Endpoints
GET
/api/partner/v1/catalogServicios publicados y ubicaciones permitidas. Usa paginación limitada con limit/cursor.
catalog.readGET
/api/partner/v1/catalog/specialistsEspecialistas publicados, filtrados por servicio y ubicación compatibles.
catalog.readGET
/api/partner/v1/availabilityHuecos libres limitados según el tiempo de antelación, el horario y la capacidad actuales.
availability.readPOST
/api/partner/v1/bookingsReserva de invitado con consentimiento de contacto, external_reference e Idempotency-Key.
booking.createGET
/api/partner/v1/bookings/{pbr_reference}Proyección de la reserva de la aplicación y versión de gestión actual.
booking.managePOST
/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.manageAutorizació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
| Ámbito | Rutas | Límite |
|---|---|---|
| catalog.read | Catálogo y especialistas | Solo datos publicados actuales permitidos por la política de ubicaciones de la credencial. |
| availability.read | Disponibilidad | Solo huecos disponibles limitados según las reglas actuales de reserva, capacidad y antelación. |
| booking.create | Crear reserva | Se requieren consentimiento explícito del cliente, external_reference e Idempotency-Key. |
| booking.manage | Lectura y acciones de reservas | Solo una referencia pbr_ de la aplicación; las acciones también requieren expected_version. |
| webhooks.manage | Centro de control del propietario | La 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ón | Respuesta | Acción del partner |
|---|---|---|
| Clave no válida o caducada | 401 invalid_api_key | Rota la clave o elige el entorno correcto; no repitas con otro selector de tenant. |
| Permiso ausente o restricción de credencial | 403 insufficient_scope / credential_restricted | Cambia la política de la aplicación en el centro de control del propietario. |
| Solicitud no válida o reserva no disponible | 400 invalid_request / 409 booking_unavailable | Corrige los datos o consulta la disponibilidad actual; conserva la clave original solo para la misma escritura lógica. |
| Registro no encontrado | 404 not_found | No deduzcas el estado del tenant ni repitas con otro selector. |
| Respuesta de cuota | 429 rate_limited | Respeta Retry-After y las cabeceras de límite. Reintenta solo tras el periodo indicado con espera limitada. |
| Respuesta temporal del servicio | 503 service_unavailable | Usa espera exponencial limitada con jitter; conserva la misma clave solo para la misma escritura. |
| Clave de idempotencia reutilizada con datos distintos | 409 idempotency_key_reused | Crea una operación lógica y una clave nuevas; nunca cambies una solicitud repetida. |
Feny