Sapa Moto

Справочник собран из OpenAPI 3.1. Секретные ключи не вводятся в браузере: пробуйте запросы из curl или Postman с тестовым ключом. Скачать OpenAPI

Загружаем справочник…

Справочник API

Методы

Расчёты

POST /v1/quotes — Рассчитать доставку

Рассчитывает цену доставки и ETA без создания заказа. quote_id держит цену 10 минут (valid_until): заказ по нему получит ровно эту цену, даже если тариф изменился. Позже заказ отклоняется с quote_expired. Адреса вне зон отклоняются с out_of_zone.
Нужна область доступа orders.write.

Заказы

GET /v1/orders — Список заказов

Ваши заказы в среде ключа, новые сверху, с фильтрами. Курсорная пагинация: передайте next_cursor страницы как cursor, чтобы получить следующую; на последней странице next_cursor равен null.
Нужна область доступа orders.read.

POST /v1/orders — Создать заказ

Создаёт заказ доставки. С quote_id цена берётся из расчёта (действует 10 минут, иначе quote_expired); без него заказ считается по текущему тарифу.
Идемпотентность. Передавайте уникальный Idempotency-Key (рекомендуем UUID). Повтор с тем же ключом и тем же телом в течение 24 часов возвращает первый ответ без изменений — таймаут никогда не создаст два заказа. Тот же ключ с другим телом отклоняется с 409 idempotency_conflict.
`external_id` — ваш номер заказа; он уникален в пределах организации и среды. Второй заказ с тем же external_id (даже другим ключом) отклоняется с 409 duplicate_external_id и ссылкой на существующий заказ.
В ответе — tracking_url для получателя и delivery_code, который получатель называет курьеру при вручении. Тестовые ключи создают заказы песочницы, их везёт виртуальный курьер.
Нужна область доступа orders.write.

POST /v1/orders/batch — Создать заказы пакетом

Создаёт до 100 заказов одним запросом. Каждый заказ обрабатывается отдельно: в результате по каждому элементу — created с заказом или error с кодом ошибки, в порядке запроса. Пакет целиком идемпотентен с Idempotency-Key.
Нужна область доступа orders.write.

GET /v1/orders/{id} — Получить заказ

Заказ со статусом, версией, курьером (имя, телефон через маску, транспорт), ETA, историей статусов и ценой. {id} — наш id заказа или ваш external_id. Заказы других организаций — 404.
Нужна область доступа orders.read.

PATCH /v1/orders/{id} — Изменить заказ

Изменяет заказ. До picked_up можно менять адрес доставки, получателя, время и сумму наложенного платежа. После забора — только comment и recipient_phone; остальные поля отклоняются с 422 order_not_editable и details[].field. Передавайте только изменяемые поля.
Нужна область доступа orders.write.

POST /v1/orders/{id}/cancel — Отменить заказ

Отменяет заказ с кодом причины. Бесплатно, пока курьер не назначен; дальше действует плата за отмену по тарифу, она возвращается в cancellation_fee (курьеру начисляется компенсация). После забора отмена превращается в возврат на точку (returning). Завершённые, недоставленные и возвращаемые заказы отменить нельзя.
Нужна область доступа orders.write.

POST /v1/orders/{id}/payment — Сообщить об оплате Kaspi QR

Передаёт статус оплаты через Kaspi QR магазина для заказа с наложенным платежом method: kaspi_qr. Курьер может вручить заказ только после paid.
Нужна область доступа orders.write.

POST /v1/orders/{id}/ready — Отметить заказ собранным

Сигнал «заказ собран и готов для курьера». Без него поиск курьера стартует по нормативу сборки точки забора.
Нужна область доступа orders.write.

Трекинг и доказательства

GET /v1/orders/{id}/proof — Получить доказательства вручения

Доказательства вручения: способ, проверен ли код получателя, геоточка и время, принятые наличные и временная ссылка на фото (действует 15 минут — когда истечёт, запросите новую). Доступно после вручения; до этого — 404.
Нужна область доступа orders.read.

GET /v1/orders/{id}/track — Отследить курьера

Последняя позиция курьера и ETA. Не чаще одного раза в 10 секунд на заказ (иначе 429). Позиция видна, пока курьер везёт заказ; до этого — только статус и ETA. Позиция курьера никогда не отправляется вебхуками — опрашивайте этот метод или дайте получателю tracking_url.
Нужна область доступа orders.read.

Точки забора

GET /v1/pickup-points — Список точек забора

Точки забора вашей организации (ведутся в кабинете). Используйте id как pickup.point_id.
Нужна область доступа points.read.

GET /v1/slots — Список слотов доставки

Слоты доставки точки забора на дату. Используйте from свободного слота как scheduled_at с type: slot. В песочнице — двухчасовые слоты каждые два часа с 10:00 до 22:00.
Нужна область доступа orders.read.

Баланс

GET /v1/balance — Получить баланс

Баланс депозита (предоплата) или остаток кредитного лимита (постоплата) вашей организации. В песочнице — постоянный тестовый баланс 1 000 000 ₸. Подпишитесь на вебхук balance.low, чтобы пополнять вовремя.
Нужна область доступа finance.read.

GET /v1/statements — Получить выписку начислений и наложенного платежа

Выписка за период: начисления за доставки и каждый заказ с наложенным платежом, завершённый в местные дни [from, to] (Алматы, не больше 92 дней), — сумма к получению, что принял курьер, способ оплаты и как заказ участвует в расчёте. Наличные зачитываются в счёт ваших доставок при закрытии периода (to_offset → offset); деньги Kaspi QR приходят вам напрямую (kaspi_direct). Если наличных больше, чем стоят доставки, Sapa Moto перечисляет разницу вам (payable_to_client). Те же данные, что «Сверка наложенного платежа» в кабинете. В песочнице выписка пустая.
Нужна область finance.read.

Вебхуки

GET /v1/webhooks — Список адресов вебхуков

Адреса вебхуков среды ключа. Тестовые и боевые адреса раздельные.
Нужна область доступа webhooks.manage.

POST /v1/webhooks — Добавить адрес вебхука

Добавляет адрес. Секрет подписи (whsec_…) возвращается один раз — сохраните его для проверки X-Sapa-Signature. Пустой event_types — подписка на все события. Адрес — только https на публичном хосте. До 10 адресов на среду.
Нужна область доступа webhooks.manage.

PUT /v1/webhooks/{endpointId} — Изменить адрес вебхука

Меняет URL, подписки или статус адреса. status: active включает приостановленный адрес: события, накопленные за время приостановки (до 7 дней), отправляются по порядку. status: disabled останавливает отправку.
Нужна область доступа webhooks.manage.

Вебхуки

balance.low — Баланс ниже порога

Депозит или остаток кредитного лимита опустился ниже вашего порога.

claim.updated — Претензия обновлена

Изменился статус претензии (повреждение, утеря, жалоба).

order.courier_assigned — Курьер назначен

Курьер назначен или заменён (включая передачу заказа другому курьеру).

order.created — Заказ создан

Заказ создан — через API, в кабинете, импортом или диспетчером.

order.delivered — Вручён

Заказ вручён — с доказательствами, а для наложенного платежа — с суммой и способом. Это сигнал отправить покупателю электронный фискальный чек.

order.eta_changed — ETA изменилось

ETA сдвинулось больше вашего порога (по умолчанию 5 минут, настраивает аккаунт-менеджер).

order.failed — Не доставлен

Заказ не удалось вручить; он едет обратно на точку забора.

order.price_changed — Цена изменилась

Изменилась итоговая цена (ожидание, возврат, смена адреса).

order.returned — Возвращён

Заказ возвращён на точку забора.

order.status_changed — Статус изменился

Любой переход статуса — с прежним и новым статусом и кодом причины. Отправляется на каждый переход в порядке версии.

ping — Пинг

Тестовое событие от кнопки «Пинг» в кабинете. На него не подписываются; доставляется всегда.