Справка

Ошибки

Как выглядит ошибка

Любая ошибка приходит с кодом ответа HTTP 4xx или 5xx и телом одного вида:

JSONCode
{ "code": "quota_exhausted", "message": "Квота отдела на смену 3 исчерпана (20 из 20). Добавить места может руководитель — обратитесь к нему", "request_id": "r8KfQ2mZx7LpT0aVn3Wd" }
ПолеЧто это
codeМашинный код. Не меняется никогда — по нему ваша CRM решает, что делать
messageТекст для человека, по-русски. Можно показать менеджеру. Не разбирайте его программой — текст может меняться
request_idНомер запроса (он же в заголовке X-Request-Id). Назовите его, когда пишете в лагерь: по нему найдут запрос в журнале

Что делать — по коду ответа

Код ответаЧто значитЧто делать
400Неверный запрос: поле, параметр, форматИсправить запрос. Повторять тот же запрос бесполезно
401Нет ключа или ключ недействителенПроверить ключ; если отозван — запросить новый у лагеря
403Нельзя: нет права или так запрещено правиламиПоказать message менеджеру; при scope_missing — попросить право у лагеря
404Записи нет или она не вашего отделаПроверить номер. Чужая запись неотличима от несуществующей
405Метод не поддерживается по этому адресуПроверить метод (GET/POST/PATCH/DELETE)
409Конфликт с текущим состоянием (нет мест, уже есть счёт, уже отменена)Показать message менеджеру; перечитать запись
412Запись изменили после вашего чтения (If-Match)Перечитать запись, показать менеджеру, повторить
413Тело больше 1 МБУменьшить запрос
422Тело не принято: незнакомое или неверное поле, или ключ повтора с другим теломИсправить тело (имя поля — в message)
429Превышен лимитПодождать Retry-After секунд и повторить (см. Лимиты)
500Внутренняя ошибка лагеряПовторить позже с тем же Idempotency-Key; если повторяется — написать в лагерь с request_id
503Сервер не ответил за 30 секунд или часть сервиса недоступнаПовторить с тем же Idempotency-Key — см. Повтор запроса

Ответы 401, 403, 429 и 503 возможны у любого адреса.

Отказ запоминается вместе с ключом повтора

Если POST с Idempotency-Key получил отказ 4xx (кроме 429), повтор с тем же ключом вернёт тот же отказ, не выполняя запрос заново. Исправили данные (добавили дату рождения, выбрали другую смену) — отправляйте с новым ключом. Подробно — в Повтор запроса.

Коды API

Запрос не разобран

codeСтатусКогдаЧто делать
bad_request400Неверный JSON или параметр адресаПроверить, что тело — правильный JSON, параметры — нужного вида
invalid_input422Поле тела не того вида, не заполнено или незнакомо (имя — в message)Исправить имя или значение поля
too_large413Тело запроса больше 1 МБРазбить на несколько запросов
method_not_allowed405Метод не поддерживается по этому адресуПроверить метод
not_found404Записи нет или она не вашего отдела; неизвестный адресПроверить номер и адрес

Списки и параметры

codeСтатусКогдаЧто делать
bad_limit400limit вне допустимых границОбычно 1–200 (у ленты событий 1–500, у сверки 1–5000)
bad_cursor400Неверный курсорНачать список заново без cursor
bad_period400Начало периода позже концаПоменять даты местами
bad_after400after — не номер события или больше последнегоПередать сохранённый номер события; в начале — 0
bad_time400Время не в формате RFC 3339Например 2027-05-14T00:00:00Z
bad_status400Неверный фильтр statusactive или cancelled
bad_payment_state400Неверный фильтр payment_stateawaiting, secured или unpaid

Данные брони, семьи, ребёнка

codeСтатусКогдаЧто делать
birth_date_required400Нет даты рождения ребёнка. Обязательна при оформлении и при смене ФИО или телефона в брони без датыСпросить дату у родителя (почему — в Бронь и оплата)
empty_name400Пустое ФИО ребёнка или родителяЗаполнить ФИО
bad_phone400Телефон родителя не разобранКазахстанский номер: 8 701 000 00 01 или +7 701 000 00 01
bad_payer_phone400Телефон плательщика не разобранТо же
unknown_city400Города нет в справочнике (оформление)Взять номер из справочника городов лагеря
bad_city400Города нет в справочнике (правка семьи)То же
unknown_transfer_point400Точки посадки нет в справочникеВзять transfer_point_id из transfer_prices смены
transfer_not_offered400Из этой точки на смену не возят, или трансфер нужен, а точка не указанаВыбрать точку из transfer_prices смены
bad_children400В оформлении семьи не 1–10 детейРазбить на несколько запросов
unknown_booking400Бронь в together_with / booking_ids не найдена среди вашихПроверить номера: только ваши брони
reason_required400Не указана причина отменыПередать reason
bad_external_id400external_id пуст или длиннее 255 знаковИсправить номер
duplicate_external_id400Один external_id дважды в одном запросе (оформление семьи)Свой номер каждому ребёнку
external_id_taken409external_id уже у другой вашей записи (в message — её номер)Скорее всего, бронь уже оформлена — прочитать её по external_id
bad_metadata400Метки не по правилам: больше 20 пар, длинный ключ или значение, вложенный объектКлюч до 40 знаков, значение до 500, без вложенности
bad_partner_manager400partner_manager длиннее 200 знаковСократить
bad_if_match400If-Match — не version записиПередать version как есть
version_mismatch412Запись изменили после вашего чтенияПеречитать запись и повторить
edit_conflict409Бронь изменилась прямо во время правкиПеречитать бронь и повторить
contacts_hidden403Ребёнка ведёт другой отдел: контакты семьи не правятсяТелефоны меняет отдел, который ведёт ребёнка
forbidden403Недостаточно прав для действияДействие доступно только лагерю
blacklisted403Оформить ребёнка нельзя (запрет лагеря; причина не сообщается)Обратиться в лагерь
duplicate_child409Ребёнок уже записан на эту смену (возможно, другим отделом)Если это ошибка — обратиться в лагерь
quota_exhausted409Места вашего отдела на смене закончилисьДругая смена, или попросить лагерь добавить мест
voucher_head_only403Путёвку выпускает и отмечает отправленной руководитель отдела или лагерьПопросить руководителя отдела

Счета Kaspi

codeСтатусКогдаЧто делать
bad_kind400kind счёта — не min/full/amountИсправить kind
bad_amount400Сумма не по шаблону, или amount передан без kind: amountСумма строкой: "50000" или "50000.00"
min_already_paid409kind: min, а минимальный платёж уже внесёнВыставить full или amount
invoice_not_live409Счёт уже закрыт — отменять нечегоПеречитать счёт
invoice_mismatch409По брони разбирается расхождение суммы счёта (при отмене такого счёта — 403)Ждать решения лагеря

Ключ и доступ

codeСтатусКогдаЧто делать
unauthorized401Нет ключа, опечатка, ключ отозван или истёкПроверить заголовок Authorization: Bearer …; новый ключ — у лагеря
scope_missing403У ключа нет нужного права (какого — в message)Попросить право у администратора лагеря
https_required403Запрос по http:// — ключ отозванИсправить адрес на https://, получить новый ключ
key_in_url400Ключ в адресе запроса — ключ отозванПередавать ключ только в заголовке, получить новый ключ
ip_not_allowed403Запрос не с разрешённого адресаСообщить лагерю адрес сервера

Повтор запроса и лимиты

codeСтатусКогдаЧто делать
idempotency_key_required400Нет заголовка Idempotency-KeyДобавить заголовок
idempotency_key_too_long400Idempotency-Key длиннее 255 знаковUUID (36 знаков) подходит
idempotency_mismatch422Этот ключ уже использован с другим теломНовое действие — новый ключ
rate_limited429Превышен лимитЖдать Retry-After секунд
timeout503Сервер не ответил за 30 секундПовторить с тем же Idempotency-Key: начатое действие доводится до конца
internal500Внутренняя ошибка сервераПовторить позже с тем же ключом; если не проходит — в лагерь с request_id

Вебхуки

codeСтатусКогдаЧто делать
bad_url400Адрес вебхука не принят (не https, внутренний, с логином, с #, длиннее 2000 знаков)Причина — в message
bad_event_type400Незнакомый тип события в подпискеПроверить по списку в Событиях
too_many_webhooks409Уже 5 действующих вебхуковОтключить ненужный (DELETE /webhooks/{id})
secret_unavailable409Секрет вебхука недоступенСменить секрет (rotate-secret)
webhooks_unavailable503Вебхуки временно недоступныПовторить позже

Служебные коды

main_department_only (403), too_many_keys (400), bad_job (400) относятся к служебным разделам лагеря. Ключу отдела продаж они не встречаются.

Правила лагеря

Кроме кодов самого API, оформление, правка и счета возвращают коды правил лагеря — те же, что видит менеджер в CRM лагеря:

codeСтатусКогда
sales_closed409Продажи на смену закрыты
shift_not_open409Продажи на смену ещё не открыты (или смена уже не в продаже)
no_quota409Вашему отделу не выделена квота на смену
birth_date_implausible400На дату заезда ребёнку меньше 3 или больше 19 лет — проверьте дату рождения
bad_birth_date400Дата рождения в будущем
transfer_point_required400needs_transfer: true, а точка посадки не указана
discount_over_max400Скидка больше max_discount смены
bad_discount400Скидка отрицательная или больше стоимости
bad_invoice400invoice при оформлении — не min/full/none
too_many_bookings400В «вместе» больше 50 броней
already_cancelled409Бронь уже отменена
already_checked_in409Ребёнок уже заехал — бронь не отменить
not_cancelled409Восстановить можно только отменённую бронь
same_shift409Перенос на ту же смену
shift_started409Перенос на уже начавшуюся смену
booking_cancelled409Счёт по отменённой брони не выставляется
invoice_live409У брони уже есть неоплаченный счёт
invoice_paid409Оплаченный счёт не отменяется
amount_over_debt400 / 409Сумма счёта больше остатка по брони
fractional_amount400Сумма счёта с тиынами — только целые тенге
nothing_to_pay400Остаток по брони — ноль
amount_too_big400Сумма счёта подозрительно велика (лишний ноль?)
family_shared403Общая семья: её общие данные не правятся (см. Ваша база)
phone_taken409Второй номер уже записан за другой семьёй

Список пополняется

Новые коды могут появиться в любой момент. Незнакомый код обрабатывайте по коду ответа HTTP: 4xx — показать менеджеру message и не повторять тот же запрос; 5xx — повторить позже с тем же Idempotency-Key.

Last modified on