Обзор
Заказ создаётся одним запросом POST на эндпоинт выше. Тело — JSON с данными получателя и, при необходимости, списком позиций. Для доступа нужен ключ API партнёра (см. «Ключ API»). Ответ всегда в формате JSON в обёртке result.
- Протокол: HTTPS рекомендуется в продакшене; хост и точный URL вы берёте из строки эндпоинта на этой странице
- Кодировка тела: UTF-8
- Основной тип содержимого:
Content-Type: application/json
- Альтернатива (удобно для PHP и старых интеграций):
application/x-www-form-urlencoded с одним полем data — его значение это строка JSON с теми же полями, что и при прямой отправке JSON
- Это API Ket Logistic, не внешние сервисы третьих сторон; контракт ниже описывает только приём заказа в нашу систему
Чек-лист для подключения партнёра
- Получить у менеджера Ket Logistic ключ API и убедиться, что карточка партнёра в системе активна
- Реализовать вызов только с вашего бэкенда (сервер магазина, CRM, 1С и т.д.) — не из браузера покупателя
- Передавать ключ в заголовке
Authorization: Bearer … или X-API-Key (см. «Авторизация»)
- Отправлять обязательные поля: телефон, ФИО, полный адрес доставки; при необходимости —
external_id для идемпотентности
- Обрабатывать HTTP-коды и JSON: успех 201 (новый заказ), 200 (повтор с тем же
external_id), ошибки 401 / 400 / 500
- Сохранять возвращаемый
result.id — внутренний номер заказа у Ket Logistic для сверки с панелью
Ключ API: где получить и как использовать
Где. Ключ привязан к вашей компании как к партнёру Ket Logistic. Его выдаёт и при необходимости обновляет наша служба (сотрудники с доступом к внутренней панели управления): в карточке партнёра → блок «Интеграция API» — там отображается текущий ключ и кнопка копирования. Эта страница документации не содержит входа в панель и не предназначена для получения ключа — для этого свяжитесь с вашим менеджером Ket Logistic.
Как создаётся. После первого сохранения карточки партнёра в системе ключ генерируется автоматически (один уникальный ключ на партнёра). Сотрудник может сгенерировать новый ключ в той же карточке — тогда предыдущий перестаёт действовать, и обновить ключ нужно во всех ваших системах (CRM, сайт, 1С).
Как передавать в запросах (рекомендуется). В заголовках HTTP (см. «Авторизация»): Authorization: Bearer … или X-API-Key. Так безопаснее для логов и прокси.
Альтернатива. Ключ можно передать в теле JSON полем api_key (если заголовки недоступны в вашей среде). Этот способ менее предпочтителен: ключ чаще попадает в лишние логи. Не вставляйте ключ в клиентский JavaScript, мобильные приложения и открытые репозитории — только обмен сервер-сервер.
Если партнёр отключён в системе (неактивен), запросы с даже верным ключом не принимаются.
Структура заказа (JSON)
Минимально нужны три поля получателя и доставки. Остальное — для синхронизации с вашей системой и для отображения состава в панели.
Полный пример
{
"recipient_phone": "+77028540451",
"recipient_name": "Иванов Иван Иванович",
"delivery_address": "г. Алматы, ул. Абая, д. 150, кв. 25",
"external_id": "SHOP-2026-1001",
"comment": "Позвонить за час",
"items": [
{ "name": "tovar_sku_a", "quantity": 2, "price": "5000.00" },
{ "name": "tovar_sku_b", "quantity": 1, "price": "3200.50" }
]
}
Если items не передать, но указать одну строку offer (как в старых интеграциях), будет создана одна позиция с этим названием.
Как данные отображаются в системе
После успешной отправки заказ попадает в работу диспетчеров: в списке заказов с колонками, соответствующими полям API. Соответствие полей и интерфейса:
| Поле в API | В системе | Где смотреть |
recipient_name / name | ФИО получателя | Колонка «Получатель» |
recipient_phone / phone | Телефон | «Телефон» |
delivery_address / addr | Адрес доставки | «Адрес и комментарий» (первая строка) |
comment / description | Комментарий к заказу | «Адрес и комментарий» (вторая строка, при наличии) |
external_id / order_id | Внешний номер у партнёра | «Внешн. №» |
items[] или offer | Позиции заказа | «Состав» (до двух строк + счётчик) |
| — | Партнёр | Определяется по ключу API — колонка «Партнёр» |
| — | Внутренний № | Колонка «№» — наш id после создания |
Поиск на странице заказов учитывает ФИО, телефон, адрес, комментарий, внутренний и внешний номер.
Авторизация
Ключ обязателен при каждом запросе. Допустим один из вариантов (приоритет сверху вниз):
| Способ | Как передать |
| Заголовок Bearer | Authorization: Bearer <ВАШ_КЛЮЧ> |
| Заголовок ключа | X-API-Key: <ВАШ_КЛЮЧ> (допускается также X-Api-Key) |
| Поле в JSON | "api_key": "<ВАШ_КЛЮЧ>" в теле запроса (вместе с остальными полями заказа) |
Если ключ отсутствует или не совпадает с активным партнёром — ответ 401. У неактивного партнёра приём заказов также отклоняется.
Поля запроса (JSON)
Имена ниже — канонические. Для совместимости с другими схемами принимаются алиасы (одна колонка «или»).
| Поле | Обязательно | Описание |
recipient_phone | да | Телефон получателя (пробелы в номере допустимы, при обработке сжимаются) |
recipient_name | да | ФИО получателя |
delivery_address | да | Полный адрес доставки одной строкой |
external_id | нет | Ваш внешний номер заказа для синхронизации; уникален в рамках партнёра (повтор с тем же значением не создаёт второй заказ — см. ответ) |
comment | нет | Комментарий к заказу |
items | нет* | Массив позиций заказа. Если не передан и нет offer, будет создана одна служебная позиция для ручного уточнения |
offer | нет* | Одна текстовая строка вместо состава (если массив items не передан): из неё создаётся одна позиция с количеством 1 |
api_key | нет† | Ключ API в теле JSON — только если не используете заголовки (см. авторизация) |
* Обязательно либо осмысленный items/offer, либо пустой состав (служебная строка в панели). † Обязателен ключ в запросе любым из способов из раздела «Авторизация».
Алиасы полей (совместимость)
| Каноническое поле | Допустимые алиасы |
recipient_phone | phone |
recipient_name | name |
delivery_address | addr |
external_id | order_id |
comment | description |
Позиции заказа (items)
Каждый элемент массива items — объект с полями:
| Поле | Обязательно | Описание |
name | да | Наименование позиции (строка) |
quantity | нет | Целое число, по умолчанию 1; допустимый диапазон 1…9999 |
price | нет | Цена за единицу (число или строка с десятичной дробью); по умолчанию 0 |
Пустые или некорректные элементы массива пропускаются. Если ни одна позиция не пришла, но передан offer, создаётся одна позиция из этой строки.
Ответ сервера
Всегда JSON. Поле result.success — булево значение JSON (true / false), не строка.
Новый заказ создан
HTTP 201 Created. Внутренний идентификатор заказа в Ket Logistic — строка в result.id (его стоит сохранять у себя для сверки).
{
"result": {
"success": true,
"message": "200 OK",
"id": "12345"
}
}
Повтор того же external_id
Если вы снова отправляете запрос с external_id, который уже был успешно принят для вашего партнёра, второй заказ не создаётся. Возвращается HTTP 200 OK, тот же id и признак дубликата:
{
"result": {
"success": true,
"message": "Заказ с таким external_id уже существует.",
"id": "12345",
"duplicate": true
}
}
Примеры
curl (JSON)
curl -X POST "https://api.ketkz.kz/api/v1/orders/" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ВАШ_КЛЮЧ" \
-d '{
"recipient_phone": "+77028540451",
"recipient_name": "Иванов Иван",
"delivery_address": "г. Алматы, ул. Абая, 150, кв. 25",
"external_id": "SHOP-1001",
"items": [
{"name": "tovar_a", "quantity": 2, "price": "5000.00"}
]
}'
Поле data (form-urlencoded)
curl -X POST "https://api.ketkz.kz/api/v1/orders/" \
-H "X-API-Key: ВАШ_КЛЮЧ" \
-d 'data={"recipient_phone":"+77028540451","recipient_name":"Иванов","delivery_address":"г. Алматы, ул. Абая, 150"}'
В значении data — одна JSON-строка; кавычки внутри экранируйте по правилам вашей оболочки.
Ключ в теле JSON (если нельзя задать заголовки)
curl -X POST "https://api.ketkz.kz/api/v1/orders/" \
-H "Content-Type: application/json" \
-d '{
"api_key": "ВАШ_КЛЮЧ",
"recipient_phone": "+77028540451",
"recipient_name": "Иванов Иван",
"delivery_address": "г. Алматы, ул. Абая, 150"
}'
Ошибки и коды HTTP
| HTTP | Когда |
| 401 | Нет ключа, неверный ключ, партнёр неактивен |
| 400 | Не передано одно из обязательных полей (recipient_phone, recipient_name, delivery_address) или невалидный JSON в data |
| 500 | Внутренняя ошибка при сохранении (текст уточнения в result.message) |
При ошибке result.success равен false. Примеры:
401 — ключ не передан
{
"result": {
"success": false,
"message": "Укажите ключ API (заголовок Authorization: Bearer … или X-API-Key)."
}
}
401 — неверный ключ или партнёр неактивен
{
"result": {
"success": false,
"message": "Неверный ключ API или партнёр неактивен."
}
}
400 — не хватает поля
{
"result": {
"success": false,
"message": "Обязательное поле: delivery_address (адрес доставки)."
}
}
Точный текст message может уточняться; ориентируйтесь на код HTTP и на то, какое поле не прошло проверку.
Ограничения и поведение
external_id — до 100 символов (лишнее обрезается)
- Телефон получателя — до 30 символов после нормализации пробелов
- ФИО получателя — до 200 символов
- Наименование позиции (
items[].name) — до 250 символов
- Количество в позиции — целое от 1 до 9999
- Выгрузка списка заказов и статусов через отдельный публичный URL в этой версии API не предусмотрена — учёт ведётся в панели Ket Logistic; при необходимости обсудите с менеджером отдельные сценарии
Безопасность и рекомендации
- Храните ключ только на сервере; не вшивайте в мобильные приложения и фронтенд магазина
- При смене ключа в панели обновите его во всех системах, которые бьют в API
- Используйте HTTPS при обращении к API в продакшене
- Для идемпотентности повторных отправок используйте стабильный
external_id на стороне магазина