Получить ключи
Предварительная версия. Этот API активно разрабатывается и пока не открыт для внешних партнёров. Эндпоинты и события с пометкой Запланировано опубликованы для ознакомления и пока недоступны. Оплата и ограничение частоты запросов пока не действуют.
Партнёрский API · v1 · Задания и Посылки

Доставляйте каждую посылку с Atasuai.

Единый набор API для партнёров по доставке в Казахстане, всего с двумя основными сущностями — Задание (задание на забор) и Посылка (каждое место внутри Задания). Принимайте задания, доставляйте до двери (по городу и между городами) и передавайте посылки партнёрским перевозчикам. Интегрируйте свою систему или используйте delivery.atasuai.com панели.

Предварительная версия — пока не обслуживает OAuth 2.0 REST · JSON Песочница включена
Модель интеграции

Все используют один API доставки; передача перевозчику открывается по запросу.

Все партнёры делают одно и то же: забрать, перевезти, доставить. Накладные, этикетки и трек-номера перевозчиков формирует централизованно Atasuai — курьер, у которого есть только телефон, может начать сегодня. Партнёры, способные сами передавать грузы перевозчику, подключают это как дополнительную возможность.

Принимать Задания, выполнять Посылки

Все партнёры

Принимайте задания на забор, забирайте партию целиком, обновляйте статус каждой Посылки и отправляйте подтверждение доставки. Scope deliveries:read · deliveries:write

Отслеживание и этикетки (только чтение)

Все партнёры

У каждой Посылки есть трек-номер и этикетка, только для чтения. Scope tracking:read

Самостоятельная передача → перевозчик

Дополнительная возможность

Бронируйте штрих-коды, печатайте пустые накладные и формируйте опись передачи перевозчику (например, Форма 103 QazPost). Scope consolidation:write

Одно Задание, много Посылок

Два направления Посылки

Продавец объединяет несколько посылок в одно Задание, выбирает интервал забора и публикует его; сегодня это открытый маркетплейс — каждый Агент в сети видит ожидающие Задания, и кто первым вызовет accept , тот и получает (эксклюзивное распределение и 10-минутный таймер переназначения пока Запланировано). Забор — на уровне Задания (курьер забирает партию целиком), а направление — на уровне Посылки — в одном Задании могут быть оба типа ниже, и после забора каждое место идёт по своему destination.

destination: door

Доставка до двери (по городу / между городами)

Работает в собственной сети доставки Atasuai. После забора посылка идёт прямо до двери покупателя — по городу или между городами (в зависимости от зоны обслуживания Агента), без участия сторонних перевозчиков.

  • Доставляется до двери покупателя (в том же или другом городе)
  • Статус полностью формируется из обновлений курьера по каждому месту
  • Используется внутренний трек-номер AD-…, номер перевозчика не расходуется
  • Брать ли оплату при доставке (COD) — решает продавец
AD-4471-02 Внутренний трек-номер
destination: carrier

Передача перевозчику

Первая миля — забор. После забора посылка передаётся в отделение одного из интегрированных сторонних перевозчиков (carrier_code: qazpost / filp / …) — трек-номер перевозчика выдаётся из централизованного пула номеров Atasuai.

  • Доставляется в отделение перевозчика; вы сообщаете статус до момента передачи
  • После передачи отслеживание продолжает перевозчик
  • Трек-номера и этикетки перевозчика выдаются на каждый carrier_code
  • Опись передачи (например, QazPost Form 103) формируется автоматически или самостоятельно
Трек-номер TRK-4471902 Присваивает перевозчик
Две сущности, с которыми вы интегрируетесь

Задания и Посылки

В домене Доставки всего две основные сущности. Задание — задание на забор, опубликованное продавцом и назначенное одному Агенту; Посылка — каждое место внутри Задания, со своим направлением и статусом. Освойте эти две сущности — и вы освоили всю интеграцию доставки.

Задание · задание на забор
// Published by the seller; any online Agent can claim it (first to accept wins)
{
  "id": "job_4471",
  "batch_no": "PB-4471",
  "status": "pending",
  "accept_deadline": "2026-07-22T09:18:32Z",  // informational only, not enforced yet
  "seller": { "name": "Oscar ЖК" },
  "pickup": {
    "address": "Алматы, Абай 150, оф.3",
    "window": { "from": "14:00", "to": "16:00" },
    "pickup_by": "2026-07-22T16:00:00Z"
  },
  "courier": null,              // optional
  "totals": { "package_count": 6, "total_weight_kg": 6.5 },
  "packages": [ "pkg_88213", "…" ]
}
Посылка · место
// Each item within a Job, with its own destination and status
{
  "id": "pkg_88213",
  "job_id": "job_4471",
  "tracking_number": "AI556489715KZ",
  "destination": "carrier",      // door | carrier
  "carrier_code": "qazpost",     // when carrier
  "status": "pending",
  "recipient": { "name": "Елена", "phone": "+7 7•• •••" },
  "weight_kg": 0.7,
  "cod": null
}
Машина состояний

Как меняется статус

Забор — на уровне Задания (партия забирается целиком); доставка/передача — на уровне Посылки (обновляется по каждому месту после забора).

Жизненный цикл Задания
pending ──accept──▶ accepted
   │              │
   │           pickup (whole batch)
   │              ▼
   │         picked_up ──▶ completed
   │
   ├─(auto-reassign on timeout — planned, not enforced)─▶ expired
   └─(seller cancels)────▶ cancelled
Посылка · destination=door
pendingpicked_upin_transitout_for_deliveryverify // OTP verificationdeliveredfailed / returned
Посылка · destination=carrier
pendingpicked_uphanded_off  // Form 103 handoff
  ── carrier takes over ──in_transitdeliveredexception
Подтверждение доставки

Подтверждение одноразовым кодом (OTP) Запланировано

Каждая Посылка с доставкой до двери (destination=door) рассчитана на индивидуальную доставку и подтверждение — получатель подтверждает лично одноразовым кодом от платформы, что исключает получение посторонним. Например: AI0123423443KZ . Всё, что помечено Запланировано — эндпоинт, событие или правило — пока не реализовано и показано только как план; реально работающий сегодня процесс подтверждения доставки — это out-for-delivery / deliver эндпоинты в справочнике API ниже.

Процесс подтверждения доставки Запланировано
// ① The rider arrives at the door and requests a code for this package
POST …/packages/pkg_88213/delivery-code
   → The platform sends an SMS to the recipient / a push to the buyer's app
   → The code goes only to the recipient and is never returned to the partner

// ② The recipient reads out the code and the rider submits it for verification
POST …/packages/pkg_88213/verify
   { "code": "4821" }
   → 200 { "status": "delivered",
           "delivered_at": "2026-07-22T15:12Z" }
Правила одноразового кода Запланировано
  • Код из 4–6 цифр, действует 5 минут.
  • Повторная отправка кода по той же посылке ограничена интервалом не менее 60 секунд , всего до 5 повторных отправок.
  • Успешная проверка означает delivered и служит подтверждением доставки (POD) для этого места.
  • Более 5 неверных попыток подряд блокируют код; нужно отправить новый.
  • Код выдаётся только получателю, и API никогда не возвращает его в открытом виде — это исключает получение посторонним и ввод на стороне партнёра.
  • Если получатель не может принять код, используйте резервное подтверждение (фото / подпись) /packages/{id}/proof.
  • COD посылки: сначала примите оплату, затем проверьте код — подтверждается одним шагом.
  • Применяется только к door; для carrierпоследняя миля после передачи — ответственность перевозчика.
Правила интеграции

Правила (нормативные)

Это жёсткие контракты. Соблюдайте их при интеграции своей системы; если не хотите строить своё — используйте delivery.atasuai.com панель напрямую — возможности идентичны.

  1. Today it's an открытый маркетплейс: every pending Задание видно всем Агентам (GET /jobs?status=pending), и кто первым вызовет accept , тот и получает — опоздавшие получают 409. accept_deadline возвращается, но не применяется; эксклюзивное распределение, 10-минутный таймер и автопереназначение через job.expired — всё это Запланировано.
  2. Задание содержит 1..N Посылок; у каждой независимое destination (door / carrier) и независимый статус. В одном Задании могут быть оба направления.
  3. Забор — на уровне Задания (POST /jobs/{id}/pickup забирает партию целиком); delivery/handoff is at the Посылка level, по каждому месту: POST /packages/{id}/out-for-delivery/deliver (неудачные попытки идут через /delivery-failed, возвраты через /return); carrier handoff is POST /jobs/{id}/handoff. Универсальный POST /packages/{id}/status пока не реализован, Запланировано.
  4. Запланировано Подтверждение доставки: по проекту door посылки подтверждаются одноразовым кодом — /packages/{id}/delivery-code отправляет код, /packages/{id}/verify verifies it as delivered; ни один из эндпоинтов пока не реализован. Сегодняшний аналогичный процесс: POST /packages/{id}/out-for-delivery выдаёт код для посылок door , а POST /packages/{id}/deliver требует этот код (для door) для подтверждения доставки, фото и имя получателя — по желанию.
  5. Курьер не обязателен: POST /jobs/{id}/courier не обязателен — можно продолжить, не назначая курьера (как и в панели).
  6. carrier местам нужна опись передачи: POST /jobs/{id}/handoff формирует её (например, QazPost Form 103), and POST /jobs/{id}/form103 rebuilds it; consolidation:write разрешает самостоятельное использование.
  7. Трек-номера: door использует внутренний номер AD-…; carrier выдаёт трек-номер перевозчика из централизованного пула номеров, по каждому carrier_code.
  8. Минимальные права: ключи несут только выданные scope и открывают доступ только к данным этого tenant; любое превышение (например, обращение к заказам/остаткам) возвращает 403.
  9. Операции записи должны передавать Idempotency-Key (заголовок принимается); однако API Доставки пока не обеспечивает идемпотентный повтор, Запланировано — не полагайтесь на это для защиты от дублей. Ошибки в формате RFC 7807 problem+json; списки используют курсорную пагинацию; ограничение частоты — по tenant.
  10. Два типа интеграторов: продавцы интегрируются, чтобы создавать Задания (jobs:write) + проверять отслеживание (tracking:read); Агенты интегрируются, чтобы принимать и выполнять (deliveries:*, consolidation:write). Ключи агента временно отключены (/oauth/token returns 503 для ключей агента); ключи продавца не затронуты.
  11. Изоляция окружений: open.atasuai.com (production); sandbox.open.atasuai.com Запланировано (сертификат пока не готов, внешне не обслуживает). Префикс ключа кодирует окружение (atk_test_ / atk_live_).
Быстрый старт

От получения ключей до первого запроса

Три шага. Machine-to-machine — без входа пользователя и без редиректов.

ШАГ 01

Получите ключи

Получите client_id and client_secret в партнёрской панели или у Atasuai при подключении. Секрет показывается только один раз. Ключи агента (партнёра по доставке) временно отключены (/oauth/token returns 503 для ключей агента); ключи продавца работают штатно.

ШАГ 02

Обменяйте на токен доступа

Обменяйте ключи на bearer-токен с ограниченными scope, действующий 15 минут (900 секунд).

# POST /oauth/token
curl -u $ID:$SECRET \
  https://open.atasuai.com/oauth/token \
  -d grant_type=client_credentials \
  -d scope="deliveries:write"
ШАГ 03

Примите Задание

Вызовите API со своим токеном. Операции записи требуют Idempotency-Key.

# Accept a pending Job (first come, first served — first to accept wins)
curl -X POST \
  …/delivery/v1/jobs/{id}/accept \
  -H "Authorization: Bearer $TOKEN" \
  -H "Idempotency-Key: $(uuidgen)"
Построено на предсказуемых основах

Основные понятия

Все сущности следуют одним соглашениям — освоив один эндпоинт, вы знаете их все.

OAuth 2.0 и scope

Токены client-credentials несут tenant и набор scope. Вы видите только то, что вам выдано — deliveries:*, tracking:read, and so on.

Идемпотентность Запланировано

Операции записи должны передавать Idempotency-Key — заголовок принимается, но API Доставки пока не выполняет дедупликацию / повтор , поэтому повторы могут создать дубликаты; пока ограничивайте их на своей стороне.

Подписанные вебхуки

Изменения статуса отправляются заранее и подписываются HMAC (sha256={ts}.{body}), с защитой от повторов; повторы идут по схеме 5s, 30s, 2m, 10m, 30m, 2h, 6h, 12h, 24h, 48h — 10 попыток примерно за 4 дня.

Стандартизированные ошибки

RFC 7807 problem+json, со стабильным error_code and a request_id для диагностики — разберите один раз, применяйте везде.

Ограничение частоты

Запланировано. Шлюз сегодня не ограничивает частоту и не возвращает заголовки Retry-After / X-RateLimit-* . Ограничение по tenant появится до запуска.

Песочница Запланировано

Полностью изолированная среда: sandbox.open.atasuai.com is скоро (сертификат пока не готов, внешне не обслуживает). Тот же контракт, тестовые штрих-коды, никаких реальных посылок и денег.

События, приходящие к вам

События вебхуков

Подпишитесь один раз; можно также опрашивать GET /delivery/v1/jobs?status=pending для текущего списка ожидающих. События с пометкой Запланировано пока фактически не отправляются.

Цикл Задания  ·  Atasuai → партнёр

PUSHjob.acceptedАгент принял задание
PUSHjob.courier_assignedНазначен курьер
PUSHjob.picked_upПартия забрана целиком
PUSHjob.completedЗадание выполнено
PUSHjob.cancelledОтменено продавцом
PUSHjob.dispatchedВам назначено новое задание Запланировано
PUSHjob.updatedЗадание изменилось до принятия Запланировано
PUSHjob.expiredНе принято вовремя, переназначено Запланировано

Цикл Посылки  ·  по местам / колбэки перевозчика  Запланировано

PKGpackage.picked_upЗабрано
PKGpackage.handed_offПередано перевозчику
PKGpackage.in_transitВ пути
PKGpackage.out_for_deliveryПоследняя миля
PKGpackage.deliveredДоставлено получателю
PKGpackage.exceptionЗастряло или возвращено
# Проверяйте каждую отправку
X-Atasuai-Signature: sha256=<hex>  X-Atasuai-Timestamp: <unix>
HMAC_SHA256(secret, "{timestamp}.{raw_body}")  ·  reject if older than 5 минут  ·  deduplicate by X-Atasuai-Event-Id
Справочник API

Справочник API

Пути разделены по домену и версионированы. Эндпоинты с пометкой Запланировано пока не реализованы и показаны только как план. Полный интерактивный справочник — на сайте документации.

МетодЭндпоинтScope
Задания · /delivery/v1
GET/delivery/v1/jobs?status=pending (все ожидающие задания, видны всем)deliveries:read
GET/delivery/v1/jobs/{id} (с посылками)deliveries:read
POST/delivery/v1/jobs/{id}/accept (кто первый — того и задание; возвращает 409, если уже принято)deliveries:write
POST/delivery/v1/jobs/{id}/declinedeliveries:write
POST/delivery/v1/jobs/{id}/courier (необязательно)deliveries:write
POST/delivery/v1/jobs/{id}/pickup (забрать партию целиком)deliveries:write
POST/delivery/v1/jobs/{id}/complete (picked_up → completed)deliveries:write
POST/delivery/v1/jobs/{id}/handoff (Форма 103 / опись передачи)consolidation:write
POST/delivery/v1/jobs/{id}/form103 (пересобрать Форму 103 QazPost)consolidation:write
POST/delivery/v1/jobs (продавец создаёт задание) Запланированоjobs:write
POST/delivery/v1/jobs/{id}/cancel (продавец отменяет) Запланированоjobs:write
Посылки · /delivery/v1
GET/delivery/v1/jobs/{id}/packagesdeliveries:read
GET/delivery/v1/packages/{id}deliveries:read
GET/delivery/v1/packages/{id}/delivery (состояние последней мили, код никогда не возвращается)deliveries:read
POST/delivery/v1/packages/{id}/out-for-delivery (начать/повторить последнюю милю; для door отправляет код)deliveries:write
POST/delivery/v1/packages/{id}/deliver (подтвердить доставку; для door нужен код, фото/имя получателя необязательны)deliveries:write
POST/delivery/v1/packages/{id}/delivery-failed (зафиксировать неудачную попытку, можно повторить)deliveries:write
POST/delivery/v1/packages/{id}/return (отметить как возврат)deliveries:write
POST/delivery/v1/packages/{id}/status (статус по каждому месту) Запланированоdeliveries:write
POST/delivery/v1/packages/{id}/delivery-code (отправить одноразовый код) Запланированоdeliveries:write
POST/delivery/v1/packages/{id}/verify (проверить код и подтвердить) Запланированоdeliveries:write
POST/delivery/v1/packages/{id}/proof (резервное подтверждение / COD) Запланированоdeliveries:write
GET/delivery/v1/packages/{id}/label Запланированоtracking:read
GET/delivery/v1/tracking/{tracking_number} Запланированоtracking:read
POST/delivery/v1/packages/{id}/location (не включено) Запланированоdeliveries:write
Вебхук · /delivery/v1
POST/delivery/v1/webhook-subscriptionswebhooks:manage

Предварительная версия: пробуйте на продакшене, песочница скоро.

Создайте ключи API в партнёрской панели или получите их у менеджера Atasuai при подключении (Ключи агента временно отключены; ключи продавца работают штатно). Нет своей системы? Ведите весь автопарк в панели Atasuai — те же возможности, ничего разрабатывать не нужно.