Начало работы

Первый запрос за 5 минут

Цель этой страницы — убедиться, что ключ работает и вы видите смены лагеря. Понадобятся ключ (см. Ключ доступа и права) и терминал с curl — или любой язык программирования.

Адрес API

Code
https://partners.zvezdnyy-burabai.edu.kz/ext/v1

Все адреса в руководстве пишутся от этого начала: GET /shifts значит GET https://partners.zvezdnyy-burabai.edu.kz/ext/v1/shifts.

  • Только https://. Запрос по http:// отклоняется, а ключ, который в нём был, сразу отзывается. Проверьте адрес в настройках CRM дважды.
  • Версия API — в адресе (/ext/v1). Что это значит для вас — в Совместимости.
  • Описание API в формате OpenAPI 3.1 можно скачать в справочнике — по нему генерируется клиент для вашего языка.

Заголовки

ЗаголовокКогдаЗначение
AuthorizationВсегдаBearer zb_live_… — ваш ключ
Content-TypeКогда отправляете тело (POST, PATCH)application/json
Idempotency-KeyПочти у всех POSTСлучайная строка, своя на каждое действие. См. Повтор запроса
If-MatchПо желанию: правка и отмена брони, правка семьиversion записи, которую вы видели. См. Повтор запроса

Тело запроса и ответа — JSON в UTF-8. Размер тела запроса — не больше 1 МБ.

В каждом ответе есть заголовок X-Request-Id — номер запроса. Сохраняйте его в своём журнале: по нему лагерь найдёт запрос, если что-то пошло не так.

Шаг 1. Кто я

Самый простой запрос — GET /me: «кто я, какой у меня отдел и какие права». Он не меняет никаких данных.

Сначала положите ключ в переменную окружения, чтобы не вставлять его в каждую команду:

TerminalCode
export ZB_KEY="zb_live_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" # ваш настоящий ключ
curl https://partners.zvezdnyy-burabai.edu.kz/ext/v1/me \ -H "Authorization: Bearer $ZB_KEY"

Ответ 200 (данные вымышленные):

JSONCode
{ "client": { "id": "3", "name": "CRM отдела «Пример»" }, "department": { "id": "7", "name": "Отдел продаж «Пример»" }, "scopes": ["read", "bookings", "invoices", "webhooks"], "limits": { "read_per_sec": 10, "write_per_sec": 2, "concurrent": 10, "bookings_per_minute": 30, "invoices_per_booking_hour": 5 } }
  • department — ваш отдел. Если здесь чужой отдел — вам выдали не тот ключ, сообщите лагерю.
  • scopes — права ключа.
  • limits — ваши лимиты (см. Лимиты).

В ответе могут быть и другие поля. Это нормально: незнакомые поля пропускайте (см. Совместимость).

Если ответ не 200

ОтветЧто не так
401 unauthorizedНет заголовка Authorization, опечатка в ключе, ключ отозван или истёк. Проверьте, что перед ключом стоит Bearer с пробелом
403 https_requiredЗапрос ушёл по http://. Ключ уже отозван — нужен новый
400 key_in_urlКлюч оказался в адресе. Ключ уже отозван — нужен новый
403 ip_not_allowedКлюч привязан к другим адресам серверов — сообщите лагерю ваш IP
429 rate_limitedСлишком много запросов или много неверных ключей с вашего адреса. Подождите столько секунд, сколько в заголовке Retry-After

Шаг 2. Какие смены продаются

GET /shifts?on_sale=true — смены, на которые можно оформить бронь прямо сейчас:

TerminalCode
curl "https://partners.zvezdnyy-burabai.edu.kz/ext/v1/shifts?on_sale=true" \ -H "Authorization: Bearer $ZB_KEY"

Ответ 200 — список порцией (подробно о порциях — в Форматах данных):

JSONCode
{ "items": [ { "id": "12", "season": { "id": "2", "name": "Лето 2027" }, "number": 3, "date_start": "2027-07-01", "date_end": "2027-07-14", "status": "open", "on_sale": true, "sales_close_at": "2027-06-30T19:00:00Z", "price": { "amount": "250000.00", "currency": "KZT" }, "transfer_price": { "amount": "15000.00", "currency": "KZT" }, "transfer_prices": [ { "transfer_point_id": "4", "name": "Астана, ж/д вокзал", "price": { "amount": "15000.00", "currency": "KZT" } }, { "transfer_point_id": "5", "name": "Караганда, автовокзал", "price": { "amount": "20000.00", "currency": "KZT" } } ], "min_payment": { "amount": "50000.00", "currency": "KZT" }, "full_payment_due": "2027-06-24", "max_discount": { "amount": "20000.00", "currency": "KZT" }, "seats": { "quota": 20, "taken": 7, "free": 13 }, "age_groups": [ { "squad": 1, "age_min": 7, "age_max": 9 }, { "squad": 2, "age_min": 10, "age_max": 12 } ] } ], "next_cursor": null }

Что здесь важно для продажи:

ПолеЧто значит
idНомер смены — его передают при оформлении брони (shift_id)
priceЦена путёвки без трансфера
transfer_pricesЦена трансфера от каждой точки посадки. Пусто — одна цена transfer_price для всех точек. Точки, которой здесь нет, на эту смену не возят
min_paymentСколько нужно внести в первые сутки, чтобы место закрепилось. 0.00 — предоплата не нужна
full_payment_dueДо какого дня оплатить всё. В этот день лагерь сам выставит счёт на остаток
max_discountНаибольшая скидка, которую ваш отдел может дать сам. null — без ограничения
seats.freeСколько ещё мест можно оформить вашему отделу
sales_close_atКогда закроются продажи (время UTC: 19:00Z — это полночь по времени Казахстана)

Готово

Если оба запроса ответили 200 — подключение работает. Дальше — Бронь и оплата по шагам.

Все запросы — в боевую систему

Отдельного тестового адреса нет. Запросы на чтение (GET) безопасны — они ничего не меняют. Оформление брони и выставление счёта — настоящие: занимают место в квоте и отправляют родителю настоящий счёт Kaspi.

Last modified on