Ir al contenido

Partner API v1

Una API de reservas compacta y con permisos limitados.

Todas las respuestas usan no-store. La aplicación vinculada a la clave determina el tenant, los permisos, las ubicaciones permitidas y las restricciones opcionales de origen/IP.

Endpoints

GET/api/partner/v1/catalog

Servicios publicados y ubicaciones permitidas. Usa paginación limitada con limit/cursor.

catalog.read
GET/api/partner/v1/catalog/specialists

Especialistas publicados, filtrados por servicio y ubicación compatibles.

catalog.read
GET/api/partner/v1/availability

Huecos libres limitados según el tiempo de antelación, el horario y la capacidad actuales.

availability.read
POST/api/partner/v1/bookings

Reserva de invitado con consentimiento de contacto, external_reference e Idempotency-Key.

booking.create
GET/api/partner/v1/bookings/{pbr_reference}

Proyección de la reserva de la aplicación y versión de gestión actual.

booking.manage
POST/api/partner/v1/bookings/{pbr_reference}/actions/{cancel|reschedule}

Cambio idempotente y versionado del ciclo de vida según las reglas de reserva actuales.

booking.manage

Autorización, envoltorios y trazabilidad de solicitudes

http
GET /api/partner/v1/catalog?locale=en&limit=2 HTTP/1.1
Authorization: Bearer fnx_test_example_key_not_a_real_credential
Accept-Language: en
Origin: https://partner.example

HTTP/1.1 200 OK
Cache-Control: private, no-store
Referrer-Policy: no-referrer
X-Request-Id: <request_id>
X-RateLimit-Limit: <limit>
X-RateLimit-Remaining: <remaining>
X-RateLimit-Reset: <unix_seconds>

{
  "data": { "services": [], "next_cursor": null },
  "meta": { "request_id": "<request_id>", "version": "v1" }
}

Política de permisos y credenciales

ÁmbitoRutasLímite
catalog.readCatálogo y especialistasSolo datos publicados actuales permitidos por la política de ubicaciones de la credencial.
availability.readDisponibilidadSolo huecos disponibles limitados según las reglas actuales de reserva, capacidad y antelación.
booking.createCrear reservaSe requieren consentimiento explícito del cliente, external_reference e Idempotency-Key.
booking.manageLectura y acciones de reservasSolo una referencia pbr_ de la aplicación; las acciones también requieren expected_version.
webhooks.manageCentro de control del propietarioLa configuración de webhooks se gestiona en el espacio protegido del propietario, no mediante una ruta API pública.

Crear reserva

http
POST /api/partner/v1/bookings HTTP/1.1
Authorization: Bearer fnx_test_example_key_not_a_real_credential
Idempotency-Key: 7b1d9ed1-7f34-4ddf-9e01-example
Content-Type: application/json

{
  "service_id": "<published_service_id>",
  "location_id": "<optional_allowed_location_id>",
  "date": "2026-09-21",
  "start_time": "10:00",
  "external_reference": "partner-order-1042",
  "customer": {
    "name": "Test customer",
    "phone": "+15550001111",
    "consent_to_contact": true
  }
}

Estructura actual de la reserva

  • Partner API v1 crea un servicio por reserva. El campo documentado service_id es singular; se rechazan los campos inventados service_ids o composition_mode.
  • La reserva compuesta secuencial o paralela está disponible mediante el widget firmado de Feny y el flujo propio, donde el motor canónico valida combinaciones, capacidad del personal y reglas vigentes.
  • No expongas una credencial Partner API en el navegador. Usa el id y la versión públicos del widget para incrustaciones y mantén las llamadas API en un servidor de confianza.

Paginación y lecturas limitadas

http
GET /api/partner/v1/catalog?locale=en&limit=25&cursor=<next_cursor> HTTP/1.1
Authorization: Bearer fnx_test_example_key_not_a_real_credential

{
  "data": {
    "services": ["..."],
    "next_cursor": "<opaque_cursor_or_null>"
  },
  "meta": { "request_id": "<request_id>", "version": "v1" }
}

Reglas de paginación

  • Las lecturas de catálogo y especialistas aceptan limit de 1 a 50 (25 por defecto). Disponibilidad acepta de 1 a 96 (48 por defecto).
  • Envía next_cursor exactamente como se recibe. Es opaco y no debe decodificarse, construirse, compartirse entre consultas no relacionadas ni usarse tras cambiar filtros.
  • El next_cursor de disponibilidad representa el inicio del último hueco devuelto para esa consulta exacta. Un next_cursor nulo indica que no hay otra página.
  • La disponibilidad es una lectura actual, no una reserva. Vuelve a consultarla y deja que la creación realice la comprobación final de capacidad en el servidor.

Acciones idempotentes de reserva

http
POST /api/partner/v1/bookings/<pbr_reference>/actions/cancel HTTP/1.1
Authorization: Bearer fnx_test_example_key_not_a_real_credential
Idempotency-Key: 11111111-2222-4333-8444-example
Content-Type: application/json

{ "expected_version": 3 }

Política de idempotencia y versiones

  • Usa una Idempotency-Key de 16–128 caracteres por escritura lógica. Tras un resultado incierto, repite la solicitud exacta; usa una clave nueva para otra operación.
  • Nunca reutilices una clave de idempotencia con datos distintos. La API devuelve 409 idempotency_key_reused en lugar de decidir qué solicitud es válida.
  • Recupera la reserva antes de cancelar o reprogramar y envía su última versión como expected_version. Una versión obsoleta puede devolver 409 booking_version_conflict.
  • No incluyas datos del cliente, credenciales ni otros valores sensibles en Idempotency-Key o external_reference.

Errores y reintentos

CondiciónRespuestaAcción del partner
Clave no válida o caducada401 invalid_api_keyRota la clave o elige el entorno correcto; no repitas con otro selector de tenant.
Permiso ausente o restricción de credencial403 insufficient_scope / credential_restrictedCambia la política de la aplicación en el centro de control del propietario.
Solicitud no válida o reserva no disponible400 invalid_request / 409 booking_unavailableCorrige los datos o consulta la disponibilidad actual; conserva la clave original solo para la misma escritura lógica.
Registro no encontrado404 not_foundNo deduzcas el estado del tenant ni repitas con otro selector.
Respuesta de cuota429 rate_limitedRespeta Retry-After y las cabeceras de límite. Reintenta solo tras el periodo indicado con espera limitada.
Respuesta temporal del servicio503 service_unavailableUsa espera exponencial limitada con jitter; conserva la misma clave solo para la misma escritura.
Clave de idempotencia reutilizada con datos distintos409 idempotency_key_reusedCrea una operación lógica y una clave nuevas; nunca cambies una solicitud repetida.
Referencia API | Desarrolladores Feny