Schemas
AgeGroup
age_maxage_minsquadBatchRequest
От 1 до 10 детей
invoiceСчёт каждому ребёнку: min | full | none (как у одной брони)
payer_phonetogetherПоселить вместе детей семьи, попавших на одну смену
BatchResponse
Брони в порядке детей запроса
Booking
commentcontacts_hiddenРебёнка теперь ведёт другой отдел: бронь остаётся в ваших списках (это ваша продажа), но телефоны родителя и плательщика скрыты
created_atОстаток: total − paid. Отрицательный — переплата
full_payment_dueДо какой даты внести всю сумму
idВаши метки: до 20 пар «ключ — значение»
Оплачено: все платежи брони, включая ещё не сверенные бухгалтерией
payment_stateawaiting — место придержано и ждёт минимальный платёж; secured — минимум внесён, место закреплено; unpaid — не оплачена в срок, место вернулось в квоту. Список может пополняться
Цена путёвки
statusactive — действует, cancelled — отменена. Список может пополняться
К оплате всего: цена + трансфер − скидка
updated_atversionВерсия записи. Передайте её в If-Match правки или отмены:
если бронь успели изменить, ответ будет 412
Путёвка в карточке брони (кратко; полностью — GET /bookings/{id}/voucher).
voucher_numberНомер путёвки: смена-порядковый номер
cancelled_reasonПричина отмены
external_idНомер записи в вашей CRM. Уникален внутри отдела
hold_untilДо какого момента держится место без минимального платежа
partner_managerКто продал бронь в вашей CRM — как вы его прислали
payer_phoneТелефон плательщика, если платит не родитель: на него уходят счета
Kaspi. Нет — платит родитель (или контакты скрыты, см. contacts_hidden)
squad_numberНомер отряда; нет — ещё не назначен
BookingChild
Город из справочника.
full_namebirth_dateidКарточка ребёнка; нет — бронь не привязана к семье
BookingChildPatch
birth_datecity_idfull_nameBookingParent
full_nameidКарточка семьи; нет — бронь не привязана к семье
phoneТелефон родителя; нет — контакты скрыты (contacts_hidden)
BookingShift
date_enddate_startidnumberНомер смены в сезоне
BookingSummary
idstatusactive — действует, cancelled — отменена. Список может пополняться
voucher_numberchild_idНет — бронь без карточки ребёнка (старые записи)
BookingVersion
idstatusactive или cancelled
versionВерсия брони — та же, что в её карточке. Не совпала с вашей — перечитайте бронь
BookingVoucher
statusnone — не сформирована, generated — сформирована, sent — отправлена. Список может пополняться
CheckChild
full_namebirth_datecity_idНе участвует в проверке. Принимается, чтобы в проверку можно было отправить тот же объект ребёнка, что потом уйдёт в оформление
CheckParent
phonefull_nameНе участвует в проверке; принимается по той же причине, что city_id
CheckReason
codeТот же код, что вернуло бы оформление: sales_closed, shift_not_open, quota_exhausted, no_quota, duplicate_child, blacklisted, birth_date_implausible. Список может пополняться
messageCheckResult
can_bookОформление сейчас пройдёт (если за это время место не займут)
Почему нельзя — все причины сразу
Checkin
checked_in_atКогда ребёнок приехал в лагерь
checked_out_atКогда уехал
Child
family_idСемья ребёнка
full_nameidВаши метки: до 20 пар «ключ — значение». Ключ — от 1 до 40 знаков, значение — строка (до 500 знаков), число, true/false или null. Мы их не разбираем: только храним и возвращаем
birth_dateНет — дата рождения неизвестна
external_idНомер ребёнка в вашей CRM
ChildIn
birth_dateДата рождения — обязательна (birth_date_required): по ней
назначается отряд, узнаётся дубль и ребёнок в базе лагеря
city_idГород — из справочника городов
full_nameФИО ребёнка
ChildPatch
external_idНомер ребёнка в вашей CRM. null — стереть номер, поле
не передано — не менять
Заменяет метки целиком
CreateRequest
commentexternal_idНомер записи в вашей CRM. Уникален внутри отдела
invoiceСчёт Kaspi при оформлении: min — минимальный платёж (по умолчанию,
если он у смены задан), full — вся сумма, none — не выставлять
Ваши метки: до 20 пар
needs_transferНужен ли трансфер
partner_managerКто продал в вашей CRM (до 200 знаков)
payer_phoneТелефон плательщика, если платит не родитель: счета Kaspi уйдут на него
together_with«Поселить вместе» с этими бронями той же смены (ваши брони), не больше 50
transfer_point_idТочка посадки — обязательна, если трансфер нужен
CreateWebhook
urlТолько https://, публичный адрес, без логина и #
event_typesТолько эти типы событий: любые из Event.type, кроме ping
(он приходит только на проверку). Незнакомый тип — отказ
bad_event_type. Нет или пусто — все, включая будущие
Debt
booking_idchild_full_nameДеньги: сумма строкой с двумя знаками и валютой. Строкой, а не числом — дробные числа в чужих языках теряют копейки.
full_payment_dueДо какой даты внести всю сумму
overdueСрок полной оплаты прошёл, а долг остался
Деньги: сумма строкой с двумя знаками и валютой. Строкой, а не числом — дробные числа в чужих языках теряют копейки.
payment_stateawaiting — место придержано до минимального платежа, secured — закреплено. Список может пополняться
shift_idК оплате по брони
Delivery
atduration_msevent_typeidokerrorЧто пошло не так (начало ответа вашего сервера или причина сбоя)
event_idНомер события; нет — проверочный ping
statusКод ответа вашего сервера; нет — ответа не было
Discount
Деньги: сумма строкой с двумя знаками и валютой. Строкой, а не числом — дробные числа в чужих языках теряют копейки.
noteЗа что скидка
DiscountIn
amount^[0-9]+(\.[0-9]{1,2}… · requiredСумма скидки в тенге строкой: целое или до двух знаков после точки.
Не больше наибольшей скидки смены (max_discount)
noteЗа что скидка
ErrorBody
codeМашинный код. Не меняется никогда — по нему ветвится ваша CRM
messageТекст для человека, по-русски
request_idНомер запроса для обращения в поддержку
Event
Чего касается событие
idНомер события — он же место в ленте. Растёт, не повторяется. Повтор доставки узнаётся по нему
occurred_attypeТип события. Сейчас бывают:
booking.created, booking.updated, booking.cancelled,
booking.restored, booking.moved, booking.hold_expired,
booking.secured, booking.removed, invoice.queued,
invoice.issued, invoice.paid, invoice.cancelled,
invoice.expired, invoice.error, invoice.mismatch,
payment.received, payment.refunded, payment.verified, payment.updated,
refund_request.created, refund_request.approved, refund_request.rejected,
refund_request.cancelled, refund_request.done, refund_request.failed,
voucher.ready, voucher.sent, child.checked_in,
child.checked_out, child.added, child.removed,
shift.seats_changed, shift.status_changed, client.merged,
child.merged, kaspi.operations.synced (только главному отделу);
ping — только проверка вебхука (POST /webhooks/{id}/test).
Список открытый и пополняется: незнакомый тип пропустите, а не падайте
dataПодробности, которых нет в самой записи. Сейчас бывают:
booking.moved — {"from_shift_id": "12"} (с какой смены);
client.merged — {"into_id": "812"} (в какую семью слита);
kaspi.operations.synced — {"date_from": "2026-06-14", "date_to": "2026-06-14", "count": 37} (за какие дни загружена
выписка и сколько в ней операций за эти дни);
ping — {"message": "…"}. У остальных — null. Поля только
добавляются
objectТекущий вид записи — тот же, что вернул бы GET по ней, по
entity.type: booking — Booking, invoice — Invoice,
payment — Payment, refund_request — RefundRequest,
child — Child, parent — Family,
shift — Shift. null, если запись вам больше не видна
(ребёнок ушёл в другой отдел) или у сущности нет вида (ping)
EventEntity
idtypebooking, invoice, payment, refund_request, child, parent, shift;
webhook — у ping;
kaspi_sync — у kaspi.operations.synced (номер загрузки выписки).
Список может пополняться
EventPage
has_moreЕсть ещё события после этой порции — запросите сразу, не дожидаясь
next_afterПередать в after следующего запроса. Совпадает с последним
номером в items; если событий не было — с вашим after
Family
Ваши брони детей этой семьи, свежие первыми
Только ваши дети. Брат или сестра, которых ведёт другой отдел, здесь не показываются
extra_phonesfull_nameidmarketing_opt_inСогласие на рассылки
merged_fromНомера карточек, слитых в эту (дубли семьи). Запрос по старому номеру отвечает этой карточкой
Ваши метки: до 20 пар «ключ — значение». Ключ — от 1 до 40 знаков, значение — строка (до 500 знаков), число, true/false или null. Мы их не разбираем: только храним и возвращаем
phoneОсновной телефон, +7XXXXXXXXXX. Ключ узнавания семьи: через API
не меняется, второй номер — в extra_phones
sharedСемью ведёт и другой отдел: общие данные семьи скрыты и не правятся
versionВерсия записи для If-Match при правке
Город из справочника.
external_idНомер семьи в вашей CRM
FamilyChild
shift_idcommentexternal_idinvoiceСчёт этому ребёнку; нет — общий invoice запроса
Ваши метки: до 20 пар «ключ — значение». Ключ — от 1 до 40 знаков, значение — строка (до 500 знаков), число, true/false или null. Мы их не разбираем: только храним и возвращаем
needs_transferpartner_managertransfer_point_idFamilyPatch
city_idГород родителя; null — стереть
external_idНомер семьи в вашей CRM. null — стереть номер, поле
не передано — не менять
extra_phonesВторые номера семьи — заменяют список целиком. Номер, записанный
за другой семьёй, не принимается (phone_taken). ФИО, город,
согласие и вторые номера семьи, которую ведёт и другой отдел
(shared), не правятся (family_shared)
full_namemarketing_opt_inЗаменяет метки целиком
FamilyPayment
Деньги: сумма строкой с двумя знаками и валютой. Строкой, а не числом — дробные числа в чужих языках теряют копейки.
booking_ididpaid_onДень оплаты по календарю лагеря (дата, без времени)
typeprepayment, payment, refund. Список может пополняться
verifiedСверен бухгалтерией
Handover
jobkeysСтроки, переданные этому заданию (сейчас или раньше). Проводите только их: остальные ведёт система лагеря или уже взяло другое задание
HandoverRequest
jobНомер задания пачки: латиница, цифры и ._:-, до 100 знаков,
начинается с буквы или цифры
keysКлючи строк, не больше 100
HistoryChange
fieldПоле брони: child.full_name, parent.phone, discount.amount…
Список может пополняться
newНовое значение; null — стёрто. Вид — как у old
oldПрежнее значение; null — не было. Вид — как у поля в брони:
строка, число, true/false, метки (объект); денежные поля
(price, transfer.fee, discount.amount) — Money
{"amount": "119000.00", "currency": "KZT"}
HistoryEntry
actioncreate, update, cancel, restore, copy, ext_ref, voucher_sent… Список может пополняться
actorВаше подключение (по имени) или «Лагерь» — для всех сотрудников лагеря и фоновых задач
atЧто изменилось
HistoryPage
next_cursorПередать в cursor, чтобы получить следующую порцию. Нет —
дальше ничего нет
Invoice
Деньги: сумма строкой с двумя знаками и валютой. Строкой, а не числом — дробные числа в чужих языках теряют копейки.
booking_idcancellingОтмену попросили, счёт ещё гасится в Kaspi. Пока это так, его всё ещё можно оплатить
created_atidpayment_typeЧем станет оплата: prepayment — предоплата, payment — оплата
purposeТекст, который плательщик видит в Kaspi рядом с суммой
statequeued — ждёт отправки в Kaspi, issued — у плательщика в Kaspi, paid — оплачен, expired — не оплачен в срок, cancelled — отменён, error — не выставлен, mismatch — Kaspi сообщил о другой сумме, лагерь проверяет. Список может пополняться
versionВерсия записи: меняется при каждом изменении счёта
Что пошло не так или чего счёт ждёт. Нет — всё в порядке
issued_atpaid_atpayment_idПлатёж, созданный оплатой этого счёта
phoneТелефон плательщика, на который ушёл счёт. Пусто, если ребёнок перешёл в другой отдел: контакты семьи вам больше не показываются
InvoiceProblem
codeМашинный код. Список может пополняться
messageТекст для человека
KaspiOperation
Сумма. Поступление — плюсом, возврат и прочий расход — минусом
dateДень операции по календарю лагеря (Asia/Almaty)
idНомер операции в Kaspi
kindpayment — поступление, refund — возврат, other — прочее (в том числе неудавшаяся операция). Список может пополняться
methodqr — оплата по QR, remote — счёт на телефон, unknown — не определён. Список может пополняться
occurred_atВремя операции
booking_idБронь этого счёта
Комиссия Kaspi, если Kaspi её назвал
invoice_idСчёт Kaspi лагеря, оплатой которого стала операция
Юрлицо кассы, в выписке которой операция (у лагеря несколько касс Kaspi Pay — у каждой своё юрлицо и свой счёт зачисления). Нет — операция загружена до появления касс
payment_idПлатёж, созданный оплатой счёта (только у payment)
KaspiOperationPage
next_cursorПередать в cursor, чтобы получить следующую порцию
synced_throughДо какого времени выписка загружена полностью. Операции позже
могут ещё дозагрузиться; null — выписка ещё ни разу не
загружалась целиком
LegalEntity
idnameКороткое имя, как его видят в лагере
binБИН (ТОО) или ИИН (ИП), если записан
iikИИК (IBAN) счёта, на который зачислены деньги, если записан
legal_nameПолное юридическое название, если записано
onec_organizationОрганизация в 1С, куда проводить эти деньги (Ref_Key или БИН), если записана в лагере
Limits
bookings_per_minuteНовых броней отделом в минуту
concurrentОдновременных запросов
invoices_per_booking_hourСчетов Kaspi на одну бронь в час
read_per_secЧтений в секунду
write_per_secЗаписей в секунду
Me
Подключение, к которому выпущен ключ
scopesПрава ключа: read, bookings, invoices, webhooks
Metadata
Money
amountСумма с двумя знаками после точки
currencyВалюта, ISO 4217. Сейчас всегда KZT
NewInvoice
kindНа что выставить: min — минимальный платёж, которым закрепляется
место (сколько его ещё не внесено); full — весь остаток;
amount — своя сумма из поля amount
amount^[0-9]+(\.0{1,2})?$Сумма для kind = amount: тенге строкой, не больше остатка брони.
Только целые тенге: "50000" или "50000.00"; дробная часть —
отказ fractional_amount
replaceЗаменить незакрытый счёт брони новым (документ 17 §6: плательщик
просит счёт на другую сумму). Без этого при живом счёте — отказ
invoice_live
NewRefundRequest
amount^[0-9]+(\.0{1,2})?$ · requiredСколько вернуть: тенге строкой, только целые ("30000" или
"30000.00"), не больше остатка оплаты за вычетом прежних
и ждущих возвратов (refund_exceeds_refundable)
payment_idОплата брони по счёту Kaspi (Payment.id). Оплата другим
способом возвращается только лагерем — отказ refund_not_kaspi_invoice
reasonПочему возвращаем — увидит тот, кто решает. 1–500 знаков
Page_Booking
next_cursorПередать в cursor, чтобы получить следующую порцию
Page_BookingVersion
next_cursorПередать в cursor, чтобы получить следующую порцию
Page_Child
next_cursorПередать в cursor, чтобы получить следующую порцию
Page_Debt
next_cursorПередать в cursor, чтобы получить следующую порцию
Page_Delivery
next_cursorПередать в cursor, чтобы получить следующую порцию
Page_Family
next_cursorПередать в cursor, чтобы получить следующую порцию
Page_FamilyPayment
next_cursorПередать в cursor, чтобы получить следующую порцию
Page_Invoice
next_cursorПередать в cursor, чтобы получить следующую порцию
Page_Payment
next_cursorПередать в cursor, чтобы получить следующую порцию
Page_RefundRequest
next_cursorПередать в cursor, чтобы получить следующую порцию
Page_Shift
next_cursorПередать в cursor, чтобы получить следующую порцию
Page_Unpaid
next_cursorПередать в cursor, чтобы получить следующую порцию
Page_Webhook
next_cursorПередать в cursor, чтобы получить следующую порцию
ParentIn
full_nameФИО родителя
phoneТелефон родителя, любой записью: «8 701…», «+7 701…»
PatchRequest
Правка ребёнка в брони.
commentexternal_idНомер записи в вашей CRM. null — стереть номер, поле
не передано — не менять
Заменяет метки целиком
needs_transferpartner_managerПустая строка — снять
payer_phoneТелефон плательщика; пустая строка — платит родитель
transfer_point_idPatchWebhook
enabledfalse — отключить, true — включить (сбрасывает счёт неудач)
event_typesТипы событий, как у CreateWebhook.event_types. Пустой список —
все типы
urlPayment
Сумма. Возврат — отрицательной суммой
bankБанк, как его записал лагерь
booking_idcreated_atidЮрлицо лагеря, на которое пришли деньги. У оплаты счёта Kaspi — юрлицо кассы, через которую счёт выставлен (у лагеря их несколько, и касса переключается). Возврат делается с этого же юрлица
paid_onДень оплаты по календарю лагеря (дата, без времени)
sourceОткуда платёж: kaspi_invoice — оплата счёта Kaspi, manual — внесён лагерем. Список может пополняться
typeprepayment — предоплата, payment — оплата, refund — возврат. Список может пополняться
verifiedСверен бухгалтерией лагеря с выпиской банка. Остаток по брони уменьшает и несверенный платёж
versionВерсия записи: меняется при каждом изменении платежа
invoice_idСчёт Kaspi, оплатой которого создан платёж
methodКак заплатили: kaspi_transfer — перевод на Kaspi лагеря,
bank_transfer — банковский перевод, cash — наличные, kaspi_invoice —
счёт Kaspi. null — не указано (записи до этого поля). Список
может пополняться
Строка выписки банка, с которой бухгалтерия лагеря сверила платёж.
Есть только у сверенного (verified) платежа
Quote
Деньги: сумма строкой с двумя знаками и валютой. Строкой, а не числом — дробные числа в чужих языках теряют копейки.
full_payment_dueДо какой даты внести всю сумму
Минимальный платёж: им бронируется место, на него уйдёт счёт при оформлении. Ноль — бронь без предоплаты
Деньги: сумма строкой с двумя знаками и валютой. Строкой, а не числом — дробные числа в чужих языках теряют копейки.
К оплате всего
Деньги: сумма строкой с двумя знаками и валютой. Строкой, а не числом — дробные числа в чужих языках теряют копейки.
hold_hoursСколько часов держится место без минимального платежа; нет — предоплата не нужна
QuoteRequest
shift_idneeds_transfertransfer_point_idТочка посадки: у сезона с ценами по городам цена трансфера своя у каждого города. При одной цене на всех можно не указывать
Redeliver
afterОтправить заново всё ПОСЛЕ этого номера события. Номер меньше доставленного — повтор, больше — пропуск
RefundRequest
Деньги: сумма строкой с двумя знаками и валютой. Строкой, а не числом — дробные числа в чужих языках теряют копейки.
booking_idby_apiПодана вашим подключением (а не сотрудником лагеря)
created_atidinvoice_idСчёт Kaspi этой оплаты
payment_idОплата по счёту Kaspi, которую возвращают
reasonstaterequested — ждёт решения лагеря; approved — одобрена, возврат
выполняется; sending — отправлен в Kaspi; needs_check — Kaspi
не ответил, лагерь проверяет вручную; done — деньги возвращены
плательщику; failed — Kaspi отказал, денег не ушло; rejected —
лагерь отклонил (причина в reject_reason); cancelled — отозвана
автором. Список может пополняться
versionВерсия записи: меняется при каждом изменении заявки
decided_atfinished_atrefund_payment_idПлатёж-возврат, записанный по выполненному возврату (done)
reject_reasonПричина отказа лагеря (только у rejected)
Seats
freeСвободно
quotaКвота отдела на смену; 0 — квоты нет, оформить нельзя
takenЗанято активными бронями отдела (включая ждущие предоплату)
Shift
Возрастные границы отрядов. Пусто — сетка ещё не задана
date_enddate_startfull_payment_dueДо какой даты внести всю сумму: автоматический счёт на остаток уходит в этот день
idМинимальный платёж, которым бронируется место. Ноль — бронь без предоплаты
numberНомер смены в сезоне
on_saleМожно ли сейчас оформить бронь: смена открыта и окно продаж не закрылось
Цена путёвки
sales_close_atКогда закрываются продажи
Места в квоте вашего отдела
statusdraft — готовится, open — продажи открыты, closed — продажи закрыты, departed — смена идёт, finished — завершена. Список может пополняться
Цена трансфера. При ценах по городам — самая низкая из них
(цена «от»); сами цены — в transfer_prices
Цены трансфера по точкам посадки. Пусто — одна цена transfer_price
на все точки. Точки, которой здесь нет, на смену не возят
Наибольшая скидка без администратора; нет — без ограничения
ShiftSales
bookingsАктивных обычных броней
date_enddate_startДолг: продано минус оплачено
freenumberНомер смены в сезоне
Оплачено по ним (все платежи, и ещё не сверенные бухгалтерией)
quotaКвота отдела на смену
season_idshift_idПродано: сумма к оплате по активным броням
takenЗанято активными бронями отдела (как в GET /shifts)
ShiftSalesReport
StatementClaim
keyКлюч строки выписки (тот, что прислан в keys)
ownercamp — строку ведёт система лагеря, accounting — бухгалтерия. Список может пополняться: незнакомое значение не проводите
payment_idsПлатежи лагеря, с которыми сверена строка (у linked)
statepending — ждёт проверки; linked — сверена с платежами; organization — оплата организации; not_ours — не оплата путёвки; internal — перевод между своими счетами; outgoing — списание. Список может пополняться
handed_jobЗадание пачки, которому строка уже передана (handover)
StatementClaims
accountsИИК счетов лагеря (ТОО, ИП), без пробелов, верхним регистром. Поступление на такой счёт, которого CRM не видела, — выписку не загрузили в CRM
Только строки, известные CRM; незнакомые ключи в ответ не попадают
StatementLineRef
dateДень строки в выписке банка
keyКлюч строки выписки — тот же, что у разборщика выписок бухгалтерии
account_iikИИК счёта лагеря, на который пришли деньги
TestResult
duration_msokАдрес ответил 2xx
errorstatusКод ответа; нет — ответа не было (DNS, соединение, сертификат, время)
Together
booking_idsВсе брони связи, включая эту
idНомер связи «вместе»
TogetherRequest
booking_idsС кем поселить: ваши брони той же смены, не больше 50
noteЗаписка: «одна компания», «просила бабушка»
Transfer
Цена трансфера в этой брони
neededНужен ли трансфер
Точка посадки
TransferPrice
nameДеньги: сумма строкой с двумя знаками и валютой. Строкой, а не числом — дробные числа в чужих языках теряют копейки.
transfer_point_idUnpaid
booking_idchild_full_nameshift_idhold_untilДо какого времени держалось место
Сколько просили внести, чтобы закрепить место
parent_full_nameparent_phoneТелефоны — пока ребёнок в вашем отделе (docs: «Ваша база»)
payer_phoneVoucher
booking_idnumberНомер путёвки
pdf_availableФайл можно скачать (GET /bookings/{id}/voucher.pdf)
statusnone — не выпущена, generated — выпущена, sent — отмечена отправленной семье. Список может пополняться
pdf_urlСсылка на скачивание PDF без ключа, живёт 10 минут (pdf_url_expires_at).
Приходит только в GET /bookings/{id}/voucher. null — ссылки нет
(путёвка не выпущена или файл собирается для вашего отдела на лету) —
тогда скачайте GET /bookings/{id}/voucher.pdf. Ссылку не храните:
за новой — снова GET /bookings/{id}/voucher
pdf_url_expires_atДо какого момента действует pdf_url
Webhook
created_atdelivered_throughНомер последнего доставленного события
enabledfalse — отключён (вами или после трёх суток неудач)
event_typesКакие типы событий слать (см. Event.type). Пусто — все
failed_attemptsНеудачных попыток подряд
idurldisabled_reasonПочему отключён
failing_sinceС какого момента адрес не принимает события подряд
next_attempt_atКогда следующая попытка после неудачи
secretСекрет подписи whsec_…. Только в ответе на создание и смену
секрета — сохраните его сразу: больше его не покажут