Volver al inicio
Partner API v1

API para clubes: conectá tu web, tu POS o tu proveedor con la agenda de Skalia

Una API server-to-server, autenticada con una key del club, para que el sistema que ya usás lea la agenda y cargue turnos sin pasar por el panel.

  • Leer disponibilidad y ocupación en tiempo real, con precios por duración.
  • Crear, mover y cancelar reservas de forma idempotente con tu propio id de orden.
  • Sincronizar todo lo que cambia en la agenda con /events, venga de donde venga.

Se pide desde el panel del club; si no tenés sesión, el login te lleva.

Ambiente de los ejemplos
https://skalia-server.vercel.app/api/partner/v1
Idioma

Capacidades

Todo lo que se puede hacer hoy con la v1, por dominio. El detalle de cada ruta está en la documentación de abajo.

  • Canchas, precios y horarios

    Listar, crear, editar y deshabilitar canchas (o cualquier recurso reservable), con su tarifario por franja y duración, los defaults del club y el horario semanal.

  • Disponibilidad vendible

    Por día: comienzos, duraciones posibles y precio de cada una, listos para mostrar en tu web o POS.

  • Demanda de lista de espera

    Cuántos jugadores esperan un turno que no consiguieron, por día, comienzo y duración (GET /waitlists/demand): dónde conviene abrir un hueco o sumar una cancha. Sólo conteos, sin personas.

  • Ocupación real

    La fuente de verdad de "ocupado": reservas de cualquier origen, fijas, bloqueos y partidos con cancha, con ETag.

  • Reservas idempotentes

    Alta, edición, reagendado y cancelación con externalRef: repetir un POST es seguro y dos en paralelo producen una sola reserva. Confirmar los pedidos pendientes de la app, marcar y filtrar el estado de pago, y ver precio y pago de cada turno del club si administrás todas las reservas.

  • Reservas fijas

    Series recurrentes por API: alta atómica e idempotente, acortar, cancelar y saltar una fecha, más el calendario de ocurrencias de cada serie (proyectadas, salteadas y ya materializadas con su estado). Se ven en la ocupación y en /events.

  • Bloqueos de cancha

    Bloquear una cancha (o todo el club) por un rango, quitar el bloqueo y abrir huecos de un día adentro del bloqueo para volver a vender esa franja. Se leen en /occupancy y llegan como occupancy.changed.

  • Pasar lista

    Marcar cada reserva como asistida o no-show desde tu POS, desde 30 minutos antes del turno y hasta 7 días después.

  • Partidos abiertos

    Publicar un partido sobre una reserva del club para que los jugadores se sumen desde la app (Skalia avisa por categoría), listar los partidos públicos con su cupo y estado, y darlos de baja. Nunca quiénes juegan.

  • Sincronización con /events

    Polling con cursor de todo lo que cambia en la agenda: tus reservas, las ajenas (anónimas), bloqueos, fijas y el aviso de que la grabación de un turno ya se puede mirar.

  • Webhooks

    Avisos push firmados (HMAC) hacia tu servidor por cada evento de la agenda —incluida la grabación lista de un turno—, con historial de entregas, reenvío, evento de prueba y rotación del secreto.

  • Torneos

    Crear eventos con sus categorías (y sumarles categorías después), sortear grupos, generar el cuadro, sugerir horarios, programar partidos, cargar resultados, leer posiciones, editar cada pareja (pago, nombre, baja o reingreso) y finalizar con podio, puntos y premios.

  • Americanos

    Leer los americanos públicos del club: estado, cupo, formato, canchas y precio, con filtros por fecha y estado. Sin datos de los inscriptos.

  • Ficha y configuración del club

    Leer y editar la ficha, la configuración, los espacios y servicios y las categorías de recurso del club, con el conteo de seguidores.

  • Reportes de horas y venta

    Totales de horas reservadas y venta esperada de un rango de fechas, por tipo y por origen, y agrupados por cancha, categoría, tipo u origen. Sólo agregados, sin personas; lo emite el dueño del club.

  • Grabación del turno

    Con el scope recordings:read, cada reserva trae el link a la grabación de la cancha cuando existe, y booking.recording_ready avisa en /events y por webhook cuando el video quedó listo para mirar.

  • Vivos por cancha

    Qué cancha está transmitiendo ahora (o tiene un vivo programado) y de qué es: turno, torneo o cámara suelta, con el link y el embed de YouTube de tus propios turnos y ETag.

  • Sandbox separado

    Un ambiente de prueba con host y keys propios (sk_test_): una key de un ambiente no vale en el otro.

  • Keys con scopes y rotación

    Permisos por key, rotación con período de gracia y cuotas visibles en GET /me. El secreto se muestra una sola vez.

Límites

Cuotas por defecto de cada integración. Se pueden subir desde el panel hasta 10× y, más allá, pidiéndoselo a Skalia.

  • 120
    lecturas por minuto
    details.quota: reads_per_minute
  • 10.000
    lecturas por día
    details.quota: reads_per_day
  • 20
    escrituras por minuto
    details.quota: writes_per_minute
  • 500
    escrituras por día
    details.quota: writes_per_day
  • 2.000
    reservas futuras activas
    details.quota: max_future_bookings
  • 5
    keys activas por integración
  • 168
    horas de gracia máximas al rotar una key
  • 90
    días de retención de /events
  • 200
    eventos por página en /events

Lecturas = GET; escrituras = POST / PATCH / DELETE. Las cuotas diarias de escritura cuentan intentos, no éxitos.

Cómo se cobra: un plan mensual con requests incluidos (más bloques de excedente con tope y degradación, nunca corte) y una tarifa por cada reserva creada por API. Los importes vigentes los comunica Skalia al activar el módulo. Detalle en la guía «Planes y costo» de la documentación.

SDKs y herramientas

Clientes oficiales para Node y Python, generados de la spec OpenAPI, y la colección Postman de cada ambiente. Publicación a npm / PyPI pendiente: por ahora se instalan desde la carpeta sdk/ del repo.

Documentación

Guías, referencia endpoint por endpoint y tutoriales. Los ejemplos usan la URL base del ambiente elegido arriba.

Empezar

La Partner API es una API server-to-server para el sistema del club (tu web, el POS, un proveedor de software). Se autentica con una API key del club, nunca con un usuario de Skalia. Con ella podés leer canchas, disponibilidad y ocupación, cargar y modificar reservas, y enterarte de todo lo que cambia en la agenda.

Antes de la primera request

  1. Skalia prende el módulo API del club (pedilo desde el panel del club en /admin/api si todavía no está). Sin eso cualquier key responde 403 MODULE_DISABLED.
  2. El dueño del club crea una integración en la tab "Integraciones y credenciales": una por sistema ("Mi web", "POS").
  3. Emite una key con los scopes que necesita. El secreto sk_live_… se muestra una sola vez: guardalo en tu vault en ese momento.
  4. Smoke test: GET /me con la key. Si responde 200, los scopes efectivos y las cuotas que ves son los que rigen.

Tu primera sesión, en curl

bash
BASE=https://skalia-server.vercel.app/api/partner/v1
KEY="Authorization: Bearer sk_live_…"

# 1) Smoke test del onboarding: quién soy, en qué club, con qué cuotas.
curl $BASE/me -H "$KEY" -H "X-Request-Id: mi-sistema-0001"

# 2) Canchas del club, para mapear ids del lado del partner.
curl "$BASE/courts" -H "$KEY"

# 3) Qué se puede vender el martes: comienzos, duraciones y precio.
curl "$BASE/availability?date=2026-09-15" -H "$KEY"

# 4) Alta IDEMPOTENTE: siempre con externalRef (tu id de orden).
curl -X POST $BASE/bookings -H "$KEY" -H "Content-Type: application/json" -d '{
  "courtId": "…", "date": "2026-09-15", "startTime": "10:00", "durationMinutes": 90,
  "externalRef": "ORD-123",
  "customer": { "name": "Juan Pérez", "phone": "+598 91 234 567" },
  "paymentStatus": "PAID"
}'
# → 201 { booking } + Location. Repetir el mismo POST → 200 + Idempotent-Replay: true.

# 5) Mover, corregir, cancelar.
curl -X PATCH  $BASE/bookings/<id> -H "$KEY" -H "Content-Type: application/json" -d '{ "startTime": "11:00" }'
curl -X DELETE "$BASE/bookings/<id>?reason=el%20cliente%20cancel%C3%B3" -H "$KEY"
curl -X DELETE "$BASE/bookings/<id>?force=true" -H "$KEY"   # si había partidos armados en el turno

# 6) Ocupación real (fuente de verdad de "ocupado"), con ETag.
curl "$BASE/occupancy?from=2026-09-15&to=2026-09-21" -H "$KEY" -H 'If-None-Match: "…"'

Cuatro reglas que conviene saber antes de la primera línea de código

  • externalRef es de un solo uso. Una reserva cancelada bloquea el ref (409 EXTERNAL_REF_USED): para re-vender la misma orden mandá otro (ORD-123-2). Sin externalRef no hay idempotencia: un reintento del mismo POST choca contra la reserva que ya creaste (409 BOOKING_CONFLICT).
  • /occupancy es la fuente de verdad de "ocupado" (reservas de cualquier origen, fijas, bloqueos, partidos con cancha); /availability es lo vendible; /events avisa qué cambió.
  • Las reservas ajenas se ven siempre anónimas (SlotDto); tu customer sólo lo ve tu integración.
  • Cancelar con partidos armados en el turno es 409 salvo ?force=true, que desliga los partidos como lo haría el panel (nunca los cancela).
Mandá tu propio X-Request-Id (8–64 caracteres de [A-Za-z0-9._-]): vuelve en la respuesta y en el requestId de todo error. Es lo que soporte busca.