Перейти к содержимому

Partner API v1

Компактный API записи с ограниченными правами.

Все ответы используют no-store. Приложение, определённое ключом, задаёт tenant, разрешённые scope, локации и необязательные ограничения origin/IP.

Конечные точки

GET/api/partner/v1/catalog

Опубликованные услуги и разрешённые локации. Используйте ограниченную пагинацию limit/cursor.

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

Опубликованные специалисты, отфильтрованные по поддерживаемым услуге и локации.

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

Ограниченный список свободных слотов с учётом текущего времени подготовки, расписания и вместимости.

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

Гостевая запись с согласием на связь, external_reference и Idempotency-Key.

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

Представление записи, принадлежащей приложению, и текущая версия управления.

booking.manage
POST/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Создайте новую логическую операцию и ключ; никогда не изменяйте повторяемый запрос.
Справочник API | Feny для разработчиков