API курьерской службы «Рултек»

Создание заказов и получение статусов из вашей системы — без личного кабинета и без участия оператора.

Версия 1.0 · 27.08.2026 https://api.rultek.ru/api

1Общие сведения

Базовый адресhttps://api.rultek.ru/api
Формат запросаJSON, заголовок Content-Type: application/json
Формат ответаJSON, заголовок Accept: application/json
КодировкаUTF-8
АутентификацияBearer-токен

Адреса в этом документе указаны относительно базового: полный путь создания заказа — https://api.rultek.ru/api/external/server/orders.

Заголовок Accept: application/json обязателен. Без него ошибки валидации возвращаются HTML-страницей вместо JSON.

Спецификация OpenAPI 3.0 — импортируется в Postman и подходит для генерации клиента.

2Аутентификация

Каждый запрос сопровождается заголовком:

Заголовок
Authorization: Bearer <ваш токен>

Токен выдаёт администратор «Рултек» для учётной записи вашей компании. Токен постоянный: срока действия не имеет, продления не требует, процедуры входа в этом интерфейсе нет.

  • Токен равнозначен паролю. Храните его в защищённом хранилище, не публикуйте в репозитории и не передавайте по открытым каналам.
  • Повторная выдача отзывает предыдущий токен. Старый перестанет работать немедленно, и интеграция встанет до замены значения.
  • Компания определяется токеном. Указывать её в запросах не нужно, а увидеть чужие заказы по чужим номерам невозможно.

При компрометации токена сообщите менеджеру — мы отзовём его и выдадим новый.

3Соглашения

Дата и время

В запросах время передаётся в формате ISO 8601. Указывайте часовой пояс явно:

Пример
2026-08-28T09:30:00+03:00
Частая ошибка при подключении

Значение без указания пояса трактуется как UTC. Московское время, отправленное без смещения, приедет на три часа раньше — курьер получит задание не на то время.

В ответах время приходит строкой ГГГГ-ММ-ДД ЧЧ:ММ:СС по московскому времени.

Денежные значения

Все суммы — целые числа в рублях. Порядок налогообложения определяется вашим договором.

Коды ответов

КодЗначениеЧто делать
200Успешный запрос статусов
201Заказ создансохранить номера из ответа
400Учётная запись не привязана к компанииобратиться к менеджеру
401Токен отсутствует, неверен или отозванпроверить заголовок Authorization
403Учётная запись заморожена или не имеет правобратиться к менеджеру
422Ошибка в данных запросаисправить данные, см. тело ответа
429Слишком много запросовподождать столько секунд, сколько указано в Retry-After
500Внутренняя ошибкаповторить позже, при повторении — сообщить нам

Формат ошибок

Ошибки валидации приходят в стандартном виде, ключи в errors соответствуют именам полей запроса:

422 Unprocessable Content
{
  "message": "Номер заказа: ожидается вид R000000000.",
  "errors": {
    "order": ["Номер заказа: ожидается вид R000000000."]
  }
}

Остальные ошибки содержат только message.

4Нумерация

R000196340 номер заказа - · 001 номер квитанции

Строка целиком — номер накладной. Заказ выступает контейнером: внутри него может быть несколько квитанций.

Обычный заказ состоит из одной квитанции. Их становится несколько, когда по одному заказу выполняется несколько поездок — подробнее в разделе «Несколько квитанций».

Что сохранять у себя

Сохраняйте номер заказа. Он не меняется и покрывает все последующие поездки: запрос статуса по нему возвращает все квитанции сразу, включая те, о которых вы на момент создания заказа не знали.

5Создание заказа

POST /external/server/orders

Создаёт заказ с одной накладной. Если передать order, накладная станет очередной квитанцией существующего заказа — так объединяются заявки, которые должны быть выполнены одной поездкой.

Формально обязательных полей нет — валидатор пропустит и полупустой запрос. Но заказ без адресов и времени выполнить невозможно, поэтому поля с пометкой «нужное» заполняйте всегда.

Поля верхнего уровня

ПолеТипОписание
orderстрокаНомер существующего заказа (R000196340) — новая квитанция ляжет в него. Без этого поля открывается новый заказ
type_of_deliveryчисло / строканужноеТип доставки, см. справочник
how_payчисло / строканужноеСпособ оплаты, см. справочник
visit_timeдата-времянужноеКогда курьер приезжает к отправителю. Без значения — текущий момент плюс 90 минут
delivery_timeдата-времяКогда груз должен быть вручён. Не раньше visit_time
visit_period_toдата-времяКонец интервала приезда, если приезд задан «с … до …»
delivery_period_toдата-времяКонец интервала вручения
weightчислоВес груза, кг. Влияет на тариф
width, height, depthцелоеГабариты, см. Влияют на тариф
cargo_descriptionстрока (1000)Что везём
refundбулевоОбратная доставка: курьер возвращается от получателя к отправителю
personallyбулевоВручить лично в руки
rentбулевоАренда курьера
loadбулевоНужна погрузка у отправителя
unloadбулевоНужна разгрузка у получателя
loader_countцелое 1–8Количество грузчиков
remarkстрока (255)Примечание. Рекомендуем передавать здесь ваш номер заказа — он виден нашим логистам и возвращается в статусе
client_linkстрока (512)Ссылка на заказ в вашей системе
client_emailстрока (256)Почта для уведомлений
client_contactsстрока (512)Контактное лицо со стороны заказчика

Адреса

Объекты sender (отправитель) и recipient (получатель) имеют одинаковый набор полей.

ПолеТипОписание
nameстрока (255)нужноеНазвание организации или имя
addressстрока (255)нужноеАдрес одной строкой
contactsстрока (512)нужноеКонтактное лицо и телефон
y, xчислонужноеКоординаты: широта и долгота
additionстрока (255)Уточнение: офис, этаж, корпус
importantlyстрока (255)Важное для курьера, показывается отдельной пометкой
commentстрока (2000)Комментарий
postal_indexстрока (10)Почтовый индекс
floorцелоеЭтаж
elevatorбулевоЕсть лифт
carryingбулевоТребуется пронос
Координаты определяют тариф

Тарифная зона — Москва, МКАД, километраж, регион — вычисляется по y и x. Без координат зона остаётся неизвестной, и стоимость поездки рассчитать нельзя. Передавайте координаты всегда, когда они у вас есть.

Пример запроса

curl
curl -X POST https://api.rultek.ru/api/external/server/orders \
  -H "Authorization: Bearer <токен>" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{
    "type_of_delivery": "foot",
    "how_pay": "invoice",
    "visit_time": "2026-08-28T10:00:00+03:00",
    "delivery_time": "2026-08-28T14:00:00+03:00",
    "weight": 0.3,
    "cargo_description": "Пакет документов",
    "remark": "V246-702-458-122",
    "sender": {
      "name": "ООО «Пример»",
      "address": "Москва, ул. Тверская, д. 1",
      "contacts": "Иванова Мария, +7 900 000-00-00",
      "y": 55.757, "x": 37.611,
      "floor": 3, "elevator": true
    },
    "recipient": {
      "name": "АО «Получатель»",
      "address": "Москва, Ленинский пр-т, д. 20",
      "contacts": "Петров Сергей, +7 900 111-11-11",
      "y": 55.712, "x": 37.586
    }
  }'

Ответ

201 Created
{
  "number": "R000196340-001",   // номер накладной, он же в документах
  "order":  "R000196340"        // номер заказа — для запроса статусов
}

6Статусы и стоимость

GET /external/server/orders/status

Возвращает состояние поездки, фактические данные и стоимость. Ответ всегда массив, даже если строка одна: по одному заказу может быть несколько квитанций.

Параметры

ПараметрОписание
orderНомер заказа R000196340 — вернутся все его квитанции
numberНомер накладной R000196340-001 — вернётся одна
date_fromНачало периода по дате приезда, ГГГГ-ММ-ДД, включительно
date_toКонец периода по дате приезда, включительно
  • order и number взаимоисключающие — вместе дают ошибку 422;
  • order можно дополнить периодом — вернутся квитанции этого заказа с приездом в эти даты;
  • период без номера возвращает все ваши накладные за эти дни;
  • период задаётся обеими границами и не может превышать 31 день;
  • запрос без единого параметра отклоняется.

Порядок строк: внутри заказа — по номеру квитанции, в выборке по датам — по времени приезда.

Примеры запросов

curl
# все квитанции заказа
curl -G https://api.rultek.ru/api/external/server/orders/status \
  -H "Authorization: Bearer <токен>" -H "Accept: application/json" \
  -d order=R000196340

# конкретная накладная
curl -G https://api.rultek.ru/api/external/server/orders/status \
  -H "Authorization: Bearer <токен>" -H "Accept: application/json" \
  -d number=R000196340-001

# всё, что приезжало за день
curl -G https://api.rultek.ru/api/external/server/orders/status \
  -H "Authorization: Bearer <токен>" -H "Accept: application/json" \
  -d date_from=2026-08-27 -d date_to=2026-08-27

Ответ

200 OK
{
  "data": [
    {
      "number": "R000196340-001",
      "status": "завершён",
      "remark": "V246-702-458-122",
      "delivery": "Колотур",
      "delivery_time": "2026-08-27 14:56:00",
      "return": "-",
      "return_time": "-",
      "back": "no",
      "type_of_delivery_ab": "бандероль до 5 кг",
      "weight_ab": "4.0",
      "type_of_delivery_ba": "-",
      "weight_ba": "-",
      "price": 1170,
      "waiting": 0,
      "load_unload": 0
    }
  ]
}

Поля ответа

ПолеТипОписание
numberстрокаНомер накладной
statusстрокаСостояние заказа, см. справочник
remarkстрокаПримечание к накладной — как правило, ваш номер заказа
deliveryстрокаКто принял груз у получателя
delivery_timeстрокаКогда груз вручён
returnстрокаКто принял возвращённый груз
return_timeстрокаКогда возврат доставлен
backстрокаyes — была обратная доставка, no — не было
type_of_delivery_abстрокаВид отправления «туда»
weight_abстрокаРасчётный вес «туда», кг
type_of_delivery_baстрокаВид отправления «обратно»
weight_baстрокаРасчётный вес «обратно», кг
priceчисло / nullСтоимость доставки
waitingчисло / nullОплата ожидания курьера
load_unloadчисло / nullОплата погрузочно-разгрузочных работ

Клиентам, работающим по агентской схеме, дополнительно приходят поля price_base, waiting_base и load_unload_base — базовая стоимость, рекомендованная для расчёта с вашим заказчиком. Если этих полей в ответе нет, схема к вам не применяется.

Как читать значения

Прочерк в текстовом поле означает, что данные ещё не внесены либо не заполняются по характеру услуги: у доставки без возврата поля возврата всегда прочеркнуты.

null — это не ноль

null в денежном поле означает, что стоимость ещё не определена: заказ не завершён либо маршрут выходит за пределы тарифной сетки (межгород, удалённый регион) и цена согласуется отдельно.

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

Стоимость появляется, когда заказ переходит в состояние «завершён», и после этого не меняется — кроме случаев ручной корректировки нашим расчётным отделом.

7Предварительный расчёт

POST /external/server/calculate

Считает стоимость по маршруту до оформления заказа. Варианты доставки считаются пачкой: один запрос на маршрут вместо отдельного обращения на каждый вид.

Цена рассчитывается по вашей тарифной схеме — той же, по которой потом выставляется счёт. Скидка за объём поездок здесь не применяется: на момент прикидки месяц ещё не набран.

Параметры

ПолеТипОписание
sender.y, sender.xчислообязательноКоординаты отправителя
recipient.y, recipient.xчислообязательноКоординаты получателя
weightчислоВес груза, кг — общий для всех вариантов
width, height, depthцелоеГабариты, см — общие для всех вариантов
optionsмассивЧто посчитать. Не передан — считаем все виды доставки

Элемент options — либо строка с типом доставки ("foot"), либо объект, где можно задать свои вес и габариты для этого варианта: { "type_of_delivery": "van", "weight": 400 }. За один запрос не более десяти вариантов.

Пример

curl
curl -X POST https://api.rultek.ru/api/external/server/calculate \
  -H "Authorization: Bearer <токен>" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{
    "sender":    { "y": 55.757, "x": 37.611 },
    "recipient": { "y": 55.712, "x": 37.586 },
    "weight": 0.3,
    "options": ["foot", "auto"]
  }'
200 OK
{
  "data": [
    { "type_of_delivery": "пешая", "shipment": "письмо",       "weight": "0.3", "zone": "Москва", "price": 830 },
    { "type_of_delivery": "авто",  "shipment": "автодоставка", "weight": "0.3", "zone": "Москва", "price": 3290 }
  ]
}

Поля ответа

ПолеОписание
type_of_deliveryЗапрошенный вид доставки
shipmentВид отправления, которым поездка будет оплачена, — с учётом веса и габаритов
weightРасчётный вес: больший из фактического и объёмного
zoneТарифная зона маршрута
priceСтоимость доставки, либо null

Клиентам на агентской схеме дополнительно приходит price_base — базовая стоимость для их заказчика.

Когда цена не рассчитывается

null означает, что маршрут выходит за пределы тарифной сетки. Это зоны Регион, Мск-Спб и Спб-Мск — межгород в обе стороны. Такие перевозки считаются отдельно, обратитесь к менеджеру. Поле zone при этом заполнено и показывает, о какой зоне идёт речь; null приходит и тогда, когда зону не удалось определить по координатам.

Вид отправления может отличаться от запрошенного: пешая доставка при весе 400 кг будет посчитана как минивен — правила перехода описаны в справочниках.

8Несколько квитанций в одном заказе

Обычно заказ — это одна поездка и одна квитанция -001. Дополнительные квитанции появляются, когда по заказу выполняется несколько поездок:

СлучайЧто происходит
Ложный приездКурьер приехал, а груз не отдали — например, не готовы документы. Приезд оплачивается, поездка закрывается квитанцией -001, на повторный выезд оформляется -002
Дополнительное плечоВ заказе указан маршрут А→Б, но в комментарии названы ещё адреса — каждое следующее плечо оформляется отдельной квитанцией
ВеерНесколько поездок из одной точки
СвязкаВы прислали два заказа с просьбой выполнить их одним курьером, и мы объединили их в один заказ

Пример: ложный приезд и повторный выезд

200 OK · поля сокращены
{
  "data": [
    {
      "number": "R000196340-001",
      "status": "завершён",
      "delivery": "груз не приняли",
      "delivery_time": "2026-08-27 11:20:00",
      "price": 830, "waiting": 0, "load_unload": 0
    },
    {
      "number": "R000196340-002",
      "status": "завершён",
      "delivery": "Колотур",
      "delivery_time": "2026-08-28 14:56:00",
      "price": 830, "waiting": 300, "load_unload": 0
    }
  ]
}

Отсюда два практических следствия:

  1. Обрабатывайте ответ как массив. Итоговая стоимость по заказу — сумма всех строк.
  2. Опрашивайте по номеру заказа, а не накладной. Запрос по order покажет все квитанции, включая те, о которых вы при создании заказа не знали.

Как объединить свои заявки

Если вы заранее знаете, что две ваши заявки должны стать одной поездкой, передайте во втором запросе на создание поле order с номером заказа из первого ответа. Вторая накладная станет квитанцией -002 того же заказа, и опрашивать вы будете один номер вместо двух.

Дописывать квитанции можно только в собственные заказы. Чужой и несуществующий номер дают одинаковую ошибку 422 с текстом «Заказ не найден».

9Справочники

Тип доставки — type_of_delivery

Принимается как число, так и текстовый ключ.

ЧислоКлючЗначение
1footпешая
2giftsподарки, в том числе цветы (до 5 кг)
3autoавто
4vanминивен
5cargoгрузовая
6escortсопровождение

Способ оплаты — how_pay

ЧислоКлючЗначение
1invoiceпо счёту
2cashналичными
3electronicэлектронно

Состояния заказа — status

ЗначениеЧто означает
созданЗаказ принят, ещё не обработан логистом
в работеНазначен курьер, поездка выполняется
завершёнПоездка закончена, стоимость определена
не подтверждёнТребуется уточнение с вашей стороны
отменёнЗаказ отменён
уточняетсяПромежуточное состояние; если задерживается — обратитесь к менеджеру

Состояние «завершён» — это в том числе ложный приезд, когда груз не приняли. В таком случае в поле delivery вместо фамилии стоит пояснение, а поездка оплачивается.

Как вес и габариты влияют на тариф

Вид отправления определяем мы — из типа доставки, веса и габаритов. Учитывается больший из двух весов: фактический и объёмный, где объёмный равен произведению длины, ширины и высоты в сантиметрах, делённому на 5000.

УсловиеРезультат
свыше 0,5 кгписьмо переходит в бандероль
свыше 5 кгподарки и цветы переходят в бандероль
от 10 кгпешая доставка переходит в авто
свыше 350 кгпереход в минивен
свыше 450 кгпереход в грузовую
объём от 0,33 м³переход в минивен
объём от 1 м³переход в грузовую

Поэтому заказ, оформленный как пешая доставка, при указании веса 15 кг будет выполнен и оплачен как авто. Указывайте вес и габариты честно: это избавит от расхождений в счёте.

Виды отправления в ответе

письмо · бандероль · бандероль до 1 кг · бандероль до 3 кг · бандероль до 5 кг · бандероль более 5 кг · подарки, в т.ч. цветы (до 5 кг) · автодоставка · минивен · грузовая доставка · сопровождение

Если вид отправления в поездке не уточнялся, доставка считается письмом — так она и отображается в ответе.

10Эксплуатация

Частота запросов

Ограничение

Не более 60 запросов в минуту — в среднем один в секунду. Лимит считается по вашей учётной записи. При превышении приходит ответ 429 с заголовком Retry-After: в нём число секунд, через которое можно продолжать.

На практике столько и не нужно. Пока статус не «завершён», стоимость не появится, а после завершения смысл в частом опросе пропадает. Для регулярной сверки делайте один запрос за период вместо сотен запросов по отдельным номерам: за один вызов возвращаются все накладные с приездом в эти дни.

Что сохранять у себя

Номер заказа — обязательно, номер накладной — для сверки документов. Свой собственный номер передавайте в remark: он будет виден нашим логистам и вернётся в ответе.

Повторные запросы

Повторная отправка одного и того же заказа создаёт новый заказ — защиты от дублей по содержимому нет. Если ответ не получен из-за обрыва связи, проверьте статус за нужную дату перед повторной отправкой.

Сверка сумм

Значения price, waiting и load_unload соответствуют тем, что попадут в счёт. Разница возможна, если наш расчётный отдел скорректировал стоимость вручную — тогда в статусе будет актуальное значение.

11Поддержка

По вопросам подключения, выдачи токена и расхождений в расчётах обращайтесь к вашему менеджеру в «Рултек».

При обращении по технической проблеме приложите номер заказа или накладной, дату и время запроса, отправленное тело запроса и полученный ответ с кодом.