iPost REST API
API Version: 1.28
- iPost REST API
- Getting started
- Authentication
- Edges
- Edge: /orders (Заказы)
- Получение всех заказов
- Получение подробной информации по заказу
- Создание заказа
- FormOrderAddress : Object
- FormOrderPickup : Object
- FormOrderDelivery : Object
- FormOrderParcel : Object
- FormOrderRedelivery : Object
- FormOrderCodToAccount : Object
- FormOrderPaymentTypeEnum : integer
- FormOrderPaymentSplit : Object
- FormOrderTargetPaymentTypeEnum : integer
- FormOrderDeliveryFinanceTypeEnum : integer
- FormOrderDeliveryRedeliveryTypeEnum : integer
- Разьяснения по оплате
- Редактирование существующего заказа
- Отмена заказа
- Получить список причин отмены заказа
- Получить стикер для доставки
- Оставить отзыв об исполнении заказа
- Изменить отзыв об исполнении заказа
- Удалить отзыв об исполнении заказа
- Получить отзывы об исполнении заказа
- Получить локацию курьера
- Получить все отзывы о курьере
- Отзывы на заказы
- Edge: /cards (Платежные карты)
- Edge: /transactions (Транзакции)
- Уведомления о состоянии заказа
- Типы данных
- Order : Object
- OrderCancelReasonDesc : Object
- OrderShort : Object
- OrderDelivery : Object
- OrderRedelivery : Object
- OrderCodToAccount : Object
- OrderAddress : Object
- OrderPickup : Object
- OrderParcel : Object
- PaymentCard : Object
- OrderStatusEnum : integer
- OrderReasonEnum : integer
- OrderPaymentTypeEnum : integer
- OrderPaymentSplit : Object
- OrderTariffTypeEnum : integer
- OrderTargetStatusEnum : integer
- OrderTargetReasonEnum : integer
- OrderTargetPaymentTypeEnum : integer
- OrderCodToAccountStatusEnum : integer
- OrderDeliveryFinanceTypeEnum : integer
- OrderDeliveryRedeliveryTypeEnum : integer
- Transaction : Object
- TransactionTypeEnum : integer
- OrderCancelReason: Object
- CourierInfo : Object
- CourierReview : Object
- CourierReviewAuthorTypeEnum : integer
- Image : Object
- Review : Object
- ReviewMeta : Object
- Location : Object
- NullLocation : Object
- NotifyOrderStatusEnum : string
- NotifyOrderReasonEnum : string
- NotifyPickupUpdate : Object
- NotifyDeliveryUpdate : Object
- NotifyRedeliveryUpdate : Object
- NotifyCodToAccountUpdate : Object
- NotifyOrderTargetStatusEnum : string
- NotifyOrderTargetReasonEnum : string
- NotifyCodToAccountStatusEnum : string
- NavLinks : Object
- NavMeta : Object
- Errors
- Важная заметка касательно обновления 1.10
- Changelog
Getting started
Запрос к API
API_URL: https://api.ipost.life/public/v1
API_URL нужно считать как начальную часть url’а для запроса.
Т.е. конечный урл запроса должен состоять из начального url и части, указанной в описании каждого конкретного метода API.
Пример
Для метода: GET /orders урл запроса будет: {API_URL}/orders т.е.: https://api.ipost.life/public/v1/orders
Запросы, требующие отправки сообщения (HTTP BODY) должны быть отосланы с HTTP хедером Content-Type: application/x-www-form-urlencoded или Content-Type: application/json, и быть закодированными соответственно указанному в запросе Content-Type.
Ответ API
Сервер отвечает в формате JSON.
В случае успеха сервер возвращает http код 200 с ожидаемым ответом.
В случае возникновения ожидаемой ошибки, сервер возвращает ответ об ошибке с http кодом 422.
В таком случае сервер возвращает тело ответа, которое рекомендуется парсить и разбирать ошибки.
{
"code": {code},
"message": {message}
}
Где {code} - это (integer) номер ошибки, а {message} - это (string) текстовое описание ошибки.
Подробнее коды ошибок описаны в разделе Errors.
Внимание!
Ответы с другими http кодами могут содержать неожиданный ответ, потому его не рекомендуется парсить, а полагаться только на http код.
В случае неудачной идентификации/авторизации пользователя сервер отвечает с http кодом 401.
Так же сервер может вернуть ошибки 403, 404, 500, и прочие. При нормальном ходе работы их возникать не должно, потому любые http коды ошибок, не обозначенные выше, должны считаться непредвиденными (5xx), или ошибкой клиента (4xx).
В случае неожиданной ошибки (например, 500) можно попробовать повторить запрос через небольшой интервал времени.
Notes
Сериализация float
Текущая реализация сериализации данных в JSON предполагает отрезание точки и следующие за ней символы у float-даннных в случае, если дробная часть равна нулю. Тем не менее, парсить такие данные нужно как float.
Сериализация денежных представлений
Таковые в документации указаны как float, но в большинстве случаев эти значения сериализируются в строку, типа "126.95".
Сериализация bool
Значения bool сериализируются как 0 и 1 для false и true соответственно.
Номер телефона
Допускается ввод номера любой страны. Валидация номера производится с помощью гугловоской библиотеки libphonenumber, которая доступна в т.ч. для Android и iOS.
Authentication
Большинство методов API требуют идентификации пользователя. Для этого, нужно слать следующий хедер:
Authorization: Bearer {access_token}
где {access_token} - это токен, который можно получить в ЛК: АККАУНТ → ПРОФИЛЬ → вкладка API.
В случае, если метод, требующий идентификации пользователя, запрашивается без хедера авторизации или запрос не прошел авторизацию, сервер ответит с http кодом 401.
Edges
API состоит из т.н. edges, т.е. логически разделенными точками входа / краями. Далее в документации указывается http метод и путь, добавляемый к base url.
Edge: /orders (Заказы)
Получение всех заказов
Метод требует идентификации
GET /orders
QueryString (GET) параметры:
| Parameter | Validation | Required? | Description |
|---|---|---|---|
| date_from | integer |
No | Фильтр по времени “от” (unix timestamp) |
| date_to | integer |
No | Фильтр по времени “до” (unix timestamp) |
| status | integer|string |
No | Фильтр по статусу (значение OrderStatusEnum, или active, или inactive) |
Пример
GET /orders?status=active
Результат:
В случае успеха сервер возвращает список заказов в следующем виде:
{
items: OrderShort[],
links: NavLinks,
meta: NavMeta
}
Пример ответа
{
"items": [{
"id": 188,
"tariff_type": 1,
"delivery_time": 7200,
"delivery_distance": 10223,
"description": "Дверная ручка",
"length": 500,
"width": 500,
"height": 300,
"valuation": 600,
"weight": 600,
"places": 1,
"name": "Грек Светлана",
"phone": "380965156948",
"price": "178.00",
"payment_type": 4,
"status": 0,
"reason": 0,
"created_at": 1529963283,
"updated_at": 1529963283,
"payment_split": {
"balance": "100.00",
"sender": "78.00"
},
"custom_price": 0
}, {
"id": 187,
"tariff_type": 1,
"delivery_time": 5400,
"delivery_distance": 10223,
"description": "Компакт-диск",
"length": 200,
"width": 200,
"height": 10,
"valuation": 250,
"weight": 100,
"places": 1,
"name": "Стриллер Вачеслав",
"phone": "380508695044",
"price": "74.00",
"payment_type": 4,
"status": 0,
"reason": 0,
"created_at": 1529962563,
"updated_at": 1529962563,
"payment_split": {
"balance": "50.00",
"sender": "24.00"
},
"custom_price": 0
}, {
"id": 186,
"tariff_type": 1,
"delivery_time": null,
"delivery_distance": 10223,
"description": "Процессор",
"length": 200,
"width": 200,
"height": 150,
"valuation": 5000,
"weight": 1,
"places": 1,
"name": "iPCStore Ukraine",
"phone": "380961212121",
"price": "94.00",
"payment_type": 1,
"status": 0,
"reason": 0,
"created_at": 1529962552,
"updated_at": 1529962552,
"payment_split": null,
"custom_price": 20
}],
"links": {
"self": "http://api.ipost.local/public/v1/orders?page=1",
},
"meta": {
"total_count": 3,
"page_count": 1,
"current_page": 1
}
}
Коды ошибок:
- + общие ошибки
Получение подробной информации по заказу
Метод требует идентификации
GET /orders/{id}
Где {id} - это id заказа.
Метод возвращает ту же информацию, что и GET /orders.
Результат:
В случае успеха сервер возвращает объект Order.
Пример ответа
{
"id": 188,
"origin_id": null,
"recreated_id": null,
"tariff_type": 1,
"delivery_time": 7200,
"delivery_distance": 10223,
"description": "Дверная ручка",
"length": 500,
"width": 500,
"height": 300,
"valuation": 600,
"weight": 600,
"places": 1,
"name": "Грек Светлана",
"phone": "380965156948",
"phone2": "380965156948",
"price": "178.00",
"payment_type": 4,
"status": 0,
"reason": 0,
"created_at": 1529963283,
"updated_at": 1529963283,
"payment_split": {
"balance": "100.00",
"sender": "78.00"
},
"address": {
"lat": 50.4327,
"long": 30.4304,
"city": "Київ",
"street": "вул. Михайла Донця",
"number": "7",
"flat": null,
"entrance": "1",
"floor": null,
"private_building": null
},
"pickup": {
"time_from": null,
"time_to": null,
"comment": null,
"status": 0,
"reason": 0,
"reason_custom": null,
"updated_at": 1529963283,
"images": []
},
"deliveries": [{
"id": 2269,
"name": "И",
"phone": "380985588999",
"phone2": "380981122333",
"time_from": null,
"time_to": null,
"payment_type": null,
"finance_type": 0,
"redelivery_type": 0,
"age_check_required": 0,
"order_number": null,
"checkout_code": "3214AA",
"confirm_code": 139770,
"comment": null,
"status": 0,
"reason": 0,
"reason_custom": null,
"updated_at": 1529963283,
"payment_amount": null,
"address": {
"lat": 50.4399,
"long": 30.5215,
"city": "Київ",
"street": "вул. Шота Руставелі",
"number": "8",
"flat": null,
"entrance": "2",
"floor": "2",
"private_building": 1
},
"parcels": [{
"id": 3422,
"description": "BLa-bla",
"valuation": 100,
"weight": 1,
"places": 1
}],
"images": []
}],
"redelivery": null,
"codtoaccount": null,
"courier": null,
"review_meta": {
"avg_rating": 4.5,
"count": 5
},
"custom_price": 0
}
Коды ошибок:
- + общие ошибки
Создание заказа
Метод требует идентификации
Для создания нового заказа:
POST /orders
Для оценки стоимости заказа (без создания):
POST /orders?preview=1
NB: при запросе с preview=1 отменяются проверки на обязательность полей (required => nonrequired). Остальные проверки остаются, но могут быть пропущены, если для какой-то проверки не хватает данных (например, если нет габаритов отправления или веса посылок, то проверка на наличие подходящего тарифа не будет произведена, соответственно, ошибки 109 быть не может.)
Поля запроса:
| Field | Validation | Required? | Example | Description |
|---|---|---|---|---|
| delivery_time | integer |
No1 | 3600 | Время доставки в секундах |
| description | string /^.{1,400}$/ |
No2 | Книги | Краткое описание заказа |
| length | integer |
Yes | 200 | Габариты отправления: длина, мм |
| width | integer |
Yes | 300 | Габариты отправления: ширина, мм |
| height | integer |
Yes | 45 | Габариты отправления: высота, мм |
| name | string /^.{1,120}$/ |
No3 | Василий Галкин | Имя и фамилия отправителя |
| phone | string /^(?=.{1,20}$)\+?\d+$/ |
No3 | 380961234567 | Номер телефона отправителя |
| phone2 | string /^(?=.{1,20}$)\+?\d+$/ |
No | 380961234567 | Дополнительный номер телефона отправителя |
| payment_type | integer |
Yes4 | 2 | Способ оплаты FormOrderPaymentTypeEnum |
| payment_split | FormOrderPaymentSplit |
No | 2 | Настройка разделения оплаты |
| payment_card_id | integer |
No7 | 123 | ID привязанной карты |
| custom_price | float |
No5 | 50 | Добавочная стоимость доставки |
| address | FormOrderAddress |
Yes | - | Адрес отправителя |
| pickup | FormOrderPickup |
Yes | - | Информация о заборе посылки |
| deliveries | FormOrderDelivery[] |
Yes | - | Информация о доставках NB: список/массив объектов |
| redelivery | FormOrderRedelivery |
No | - | Информация об обратной доставке |
| codtoaccount | FormOrderCodToAccount |
No6 | - | Информация об наложенном платеже на расчетный счет |
| voucher_code | /^[A-Z0-9]+$/ |
No | DISCOUNT50 | Код ваучера для скидки |
| notify_url | string /^.{0,1024}$/ |
No | https://myproject.com/ipost-respond/systemid-325643fsdgn4 | Урл, на который сервер будет присылать уведомления о состоянии заказа. Значение должно быть валидным урлом. IDN домены не принимаются. подробнее |
- 1 Если указать значение в данном поле, то время доставки будет считаться относительным - “доставить за X”, где X - кол-во секунд, кратное 1800 (30 минут), но не менее 1800 (30 минут) и не более 10800 (3 часа). При этом поля
time_fromиtime_toв объектахFormOrderPickup,FormOrderDeliveryиFormOrderRedeliveryбудут проигнорированны. Данное поле возможно установить только в том случае, если в заказе указан только один пункт доставки (order.deliveries). - 2 Если в заказе более 1 пункта доставки, тогда поле обязательно. В других случаях, если значение не указано, оно подставляется из описания посылки.
- 3 Если не указывать, значения будут взяты из профиля пользователя.
- 4 Если в заказе более 1 пункта доставки, данное поле не обязательно и игнорируется. В этом случае необходимо заполнить аналогичное поле в доставке (
FormOrderDelivery). - 5 Данное поле может быть установлено только если в заказе задан только один пункт доставки.
- 6 Значение обязательно в случае, если есть наложенный платеж на расчетный счет. В других случаях игнорируется.
- 7 Значение обязательно в случае, если оплата доставки картой. В других случаях игнорируется.
ВНИМАНИЕ: в некоторых случаях (если клиент — бизнес) при использовании ваучера вместе с оплатой с баланса (включая разделение платежа) может вернуться ошибка 136, что значит, что произвести оплату с баланса при использовании ваучера невозможно. Доступные варианты оплаты остатка (если после применения ваучера он есть): наличными отправителем, наличными получателем, разделение платежа на наличными отправителем и получателем.
Количество пунктов доставки (элементов в order.deliveries) должно быть не более 30, в противном случае будет ошибка валидации.
Пустые структуры и значения можно не отправлять.
FormOrderAddress : Object
| Field | Validation | Required? | Example | Description |
|---|---|---|---|---|
| lat | float |
Yes | 50.4385526 | Гео-координаты - latitude |
| long | float |
Yes | 30.5233046 | Гео-координаты - longitude |
| city | string /^.{1,120}$/ |
Yes | Киев | Название города/населенного пункта |
| street | string /^.{1,120}$/ |
Yes | ул. Пушкина | Название улицы (должно начинаться с “ул.”, “пр.”, и т.п.) |
| number | string /^.{1,20}$/ |
No | 112/11 | Номер дома/здания |
| flat | string /^.{1,20}$/ |
No | 4a | Номер квартиры/офиса |
| entrance | /^.{1,20}$/ |
No | 1 | Подъезд |
| floor | /^.{1,20}$/ |
No | 2 | Этаж |
| private_building | bool|null |
No | 1 | Частный дом |
FormOrderPickup : Object
| Field | Validation | Required? | Example | Description |
|---|---|---|---|---|
| time_from | integer |
Yes1 | 1458637363 | Время прибытия курьера - С |
| time_to | integer |
Yes1 | 1458638363 | Время прибытия курьера - До |
| comment | string /^.{1,4000} |
No | Осторожно, злой консьерж! | Комментарий заказчика касательно прибытия курьера к отправителю, забора посылок |
- 1 В случае, если в заказе установлено значение
delivery_time, то поляtime_fromиtime_toзаполнять не нужно. Они будут проигнорированны и выставленны другие после принятия заказа курьером.
FormOrderDelivery : Object
| Field | Validation | Required? | Example | Description |
|---|---|---|---|---|
| name | string /^.{1,120}$/ |
Yes | Василий Галкин | Имя и фамилия получателя |
| phone | string /^(?=.{1,20}$)\+?\d+$/ |
Yes | 380961234567 | Номер телефона получателя NB: без “+” |
| phone2 | string /^(?=.{1,20}$)\+?\d+$/ |
No | 380961234567 | Дополнительный номер телефона получателя NB: без “+” |
| time_from | integer |
Yes1 | 1458645563 | Время прибытия курьера - С |
| time_to | integer |
Yes1 | 1458649163 | Время прибытия курьера - До |
| payment_type | integer |
No2 | 2 | Способ оплаты FormOrderTargetPaymentTypeEnum |
| finance_type | integer |
No3 | 1 | Дополнительные финансовые операции FormOrderDeliveryFinanceTypeEnum. NB: для доставки по межгороду вариант FINANCE_TYPE_COD_REDELIVERY недоступен! |
| redelivery_type | integer |
No34 | 1 | Тип обратной доставки FormOrderDeliveryRedeliveryTypeEnum |
| cod_card_id | integer |
No5 | 123 | ID привязанной карты пользователя для наложенного платежа |
| age_check_required | bool (0|1) |
No | 1 | Требуется ли проверка возраста получателя (совершеннолетие) курьером |
| age_check_dob | string /^\d{4}-\d{2}-\d{2}$/ |
No | 1990-07-23 | Дата рождения получателя. Формат YYYY-MM-DD. Активно только вместе с age_check_required=1. Если указано, система даст завершить доставку только если дата рождения получателя, которую проверяет курьер, соответствует указанному в этом поле. Если значение не указано, будет произведена проверка на соотвутствие даты рождения совершеннолетию |
| order_number | string /^[\x21-\x7E]{1,25}$/ |
No | 2555/12QWE | Внутренний номер заказа |
| checkout_code | /^.{1,20}$/ |
No | 12-48 | Код для получения заказа |
| confirm_code | /^[1-9]\d{3}$/ |
No | 4821 | Код подтверждения доставки; если не передан, генерируется системой |
| comment | string /^.{1,4000} |
No | Спуститесь в подвал | Комментарий заказчика касательно прибытия курьера к получателю, доставки посылок |
| address | FormOrderAddress |
Yes | - | Адрес получателя |
| parcels | FormOrderParcel[] |
Yes | - | Посылки NB: список/массив объектов |
- 1 В случае, если в заказе установлено значение
delivery_time, то поляtime_fromиtime_toзаполнять не нужно. Они будут проигнорированны и выставленны другие после принятия заказа курьером. - 2 Поле требуется только при мультидоставке - когда способ оплаты в форме заказа не указан (т.е. для каждого получателя оплата определяется отдельно.). В ином случае оно игнорируется, используется значение
order.payment_type. - 3 Может быть установлено только одно из двух полей -
finance_typeилиredelivery_type. (Т.е. второе должно быть 0 или вовсе отсутствовать). - 4 В настоящее время возможность оформлять обартную доставку для межгорода закрыта!
- 5 Поле требуется только при наложенном платеже на карту (если
finance_type=FormOrderDeliveryFinanceTypeEnum::FINANCE_TYPE_COD_CARD).
FormOrderParcel : Object
| Field | Validation | Required? | Example | Description |
|---|---|---|---|---|
| description | string /^.{1,400}$/ |
Yes | Кастрюля | Описание посылки |
| valuation | integer |
Yes | 500 | Объявленная стоимость посылки |
| weight | integer |
Yes | 1300 | Вес посылки, в граммах |
| places | integer |
Yes | 1 | Количество мест |
FormOrderRedelivery : Object
| Field | Validation | Required? | Example | Description |
|---|---|---|---|---|
| time_from | integer |
Yes1 | 1458645563 | Время прибытия курьера - С |
| time_to | integer |
Yes1 | 1458649163 | Время прибытия курьера - До |
| payment_type | integer |
No2 | 2 | Способ оплаты FormOrderTargetPaymentTypeEnum |
| confirm_code | /^[1-9]\d{3}$/ |
No | 4821 | Код подтверждения обратной доставки; если не передан, генерируется системой |
- 1 В случае, если в заказе установлено значение
delivery_time, то поляtime_fromиtime_toзаполнять не нужно. Они будут проигнорированны и выставленны другие после принятия заказа курьером. - 2 Поле требуется только при мультидоставке и только если хотя бы у одного из получателей указана обратная доставка, в ином случае оно игнорируется, используется значение
order.payment_type. Допускаются только следующие значения:PAYMENT_TYPE_RECIPIENT,PAYMENT_TYPE_BALANCE,PAYMENT_TYPE_CARD.
FormOrderCodToAccount : Object
| Field | Validation | Required? | Example | Description |
|---|---|---|---|---|
| destination | string /^.{10,160}$/ |
Yes | Наложенный платеж по счету 32443 | Назначение наложенного платежа |
NB: остальные значения для наложенного платежа подтягиваются из бизнес-профиля. Потому последний должен быть заполнен.
FormOrderPaymentTypeEnum : integer
Возможные значения:
| Value | Name |
|---|---|
| 1 | PAYMENT_TYPE_BALANCE |
| 2 | PAYMENT_TYPE_SENDER |
| 3 | PAYMENT_TYPE_RECIPIENT |
| 4 | PAYMENT_TYPE_SPLIT_BALANCE_AND_SENDER |
| 5 | PAYMENT_TYPE_SPLIT_BALANCE_AND_RECIPIENT |
| 6 | PAYMENT_TYPE_SPLIT_SENDER_AND_RECIPIENT |
| 7 | PAYMENT_TYPE_CARD |
| 8 | PAYMENT_TYPE_SPLIT_CARD_AND_SENDER |
| 9 | PAYMENT_TYPE_SPLIT_CARD_AND_RECIPIENT |
(описания см. в OrderPaymentTypeEnum)
FormOrderPaymentSplit : Object
| Field | Validation | Required? | Example | Description |
|---|---|---|---|---|
| balance | integer |
No | 50 | Сумма оплаты с баланса |
| card | integer |
No | 50 | Сумма оплаты с карты |
| sender | integer |
No | 50 | Сумма оплаты отправителем |
| recipient | integer |
No | 50 | Сумма оплаты получателем |
NB: если будет установлено более одного поля, использоваться будет только первое подходящее, остальные будут проигнорированы.
FormOrderTargetPaymentTypeEnum : integer
Возможные значения:
| Value | Name |
|---|---|
| 1 | PAYMENT_TYPE_BALANCE |
| 2 | PAYMENT_TYPE_SENDER |
| 3 | PAYMENT_TYPE_RECIPIENT |
| 7 | PAYMENT_TYPE_CARD |
(описания см. в OrderTargetPaymentTypeEnum)
FormOrderDeliveryFinanceTypeEnum : integer
Возможные значения:
| Value | Name |
|---|---|
| 0 | FINANCE_TYPE_NONE |
| 1 | FINANCE_TYPE_REDEEM_BALANCE |
| 2 | FINANCE_TYPE_REDEEM_RECIPIENT |
| 3 | FINANCE_TYPE_COD_BALANCE |
| 6 | FINANCE_TYPE_COD_CARD |
| 7 | FINANCE_TYPE_COD_TOACCOUNT |
NB: на данный момент опции 3 и 6 недоступны! При использовании этих опций будет приходить ошибка 132.
NB: значение 7 (Наложенный платеж на расчетный счет) не может быть установлено для мультидоставки. В противном случае будет ошибка валидации. Так же, это значение (7) может быть использовано только бизнес-клиентом, у которого заполнен бизнес-профиль. Иначе — ошибка валидации. (Предполагается, что у всех бизнес-клиентов этот профиль заполнен, но есть несколько исключений).
(описания см. в OrderDeliveryFinanceTypeEnum)
FormOrderDeliveryRedeliveryTypeEnum : integer
Возможные значения:
| Value | Name |
|---|---|
| 0 | REDELIVERY_TYPE_NONE |
| 1 | REDELIVERY_TYPE_REGULAR |
(описания см. в OrderDeliveryRedeliveryTypeEnum)
Разьяснения по оплате
Для определения способа оплаты используется поле order.payment_type.
Оно определяет способ оплаты как за доставку, так и за обратную доставку.
Но в мультидоставке за обратную доставку отвечает поле FormOrderRedelivery.payment_type.
При установке order.payment_type имеется возможность разбить платеж на 2 способа оплаты, установив в объекте order.payment_split одно из соответсвующих способу разделения оплаты - второе будет расчитано автоматически.
Если указаное значение будет больше или равно стоимости доставки, то order.payment_type будет изменен на соответствующий способ (например, выбрали способ оплаты - разделение: с баланса и получателем, но указали фиксированную сумму получателем 200 у.д.е. при стоимости заказа в 150 у.д.е., в таком случае, order.payment_type будет изменен с PAYMENT_TYPE_SPLIT_BALANCE_AND_RECIPIENT на PAYMENT_TYPE_RECIPIENT).
Если будет выбран способ платежа - разделение оплаты, но order.payment_split не будет установлен, то разделение будет 50%/50% с округлением каждой части вверх до целой у.д.е.
Примеры:
- 40 у.д.е. получателем и остальное отправителем:
payment_type = PAYMENT_TYPE_SPLIT_SENDER_AND_RECIPIENT payment_split = {recipient: 40} - 40 у.д.е. отправителем и остальное получателем:
payment_type = PAYMENT_TYPE_SPLIT_SENDER_RECIPIENT payment_split = {sender: 40}
Пример запроса
{
"delivery_time": 5400,
"description": "Мед. препараты",
"length": 500,
"width": 500,
"height": 300,
"name": "Имя фамилия отправителя",
"phone": "380500000001",
"phone2": "380500000003",
"payment_type": 1,
"custom_price": 0,
"address": {
"lat": 50.45180590,
"long": 30.52591339,
"city": "Киев",
"street": "Крещатик улица",
"number": "10",
"flat": "24",
"entrance": "1",
"floor": null,
"private_building": null
},
"pickup": {
"comment": "Во дворе злой консьерж"
},
"deliveries": [
{
"name": "Имя фамилия получателя",
"phone": "380500000002",
"finance_type": 0,
"redelivery_type": 0,
"comment": "Комментарий по получателю",
"address": {
"lat": 50.45010990,
"long": 30.52261900,
"city": "Киев",
"street": "Крещатик улица",
"number": "20-22"
},
"parcels": [{
"description": "Мед. препараты (Аспирин x 1)",
"valuation": 40.00,
"weight": 1000,
"places": 1
}]
}
],
"notify_url": "https://example.com/myproject/notify/34353"
}
Результат:
В случае успеха сервер возвращает id заказа и цену.
Пример ответа
{
"id": 10,
"price": 80,
"price_parts": {
"delivery": 30, // Базовая стоимость доставки
"fast": 40, // Надбавка за срочность
"weight": 10, // Надбавка за вес
"distance": 0, // Надбавка за расстояние
"night": 20, // Надбавка за нерабочее время
"holiday": 20, // Надбавка за выходной / праздник
"cod": 0, // Надбавка за наложенный платеж (в случае передачи суммы наложенного платежа на счет iPOST клиента)
"redeem": 0, // Надбавка на выкуп посылки курьером
"valuation": 0, // Надбавка на оценочную стоимость
"redelivery": 0, // Стоимость обратной доставки
"custom": 50, // Свободная надбавка клиента
"peak": 0, // надбавка в пиковое время
"weather": 0, // надбавка за погодные условия
},
"balance": 510
}
| Field | Type | Description |
|---|---|---|
| id | integer |
Id заказа |
| price | float |
Стоимость |
| price_parts | Map<string,float> |
Составные части стоимости заказа |
| balance | float |
Баланс пользователя после запроса |
При запросе с preview=1 поля в ответе следующие:
| Field | Type | Description |
|---|---|---|
| price | float|null |
Стоимость |
| price_parts | Map<string,float>|null |
Составные части стоимости заказа |
| pledge | float|null |
Сумма залога которая будет заблокирована у клиента (при выкупе посылки курьером с гарантированием) |
| balance | float |
Баланс пользователя после запроса |
| min_delivery_time | integer|null |
Минимальное время доставки |
| tariff_type | OrderTariffTypeEnum|null |
Тип доставки |
| multiplier | float | Множитель стоимости доставки (пиковое время, погодные условия и т.п.) |
| delivery_distance | integer |
Расстояние доставки (в метрах) |
priceиprice_partsмогут бытьnull, когда не хватает данных для расчета стоимости- поле
min_delivery_timeравноnullпри наличии более одного пункта доставки, а так же если не хватает данных для расчета времени доставки. - поле
tariff_typeможет бытьnull, если не хватает данных для определения типа доставки.
Минимальное время доставки:
Система определяет для заказа минимальное время доставки исходя из расстояния.
Время доставки — это значение, указанное в delivery_time или разница между deliveries[].time_to и pickup.time_from.
В случае, если в заказе есть обратная доставка, то это так же разница между redelivery.time_to и deliveries[].time_from.
Коды ошибок:
- 44 — Нет привязанной карты (в случае наложенного платежа на карту клиента)
- 104 — Недостаточно средств на балансе
- 105 — Баланс ниже нуля
- 109 — Для заказа не нашлось подходящего тарифа
- 114 — Cумма оценочной стоимости больше допустимой
- 117 — Указаный адрес находится вне допустимых пределах карты
- 123 — Cумма оценочной стоимости для выкупа больше допустимой
- 124 — Время доставки слишком малое для этого маршрута
- 125 — Время обратной доставки слишком малое для этого маршрута
- 128 — Cумма оценочной стоимости для наложенного платежа на расчетный счет больше допустимой
- 130 — Значение
age_check_dobне соответствует совершеннолетию на дату доставки. - 132 — Опция отключена. В поле
messageошибки есть текстовое описание - 135 — Ваучер не найден
- 136 — Нельзя произвести оплату с баланса при использовании ваучера
- 139 — Платежная карта не найдена
- 140 — Неуспешный платеж
- + общие ошибки
Редактирование существующего заказа
Метод требует идентификации
PATCH /orders/{id}
Поля запроса:
| Field | Validation | Required? | Example | Description |
|---|---|---|---|---|
| description | string /^.{1,400}$/ |
No | Книги | Краткое описание заказа |
| length | integer |
No | 200 | Габариты отправления: длина, мм |
| width | integer |
No | 300 | Габариты отправления: ширина, мм |
| height | integer |
No | 45 | Габариты отправления: высота, мм |
| name | string /^.{1,120}$/ |
No | Василий Галкин | Имя и фамилия отправителя |
| phone | string /^(?=.{1,20}$)\+?\d+$/ |
No | 380961234567 | Номер телефона отправителя |
| phone2 | string /^(?=.{1,20}$)\+?\d+$/ |
No | 380961234567 | Дополнительный номер телефона отправителя |
| pickup | FormOrderUpdatePickup |
No | - | Информация о заборе посылки |
| deliveries | FormOrderUpdateDelivery[] |
No | - | Информация о доставках NB: список/массив объектов |
| custom_price | float |
No | 50 | Добавочная стоимость доставки |
| payment_split | FormOrderUpdatePaymentSplit |
No | 2 | Настройка разделения оплаты |
FormOrderUpdatePickup : Object
| Field | Validation | Required? | Example | Description |
|---|---|---|---|---|
| comment | string /^.{0,4000} |
No | Осторожно, злой консьерж! | Комментарий заказчика касательно прибытия курьера к отправителю, забора посылок. Если указана пустая строка, комментарий будет очищен |
FormOrderUpdateDelivery : Object
| Field | Validation | Required? | Example | Description |
|---|---|---|---|---|
| id | integer |
Yes | 23421 | Id доставки |
| name | string /^.{1,120}$/ |
No | Василий Галкин | Имя и фамилия отправителя |
| phone | string /^(?=.{1,20}$)\+?\d+$/ |
No | 380961234567 | Номер телефона отправителя |
| phone2 | string /^(?=.{1,20}$)\+?\d+$/ |
No | 380961234567 | Дополнительный номер телефона отправителя |
| comment | string /^.{0,4000} |
No | Спуститесь в подвал | Комментарий заказчика касательно прибытия курьера к получателю, доставки посылок. Если указана пустая строка, комментарий будет очищен |
| parcels | FormOrderUpdateParcel[] |
No | - | Посылки NB: список/массив объектов |
FormOrderUpdateParcel : Object
| Field | Validation | Required? | Example | Description |
|---|---|---|---|---|
| id | integer |
Yes | 45323 | Id посылки |
| description | string /^.{1,400}$/ |
No | Кастрюля | Описание посылки |
| valuation | integer |
No | 500 | Объявленная стоимость посылки |
| weight | integer |
No | 1300 | Вес посылки, в граммах |
| places | integer |
No | 1 | Количество мест |
FormOrderUpdatePaymentSplit : Object
| Field | Validation | Required? | Example | Description |
|---|---|---|---|---|
| balance | integer |
No | 50 | Сумма оплаты с баланса |
| card | integer |
No | 50 | Сумма оплаты с карты |
| sender | integer |
No | 50 | Сумма оплаты отправителем |
| recipient | integer |
No | 50 | Сумма оплаты получателем |
NB: если будет установлено более одного поля, использоваться будет только первое подходящее, остальные будут проигнорированы.
Редактирование добавочной стоимости заказа
В заказах с одним платежом (картой, с баланса, отправителем или получателем) достаточно изменить только значение custom_price.
В заказах с разделением платежа рекомендуется указывать payment_split, иначе API будет самостоятельно измнять суммы платежей следующим образом:
- если значение стало больше, то будет увеличено только первое значение из пары:
balanceдляPAYMENT_TYPE_SPLIT_BALANCE_AND_SENDERиPAYMENT_TYPE_SPLIT_BALANCE_AND_RECIPIENTcardдляPAYMENT_TYPE_SPLIT_CARD_AND_SENDERиPAYMENT_TYPE_SPLIT_CARD_AND_RECIPIENTsenderдляPAYMENT_TYPE_SPLIT_SENDER_RECIPIENT
- если значение стало меньше, будет уменьшено первое значение из пары (аналогично пункту выше)
- если первое значение из пары стало 0, то остаток вычитается из второго значения пары
При редактировании payment_split, рекомендуется указывать только одно значение из пары разделения платежа (вторая сторона будет проигнорирована).
В payment_split можно указать только те значения, которые определены в методе разделения платежа:
balanceиsenderдляPAYMENT_TYPE_SPLIT_BALANCE_AND_SENDERbalanceиrecipientдляPAYMENT_TYPE_SPLIT_BALANCE_AND_RECIPIENTcardиsenderдляPAYMENT_TYPE_SPLIT_CARD_AND_SENDERcardиrecipientдляPAYMENT_TYPE_SPLIT_CARD_AND_RECIPIENTsenderиrecipientдляPAYMENT_TYPE_SPLIT_SENDER_RECIPIENT
Результат:
В случае успеха сервер возвращает новую цену.
Пример ответа
{
"price": "80",
"balance": "510"
}
| Field | Type | Description |
|---|---|---|
| price | float |
Стоимость |
| balance | float |
Баланс пользователя после запроса |
Коды ошибок:
- 44 — в запросе указанные неизвестные или не соответствующие заказу id доставок или посылок
- 104 — Недостаточно средств на балансе
- 105 — Баланс ниже нуля
- 106 — запрос пытается отредактировать завершенную точку забора/доставки (
STATUS_DONE,STATUS_CANCELED) - 112 — статус у заказа не
STATUS_NEW,STATUS_INWORKилиSTATUS_MODERATE - 114 — Cумма оценочной стоимости больше допустимой
- 116 — запрос пытается отредактировать добавочную стоимость доставки, когда заказ не в статусе
STATUS_NEW - 118 — в заказе есть несколько получателей, или значение
payment_typeне соответствует одному изPAYMENT_TYPE_BALANCE,PAYMENT_TYPE_SENDER,PAYMENT_TYPE_RECIPIENT - 123 — Cумма оценочной стоимости для выкупа больше допустимой
- 128 — Cумма оценочной стоимости для наложенного платежа на расчетный счет больше допустимой
- 132 — Опция отключена. В поле
messageошибки есть текстовое описание - 140 — Неуспешный платеж
- 142 — Ограничение редактирования заказа: в запросе указаны габариты/вес свыше допустимого в тарифе или суммарная разница изменения объявленной стоимости выше определенного лимита (лимит лучше уточнять у менеджера).
- + общие ошибки
Отмена заказа
Метод требует идентификации
Для отмены заказа:
POST /orders/{id}/cancel
Для оценки штрафа (без отмены):
POST /orders/{id}/cancel?preview=1
Где {id} - это id заказа.
Поля запроса:
| Field | Validation | Required? | Example | Description |
|---|---|---|---|---|
| reason | integer /^\d+$/1 |
No2 | 447 | Id причины отмены |
| comment | string /^.{1,4000}$/ |
No3 | Случайно создал заказ | Комментарий клиента |
- 1 Список причин отмены можно получить методом
GET /orders/cancel-reason-options. - 2 Причина требуется, если это настроено в системе.
- 3 Комментарий требуется, если это указано в самой причине (
OrderCancelReason.comment_required).
Результат:
В случае успеха сервер возвращает размер штрафа.
Пример ответа
{
"fine": 0,
"balance": "510"
}
| Field | Type | Description |
|---|---|---|
| fine | float |
Размер штрафа |
| balance | float |
Баланс пользователя после запроса |
Коды ошибок:
- 112 — Нельзя отменить заказ (статус заказа не
NEW,INWORKилиMODERATE) - 131 — С указанной причиной требуется добавить комментарий
- 147 — Указанная причина отмены не найдена
- 149 — Требуется указать причину отмены
- + общие ошибки
Получить список причин отмены заказа
Метод требует идентификации
GET /orders/cancel-reason-options
Результат:
В случае успеха сервер возвращает список значений в следующем виде:
{
items: OrderCancelReason[],
}
Пример ответа
{
"items": [{
"id": 347,
"title": "Случайно создал заказ",
"comment_required": false
}, {
"id": 348,
"title": "Передумал",
"comment_required": false
}, {
"id": 349,
"title": "Другое",
"comment_required": true
}]
}
Коды ошибок:
- + общие ошибки
Получить стикер для доставки
Метод требует идентификации
GET /stickers/{id}
Где {id} - это id доставки (order.deliveries[].id).
Результат:
В случае успеха сервер возвращает файл в формате pdf размером 100mm x 100mm.
В случае, если запрашивается стикер с неизвестным id заказа, будет возвращена ошибка 44.
Коды ошибок:
- + общие ошибки
Оставить отзыв об исполнении заказа
Метод требует идентификации
POST /orders/{id}/review
Где {id} - это id заказа.
Поля запроса:
| Field | Validation | Required? | Example | Description |
|---|---|---|---|---|
| rating | integer (1-5) |
Yes | 5 | Оценка заказа |
| text | string /^.{,4000}$/ |
No* | Супер! Курьер молодец! | Текст отзыва. |
Поле text является обязательным при оценке 1 и 2. Если в этом случае оно не будет указано, то будет ошибка 131.
Если курьер еще не был назначен, или заказ был отменен курьером ранее, то в ответ придет ошибка 106.
Результат:
В случае успеха сервер отвечает с http кодом 200 без тела ответа.
Коды ошибок:
106- нельзя оставить отзыв, т.к. курьер не назначен или заказ отменен клиентом.131- требуется добавить комментарий.- + общие ошибки
Изменить отзыв об исполнении заказа
Метод требует идентификации
Является синонимом POST /orders/{id}/review
PATCH /orders/{id}/review
Описание смотреть в POST /orders/{id}/review, т.к. фактически является синонимом. Отличается только http-методом и только для семантической разницы.
Удалить отзыв об исполнении заказа
Метод требует идентификации
DELETE /orders/{id}/review
Где {id} - это id заказа.
Результат:
В случае успеха сервер отвечает с http кодом 200 без тела ответа.
Коды ошибок:
- + общие ошибки
Получить отзывы об исполнении заказа
Метод требует идентификации
GET /orders/{id}/reviews
Где {id} - это id заказа.
Результат:
В случае успеха сервер возвращает список значений в следующем виде:
{
items: Review[],
}
Пример ответа
{
"items": [
{
"order_id": 123,
"target_id": null,
"rating": 5,
"text": "Все ок, хорошо поработал, красафчег!",
"created_at": 1459799323,
"updated_at": 1459800411
},
{
"order_id": 123,
"target_id": 2,
"rating": 5,
"text": "Хороший курьер, быстро доставил!",
"created_at": 1459898132,
"updated_at": 1459898132
}
]
}
Коды ошибок:
- + общие ошибки
Получить локацию курьера
Метод требует идентификации
GET /orders/{id}/tracking
Где {id} - это id заказа.
Результат:
В случае успеха сервер возвращает объект Location, а если локация курьера недоступна (заказ не в работе, курьер ещё не приступил к выполнению заказа или не передал координаты) — объект NullLocation.
Пример ответа
{
"lat": 12.33333,
"long": 0.13232
}
Пример ответа, если локация недоступна (NullLocation):
{
"lat": null,
"long": null
}
В случае, если запрашивается локация с неизвестным id заказа, придет ошибка 44.
Коды ошибок:
- 44 — Заказ с таким id не найден
- + общие ошибки
Получить все отзывы о курьере
Метод требует идентификации
GET /orders/{id}/courier/reviews
Где {id} - это id заказа.
Результат:
В случае успеха сервер возвращает список значений в следующем виде:
{
items: CourierReview[],
links: NavLinks,
meta: NavMeta
}
Пример ответа
{
"items": [
{
"author_type": 1,
"rating": 5,
"text": "Все ок, хорошо поработал, красафчег!",
"created_at": 1459799323,
"updated_at": 1459800411
},
{
"author_type": 2,
"rating": 5,
"text": "Хороший курьер, быстро доставил!",
"created_at": 1459898132,
"updated_at": 1459898132
}
],
"links": {
"self": "http://api.ipost.local/public/v1/orders/1234/courier-reviews?page=1",
},
"meta": {
"total_count": 2,
"page_count": 1,
"current_page": 1
}
}
Коды ошибок:
106- отзывы курьера не доступны, заказ находится не в работе.- + общие ошибки
Отзывы на заказы
Получить все отзывы на заказы
Метод требует идентификации
GET /order-reviews
QueryString (GET) параметры:
| Parameter | Validation | Required? | Description |
|---|---|---|---|
| date_from | /^\d+$/ |
No | Фильтр по времени “от” (unix timestamp) |
| date_to | /^\d+$/ |
No | Фильтр по времени “до” (unix timestamp) |
| order_id | /^\d+$/ |
No | Фильтр по ID заказа |
| author_type | /^\d+$/ |
No | Фильтр по типу автора (значение CourierReviewAuthorTypeEnum) |
| sort | /^-?\w+$/ |
No | Сортировка. Значение - имя поля. Только по примитивным полям. Если перед именем поля есть минус (-), порядок сортировки будет DESC, иначе ASC. Сортировка по умолчанию - id DESC |
Пример
GET /order-reviews?author_type=1
Результат:
В случае успеха сервер возвращает список значений в следующем виде:
{
items: Review[],
links: NavLinks,
meta: NavMeta
}
Пример ответа
{
"items": [
{
"order_id": 123,
"target_id": null,
"rating": 5,
"text": "Все ок, хорошо поработал, красафчег!",
"created_at": 1459799323,
"updated_at": 1459800411
},
{
"order_id": 123,
"target_id": 155,
"rating": 5,
"text": "Хороший курьер, быстро доставил!",
"created_at": 1459898132,
"updated_at": 1459898132
}
],
"links": {
"self": "https://api.ipost.life/public/v1/order-reviews?page=1",
},
"meta": {
"total_count": 2,
"page_count": 1,
"current_page": 1
}
}
Коды ошибок:
- + общие ошибки
Edge: /cards (Платежные карты)
Получение списка платежных карт
Метод требует идентификации
GET /cards
Результат:
В случае успеха сервер возвращает список значений в следующем виде:
{
items: PaymentCard[],
}
Пример ответа
{
"items": [
{
"id": 123,
"type": "VISA",
"number": "44****2154"
},
{
"id": 250,
"type": "MASTERCARD",
"number": "51****3453"
}
]
}
Коды ошибок:
- + общие ошибки
Edge: /transactions (Транзакции)
Получение всех транзакций
Метод требует идентификации
GET /transactions
QueryString (GET) параметры:
| Parameter | Validation | Required? | Description |
|---|---|---|---|
| type | /^\d+$/ |
No | Фильтр по типу (значение TransactionTypeEnum) |
| order_id | /^\d+$/ |
No | Фильтр по id заказа |
Пример
GET /transactions?order_id=1
Результат:
В случае успеха сервер возвращает список транзакций в следующем виде:
{
items: Transaction[],
links: NavLinks,
meta: NavMeta
}
Пример ответа
{
"items": [{
"id": 14,
"order_id": null,
"type": 3,
"amount": 200
}, {
"id": 13,
"order_id": 1,
"type": 4,
"amount": 110
}, {
"id": 12,
"order_id": 2,
"type": 3,
"amount": 100
}, {
"id": 11,
"order_id": null,
"type": 1,
"amount": 10
}],
"links": {
"self": "https://api.ipost.life/public/v1/transactions?page=1"
},
"meta": {
"total_count": 4,
"page_count": 1,
"current_page": 1
}
}
Коды ошибок:
- + общие ошибки
Уведомления о состоянии заказа
Если при отправке заказа добавить поле notify_url, то сервер будет делать POST-запрос на этот урл с сообщением о статусе заказа.
Аутентификация запроса
Для аутентификации запроса передается заголовок X-Signature, содержащий подпись запроса.
Алгоритм формирования подписи — HMAC-SHA256:
Signature = HMAC_SHA256(Key, Content)
Key — это Ваш access_token для доступа к данному API, а Content — полное тело HTTP-запроса.
Подпись передается в шестнадцатиричном формате (hex).
Для аутентификации/авторизации запроса требуется локально сформировать подпись и сопоставить с переданной в заголовке.
Содержимое запроса
Содержимое запроса передается в формате JSON.
Структура содержимого следующая:
| Field | Type | Description |
|---|---|---|
| time | string. Format (W3C): YYYY-MM-DDThh:mm:ssTZD |
Время создания уведомления. |
| type | string |
Тип уведомления. Возможные значения описаны ниже. |
Поля time и type присутствуют в запросе всегда.
Наличие в сообщении других полей зависит от значения поля type.
Сообщения с неизвестным значением type следует игнорировать (добавление новых событий в будущем).
Возможные значения type:
order:created- создан заказorder:status-update- изменения в статусе заказа
Дополнительные поля для сообщения с type = “order:created”
| Field | Type | Description |
|---|---|---|
| order | Order |
Структура созданного заказа |
Поле order присутствует в сообщении всегда.
Дополнительные поля для сообщения с type = “order:status-update”
| Field | Type | Description |
|---|---|---|
| order_id | integer |
Id заказа |
| status | NotifyOrderStatusEnum |
Статус заказа |
| reason | NotifyOrderReasonEnum|null |
Причина для статуса |
| courier | CourierInfo|null |
Информация о курьере |
| courier_location | Location|null |
Текущая геолокация курьера |
| recreated_id | integer|null |
Id пересозданного заказа |
| pickup_update | NotifyPickupUpdate|null |
Обновление по пункту отправителя |
| delivery_updates | NotifyDeliveryUpdate[]|null |
Обновления по пунктам получателя |
| redelivery_update | NotifyRedeliveryUpdate|null |
Обновление по пункту обратной доставки |
| codtoaccount_update | NotifyCodToAccountUpdate|null |
Обновление по наложенному платежу на р/с |
| cancel_reason | OrderCancelReasonDesc |
Причина отмены |
Поля order_id, status присутствуют в сообщении всегда.
Поле reason присутствует в сообщении только при наличии причины для статуса (актуально для “MODERATE”, “CANCELED”).
Поле courier присутствует в сообщении только при назначении курьера на заказ! (То есть, при первом сообщении со статусом INWORK).
Поле courier_location присутствует в сообщении только когда на заказ назначен курьер.
Поле recreated_id может присутствовать в сообщении только при отмене заказа (status = "CANCELED") или при статусе “курьер не найден” (status = "UNAPPLIED"), если оператор iPOST в это же время пересоздал заказ. В таком случае нужно считать новый заказ (recreated_id) замещающим текущий. Дальнейшие обновления будут приходить по новому заказу. Если пересоздания заказа не было, то поле отсутствует, заказ считается закрытым. Реализовано ввиду невозможности в настоящий момент переназначать курьера в заказе.
Поля pickup_update, delivery_updates, redelivery_update, codtoaccount_update присутствуют в сообщении только при наличии обновления по соответствующим пунктам заказа.
Поле cancel_reason может присутствовать в сообщении только при отмене заказа клиентом (status = "CANCELED")
За весь цикл работы с заказом может несколько раз приходить уведомление со значением status = "INWORK", но разными значениями пунктов (pickup_update, delivery_updates …).
Конечные статусы заказа - CANCELED (если нет recreated_id), UNAPPLIED (если нет recreated_id), DONE.
Заказ из статуса MODERATE может вновь стать активным (INWORK), отмененным (CANCELED) или “курьер не назначен” (UNAPPLIED).
Примеры
Создан новый заказ
{
"time": "2020-07-16T19:20:10+03:00",
"type":"order:created",
"order": {
"id": 188,
"origin_id": null,
"recreated_id": null,
"tariff_type": 1,
"delivery_time": 7200,
"delivery_distance": 10223,
"description": "Дверная ручка",
"length": 500,
"width": 500,
"height": 300,
"valuation": 600,
"weight": 600,
"places": 1,
"name": "Грек Светлана",
"phone": "380965156948",
"price": "178.00",
"payment_type": 4,
"status": 0,
"reason": 0,
"created_at": 1529963283,
"updated_at": 1529963283,
"payment_split": {
"balance": "100.00",
"sender": "78.00"
},
"address": {
"lat": 50.4327,
"long": 30.4304,
"city": "Київ",
"street": "вул. Михайла Донця",
"number": "7",
"flat": null
},
"pickup": {
"time_from": null,
"time_to": null,
"comment": null,
"status": 0,
"reason": 0,
"reason_custom": null,
"updated_at": 1529963283,
"images": []
},
"deliveries": [{
"id": 2269,
"name": "И",
"phone": "380985588999",
"time_from": null,
"time_to": null,
"payment_type": null,
"finance_type": 0,
"redelivery_type": 0,
"age_check_required": 0,
"order_number": null,
"confirm_code": 139770,
"comment": null,
"status": 0,
"reason": 0,
"reason_custom": null,
"updated_at": 1529963283,
"payment_amount": null,
"address": {
"lat": 50.4399,
"long": 30.5215,
"city": "Київ",
"street": "вул. Шота Руставелі",
"number": "8",
"flat": null
},
"parcels": [{
"id": 3422,
"description": "BLa-bla",
"valuation": 100,
"weight": 1,
"places": 1
}],
"images": []
}],
"redelivery": null,
"codtoaccount": null,
"courier": null,
"review_meta": {
"avg_rating": 4.5,
"count": 5
},
"custom_price": 0
}
}
Назначен курьер на заказ
{
"time": "2020-07-16T19:20:30+03:00",
"type":"order:status-update",
"order_id":342,
"status":"INWORK",
"courier": {
"idhash": "hpdjXS73QxwDCFH0TU0MYMz6hosY6AJj9/tymHya9H4",
"name": "Соловьев Кирилл",
"phone": "380501234567",
"avatar": "https://api.ipost.life/path/to/image.jpg",
"rating": 5.84,
"orders_count": 320,
"created_at": 1558264087
},
"courier_location": {
"lat": 50.4502499,
"long": 30.5222594
}
}
Курьер получил отправление
{
"time": "2020-01-16T09:11:57+02:00",
"type":"order:status-update",
"order_id":342,
"status":"INWORK",
"pickup_update": {
"status": "DONE"
},
"courier_location": {
"lat": 50.4502499,
"long": 30.5222594
}
}
Курьер доставил отправление
{
"time": "2020-01-16T09:11:57+02:00",
"type":"order:status-update",
"order_id":342,
"status":"DONE",
"delivery_updates": [
{
"id": 849,
"status": "DONE"
}
],
"courier_location": {
"lat": 50.4502499,
"long": 30.5222594
}
}
В некоторых случаях может прийти уведомление без статуса назначения, сразу с завершенным заказом.
{
"time": "2020-01-16T09:11:57+02:00",
"type":"order:status-update",
"order_id":342,
"status":"DONE",
"courier_location": {
"lat": 50.4502499,
"long": 30.5222594
}
}
Курьер отменяет заказ
{
"time": "2020-01-16T09:11:57+02:00",
"type":"order:status-update",
"order_id":342,
"status":"MODERATE",
"reason":"CANCELED_BY_COURIER",
"courier_location": {
"lat": 50.4502499,
"long": 30.5222594
}
}
Заказ стал на модерацию оператором.
Заказ отменен
{
"time": "2020-01-16T09:11:57+02:00",
"type":"order:status-update",
"order_id":342,
"status":"CANCELED",
"reason":"CANCELED_BY_COURIER",
"courier_location": {
"lat": 50.4502499,
"long": 30.5222594
}
}
Заказ полностью отменен.
Заказ отменен и пересоздан
{
"time": "2020-01-16T09:11:57+02:00",
"type":"order:status-update",
"order_id":342,
"status":"CANCELED",
"reason":"CANCELED_BY_COURIER",
"recreated_id":345,
"courier_location": {
"lat": 50.4502499,
"long": 30.5222594
}
}
Типы данных
Order : Object
| Field | Type | Description |
|---|---|---|
| id | integer |
Id заказа |
| origin_id | integer|null |
Id родительского заказа (только в пересозданных системой заказах) |
| recreated_id | integer|null |
Id дочернего заказа (только если заказ был пересоздан) |
| status | OrderStatusEnum |
Текущий статус исполнения заказа |
| reason | OrderReasonEnum |
Причина текущего статуса |
| tariff_type | OrderTariffTypeEnum |
Тип доставки |
| delivery_time | integer|null |
Время доставки (доставить за X) |
| description | string |
Краткое описание доставляемого |
| valuation | float |
Суммарная объявленная стоимость посылок |
| length | integer |
Габариты отправления: длина, мм |
| width | integer |
Габариты отправления: ширина, мм |
| height | integer |
Габариты отправления: высота, мм |
| weight | integer |
Суммарный вес посылок |
| places | integer |
Суммарное кол-во мест, занимаемое посылками |
| name | string |
Имя и фамилия отправителя |
| phone | string |
Номер телефона отправителя NB: без “+” |
| phone2 | string|null |
Дополнительный номер телефона отправителя NB: без “+” |
| price | float |
Стоимость заказа |
| cancel_reason | OrderCancelReasonDesc |
Причина отмены |
| payment_type | OrderPaymentTypeEnum |
Способ оплаты |
| payment_split | OrderPaymentSplit|null |
Разделение оплаты |
| custom_price | float |
Надбавка клиента |
| delivery_distance | integer |
Расстояние доставки (в метрах) |
| updated_at | integer |
Дата изменения заказа |
| created_at | integer |
Дата создания заказа |
| address | OrderAddress |
Адрес отправителя |
| pickup | OrderPickup |
Информация о заборе посылки |
| deliveries | OrderDelivery[] |
Информация о доставках |
| redelivery | OrderRedelivery |
Информация об обратной доставке |
| codtoaccount | OrderCodToAccount |
Информация о наложенном платеже на расчетный счет |
| courier | CourierInfo |
Информация о курьере |
| review_meta | ReviewMeta |
Информация об отзывах |
NB: Поле updated_at означает дату изменения полей заказа. Это значение не относится ко вложенным структурам.
OrderCancelReasonDesc : Object
| Field | Type | Description |
|---|---|---|
| id | integer |
Id |
| title | string |
Причина |
OrderShort : Object
| Field | Type | Description |
|---|---|---|
| id | integer |
Id заказа |
| status | OrderStatusEnum |
Текущий статус исполнения заказа |
| reason | OrderReasonEnum |
Причина текущего статуса |
| tariff_type | OrderTariffTypeEnum |
Тип доставки |
| description | string |
Краткое описание доставляемого |
| valuation | float |
Суммарная объявленная стоимость посылок |
| length | integer |
Габариты отправления: длина, мм |
| width | integer |
Габариты отправления: ширина, мм |
| height | integer |
Габариты отправления: высота, мм |
| weight | integer |
Суммарный вес посылок |
| places | integer |
Суммарное кол-во мест, занимаемое посылками |
| name | string |
Имя и фамилия отправителя |
| phone | string |
Номер телефона отправителя NB: без “+” |
| price | float |
Стоимость заказа |
| payment_type | OrderPaymentTypeEnum |
Способ оплаты |
| payment_split | OrderPaymentSplit|null |
Разделение оплаты |
| custom_price | float |
Надбавка клиента |
| delivery_distance | integer |
Расстояние доставки (в метрах) |
| updated_at | integer |
Дата изменения заказа |
| created_at | integer |
Дата создания заказа |
NB: Поле updated_at означает дату изменения полей заказа. Это значение не относится ко вложенным структурам.
OrderDelivery : Object
| Field | Type | Description |
|---|---|---|
| id | integer |
Id доставки |
| name | string |
Имя и фамилия получателя |
| phone | string |
Номер телефона получателя NB: без “+” |
| phone2 | string|null |
Дополнительный номер телефона получателя NB: без “+” |
| time_from | integer|null |
Время прибытия курьера - С |
| time_to | integer|null |
Время прибытия курьера - До |
| payment_type | OrderTargetPaymentTypeEnum|null |
Способ оплаты за доставку (актуально только для мультидоставки) |
| payment_amount | float|null |
Сумма оплаты за доставку (актуально только для мультидоставки) |
| finance_type | OrderDeliveryFinanceTypeEnum |
Дополнительные финансовые операции |
| redelivery_type | OrderDeliveryRedeliveryTypeEnum |
Тип обратной доставки |
| age_check_required | bool |
Требуется ли проверка возраста получателя (совершеннолетие) |
| age_check_dob | string|null |
Точная дата рождения получателя, которую необходимо проверить. |
| order_number | string|null |
Внутренний номер заказа |
| checkout_code | string|null |
Код для получения заказа |
| confirm_code | integer |
Код подтверждения доставки |
| comment | string|null |
Комментарий заказчика касательно прибытия курьера к получателю, доставки посылок |
| status | OrderTargetStatusEnum |
Статус доставки |
| reason | OrderTargetReasonEnum |
Причина текущего статуса |
| reason_custom | string|null |
Описание причины (только при reason = REASON_CUSTOM) |
| updated_at | integer |
Дата изменения полей структуры (В частности, status) |
| address | OrderAddress |
Адрес получателя |
| parcels | OrderParcel[] |
Посылки |
| images | Image[] |
Фотографии посылок |
| personal_id_check_required | DEPRECATED | Поле следует игнорировать, оно существует только для обратной совместимости. Будет удалено в будущем. |
OrderRedelivery : Object
Обратная доставка
| Field | Type | Description |
|---|---|---|
| time_from | integer|null |
Время прибытия курьера - С |
| time_to | integer|null |
Время прибытия курьера - До |
| payment_type | OrderTargetPaymentTypeEnum|null |
Способ оплаты за доставку (актуально только для мультидоставки) |
| payment_amount | float|null |
Сумма оплаты за доставку (актуально только для мультидоставки) |
| confirm_code | integer |
Код подтверждения доставки |
| status | OrderTargetStatusEnum |
Статус доставки |
| reason | OrderTargetReasonEnum |
Причина текущего статуса |
| reason_custom | string|null |
Описание причины (только при reason = REASON_CUSTOM) |
| updated_at | integer |
Дата изменения полей структуры (В частности, status) |
| images | Image[] |
Фотографии посылок |
OrderCodToAccount : Object
Наложенный платеж на расчетный счет
| Field | Type | Description |
|---|---|---|
| time_to | integer|null |
Крайний срок зачисления средств на расчетный счет. Значение устанавливается автоматически после доставки посылки |
| amount | float |
Сумма наложенного платежа |
| destination | string |
Назначение платежа |
| recipient_name | string |
Название компании, получателя платежа |
| recipient_egrpou | string |
Код ЕГРПОУ компании, получателя платежа |
| recipient_iban | string |
IBAN компании, получателя платежа |
| status | OrderCodToAccountStatusEnum |
Статус наложенного платежа |
| updated_at | integer |
Дата изменения полей структуры (В частности, status) |
OrderAddress : Object
| Field | Type | Description |
|---|---|---|
| lat | float |
Гео-координаты - latitude |
| long | float |
Гео-координаты - longitude |
| city | string |
Название города/населенного пункта |
| street | string |
Название улицы (должно начинаться с “ул.”, “пр.”, и т.п.) |
| number | string|null |
Номер дома/здания |
| flat | string|null |
Номер квартиры/офиса |
| entrance | string|null |
Подъезд |
| floor | string|null |
Этаж |
| private_building | bool|null |
Частный дом |
OrderPickup : Object
| Field | Type | Description |
|---|---|---|
| time_from | integer|null |
Время прибытия курьера - С |
| time_to | integer|null |
Время прибытия курьера - До |
| comment | string|null |
Комментарий заказчика касательно прибытия курьера к отправителю, забора посылок |
| status | OrderTargetStatusEnum |
Статус забора посылок |
| reason | OrderTargetReasonEnum |
Причина текущего статуса |
| reason_custom | string|null |
Описание причины (только при reason = REASON_CUSTOM) |
| updated_at | integer |
Дата изменения полей структуры (В частности, status) |
| images | Image[] |
Фотографии посылок |
OrderParcel : Object
| Field | Type | Description |
|---|---|---|
| id | int |
Id посылки |
| description | string |
Описание посылки |
| valuation | integer |
Объявленная стоимость посылки |
| weight | integer |
Вес посылки |
| places | integer |
Количество мест |
PaymentCard : Object
Привязанная карта пользователя.
| Field | Type | Description |
|---|---|---|
| id | integer |
Id карты |
| type | string |
Тип карты (MASTERCARD, VISA, может какой-то другой вариант) |
| number | string |
Номер карты (частично засекреченный) |
OrderStatusEnum : integer
Возможные значения:
| Value | Name | Description |
|---|---|---|
| 0 | STATUS_NEW | Поиск курьера |
| 1 | STATUS_INWORK | Заказ находится в работе |
| 3 | STATUS_MODERATE | Заказ находится на модерации |
| -1 | STATUS_UNAPPLIED | Курьер не назначен |
| -2 | STATUS_DONE | Заказ завершен |
| -4 | STATUS_CANCELED | Заказ отменен |
OrderReasonEnum : integer
Возможные значения:
| Value | Name | Description |
|---|---|---|
| 0 | REASON_NONE | Нет причины/Все хорошо |
| 1 | REASON_CANCELED_BY_CLIENT | Заказ отменен клиентом |
| 2 | REASON_CANCELED_BY_COURIER | Заказ отменен курьером |
| 3 | REASON_TARGET_CANCELED | Одна из точек (pickup, deliveries[], redelivery) была отменена, из-за чего невозможно продолжить исполнение заказа |
| 4 | REASON_MANUAL_REVIEW | Заказ на ручной проверке |
| 5 | REASON_FRAUD | Подозрение на мошенничество |
| 6 | REASON_COURIER_NOT_ASSIGNED | Курьер не назначен |
| 7 | REASON_PAYMENT_FAILED | Неудачная оплата с карты |
OrderPaymentTypeEnum : integer
| Value | Name | Description |
|---|---|---|
| 1 | PAYMENT_TYPE_BALANCE | Оплата с баланса |
| 2 | PAYMENT_TYPE_SENDER | Оплата отправителем |
| 3 | PAYMENT_TYPE_RECIPIENT | Оплата получателем |
| 4 | PAYMENT_TYPE_SPLIT_BALANCE_AND_SENDER | Разделение оплаты: с баланса и отправителем |
| 5 | PAYMENT_TYPE_SPLIT_BALANCE_AND_RECIPIENT | Разделение оплаты: с баланса и получателем |
| 6 | PAYMENT_TYPE_SPLIT_SENDER_AND_RECIPIENT | Разделение оплаты: отправителем и получателем |
| 7 | PAYMENT_TYPE_CARD | Оплата картой |
| 8 | PAYMENT_TYPE_SPLIT_CARD_AND_SENDER | Разделение оплаты: с карты и отправителем |
| 9 | PAYMENT_TYPE_SPLIT_CARD_AND_RECIPIENT | Разделение оплаты: с карты и получателем |
OrderPaymentSplit : Object
Этот объект динамический - количество полей в нем может меняться. Описание возможных полей:
| Field | Type | Description |
|---|---|---|
| balance | float|null |
Сумма оплаты с баланса |
| card | float|null |
Сумма оплаты с карты |
| sender | float|null |
Сумма оплаты отправителем |
| recipient | float|null |
Сумма оплаты получателем |
OrderTariffTypeEnum : integer
Возможные значения:
| Value | Name | Description |
|---|---|---|
| 1 | INCITY | Доставка по городу |
| 2 | INTERCITY | Междугородняя доставка |
| 3 | MULTI_INCITY | Мульти-доставка (несколько получателей) по городу |
| 4 | MULTI_INTERCITY | Междугородняя мульти-доставка (несколько получателей) |
OrderTargetStatusEnum : integer
Возможные значения:
| Value | Name | Description |
|---|---|---|
| 0 | STATUS_NONE | Новое назначение / Курьер еще не приступил к этому назначению |
| 1 | STATUS_ONWAY | Курьер в пути к точке назначения |
| 2 | STATUS_WAIT | Курьер ожидает отправителя/получателя |
| 3 | STATUS_DONE | Назначение завершено |
| 4 | STATUS_CANCELED | Назначение отменено (отмена клиентом, отказ, отправитель/получатель не вышел на связь) |
OrderTargetReasonEnum : integer
Возможные значения:
| Value | Name | Description |
|---|---|---|
| 0 | REASON_NONE | Нет причины/Не задано |
| 1 | REASON_CUSTOM | Другая причина (в reason_custom) |
| 2 | REASON_REFUSED | По назначению получен отказ (отправитель/получатель отказался отправить/получить посылку) |
| 3 | REASON_CLIENT_CANCELED | Назначение отменено клиентом |
| 4 | REASON_CALL_NOT_ANSWERED | Курьер не дозвонился отправителю/получателю. / Отправитель/получатель не вышел на связь |
| 5 | REASON_AGE_CHECK_NOT_PASSED | Получатель не прошел проверку возраста (совершеннолетие) // применяется только к причине в пункте ДОСТАВКИ |
OrderTargetPaymentTypeEnum : integer
| Value | Name | Description |
|---|---|---|
| 1 | PAYMENT_TYPE_BALANCE | Оплата с баланса |
| 2 | PAYMENT_TYPE_SENDER | Оплата отправителем |
| 3 | PAYMENT_TYPE_RECIPIENT | Оплата получателем |
| 7 | PAYMENT_TYPE_CARD | Оплата с карты |
OrderCodToAccountStatusEnum : integer
Возможные значения:
| Value | Name | Description |
|---|---|---|
| 0 | STATUS_NONE | Задача не начата / Курьер еще не завершил доставку посылки |
| 1 | STATUS_AWAITING | Ожидание зачисления наложенного платежа |
| 2 | STATUS_DONE | Наложенный платеж успешно зачислен |
| 3 | STATUS_CANCELED | Наложенный платеж отменен (например, в случае, если доставка была отменена / получатель отказался принять посылку и т.п.) |
OrderDeliveryFinanceTypeEnum : integer
Дополнительные финансовые операции по доставке.
Возможные значения:
| Value | Name | Description |
|---|---|---|
| 0 | FINANCE_TYPE_NONE | Нет доп. фин. операций |
| 1 | FINANCE_TYPE_REDEEM_BALANCE | Выкупить посылку у отправителя, стоимость выкупа будет компенсирована с баланса клиента |
| 2 | FINANCE_TYPE_REDEEM_RECIPIENT | Выкупить посылку у отправителя, стоимость выкупа компенсирует получатель |
| 3 | FINANCE_TYPE_COD_BALANCE | Наложенный платеж: перевод суммы на счет клиента |
| 4 | FINANCE_TYPE_COD_REDELIVERY | Наложенный платеж: доставить сумму обратно отправителю |
| 6 | FINANCE_TYPE_COD_CARD | Наложенный платеж: перевод суммы на привязанную карту клиента. |
OrderDeliveryRedeliveryTypeEnum : integer
Возможные значения:
| Value | Name | Description |
|---|---|---|
| 0 | REDELIVERY_TYPE_NONE | Без обратной доставки |
| 1 | REDELIVERY_TYPE_REGULAR | Обычная обратная доставка по тарифу |
| 2 | REDELIVERY_TYPE_COD | Обратная доставка наложенного платежа (совместно с OrderDeliveryFinanceTypeEnum(FINANCE_TYPE_COD_REDELIVERY)) |
Transaction : Object
| Field | Type | Description |
|---|---|---|
| id | integer |
Id транзакции |
| order_id | integer|null |
Id заказа |
| type | TransactionTypeEnum |
Тип транзакции |
| amount | float |
Сумма |
TransactionTypeEnum : integer
Возможные значения:
| Value | Name | Description |
|---|---|---|
| 1 | TYPE_BALANCE_REFILL | Пополнение картой |
| 2 | TYPE_BALANCERESERVE_VOUCHER | Использование ваучера |
| 3 | TYPE_BALANCE_SYSTEM_ADD | Пополнение баланса системой |
| 4 | TYPE_BALANCE_SYSTEM_SUB | Списание баланса системой |
| 5 | TYPE_BALANCERESERVE_SYSTEM_ADD | Пополнение счета бонусом (невыводимой суммой) |
| 6 | TYPE_BALANCERESERVE_SYSTEM_SUB | Списание бонуса со счета (невыводимой суммы) |
| 7 | TYPE_BALANCE_REFUND | Возврат средств на карту (отмена платежа) |
| 10 | TYPE_BALANCE_WITHDRAW | Резервирование суммы для выплаты/вывода |
| 11 | TYPE_BALANCE_WITHDRAW_RETURN | Возврат зарезервированной суммы для выплаты/вывода |
| 20 | TYPE_ORDER_SEND_PAYMENT | Оплата заказа |
| 21 | TYPE_ORDER_RETURN_PAYMENT | Возврат оплаты заказа |
| 23 | TYPE_ORDER_ADD_PAYMENT | Доплата по заказу |
| 24 | TYPE_ORDER_ADD_CUSTOM_PRICE | Добавление надбавки клиента по заказу |
| 25 | TYPE_ORDER_SUB_CUSTOM_PRICE | Уменьшение надбавки клиента по заказу |
| 26 | TYPE_ORDER_USE_VOUCHER | Использование купона в заказе |
| 30 | TYPE_ORDER_FINE_CANCEL | Штраф за отмену заказа |
| 33 | TYPE_ORDER_LATE_COMPENSATION | Компенсация за опоздание |
| 35 | TYPE_ORDER_CANCEL_COMPENSATION | Компенсация за отмену заказа |
| 40 | TYPE_VALUATION_RESERVE | Резервирование оценочной стоимости посылки |
| 41 | TYPE_VALUATION_RETURN | Возврат оценочной стоимости посылки |
| 42 | TYPE_VALUATION_RECEIVE | Получение оценочной стоимости посылки |
| 52 | TYPE_COST_RECEIVE | Получение стоимости заказа (Компенсация) |
| 60 | TYPE_PARTNERS_COMPENSATION | Партнерское вознаграждение |
OrderCancelReason: Object
| Field | Type | Description |
|---|---|---|
| id | integer |
ID причины |
| title | string |
Текст причины |
| comment_required | bool |
Требуется ли комментарий |
CourierInfo : Object
| Field | Type | Description |
|---|---|---|
| idhash | string |
Уникальный хеш (ID) курьера |
| name | string |
Имя и фамилия курьера |
| phone | string |
Номер телефона курьера |
| avatar | string |
URL аватара курьера |
| rating | float |
Рейтинг курьера |
| orders_count | integer |
Кол-во доставок курьера |
| created_at | integer |
Дата регистрации курьера |
CourierReview : Object
| Field | Type | Description |
|---|---|---|
| author_type | CourierReviewAuthorTypeEnum |
Тип пользователя оставившего отзыв |
| rating | integer |
Рейтинг (от 1 до 5) |
| text | string|null |
Текст отзыва |
| created_at | integer |
Дата создания отзыва |
| updated_at | integer |
Дата изменения отзыва |
CourierReviewAuthorTypeEnum : integer
Возможные значения:
| Value | Name | Description |
|---|---|---|
| 1 | TYPE_CLIENT | Клиент |
| 2 | TYPE_RECIPIENT | Получатель |
Image : Object
| Field | Type | Description |
|---|---|---|
| id | integer |
Id изображения |
| url | string |
URL изображения |
Review : Object
| Field | Type | Description |
|---|---|---|
| order_id | integer |
ID заказа |
| target_id | integer|null |
ID доставки. Если null, то отзыв оставил клиент, иначе оставил получатель. |
| rating | integer |
Рейтинг (от 1 до 5) |
| text | string|null |
Текст отзыва |
| created_at | integer |
Дата создания отзыва |
| updated_at | integer |
Дата изменения отзыва |
ReviewMeta : Object
| Field | Type | Description |
|---|---|---|
| avg_rating | float |
Средняя оценка |
| count | integer |
Количество отзывов |
Location : Object
| Field | Type | Description |
|---|---|---|
| lat | float |
Гео-координаты курьера latitude |
| long | float |
Гео-координаты курьера longitude |
NullLocation : Object
Возвращается методом GET /orders/{id}/tracking, если локация курьера недоступна.
| Field | Type | Description |
|---|---|---|
| lat | null |
Всегда null |
| long | null |
Всегда null |
NotifyOrderStatusEnum : string
| Value | Description |
|---|---|
| INWORK | Заказ принят в работу |
| MODERATE | Заказ находится на модерации (обычно с причиной) |
| DONE | Заказ успешно завершен |
| UNAPPLIED | Не найдено курьера |
| CANCELED | Заказ отменен |
NotifyOrderReasonEnum : string
| Value | Description |
|---|---|
| CANCELED_BY_CLIENT | Клиент хочет отменить заказ |
| CANCELED_BY_COURIER | Курьер хочет отменить заказ |
| TARGET_CANCELED | Один из пунктов доставки отменен (точная причина отмены пункта - в заказе) |
| MANUAL_REVIEW | Заказ на ручной проверке |
| FRAUD | Подозрение на мошенничество |
| COURIER_NOT_ASSIGNED | Курьер не назначен |
| PAYMENT_FAILED | Неудачная оплата с карты |
NotifyPickupUpdate : Object
| Field | Type | Description |
|---|---|---|
| status | NotifyOrderTargetStatusEnum |
Статус |
| reason | NotifyOrderTargetReasonEnum|null |
Причина статуса |
| reason_custom | string|null |
Другая причина статуса |
NB: поле reason присутствует только при наличии причины установки статуса (актуально для “CANCELED”).
NB: поле reason_custom присутствует только если reason = "CUSTOM".
NotifyDeliveryUpdate : Object
| Field | Type | Description |
|---|---|---|
| id | integer |
Id пункта получателя (OrderDelivery.id) |
| status | NotifyOrderTargetStatusEnum |
Статус |
| reason | NotifyOrderTargetReasonEnum|null |
Причина статуса |
| reason_custom | string|null |
Другая причина статуса |
NB: поле reason присутствует только при наличии причины установки статуса (актуально для “CANCELED”).
NB: поле reason_custom присутствует только если reason = "CUSTOM".
NotifyRedeliveryUpdate : Object
| Field | Type | Description |
|---|---|---|
| status | NotifyOrderTargetStatusEnum |
Статус |
| reason | NotifyOrderTargetReasonEnum|null |
Причина статуса |
| reason_custom | string|null |
Другая причина статуса |
NB: поле reason присутствует только при наличии причины установки статуса (актуально для “CANCELED”).
NB: поле reason_custom присутствует только если reason = "CUSTOM".
NotifyCodToAccountUpdate : Object
| Field | Type | Description |
|---|---|---|
| status | NotifyCodToAccountStatusEnum |
Статус |
NotifyOrderTargetStatusEnum : string
| Value | Description |
|---|---|
| NONE | Задача не начата (соответствует OrderTargetStatusEnum::STATUS_NONE) |
| ONWAY | Курьер в пути к точке назначения (соответствует OrderTargetStatusEnum::STATUS_ONWAY) |
| WAIT | Курьер ожидает отправителя/получателя (соответствует OrderTargetStatusEnum::STATUS_WAIT) |
| DONE | Назначение завершено (соответствует OrderTargetStatusEnum::STATUS_DONE) |
| CANCELED | Назначение отменено (отмена клиентом, отказ, отправитель/получатель не вышел на связь) (соответствует OrderTargetStatusEnum::STATUS_CANCELED) |
NotifyOrderTargetReasonEnum : string
| Value | Description |
|---|---|
| CUSTOM | Другая причина. Указана в reason_custom. (соответствует OrderTargetReasonEnum::REASON_CUSTOM) |
| REFUSED | По назначению получен отказ (отправитель/получатель отказался отправить/получить посылку) (соответствует OrderTargetReasonEnum::REASON_REFUSED) |
| CLIENT_CANCELED | Назначение отменено клиентом (соответствует OrderTargetReasonEnum::REASON_CLIENT_CANCELED) |
| CALL_NOT_ANSWERED | Курьер не дозвонился отправителю/получателю. / Отправитель/получатель не вышел на связь (соответствует OrderTargetReasonEnum::REASON_CALL_NOT_ANSWERED) |
| AGE_CHECK_NOT_PASSED | Получатель не прошел проверку возраста (совершеннолетие) // применяется только к причине в пункте ДОСТАВКИ (соответствует OrderTargetReasonEnum::REASON_AGE_CHECK_NOT_PASSED) |
NotifyCodToAccountStatusEnum : string
| Value | Description |
|---|---|
| NONE | Задача не начата / Курьер еще не завершил доставку посылки (соответствует OrderCodToAccountStatusEnum::STATUS_NONE) |
| AWAITING | Ожидание зачисления наложенного платежа (соответствует OrderCodToAccountStatusEnum::STATUS_AWAITING) |
| DONE | Наложенный платеж успешно зачислен (соответствует OrderCodToAccountStatusEnum::STATUS_DONE) |
| CANCELED | Наложенный платеж отменен. Например, в случае, если доставка была отменена / получатель отказался принять посылку и т.п. (соответствует OrderCodToAccountStatusEnum::STATUS_CANCELED) |
NavLinks : Object
Данный объект представляет словарь (Map<String, String>) ссылок навигации перечисления.
Возможные пары:
| Field | Description |
|---|---|
| self | Ссылка на текущую страницу |
| prev | Ссылка на предыдущую страницу |
| next | Ссылка на следующую страницу |
| first | Ссылка на первую страницу |
| last | Ссылка на последнюю страницу |
Все ключи, кроме self могут отсутствовать. Например, если все элементы укладываются в одну страницу, будет существовать только self. В случае, если следующей или предыдущей страницы нет, будут отсутствовать next (и last) или prev (и first) соответственно.
NavMeta : Object
Данный объект представляет словарь (Map<String, integer>) метаинформации перечисления.
Возможные пары:
| Field | Description |
|---|---|
| total_count | Кол-во элементов в перечислении |
| page_count | Кол-во страниц в навигации по перечислению |
| current_page | Текущая страница навигации по перечислению |
Errors
Внимание: В данный момент коды ошибок не стандартизированны, и могут измениться в ходе разработки API. Потому рекомендуется создать список констант на клиенте и использовать их при разработке клиента, чтоб в дальнейшем без проблем можно было их изменить.
Список кодов ошибок
| Код | Имя | Описание | Общая? |
|---|---|---|---|
0 |
COMMON_ERROR | Общая ошибка | + |
1 |
API_VERSION_CLOSED_ERROR | Версия API закрыта. | + |
44 |
NOT_FOUND_ERROR | Запрашиваемая сущность не известна. | + |
100 |
VALIDATION_ERROR | Ошибка валидации сущности. | + |
104 |
NOT_ENOUGH_BALANCE_ERROR | Недостаточно средств на балансе | - |
105 |
BALANCE_NEGATIVE_ERROR | Баланс меньше нуля | - |
106 |
NOT_ALLOWED_BY_CONDITION_ERROR | Действие не разрешено по условию | ? |
109 |
NO_MATCHING_TARIFF_FOUND_ERROR | Не найден тариф для заказа. Возможно, слишком большой размер посылки/вес груза. | - |
112 |
ORDER_NOT_INWORK_ERROR | Статус заказа не позволяет выполнить действие | - |
114 |
IMPERMISSIBLE_VALUATION_ERROR | Недопустимая оценочная стоимость | - |
116 |
ORDER_ALREADY_INWORK_ERROR | Статус заказа был изменен, order.status != STATUS_NEW |
- |
117 |
ADDRESS_OUT_OF_MAP_BOUNDS_ERROR | Адрес находится за допустимыми пределами | - |
118 |
PROPERTY_IS_READONLY_ERROR | Нельзя изменить свойство по каким-либо причинам | - |
123 |
IMPERMISSIBLE_REDEEM_VALUATION_ERROR | Недопустимая сумма выкупа посылки | - |
124 |
IMPERMISSIBLE_DELIVERY_TIME_ERROR | Время доставки слишком малое для этого маршрута | - |
125 |
IMPERMISSIBLE_REDELIVERY_TIME_ERROR | Время обратной доставки слишком малое для этого маршрута | - |
128 |
IMPERMISSIBLE_CODTOACCOUNT_VALUATION_ERROR | Недопустимая сумма наложенного платежа на расчетный счет | - |
130 |
IMPERMISSIBLE_AGE_CHECK_DOB_ERROR | Указанная дата рождения получателя не соответствует совершеннолетию на дату доставки. | - |
131 |
COMMENT_REQUIRED_ERROR | Требуется добавить комментарий | - |
132 |
OPTION_DISABLED_ERROR | Опция не доступна | - |
135 |
VOUCHER_NOT_FOUND_ERROR | Ваучер не найден | - |
136 |
CANNOT_PAY_WITH_BALANCE_WHEN_VOUCHER_USED_ERROR | Нельзя произвести оплату заказа с баланса при использовании ваучера | - |
139 |
PAYMENT_CARD_NOT_FOUND_ERROR | Платежная карта не найдена | - |
140 |
PAYMENT_FAILED_ERROR | Неуспешный платеж | - |
142 |
ORDER_UPDATE_RESTRICTION_ERROR | Ограничение редактирования заказа | - |
147 |
NO_REASON_FOUND | Указанная причина отмены не найдена | - |
149 |
REASON_REQUIRED | Требуется указать причину отмены | - |
Ошибка 0
Когда приходит эта ошибка, нужно просто показать сообщение из нее (message) пользователю.
Ошибка 1
Запрашиваемая версия API закрыта. Необходимо обновить приложение. Можно показать пользователю поп-ап с текстом типа “Для продолжения работы требуется обновить приложение” и кнопочкой “Обновить”, нажатие на которую ведет на источник установки приложения (e.g. плей-маркет).
Ошибка 100
С этой ошибкой есть дополнительное поле - errors
[
{
"field": {field_name},
"message": {error_message}
}
]
где {field_name} - (string) имя поля, {error_message} - (string) текстовое описание ошибки.
Ошибки 104, 105
С этой ошибкой есть дополнительное поле:
balance(float) - текущая сумма на балансе пользователя
Ошибка 109
С этой ошибкой есть дополнительные поля:
maxLength(integer) - Максимальная длина (мм) отправления NB: Это значение может изменяться!maxWidth(integer) - Максимальная ширина (мм) отправления NB: Это значение может изменяться!maxHeight(integer) - Максимальная высота (мм) отправления NB: Это значение может изменяться!maxWeight(integer) - Максимальный вес (г) отправления NB: Это значение может изменяться!
Ошибка 114
С этой ошибкой есть дополнительные поля:
max(float) - Максимальное допустимая сумма оценочной стоимости. NB: Это значение может изменяться!
Ошибка 117
Допустимые пределы карты на данный момент - Киев и Киевская область (по версии Google Maps).
С этой ошибкой есть дополнительные поля:
reason(string|null) - Текстовое описание ошибки, которое можно показать пользователю. NB: Этого поля может вовсе не быть!lat(float) - Гео-координаты адреса - latitude NB: Это значение может изменяться!long(float) - Гео-координаты адреса - longitude NB: Это значение может изменяться!
Ошибка 123
С этой ошибкой есть дополнительные поля:
max(float) - Максимальное допустимая сумма для выкупа посылки. NB: Это значение может изменяться!
Ошибка 124
С этой ошибкой есть дополнительные поля:
min(integer) - Минимальное допустимое время доставки. NB: Это значение может изменяться!
Ошибка 125
С этой ошибкой есть дополнительные поля:
min(integer) - Минимальное допустимое время обратной доставки. NB: Это значение может изменяться!
Ошибка 128
С этой ошибкой есть дополнительные поля:
max(float) - Максимальное допустимая сумма наложенного платежа. NB: Это значение может изменяться!
Важная заметка касательно обновления 1.10
В обновлении 1.10 был переработан механизм определения тарифа для заказа.
В виду этого изменения было убрано поле delivery_type из заказа. Вместо него теперь есть поле tariff_type, определяющее тип тарифа, который был применен к конкретному заказу.
Для создания заказа типа “доставить за XX минут” можно использовать новое поле delivery_time.
Для обратной совместимости значение delivery_type все еще обрабатывается в форме и возвращается методами получения списка заказов/информации о заказе, но с корректировками:
* в форме создания заказа:
- значения DELIVERY_TYPE_REGULAR, DELIVERY_TYPE_INTERCITY и DELIVERY_TYPE_MULTI игнорируются. Тип тарифа (по городу, межгород, мульти) определяется автоматически на основании данных в запросе.
- значения DELIVERY_TYPE_FAST30, DELIVERY_TYPE_FAST60, DELIVERY_TYPE_FAST90, DELIVERY_TYPE_FAST120 преобразовываются в соответствующее значение delivery_time, тип тарифа определяется автоматически на основании данных в запросе.
* в методах получения списка заказов и подробной информации о заказе данное значение частично эмулируется.
В будущих версиях API поддержка значения delivery_type будет окончательно прекращена. Рекомендуется как можно скорее начать использовать новые значения tariff_type и delivery_time.
На тестовом сервере поле delivery_type не поддерживается.
Changelog
1.28
- Добавлен метод “Получение всех транзакций” (
GET /transactions). - Добавлена структура
Transaction. - Добавлено перечисление
TransactionTypeEnum. - В список кодов ошибок добавлена ошибка
112(ранее была описана только в методах, которые её возвращают). - Исправлена документация: поле
phone2вFormOrderDeliveryне обязательное. - Исправлена документация: если локация курьера недоступна,
GET /orders/{id}/trackingвозвращает структуруNullLocationсnullв поляхlatиlong. - В методе создания заказа (
POST /orders) добавлено полеconfirm_codeв структурыFormOrderDeliveryиFormOrderRedelivery: можно передать собственный 4-значный код подтверждения доставки/обратной доставки. Если не передан, код генерируется системой.
1.27
- В методе создания заказа (
POST /orders) добавлены поля в структуру запроса:phone2в основную структуру и вFormOrderDeliverycheckout_codeвFormOrderDeliveryentrance,floorиprivate_buildingвFormOrderAddress
- В методе редактирования существующего заказа (
PATCH /orders/{id}) добавлено полеphone2в основную структуру запроса и вFormOrderUpdateDelivery. - Добавлено поле
phone2в структуруOrder. - Добавлены поля
phone2иcheckout_codeв структуруOrderDelivery. - Добавлены поля
entrance,floorиprivate_buildingв структуруOrderAddress. - Добавлено новое значение поля
typeв уведомление о состоянии заказа (“order:created”)
1.26
- Добавлено поле
cancel_reasonв запросе наnotify_url. - Добавлено поле
cancel_reasonв структуруOrder. - Добавлена структура
OrderCancelReasonDesc.
1.25
- В ответ метода оценки стоимости заказа (
POST /orders?preview=1) добавлено полеdelivery_distance.
1.24
- В метод “Отмена заказа” (
POST /orders/{id}/cancel) добавлена ошибка112.
1.23
- Добавлено поле
timeв запросе наnotify_url.
1.22
- В ответ метода создания заказа (
POST /orders) добавлена параweather: floatв словарьprice_parts. - В метод “Отмена заказа” (
POST /orders/{id}/cancel) добавлены поля запросаreason,commentи ошибки131,147,149. - Добавлен метод “Получить список причин отмены заказа” (
GET /orders/cancel-reason-options). - Добавлена структура
OrderCancelReason. - Добавлены ошибки
147,149.
1.21
- Добавлено поле
payment_splitв запрос метода редактирования существующего заказа (PATCH /orders/{id}).
- В методе создания заказа (
POST /orders) в структуреFormOrderDeliveryудалены поляpersonal_id_check_requiredиpersonal_id_check_value. - В структуре
OrderDeliveryудалено полеpersonal_id_check_required. (Данная структура используется в структуреOrder, которую возвращает метод получения подробной информации по заказу (GET /orders/{id})) - В перечислении
OrderTargetReasonEnumудалено значение6(REASON_PERSONAL_ID_CHECK_NOT_PASSED) - В перечислении
NotifyOrderTargetReasonEnumудалено значениеPERSONAL_ID_CHECK_NOT_PASSED
1.20
- Добавлено поле
idв структуруOrderParcel. - Добавлена ошибка
142(Ограничение редактирования заказа). - Метод редактирования объявленной стоимости (
PATCH /orders/{id}) расширен до частичного редактирования заказа.
1.19
- Добавлен метод получения стикера для доставки
GET /stickers/{id}.
1.18
- При создании заказа с мульти-доставкой (несколько получателей) теперь можно указывать пункты доставки в разных населенных пунктах.
- Значение
MULTIпереименовано вMULTI_INCITYв перечисленииOrderTariffTypeEnum. - Добавлено значение
MULTI_INTERCITYв перечислениеOrderTariffTypeEnum. - Удалена ошибка
119(Адрес отправителя и адрес получателя находятся в разных населенных пунктах).
1.17
- Добавлено поле
recreated_idв структуруOrder.
1.16
- Добавлено поле
payment_card_idв запрос метода создания заказа (POST /orders). Так же добавлены ошибки139(Платежная карта не найдена) и140(Неуспешный платеж). - Добавлено значение
REASON_PAYMENT_FAILEDв перечислениеOrderReasonEnum. - Добавлено значение
PAYMENT_FAILEDв перечислениеNotifyOrderReasonEnum. - Добавлено значение
PAYMENT_TYPE_CARDв перечисленияOrderTargetPaymentTypeEnumиFormOrderTargetPaymentTypeEnum. - Добавлены значения
PAYMENT_TYPE_CARD,PAYMENT_TYPE_SPLIT_CARD_AND_SENDER,PAYMENT_TYPE_SPLIT_CARD_AND_RECIPIENTв перечисленияOrderPaymentTypeEnumиFormOrderPaymentTypeEnum. - Добавлено поле
cardв структуруFormOrderPaymentSplit.
1.15
- В структуру
Reviewдобавлено полеorder_id. - Добавлен метод получения всех отзывов на заказы
GET /order-reviews. - Добавлен метод вывода списка привязанных платежных карт (
GET /cards) - Добавлено поле
cod_card_idв структуруFormOrderDelivery. - Добавлена структура
PaymentCard.
1.14
- В структуре
Reviewдобавлено полеtarget_id. - В структуре
Orderудалено полеreviewи добавлено полеreview_meta. - Добавлена структура
ReviewMeta. - Добавлен метод получения отзывов о выполнении заказа (
GET /orders/{id}/reviews). - Добавлен метод получения всех отзывов о курьере (
GET /orders/{id}/courier/reviews). - Добавлена структура
CourierReview. - Добавлено перечисление
CourierReviewAuthorTypeEnum.
1.13
- Максимальное значение
delivery_timeв методе создания заказа (POST /orders) увеличено до 10800 (3 часа)
1.12
- Добавлено поле
voucher_codeв запрос метода создания заказа (POST /orders). Так же добавлены ошибки135(Ваучер не найден) и136(Нельзя произвести оплату заказа с баланса при использовании ваучера). - Добавлена аутентификация уведомлений о статусе заказа (на
notify_url)
1.11
- Добавлена проверка возраста получателя:
- поле
personal_id_check_requiredв структуреFormOrderDelivery@ метод создания заказа (POST /orders) - поле
personal_id_check_valueв структуреFormOrderDelivery@ метод создания заказа (POST /orders) - поле
personal_id_check_requiredв структуреOrderDelivery - значение
6(REASON_PERSONAL_ID_CHECK_NOT_PASSED) в перечислениеOrderTargetReasonEnumпричин статуса пункта доставки - значение
PERSONAL_ID_CHECK_NOT_PASSEDв перечислениеNotifyOrderTargetReasonEnumпричин статуса пункта доставки в уведомлении наnotify_url
- поле
1.10
- Изменения в методе создания заказа (
POST /orders):- удалено поле
delivery_typeиз формы запроса - добавлено поле
delivery_timeв форму запроса - удалены значения
delivery_time_fromиdelivery_time_toиз структуры ответа при запросе сpreview=1 - добавлено значение
tariff_typeв структуру ответа при запросе сpreview=1 - ошибка
119теперь актуальна только для мульти-доставок
- удалено поле
- В методе изменения добавочной стоимости существующего заказа (
PATCH /orders/{id}) изменены условия — в заказе должен быть только один пункт доставки (вместо проверкиdelivery_type == DELIVERY_TYPE_MULTI, т.к. полеdelivery_typeудалено). - В структуре
Orderудалено полеdelivery_typeи добавлены поляtariff_typeиdelivery_time. - В структуре
OrderShortудалено полеdelivery_typeи добавлено полеtariff_type. - Удалено перечисление
OrderDeliveryTypeEnumи добавлено новое —OrderTariffTypeEnum.
1.9
- В методах создания/обновления отзыва об исполнении заказа (
POST /orders/{id}/reviewиPATCH /orders/{id}/review) полеtextстало условно обязательным, добавлена ошибка131. - Удалено значение
5(FINANCE_TYPE_REDEEM_RECIPIENT_NORESERVE) из перечисленияOrderDeliveryFinanceTypeEnumи из перечисленияFormOrderDeliveryFinanceTypeEnum, таким образом, выкупа отправления с компенсацией получателем без гарантирования (со стороны клиента) более нет. Если будет передано значение5, оно будет неявно преобразовано в2(FINANCE_TYPE_REDEEM_RECIPIENT). - В методе создания заказа (
POST /orders) отключены опции наложенного платежа на баланс и карту (значения3и6поляfinance_typeвFormOrderDelivery). - Добавлена ошибка
132.
1.8
- Добавлено поле
age_check_dobв формуFormOrderDeliveryметода создания заказа (POST /orders). - Добавлена ошибка
130в метод создания заказа (POST /orders). - Добавлено поле
age_check_dobв структуруOrderDelivery.
1.7
- Теперь в случаях, когда не был вовремя назначен курьер, заказ переходит на модерирование вместо конечного статуса
UNAPPLIED. После этого курьер может быть назначен вручную (переход в статусINWORK), или заказ может быть отменен (переход в статусCANCELED), или подтвержден, что курьер не найден (переход в статусUNAPPLIED). В последних двух случаях заказ может быть пересоздан сrecreated_idв уведомлении. - Добавлено значение
6в перечислениеOrderReasonEnum. - Добавлено значение
COURIER_NOT_ASSIGNEDв перечислениеNotifyOrderReasonEnum.
1.6
- Добавлено поле
courier_locationв запросе наnotify_url.
1.5
- Добавлены значения
4и5в перечислениеOrderReasonEnum. - Добавлены значения
MANUAL_REVIEWиFRAUDв перечислениеNotifyOrderReasonEnum. - Изменена максимальная длина поля
notify_urlв запросе создания заказаPOST /ordersдо 1024.
1.4
- В метод создания заказа (
POST /orders) добавлена ошибка128. - Добавлено описание ошибки
128. - Добавлена проверка возраста получателя:
- поле
age_check_requiredв структуреFormOrderDelivery - поле
age_check_requiredв структуреOrderDelivery - значение
5(REASON_AGE_CHECK_NOT_PASSED) в перечислениеOrderTargetReasonEnumпричин статуса пункта доставки - значение
AGE_CHECK_NOT_PASSEDв перечислениеNotifyOrderTargetReasonEnumпричин статуса пункта доставки в уведомлении наnotify_url
- поле
1.3
- Добавлены поля
pickup_update,delivery_updates,redelivery_update,codtoaccount_updateв запросе наnotify_url. - Добавлены типы
NotifyPickupUpdate,NotifyDeliveryUpdate,NotifyRedeliveryUpdate,NotifyCodToAccountUpdate,NotifyOrderStatusEnum,NotifyOrderReasonEnum,NotifyOrderTargetStatusEnum,NotifyOrderTargetReasonEnum,NotifyCodToAccountStatusEnum. - Добавлены перечисления
NotifyPickupUpdate,NotifyDeliveryUpdate,NotifyRedeliveryUpdate,NotifyCodToAccountUpdate. - Добавлены примеры запросов на
notify_url.
1.2.2
- Добавлено поле
origin_idв структуруOrder. - Добавлено поле
recreated_idв запросе наnotify_url.
1.2.1
- Добавлено поле
idhashв структуруCourierInfo. - Добавлено поле
courierв запросе наnotify_url.
1.2
- Добавлено значение
7в перечислениеOrderDeliveryFinanceTypeEnum - Добавлена структура
OrderCodToAccountв структуруOrder(полеcodtoaccount) - Добавлено перечисление
OrderCodToAccountStatusEnum - Изменения в методе создания заказа (
POST /orders):- Добавлено поле запроса
codtoaccount - Добавлена структура
FormOrderCodToAccount - Добавлено значение
7в перечисление формыFormOrderDeliveryFinanceTypeEnum, а так же в этой секции добавлен разъяснительный текст касательно этого значения.
- Добавлено поле запроса
- Удалено поле
company_nameиз структурыCourierInfo, т.к. не используется. - Добавлено поле
order_numberв формеFormOrderDeliveryметодаPOST /orders. - Добавлено поле
order_numberв структуруclient::OrderDelivery.
1.1
- Добавлено поле
notify_urlв тело запросаPOST /orders.