Конечные точки
GET
/api/partner/v1/catalogОпубликованные услуги и разрешённые локации. Используйте ограниченную пагинацию limit/cursor.
catalog.readGET
/api/partner/v1/catalog/specialistsОпубликованные специалисты, отфильтрованные по поддерживаемым услуге и локации.
catalog.readGET
/api/partner/v1/availabilityОграниченный список свободных слотов с учётом текущего времени подготовки, расписания и вместимости.
availability.readPOST
/api/partner/v1/bookingsГостевая запись с согласием на связь, external_reference и Idempotency-Key.
booking.createGET
/api/partner/v1/bookings/{pbr_reference}Представление записи, принадлежащей приложению, и текущая версия управления.
booking.managePOST
/api/partner/v1/bookings/{pbr_reference}/actions/{cancel|reschedule}Версионное идемпотентное изменение жизненного цикла по текущим правилам записи.
booking.manageАвторизация, конверты и трассировка запросов
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" }
}Политика scope и учётных данных
| Область | Маршруты | Границы |
|---|---|---|
| catalog.read | Каталог и специалисты | Только текущие опубликованные данные, разрешённые политикой локаций учётных данных. |
| availability.read | Доступность | Только ограниченные доступные слоты по текущим правилам записи, вместимости и времени подготовки. |
| booking.create | Создание записи | Требуются явное согласие клиента, external_reference и Idempotency-Key. |
| booking.manage | Чтение записи и действия | Только ссылка pbr_, принадлежащая приложению; для действий также нужен expected_version. |
| webhooks.manage | Центр управления владельца | Webhook настраивается в защищённом кабинете владельца, а не через публичный API-маршрут. |
Создание записи
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
}
}Текущая структура записи
- Partner API v1 создаёт одну услугу на запись. Документированное поле service_id является одиночным; выдуманные поля service_ids или composition_mode отклоняются.
- Составная последовательная или параллельная запись доступна через подписанный виджет Feny и собственный поток записи, где канонический механизм проверяет комбинации, вместимость персонала и текущие правила бизнеса.
- Не раскрывайте учётные данные Partner API в коде браузера. Для встраивания используйте публичные id и версию виджета, а вызовы API выполняйте на доверенном сервере.
Пагинация и ограниченное чтение
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" }
}Правила пагинации
- Чтение каталога и специалистов принимает limit от 1 до 50 (по умолчанию 25). Доступность принимает от 1 до 96 (по умолчанию 48).
- Передавайте next_cursor точно в полученном виде. Он непрозрачный: его нельзя декодировать, создавать, передавать между несвязанными запросами или использовать после смены фильтров.
- next_cursor доступности обозначает время начала последнего возвращённого слота именно для этого запроса. null означает, что следующей страницы нет.
- Доступность является текущим чтением, а не резервированием. Прочитайте её снова и позвольте запросу создания выполнить финальную серверную проверку вместимости.
Идемпотентные действия с записью
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 }Политика идемпотентности и версий
- Используйте один Idempotency-Key на 16–128 символов для одной логической операции записи. После неопределённого результата повторите точный запрос; для новой операции создайте новый ключ.
- Никогда не используйте ключ идемпотентности повторно с изменёнными данными. API возвращает 409 idempotency_key_reused вместо предположений о главном запросе.
- Получите управляемую запись перед отменой или переносом и передайте последнюю версию как expected_version. Устаревшая версия может вернуть 409 booking_version_conflict.
- Не кодируйте данные клиента, учётные данные или другие чувствительные значения в Idempotency-Key или external_reference.
Ошибки и повторные попытки
| Условие | Ответ | Действие партнёра |
|---|---|---|
| Недействительный или просроченный ключ | 401 invalid_api_key | Ротируйте ключ или выберите правильную среду; не повторяйте запрос с другим tenant selector. |
| Нет scope или действует ограничение учётных данных | 403 insufficient_scope / credential_restricted | Измените политику приложения в Центре управления владельца. |
| Недействительный запрос или запись недоступна | 400 invalid_request / 409 booking_unavailable | Исправьте данные или получите текущую доступность; сохраняйте исходный ключ только для той же логической операции. |
| Запись не найдена | 404 not_found | Не делайте выводов о состоянии tenant и не повторяйте с другим selector. |
| Ответ о квоте | 429 rate_limited | Соблюдайте Retry-After и заголовки лимита. Повторяйте только после указанного времени с ограниченной задержкой. |
| Временный ответ сервиса | 503 service_unavailable | Используйте ограниченную экспоненциальную задержку с jitter; сохраняйте тот же ключ только для той же операции. |
| Ключ идемпотентности повторно использован с изменёнными данными | 409 idempotency_key_reused | Создайте новую логическую операцию и ключ; никогда не изменяйте повторяемый запрос. |
Feny