TbT Platform Docs

Logo

TbT Docs at GitHub Pages.

View My GitHub Profile

TbT ERP API

Общая информация

Агентский API предназначен для интеграции ERP систем бизнес-агентов в сервисы TbT.

Для подключения к системе необходимо:

  • иметь регистрационную запись в системе с установленным признаком agent

  • ID учетной записи агента (UUID)

  • Уникальный токен и пароль (или одноразовый сессионный код) для клиентского подключения (передаются в заголовке для Basic Auth)

К агентскому токену могут добавляться ограничения на некоторые общие типы операций: create, update, notify

При подключении в индифидуальном профиле создается реестр правил/классификатор обработки ТТН для каждой группы агентов (agent class) в зависимости от особенностей их данных, чтобы облегчить интеграцию.

Формат URL для отправки запросов к API

https://api.tbt-post.net/api/v{v_number}/{method_name}/{method_params}?{get_params}
где
{v_number}

номер версии API в виде числа

{method_name}

название метода

{method_params}

параметры метода в URI

{get_params}

опциональные GET параметры

Для проверки запросов в командной строке/терминале, используйте User-Agent: curl, не ниже 7.47.0

API

Посылки

Создание посылки

protocol_method

POST

method_name

agent/parcel

method_params

new

request_body

{"order_id": "<EXT Order ID>", "receiver": { "id": "<EXT User ID>", "phone": <PHONE 380XXYYYYYYY>, "email" : "<USER EMAIL>", "first name" : <FIRST NAME>, "last_name": "<LAST NAME>"}, "delivery_type": <DELIVERY TYPE>, "dest" : [ <LATITUDE>, <LONGITUDE>], "dest_apartment": "<DEST APARTMENT>", "weight" : <WEIGHT GRAM as INTEGER>, "price" : <PRICE as DECIMAL(10,2)>, "cod_amount" : <PRICE as DECIMAL(10,2)>, "type" : "<TYPE CODE>:<CLASS CODE>", "note" : "<USER NOTE>", "created_at": "<DATE TIME in ISO 8601>", "contragent_id" : <CONTRAGENT ID>, "dimensions": [<WIDTH>, <HEIGHT>, <DEPTH>], "_comment" : "<SENDER’s comment>", "items": [<PARCEL ITEM SPEC>, …​]}

expected_result

200 {"id" : "<PARSEL ID>", "success": true}

описание PARCEL_ITEM_SPEC: {"barcode": "<UNIQ BARCODE>", "sku": "<SUPPLIER SKU NAME>", "name": "<NAME>", "brand": "<BRAND>", "size": "<SIZE>", "quantity": <QUANTITY as INTEGER>, "weight": <WEIGHT GRAM as INTEGER>, "price": <PRICE as DECIMAL(10,2)>, "comment": "<OPTIONAL COMMENT>", "photos":["<OPTIONAL PHOTO_URL_LIST>"]}
ключи cod_amount, contragent_id, dimensions, _comment, items — опциональны.
contragent_id - необходимо указывать если в type=COD
Для посылок с классификатором оплаты COD в качестве значения cod_amount будет подставляться параметр price в случае отсутствия явного его указания в параметрах. cod_amount не может быть больше чем price
параметр delivery_type имеет значение по-умолчанию W2W, в случае значений W2D и D2D необходимо передать ключ dest_apartment
Пример запроса/ответа
Запрос
curl -v -X POST "https://sandbox-api.tbt-post.net/api/v1/agent/parcel/new" \
-H "Content-Type: application/json" \
-H "Authorization: Basic dG9rZW46cGFzc3dk" \
-d '{"order_id": "TEST0001", "receiver": { "id": 0, "phone": "380662225577", "email" : "example@gmail.com", "first_name" : "test", "last_name": "user"}, "delivery_type": "W2W", "dest" : ["50.405237", "30.679338"], "dest_apartment": "26b10dbb-4f1b-4d45-9c19-ec3cb85d4253", "weight" : 1520, "price" : 2500, "cod_amount" : 0, "type" : "fragile:A.PRP.NR.NA.S000", "note" : "", "created_at": "2018-12-11T11:45:00+00:00"}'

В параметрах "Authorization" Необходимо указать токен и пароль в формате base64.
Например: token:passwd → dG9rZW46cGFzc3dk

Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Tue, 11 Dec 2018 10:32:02 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 63
Connection: keep-alive
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS
Access-Control-Max-Age: 600
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://sandbox-ui.tbt-post.net
Access-Control-Allow-Headers: Content-Type

{
  "id": "252395d6-5764-4232-baeb-2020db2d8c2c",
  "success": true
}
При повторном отправлении запроса с такими же параметрами, сервер ответит ошибкой "409" и сообщением "{"message": "Order TEST0001 already registered", "success": false}"

Получение по id/code

protocol_method

GET

method_name

agent/parcel

method_params

<PARCEL ID>

get_params

<code>

request_body

----

expected_result

200 {"success": true, "address_id": "<SHIPPING ADDRESS ID>", "code": "<CODE-128>", "is_paid": <true/false>, "weight": <WEIGHT GRAM as DECIMAL(10,6)>, "agent": "<USER ID>", "is_open": <true/false>, "paid_at": "<TIMESTAMP UTC> or null", "closed_at": "<TIMESTAMP UTC or null>", "id": "<PARCEL ID>", "type": <TYPE CODE>, "parent": <PARCEL ID or null>, "price": <PRICE as DECIMAL(10,2)>, "cod_amount": <PRICE as DECIMAL(10,2)>, "paid_amount": <PAYMENTS TOTAL as DECIMAL(10,2)>, "class": "<CLASS ID>", "sender": "<USER ID>", "created_at": "<TIMESTAMP UTC>", "modified_at": "<TIMESTAMP UTC>", "receiver": "<USER ID>", "state": "<PARCEL STATE>", "transfer_via": "<OFFCIE ID>", "pentity": "<OFFICE ENTITY ID>", "additional_data": {…​}, "delivery_type": "<DELIVERY TYPE>" …​}

parcel_id имеет более высокий приоритет, чем code
Пример запроса/ответа
Запрос
curl -v -X GET "https://sandbox-api.tbt-post.net/api/v1/agent/parcel/252395d6-5764-4232-baeb-2020db2d8c2c" \
-H "Content-Type: application/json" \
-H "Authorization: Basic dG9rZW46cGFzc3dk"
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Tue, 11 Dec 2018 13:08:05 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 1114
Connection: keep-alive
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS
Access-Control-Max-Age: 600
Etag: "ea3c10b5aa787248012184e6befffbf7732930d0"
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://sandbox-ui.tbt-post.net
Access-Control-Allow-Headers: Content-Type

{
  "address_id": "f50a7aaa-8a1d-11e6-8a66-83b0de5b609d",
  "code": "TEST0001",
  "weight": 1520,
  "agent": "44ee4ac5-8e42-4e40-821a-3f3e5f13f680",
  "is_dirty": false,
  "is_open": true,
  "paid_at": null,
  "closed_at": null,
  "id": "252395d6-5764-4232-baeb-2020db2d8c2c",
  "paid_amount": 0,
  "state": "PU0000",
  "mark": null,
  "last_seen_at": null,
  "type": "fragile",
  "delivery_type": "W2W",
  "parent": null,
  "price": 2500,
  "checked_in_at": null,
  "class": "A.PRP.NR.NA.S000",
  "pentity": null,
  "transfer_via": "26b10dbb-4f1b-4d45-9c19-ec3cb85d4253",
  "sender": "44ee4ac5-8e42-4e40-821a-3f3e5f13f680",
  "nsid": 0,
  "is_paid": false,
  "modified_at": "2018-12-11T10:32:02.238182+00:00",
  "success": true,
  "additional_data": {
    "erp_token": "token",
    "ttl_days": 15,
    "ttl_days_default": 15,
    "_receiver": {
      "phone": "380662225577",
      "first_name": "test",
      "last_name": "user",
      "id": 0,
      "email": "example@gmail.com"
    }
  },
  "receiver": "67719cba-5cd5-4dd0-84c9-6b6864a75066",
  "cod_amount": 0,
  "created_at": "2018-12-11T10:32:02.238169+00:00",
  "goes_back": false
}

Получение cписка посылок по списку id

protocol_method

POST

method_name

agent/parcel/list

method_params

----

get_params

<code>

request_body

{"id": ["<PARCEL ID>", "<PARCEL ID>", …​]}

expected_result

200 {"success": true, "parcels": [{<PARCEL SPEC>}, {<PARCEL SPEC>}, …​]}

Пример запроса/ответа
Запрос
curl -v -X POST "https://sandbox-api.tbt-post.net/api/v1/agent/parcel/list" \
-H "Content-Type: application/json" \
-H "Authorization: Basic dG9rZW46cGFzc3dk" \
-d '{"id": ["252395d6-5764-4232-baeb-2020db2d8c2c", "4d52c496-9137-4e8a-bb1b-56f378669ac0"]}'
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Tue, 11 Dec 2018 14:24:13 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 2228
Connection: keep-alive
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS
Access-Control-Max-Age: 600
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://sandbox-ui.tbt-post.net
Access-Control-Allow-Headers: Content-Type

{
  "parcels": [
    {
      "address_id": "f50a7aaa-8a1d-11e6-8a66-83b0de5b609d",
      "code": "TEST0001",
      "weight": 1520,
      "agent": "44ee4ac5-8e42-4e40-821a-3f3e5f13f680",
      "is_dirty": false,
      "is_open": true,
      "paid_at": null,
      "closed_at": null,
      "id": "252395d6-5764-4232-baeb-2020db2d8c2c",
      "paid_amount": 0,
      "state": "PU0000",
      "mark": null,
      "last_seen_at": null,
      "type": "fragile",
      "delivery_type": "W2W",
      "parent": null,
      "price": 2500,
      "checked_in_at": null,
      "class": "A.PRP.NR.NA.S000",
      "pentity": null,
      "transfer_via": "26b10dbb-4f1b-4d45-9c19-ec3cb85d4253",
      "sender": "44ee4ac5-8e42-4e40-821a-3f3e5f13f680",
      "nsid": 0,
      "is_paid": false,
      "modified_at": "2018-12-11T10:32:02.238182+00:00",
      "additional_data": {
        "erp_token": "token",
        "_receiver": {
          "phone": "380662225577",
          "first_name": "test",
          "last_name": "user",
          "id": 0,
          "email": "example@gmail.com"
        },
        "ttl_days": 15,
        "ttl_days_default": 15
      },
      "receiver": "67719cba-5cd5-4dd0-84c9-6b6864a75066",
      "cod_amount": 0,
      "created_at": "2018-12-11T10:32:02.238169+00:00",
      "goes_back": false
    },
    {
      "address_id": "f50a7aaa-8a1d-11e6-8a66-83b0de5b609d",
      "code": "TEST0002",
      "PARCEL SPEC",
      "PARCEL SPEC",
      "PARCEL SPEC",
      "PARCEL SPEC",
      "created_at": "2018-12-11T14:23:51.628901+00:00",
      "goes_back": false
    }
  ],
  "success": true
}

Получение cписка посылок по участию

protocol_method

GET

method_name

agent/parcel/list

method_params

----

get_params

participant = all|agent|sender|receiver, sort_by = <SORT FIELD>, [sort_order = desc|asc], [limit=20, offset=0]

request_body

----

expected_result

200 {"total": <INTEGER TOTAL>, "parcels": [{<PARCEL SPEC>}, {<PARCEL SPEC>}, …​], "success": true}

По-умолчанию выполняется поиск всех посылок participant=all, порядок сортировки по-убыванию по состояниям. В качестве sort_by можно передать такие поля: [code, weight, price, paid_amount, created_at, modified_at, paid_at, type, class, state, goes_back]
Параметры в GET запросах необходимо перечислять через символ &
Параметры в [] - опциональны
Пример запроса/ответа
Запрос
curl -v -X GET "https://sandbox-api.tbt-post.net/api/v1/agent/parcel/list?participant=agent&sort_by=type&sort_order=asc&limit=20&offset=0" \
-H "Content-Type: application/json" \
-H "Authorization: Basic dG9rZW46cGFzc3dk"
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Wed, 12 Dec 2018 10:22:47 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 3337
Connection: keep-alive
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS
Access-Control-Max-Age: 600
Etag: "35c21fc7f5e3aa7aecbdc4389aa4b8097372f81c"
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://sandbox-ui.tbt-post.net
Access-Control-Allow-Headers: Content-Type

{
  "total": 3,
  "parcels": [
    {
      "address_id": "f50a7aaa-8a1d-11e6-8a66-83b0de5b609d",
      "code": "TEST0003",
      "weight": 145,
      "agent": "44ee4ac5-8e42-4e40-821a-3f3e5f13f680",
      "is_dirty": false,
      "is_open": true,
      "paid_at": null,
      "closed_at": null,
      "id": "0e1837e3-609f-4bc6-a121-3b21c0f11a5b",
      "paid_amount": 0,
      "state": "PU0000",
      "mark": null,
      "last_seen_at": null,
      "type": "fragile",
      "delivery_type": "W2W",
      "parent": null,
      "price": 125,
      "checked_in_at": null,
      "class": "A.PRP.NR.NA.S000",
      "pentity": null,
      "transfer_via": "26b10dbb-4f1b-4d45-9c19-ec3cb85d4253",
      "sender": "44ee4ac5-8e42-4e40-821a-3f3e5f13f680",
      "nsid": 0,
      "is_paid": false,
      "modified_at": "2018-12-12T10:19:42.207810+00:00",
      "additional_data": {
        "erp_token": "510ad08a-830e-46aa-ab63-dfade75a00a7",
        "_receiver": {
          "phone": "380662225577",
          "first_name": "test",
          "last_name": "user",
          "id": 0,
          "email": "example@gmail.com"
        },
        "ttl_days": 15,
        "ttl_days_default": 15
      },
      "receiver": "67719cba-5cd5-4dd0-84c9-6b6864a75066",
      "cod_amount": 0,
      "created_at": "2018-12-12T10:19:42.207796+00:00",
      "goes_back": false
    },
    {
      "address_id": "f50a7aaa-8a1d-11e6-8a66-83b0de5b609d",
      "code": "TEST0002",
      "PARCEL SPEC",
      "PARCEL SPEC",
      "PARCEL SPEC",
      "PARCEL SPEC",
      "created_at": "2018-12-11T14:23:51.628901+00:00",
      "goes_back": false
    },
    {
      "address_id": "f50a7aaa-8a1d-11e6-8a66-83b0de5b609d",
      "code": "TEST0001",
      "PARCEL SPEC",
      "PARCEL SPEC",
      "PARCEL SPEC",
      "PARCEL SPEC",
      "created_at": "2018-12-11T10:32:02.238169+00:00",
      "goes_back": false
    }
  ],
  "success": true
}

Получение списка items

protocol_method

GET

method_name

agent/parcel/item/list

method_params

<parcel_id>

get_params

----

request_body

----

expected_result

200 {"items":[{"sku":"<SUPPLIER SKU NAME>","name":"<NAME>","weight":<WEIGHT GRAM as INTEGER>,"modified_at":"<DATE>","brand":"<BRAND>","barcode":"<UNIQ BARCODE>","additional_data":{"photos":["<OPTIONAL PHOTO_URL_LIST>"]},"quantity":<QUANTITY as INTEGER>,"price":<PRICE as DECIMAL(10,2)>,"size":"<SIZE>"}],"success":true}

Пример запроса/ответа
Запрос
curl -v -X GET "https://sandbox-api.tbt-post.net/api/v1/agent/parcel/item/list/	cc52d435-ba59-4d5f-982c-09e0ff9cacad" \
-H "Authorization: Basic NTEwYWQwOGEtODMwZS00NmFhLWFiNjMtZGZhZGU3NWEwMGE3OmtSZnR2dzdX"
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Sun, 14 Apr 2019 14:35:08 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 513
Connection: keep-alive

{
  "items": [
    {
      "sku": "123_adidas_xl",
      "name": "Куртка",
      "weight": 1500,
      "modified_at": "2019-04-14T14:21:09.904880+00:00",
      "brand": "Adidas",
      "barcode": "123456789",
      "additional_data": {
        "photos": [
          "https://m3.ttest.net/imgw/loc/518939a431.jpg", "https://m4.test.net/imgw/325a9fa.jpg"
        ]
      },
      "quantity": 1,
      "price": 2050,
      "size": "XS"
    }
  ],
  "success": true
}

Получение кодов

protocol_method

GET

method_name

agent/parcel/codes

method_params

<PARCEL ID>

request_body

----

expected_result

200 {"qr": "<QR body>", "bcode": "<CODE128>", "success": true}

Пример запроса/ответа
Запрос
curl -v -X GET "https://sandbox-api.tbt-post.net/api/v1/agent/parcel/codes/4d52c496-9137-4e8a-bb1b-56f378669ac0" \
-H "Content-Type: application/json" \
-H "Authorization: Basic dG9rZW46cGFzc3dk"
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Wed, 12 Dec 2018 10:49:02 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 4040
Connection: keep-alive Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS
Access-Control-Max-Age: 600
Etag: "2b06b6d02fb247c191d703bb325ca1173138a2bd"
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://sandbox-ui.tbt-post.net
Access-Control-Allow-Headers: Content-Type

{
  "qr": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALIAAACyAQAAAADO8ajFAAAE9klEQVR4nNVXz4fl1xKv7ro8TY0aZvUITxjeqqlWTQxnVG8fTf6GEN52yCpkE7J9hLcaQv6JkNVwWg0jnOtcejU0EYaswmnn0oa6KvuYe2b73ndZPj4+p+pTP74nCR/6bk4/GAb434ufbG5gu7+4fL2Fy93F9vkF3J9cHcVD2kzpYEoZrbA1G5pWj+NFYXD1rpXnyJRExY/graQgzvQ6baCv8BsA0K3CzvaPujyy76/GJ+8er97L9TD3FwZv84u3tpPd3R8Qx/EneYLyl9hhZ98e15/JgNUKBjYrzKNa5lH9p3Cxedef4Q0UfLW/eVOfXsP95rgeyOzRZEy1UOaEIVj9OD+kj+iDWKq2mZTUs41V/iMiHIAyfNbRRafiih+d2aYnSyP1FjLW/NamVVRlQx6TsxAv+dUdc7QiHk6UVD14xQ+cnjxrrz2nNnFAWPEXt5jQB5hW66hZmqzwPUCbhvamXSqnGC/zz97KHFCGxjCs0j3myg/w7Kvb7Z29/sfZZ7++qsSfnl3uVn6Q2pUkajcHLRPIC630TJrQU91HcgB1YY1lP6I4QiWp4eJTEput8JMFotPMhoa1tJk8V/gK6OpAU9PBYKSDLfWbyWCD5mgGvWna2j8KA1WlS1YFIQ1d1PcUiOj6jwPhpz88fkFwp98/odvVPEQgagHGMjowysf0a8PGMcFqS1WOSiGr/BCgaPbpNls1KhXX7+VGOQBpVjAaLWuWsXqv7J9e7Pzgb7/Jb//568ONbeB65TdOKzZH1Tp6KUqTaOkf9jJkAHWzhp7R/CP1ChvNlAXrNCgMSbriVy/dgA3LDOsK3cuiH0/hP9coYOeH9w/bN/cXZwyH11er+lYdPcGxy+w9fWLaUg83iFkJJrlNaUWaLudDl+ZzAgoXpJ7Fci7mA+RoNCWpsSiGdZutLfmreEWJUm106kmZsfADJLYcwc25aBfkAZV1hW+VipUs0dBgNG595TfIliZt9tJj9Cg0jfvSD71maZYaHSJaYMux2KeQQeAEkT3UWRNHNz6O38Dtnq/G1cb2rwjuz24KXR5k5X8yADaD5EFWMI1tcZ+cwu97hXf3ezr56e6n/Zv3j74b+2d1wa+GoGiUA8nIB6Et910CBjZAVmQQK81gub+iiGZYjUAayaE0lv4BmRW1ZdXwbJMi1/wjq0yChjF9DKfksfRzOk4SKMDKhUSz05J/ZiuljsJ9NJ/QlVb3FSTOoZheAWOSOmSHRT43QP/aE5xI9xc70Puz8pqq8NF7fgO/Xf24h6//u5EDwuHu3/Vs/8lY+af2Ku4QIhoji2vRZX4cBhWyItl76qTW1/1bqClIL7WhhTaakUt+kCg0yQemRx9aZln0yykwP7l993c/7N5fnm/2n798uHvzdDk/PUCS2WV61yCrddnvNdSxB1pHEyBz60t/qhSHPjpqZDMU9rK8t4HhEF88+bJt/7bZv/qFf3vx3W6pf3ogz8Fm3tkH1SzLedWQreCMRkUGcc2sy/cO645AVWaAqWSF5b2aaV3BhGlWo0rQ1/sIsKmLFpd0RS4zdTHPT8HGVy+v7+ih7HZC5wd8fqDD8v5Ubh5QqBcD7WU6LPMjqoDDpwUCh88p0Zf1grfzl+uvt9uHcz5/oLPnP3y2X+mxOaKn4CTXLEMkaeH/Ddw8PgfejtudfvPyBm8J4eez1f/gB8P/N//7fwKlha0A3o4jOwAAAABJRU5ErkJggg==",
  "bcode": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASAAAABzCAIAAAC3jEg6AAAGK0lEQVR4nO3cSWgTfRiA8TeaNGpj6gJWMFZIrVAXKrmIqFiJDT1pUTwIRcEePKQnF0Q81JsH6c1qwZPkUJEKgiLi2rhUBDFipbhUEaVougiKmqaNme8wfCFfE9Ms8yqffX43Z97M/GfoQ9Jp0GYYhgDQMeNPLwD4mxEYoIjAAEUEBigiMEARgQGKCAxQRGCAIgIDFBEYoMg+5YTNZkv/p/nVqtTG9G9aZd1Y0NEyd/3qCDmWkfVcqYH0l5e+NmuPlvUIWa80x3Gy7so9k2Nj1svJsav0F+a+0il/tApaW9YZSxaTwjsYoIjAAEUEBigiMEARgQGKCAxQRGCAIgIDFBEYoIjAAEUEBigiMEARgQGKCAxQRGCAIgIDFBEYoIjAAEUEBigiMEARgQGKCAxQRGCAIgIDFBEYoIjAAEUEBigiMEARgQGKCAxQRGCAIgIDFBEYoIjAAEUEBigiMEARgQGKCAxQRGCAIgIDFBEYoIjAAEUEBigiMEARgQGKCAxQRGCAIgIDFBEYoIjAAEUEBigiMEARgQGKCAxQRGCAIgIDFBEYoIjAAEUEBiiyGYbxp9cA/LV4BwMUERigiMAARQQGKCIwQBGBAYoIDFBEYIAiAgMUERigiMD+49ChQ7acWltbRWRkZCT3QEooFNq4caPb7Xa73T6f7+jRo69evSroXKbHjx83NjZWVFS43e6GhoaHDx9mLr70mXg8fuHChW3btnm9XqfTWVlZuWvXrkgkUvqNnb4MpDl48GDu2xUMBg3DGB4ezj1g2r9/f+bAkiVLCjqXYRiPHj1yOp3puxwOx927d9NXbsnM2bNnM5fhcDguX76sdMP/egSWS3l5uYhMTExM2m4Glkolq9u3b4tIeXl5Z2fnx48fv3///vz581OnTgUCgYLOZRiGz+cTkebm5k+fPg0NDbW0tIjIqlWrksmktTOhUGjHjh3d3d2vX7/+8eNHX19fIBAQkcWLF2ddGKZEYLmUEtiBAwdEpL29vcRzPXnyREQ8Hk88Hje3TExMeL1eEXnw4IG1M5m+fPnicrlEJBKJ5HkhSMfvYFq+ffsmIjU1NSUeJxwOi0hTU1NZWZm5xW6379y5U0Tu3Llj7Uwmt9ttRphMJku8kOmJwLSsXLlSRDo7O83SimY+FFmzZk36xrq6utQuC2cyxePxd+/ezZs3b/Xq1aVcxbRFYMUbHBzMfPR37do1c29LS0tVVdXVq1erqqp2797d0dHx4sWLIs4yOjoqIpWVlekbFy1alNpl4Uym9vb2r1+/HjlyJPW+h4IQmBaXy9Xb27tnz55YLHb+/PnW1tba2tpNmzb19fUVdJyxsTERKSsrGxwc9Hq9y5Yte/v2rfkwMBaLWTszSTgcbmtrq6+vP3z4cHE3AQRWvKwPORobG9MHzp07Nzo6euPGjba2trq6uvv379fX14+MjOR/llmzZonI+Ph4MplMJBLmE794PC4is2fPtnYm3dOnT5uammpqai5evDhz5syi7hAITN+cOXO2bt16/PjxSCQSDAY/f/7c0dGR/8sXLlwoItFodOnSpe/fv//w4UN1dfXQ0FBql4UzKf39/Q0NDRUVFdevX1+wYEGJd2A6I7Dfx2az7d27V0T6+/vzf9WKFStEZNIHy2fPnqV2WThjevnypd/vdzgct27d8ng8+S8VmQjstzKf182YUcBt37x5s4hcunRpfHzc3JJIJLq7u0Vky5Yt1s6IyMDAgN/vTyQSN2/erK6uLvZC8a/f/He3/5dS/tB8+vTpffv2XblyZWBgIBaLRaPRUChkfhg7c+ZM/ucyDGPt2rUi0tzcHI1Gh4eHzW9g1NbW/vz509qZN2/eeDye+fPn82dlqxBYLrkDy2rDhg3mzMmTJ7MOrFu3bmxsLP9zGYbR29s76TuEdru9p6fH8pljx4796rq6urqKu4fTHB8RtQSDwa6uru3bty9fvtzpdLpcLp/Pd+LEiZ6enkk/5VNav379vXv3AoHA3LlzXS6X3+8Ph8PmRz7LZ2At/mdfQBHvYIAiAgMUERigiMAARQQGKCIwQBGBAYoIDFBEYIAiAgMUERigiMAARQQGKCIwQBGBAYoIDFBEYICifwAnfbNqPTt/mgAAAABJRU5ErkJggg==",
  "success": true
}
Если вставить полученный код в строке браузера, напримпр: "Crhome", то в результате получим изображение необходимого кода. Копировать необходимо без скобок, например: data:image/png;base64,iV…​<body>…​U5ErkJggg==

Получения PDF этикетки заказа

protocol_method

GET

method_name

agent/print-renderer

method_params

compile

get_params

pid=<parcel_id> [, cell=<sort_cell_id>]

request_body

----

expected_result

200 <pdf file data>

Пример запроса/ответа
Запрос
curl -v -X GET "https://sandbox-api.tbt-post.net/api/v1/agent/print-renderer/compile/kp?pid=30ca60d8-7d9b-47b3-a7b7-e40ff2fdefd2" --output test.pdf \
-H "Authorization: Basic dG9rZW46cGFzc3dk"
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Mon, 18 Feb 2019 12:31:13 GMT
Content-Type: application/pdf
Content-Length: 35836
Connection: keep-alive
Content-Disposition: attachment; filename="tabata_58x81"
Vary: Accept-Encoding
Etag: "ab6ffba98c9ff360e5cbc4952ef99a7646e980cd"
Cache-Control: no-cache

Результатом выполнения запроса будет загрузка PDF в файл, указанный в --output

Состояние посылки

protocol_method

GET

method_name

agent/parcel/track

method_params

<PARCEL ID>

request_body

----

expected_result

200 {"modified_at" : "<TIMESTAMP UTC>", "code" : "<CODE ID>", "geo" : [ <LATITUDE>, <LONGITUDE>], "success": true, "state_desc" : "<STATE DESCR>"}

Пример запроса/ответа
Запрос
curl -v -X GET "https://sandbox-api.tbt-post.net/api/v1/agent/parcel/codes/4d52c496-9137-4e8a-bb1b-56f378669ac0" \
-H "Content-Type: application/json" \
-H "Authorization: Basic dG9rZW46cGFzc3dk"
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Wed, 12 Dec 2018 11:43:01 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 302
Connection: keep-alive
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS
Access-Control-Max-Age: 600
Etag: "ccbb8b78e88fca92e5d705649a731f736f74ee55"
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://sandbox-ui.tbt-post.net
Access-Control-Allow-Headers: Content-Type

{
  "modified_at": "2018-12-12T10:42:49.430110+00:00",
  "code": "PU0000",
  "geo": [
    0,
    0
  ],
  "success": true,
  "state_desc": "Заявка зарегистрирована в системе"
}

История изменения состояний

protocol_method

GET

method_name

agent/parcel/log

method_params

<PARCEL ID>

request_body

----

expected_result

200 {"<TIMESTAMP UTC>" : {"code" : "<CODE ID>", "geo" : [ <LATITUDE>, <LONGITUDE>], "state_desc" : "<STATE DESCR>"}, …​, "success": true}

Пример запроса/ответа
Запрос
curl -v -X GET "https://sandbox-api.tbt-post.net/api/v1/agent/parcel/log/4d52c496-9137-4e8a-bb1b-56f378669ac0" \
-H "Content-Type: application/json" \
-H "Authorization: Basic dG9rZW46cGFzc3dk"
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Wed, 12 Dec 2018 11:43:01 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 302
Connection: keep-alive
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS
Access-Control-Max-Age: 600
Etag: "ccbb8b78e88fca92e5d705649a731f736f74ee55"
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://sandbox-ui.tbt-post.net
Access-Control-Allow-Headers: Content-Type

{
    "1542777583615": {
        "code": "PU0001",
        "geo": [
            0,
            0
        ],
        "state_desc": "Отправление принято к доставке"
    },
    "1542880237734": {
        "code": "PU0003",
        "geo": [
            0,
            0
        ],
        "state_desc": "В отделении"
    },
    "1543160738969": {
        "code": "PU0007",
        "geo": [
            0,
            0
        ],
        "state_desc": "Доставлено"
    },
    "success": true
}

История изменения состояний всех посылок

protocol_method

GET

method_name

agent/parcel/

method_params

logs

get_params

ts_from=<TIMESTAMP UTC> [, ts_to=<TIMESTAMP UTC>, state=<PARCEL STATE>]

request_body

----

expected_result

200 {"logs": [{"<TIMESTAMP UTC>" : {"code" : "<CODE ID>", "geo" : [ <LATITUDE>, <LONGITUDE>], "state_desc" : "<STATE DESCR>"}, "id": <PARCEL ID>}, {"<TIMESTAMP UTC>" : {…​}, …​}, …], "success": true}

,

Временные параметры ts_from, ts_to задаются в формате timestamp UTS in miliseconds.
Пример запроса/ответа
Запрос
curl -v -X GET "https://sandbox-api.tbt-post.net/api/v1/agent/parcel/log/logs?ts_from=1542880237734&ts_to=1542880237734&state="PU0007" \
-H "Content-Type: application/json" \
-H "Authorization: Basic dG9rZW46cGFzc3dk"
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Wed, 12 Dec 2018 11:43:01 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 302
Connection: keep-alive
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS
Access-Control-Max-Age: 600
Etag: "ccbb8b78e88fca92e5d705649a731f736f74ee55"
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://sandbox-ui.tbt-post.net
Access-Control-Allow-Headers: Content-Type

{
"logs": [
        {
            "1544628934289": {
                "code": "PU0007",
                "geo": [
                    0,
                    0
                ],
                "state_desc": "Доставлено"
            },
            "id": "ad0a7e57-5932-4e6f-86c3-c72df9fb317f"
        },
        {
            "1544628989049": {
                "code": "PU0007",
                "geo": [
                    0,
                    0
                ],
                "state_desc": "Доставлено"
            },
            "id": "0d575a34-bc24-4a77-bee7-018657311581"
        },
        {
            "1544628596582": {
                "code": "PU0007",
                "geo": [
                    0,
                    0
                ],
                "state_desc": "Доставлено"
            },
            "id": "fba18a75-e47e-4ca7-b22e-53416baad354"
        }
    ],
    "success": true
}

Модификация зарегистрированой посылки

protocol_method

PUT

method_name

agent/parcel/alter

method_params

<PARCEL ID>

request_body

{ "receiver": { "id": "<MK User ID>", "phone": <PHONE 380XXYYYYYYY>, "email" : "<USER EMAIL>", "first name" : <FIRST NAME>, "last_name": "<LAST NAME>"}, "delivery_type": "<DELIVERY TYPE>", "dest" : [ <LATITUDE>, <LONGITUDE>], "dest_apartment": "<APARTMENT>", "weight" : <WEIGHT GRAM as INTEGER>, "price" : <PRICE as DECIMAL(10,2)>, "cod_amount" : <PRICE as DECIMAL(10,2)>, "type" : "<TYPE CODE>:<CLASS CODE>", "note" : "<USER NOTE>", "contragent_id" : <CONTRAGENT ID>, "dimensions": [<WIDTH>, <HEIGHT>, <DEPTH>], "_comment" : "<SENDER’s comment>"}

expected_result

202 {"success": true}

Все ключи — опциональны, некоторые ключи имеют в зависимостях другие ключи: например dest связан с delivery_type, dest_apartment
Изменения применимы только для состояния Заявка зарегистрирована в системе (state == PU0000)
Пример запроса/ответа
Запрос
curl -v -X PUT "https://sandbox-api.tbt-post.net/api/v1/agent/parcel/alter/0e1837e3-609f-4bc6-a121-3b21c0f11a5b" \
-H "Content-Type: application/json" \
-H "Authorization: Basic dG9rZW46cGFzc3dk" \
-d '{"receiver": { "id": 0, "phone": "380667265627", "email": "bulikj@gmail.com", "first_name" : "Юлия", "last_name": "Верещак"}, "delivery_type": "W2W", "dest": ["50.405237", "30.679338"], "dest_apartment": "26b10dbb-4f1b-4d45-9c19-ec3cb85d4253","weight": 145, "price": 125, "cod_amount" : 0, "type": "fragile:A.PRP.NR.NA.S000", "note": "example information", "dimensions": [250, 400, 80], "_comment" : "test parcel"}'
Ответ

HTTP/1.1 202 Accepted
Server: nginx/1.10.3
Date: Wed, 12 Dec 2018 12:15:53 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 17
Connection: keep-alive
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS
Access-Control-Max-Age: 600
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://sandbox-ui.tbt-post.net
Access-Control-Allow-Headers: Content-Type

{
  "success": true
}
Если состояние отправления не позволяет выполнить запрос, будет получена ошибка с кодом 409 и сообщением {"message":"Inappropriate parcel state","success":false}
Модификация содержимого отправления
Добавление/обновление item
protocol_method

PUT

method_name

agent/parcel/item/add

method_params

<PARCEL ID>

request_body

{"barcode": "<UNIQ BARCODE>", "sku": "<SUPPLIER SKU NAME>", "name": "<NAME>", "brand": "<BRAND>", "size": "<SIZE>", "quantity": <QUANTITY as INTEGER>, "weight": <WEIGHT GRAM as INTEGER>, "price": <PRICE as DECIMAL(10,2)>, "comment": "<OPTIONAL COMMENT>", "photos": [<OPTIONAL PHOTO_URL_LIST>]}

expected_result

200 {"success": true}

Параметры quantity, price, weight (gramm), photos, comment - опциональны
При добавлении item с тем же barcode, данные будут обновлены.
Пример запроса/ответа
Запрос
curl -v -X PUT "https://sandbox-api.tbt-post.net/api/v1/agent/parcel/item/add/cc52d435-ba59-4d5f-982c-09e0ff9cacad" \
-H "Content-Type: application/json" \
-H "Authorization: Basic dG9rZW46cGFzc3dk" \
-d '{"barcode": "123456789", "sku": "123_adidas_xl", "name": "Куртка", "brand": "Adidas", "size": "XS", "quantity": 1, "weight": 1500, "price": 2050, "photos": ["https://m3.ttest.net/imgw/loc/518939a431.jpg", "https://m4.test.net/imgw/325a9fa.jpg"]}'
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Sun, 14 Apr 2019 14:18:08 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 17
Connection: keep-alive

{
  "success": true
}
Удаление item
protocol_method

PUT

method_name

agent/parcel/item/del

method_params

<PARCEL ID>

request_body

{"barcode": "<UNIQ BARCODE>"}

expected_result

200 {"success": true}

Пример запроса/ответа
Запрос
curl -v -X PUT "https://sandbox-api.tbt-post.net/api/v1/agent/parcel/item/del/cc52d435-ba59-4d5f-982c-09e0ff9cacad" \
-H "Content-Type: application/json" \
-H "Authorization: Basic dG9rZW46cGFzc3dk" \
-d '{"barcode": "12345678910"}'
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Sun, 14 Apr 2019 14:30:21 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 17
Connection: keep-alive

{
  "success": true
}

Запрос на изменение посылки после принятия к доставке

protocol_method

PUT

method_name

agent/parcel/update

method_params

<PARCEL ID>

request_body

{ "receiver": { "id": "<MK User ID>", "phone": <PHONE 380XXYYYYYYY>, "email" : "<USER EMAIL>", "first name" : <FIRST NAME>, "last_name": "<LAST NAME>"}, "price" : <PRICE as DECIMAL(10,2)>, "cod_amount" : <PRICE as DECIMAL(10,2)>}

expected_result

202 {"success": true}

receiver опциональный, cod_amount и paid_amount необходимо передавать парой, изменение возможно только в меньшую сторону по сравнению с начальным значением и доступно только для типов отправлений с COD
Запрос на модификацию возможен в состояних Принято к доставке (state == PU0001) и В отделении (state == PU0003)
Пример запроса/ответа
Запрос
curl -v -X PUT "https://sandbox-api.tbt-post.net/api/v1/agent/parcel/update/30ca60d8-7d9b-47b3-a7b7-e40ff2fdefd2" \
-H "Content-Type: application/json" \
-H "Authorization: Basic dG9rZW46cGFzc3dk" \
-d '{"price" : 350, "cod_amount" : 299}'
Ответ

HTTP/1.1 202 Accepted
Server: nginx/1.10.3
Date: Wed, 12 Dec 2018 13:45:30 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 17
Connection: keep-alive
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS
Access-Control-Max-Age: 600
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://sandbox-ui.tbt-post.net
Access-Control-Allow-Headers: Content-Type

{
  "success": true
}

Подтверждение платежа

protocol_method

POST

method_name

agent/parcel/paid

method_params

<PARCEL ID>

request_body

{ "amount": <PRICE as DECIMAL(10,2)>, "payment_id": "<ID as STRING>"}

expected_result

200 {"success": true}

Изменения не применимы для состояния Доставлено (state == PU0007)
Пример запроса/ответа
Запрос
curl -v -X POST "https://sandbox-api.tbt-post.net/api/v1/agent/parcel/paid/30ca60d8-7d9b-47b3-a7b7-e40ff2fdefd2" \
-H "Content-Type: application/json" \
-H "Authorization: Basic dG9rZW46cGFzc3dk" \
-d '{"amount": 299, "payment_id": "test0001"}'
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Wed, 12 Dec 2018 13:59:40 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 17
Connection: keep-alive
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS
Access-Control-Max-Age: 600
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://sandbox-ui.tbt-post.net
Access-Control-Allow-Headers: Content-Type

{
  "success": true
}

Установка времени хранения посылки на отделении

protocol_method

PUT

method_name

agent/parcel/ttl

method_params

<PARCEL ID>

request_body

{"ttl_days": <INTEGER>}

expected_result

200 {"success": true}

ttl_days возможно передать в диапазоне parcel: additional_data→>ttl_days, additional_data→>ttl_days_max OR additional_data→>ttl_days * 2
Максимальное время хранения и время хранения по умолчанию задается в настройках erp-токена при создании. Если выполнение запроса завершилось ошибкой с кодом ответа 400 и сообщением (пример) {"message": "{\"error\":\"ttl_days: not in range 10 20\"}", "success": false} - это значит, что превышено минимальное или максимальное время хранения.
Пример запроса/ответа
Запрос
curl -v -X PUT "https://sandbox-api.tbt-post.net/api/v1/agent/parcel/ttl/30ca60d8-7d9b-47b3-a7b7-e40ff2fdefd2" \
-H "Content-Type: application/json" \
-H "Authorization: Basic dG9rZW46cGFzc3dk" \
-d '{"ttl_days": 11}'
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3 6
Date: Wed, 12 Dec 2018 15:30:18 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 17
Connection: keep-alive
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS
Access-Control-Max-Age: 600
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://sandbox-ui.tbt-post.net
Access-Control-Allow-Headers: Content-Type

{
  "success": true
}

Пометка посылки к отмене на отделении

protocol_method

PUT

method_name

agent/parcel/mark-cancel

method_params

<PARCEL ID>

request_body

----

expected_result

200 {"success": true}

Пример запроса/ответа
Запрос
curl -v -X PUT "https://sandbox-api.tbt-post.net/api/v1/agent/parcel/mark-cancel/30ca60d8-7d9b-47b3-a7b7-e40ff2fdefd2" \
-H "Content-Type: application/json" \
-H "Authorization: Basic dG9rZW46cGFzc3dk" \
-d '{}'
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Wed, 12 Dec 2018 16:09:54 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 17
Connection: keep-alive
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS
Access-Control-Max-Age: 600
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://sandbox-ui.tbt-post.net
Access-Control-Allow-Headers: Content-Type

{
  "success": true
}

Проверка условий доставки для посылки перед регистрацией

protocol_method

POST

method_name

agent/parcel/delivery-check

method_params

----

request_body

{"delivery_type": <DELIVERY TYPE>, "dest" : [ <LATITUDE>, <LONGITUDE>], "weight" : <WEIGHT GRAM as INTEGER>, "price" : <PRICE as DECIMAL(10,2)>, "type" : "<TYPE CODE>"}

expected_result

200 {"success": true, "transfer_via": "<office_id>", "route_mark": "<mark>"}

В случае каких-либо ошибок валидации параметров будет возвращен статус 400 с описанием ошибки.
"route_mark" будет отображен при типе доставки "курьерская доставка"
Пример запроса/ответа
Запрос
curl -v -X POST "https://sandbox-api.tbt-post.net/api/v1/agent/parcel/delivery-check" \
-H "Content-Type: application/json" \
-H "Authorization: Basic dG9rZW46cGFzc3dk" \
-d '{"delivery_type": "W2W", "dest" : ["50.405237", "30.679338"], "weight" : 10000, "price" : 23000, "type" : "undef:A.COD.NR.NA.S000"}'
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Wed, 12 Dec 2018 16:34:19 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 73
Connection: keep-alive
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS
Access-Control-Max-Age: 600
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://sandbox-ui.tbt-post.net
Access-Control-Allow-Headers: Content-Type

{
  "transfer_via": "26b10dbb-4f1b-4d45-9c19-ec3cb85d4253",
  "success": true
}

Отделения и адреса

Получения данных отделений

protocol_method

GET

method_name

offices

get_params

<lang>

request_body

----

expected_result

200 { "offices": [ { "id": "<OFFICE ID>", "name": "<OFFICE NAME>", "descr": "<OFFICE LONG NAME>", "number": <OFFICE NUMBER>, "phone": "<OFFICE PHONE>", "email": "<OFFICE EMAIL>", "address": { <ADDRESS SPEC> }, "address_data": { "index": "<POST CODE>", "floor": <NUM>, …​ <OPTIONAL OTHER DATA> }, "schedule": { "1": "<OPEN_TIME-CLOSE_TIME | STATUS>", "2": "<OPEN_TIME-CLOSE_TIME | STATUS>", …​ "7": "<OPEN_TIME-CLOSE_TIME | STATUS>", }, "optimal_hours": {<OPTIMAL WORKING HOURS>}, "photos": ["<PHOTO URL>", …​], "way_photos": ["<PHOTO URL>", …​], "pay_cash": true|false, "pay_card": true|false, "additional_data": { "sms_addr": "<SMS ADDRESS>", "code_prefix": "<OFFICE CODE PREFIX>", "label": "<OFFICE LABEL>" }, "ui_address": "<ADDRESS LINE>" }, …​.. ], "success": true }

Пример запроса/ответа
Запрос
curl -v -X GET "https://sandbox-api.tbt-post.net/api/v1/offices?lang=ru" \
-H "Content-Type: application/json" \
-H "Authorization: Basic dG9rZW46cGFzc3dk"
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Sat, 15 Dec 2018 13:49:42 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 28454
Connection: keep-alive
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS
Access-Control-Max-Age: 600
Etag: "7a90a5c1837fa48d07b1e2a6eb67ebdd2b0540be"
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://sandbox-ui.tbt-post.net
Access-Control-Allow-Headers: Content-Type

{
  "offices": [
    {
      "address_data": {
        "index": "61161",
        "floor": 1
      },
      "name": "Харьков, Отделение №1",
      "descr": "Харьков, №1. ул. Академика Павлова, 323 (ориентир - автостанция)",
      "schedule": {
        "1": "09:00-21:00",
        "2": "09:00-21:00",
        "3": "09:00-21:00",
        "4": "09:00-21:00",
        "5": "09:00-21:00",
        "6": "09:00-21:00",
        "7": "09:00-21:00"
      },
      "optimal_hours": {},
      "number": 1,
      "photos": [],
      "id": "93ccfdec-f886-4f1c-9d04-6d1d8ef502f3",
      "pay_cash": true,
      "phone": "380112000001",
      "email": "harkov_1@tbt-post.net",
      "way_photos": [],
      "address": {
        "lang": "ru",
        "city": "Харьков",
        "building": "323",
        "area": "Харьковский городской совет",
        "country": "UA",
        "region": "Харьковская область",
        "lon": 36.337401,
        "geo_object": {},
        "addr_type": "cc_office",
        "note": "№1",
        "modified_at": "2017-06-15T11:10:02.140775+00:00",
        "street": "улица Академика Павлова",
        "geo_source": "yandex",
        "lat": 50.027012,
        "id": "2d741b70-51bb-11e7-b609-0fc3a07cbedf",
        "accuracy": "exact"
      },
      "services": [],
      "additional_data": {
        "label": "Харьков-1",
        "code_prefix": "TJ",
        "sms_addr": "Harkov, ul. Akademika Pavlova 323, 09:00-21:00"
      },
      "ui_address": "м.Харків, вулиця Академіка Павлова 323",
      "pay_card": false
    },
    {
      "address_data": {
        "index": "03150",
        "place": "ст. м. Бориспольская, БЦ modnaVilla",
        "floor": 1
      },
      "name": "Киев, Отделение №1",
      "descr": "№1. Харьковское шоссе, 201/203, БЦ modnaVilla, 1 этаж",
      "schedule": {
        "1": "09:00-21:00",
        "2": "09:00-21:00",
        "3": "09:00-21:00",
        "4": "09:00-21:00",
        "5": "09:00-21:00",
        "6": "09:00-21:00",
        "7": "09:00-21:00"
      },
      "optimal_hours": {},
      "number": 1,
      "photos": [
        "csc_photos/4a3ad637c9ab45d0a034d2b3d8abae6b.jpg"
      ],
      "id": "26b10dbb-4f1b-4d45-9c19-ec3cb85d4253",
      "pay_cash": true,
      "phone": "380110000001",
      "email": "kiev_1@tbt-post.net",
      "way_photos": [],
      "address": {
        "lang": "ru",
        "city": "Киев",
        "building": "201-203к1А",
        "area": null,
        "country": "UA",
        "region": "Киев",
        "lon": 30.679338,
        "geo_object": {},
        "addr_type": "cc_office",
        "note": "№1",
        "modified_at": "2016-10-04T10:33:54.383917+00:00",
        "street": "Харьковское шоссе",
        "geo_source": "yandex",
        "lat": 50.405237,
        "id": "0c722922-8a1e-11e6-8a66-b356fd9f196a",
        "accuracy": "exact"
      },
      "services": [],
      "additional_data": {
        "code_prefix": "T1",
        "label": "Киев-1"
      },
      "ui_address": "м.Київ, Харківське шосе 201-203к1А",
      "pay_card": false
    }
  ],
  "success": true
}
В теле json ответа в указанном примере включены не все отделения.

Получение данных адреса из справочника

protocol_method

GET

method_name

address

get_params

<lang, <lat,lon> | <region,city,street,building>>

request_body

----

expected_result

200 {"success": true, "lang": "<LANG>", "city": "<CITY>", "building": "<BUILDING>", "area": "<ADDRESS AREA or null>", "country": "<COUNTRY CODE>", "region": "<CITY REGION or null>", "lon": <LONGITUDE>, "lat": <LONGITUDE>, "id": "<SHIPPING ADDRESS ID>", "note": "<TEXT or null>", "modified_at": "<TIMESTAMP UTC>", "street": "<STREET>", "addr_type": "<TYPE ID>", "accuracy": "<ADDRESS ACCURACY>", "geo_source": "<google|yandex|osm>", "geo_object": {<ADDITIONAL GEO DATA>}}

в качестве get-параметров указывается либо пара гео-координат, либо cоставные части адреса region, city, street, building
Пример запроса/ответа
Запрос
curl -v -X GET "https://sandbox-api.tbt-post.net/api/v1/address?region=%D0%9A%D0%B8%D0%B5%D0%B2&city=%D0%9A%D0%B8%D0%B5%D0%B2&street=%D0%A5%D0%B0%D1%80%D1%8C%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B5%20%D1%88%D0%BE%D1%81%D1%81%D0%B5&building=201-203"\
-H "Content-Type: application/json" \
-H "Authorization: Basic dG9rZW46cGFzc3dk"
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Sat, 15 Dec 2018 14:53:29 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 525
Connection: keep-alive
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS
Access-Control-Max-Age: 600
Etag: "252fb40a97403595bcea1297618cb1432d54adb7"
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://sandbox-ui.tbt-post.net
Access-Control-Allow-Headers: Content-Type

{
  "lang": "uk",
  "city": "Київ",
  "building": "201/203",
  "success": true,
  "area": "місто Київ",
  "country": "UA",
  "region": null,
  "lon": 30.6817834,
  "geo_object": {},
  "id": "afea6db6-0074-11e9-a8b4-1f50ad4e3573",
  "note": null,
  "modified_at": "2018-12-15T14:21:17.909359+00:00",
  "street": "Харківське шосе",
  "geo_source": "google",
  "lat": 50.4035667,
  "addr_type": "regular",
  "accuracy": "exact"
}
Используемое кодирование для кирилицы в запросе - UTF-8
В ответе - текст закодированный функцией escape

Пользователи

Регистрация пользователя

protocol_method

POST

method_name

agent/user/new

method_params

----

request_body

{ "email": "<EMAIL>", "phone": "<PHONE>", "first_name": "<FIRST NAME>", "last_name": "<LAST NAME>", "gender": "male|female|undef", "birthday": "1970-01-01", "company": { "name": "<COMPANY NAME>", "reg_id": "<REG ID>", "tax_id": "<TAX ID>", "type": "company|pe" } }

expected_result

200 { "user_id": "<USER ID>", "success": true }

Пример запроса/ответа
Запрос
curl -v -X POST "https://sandbox-api.tbt-post.net/api/v1/agent/user/new" \
-H "Content-Type: application/json" \
-H "Authorization: Basic dG9rZW46cGFzc3dk" \
-d '{ "email": "example@gmail.com", "phone": "380666666666", "first_name": "test", "last_name": "user", "gender": "undef", "birthday": "1980-01-01", "company": { "name": "TestCompany", "reg_id": "12345", "tax_id": "321654", "type": "company" } }'
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Thu, 20 Dec 2018 14:40:11 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 68
Connection: keep-alive
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS
Access-Control-Max-Age: 600
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://sandbox-ui.tbt-post.net
Access-Control-Allow-Headers: Content-Type

{
  "user_id": "cf8b0967-f1d3-4e53-aa48-297940415263",
  "success": true
}

Поиск пользователя

protocol_method

GET

method_name

agent/user/find

get_params

phone, reg_id, tax_id, company

request_body

----

expected_result

200 {"users": [{"first_name": "<FIRST NAME>", "last_name": "<LAST NAME>", "company": {"name": "<COMPANY NAME>", "modified_at": "2018-07-10T09:15:52.366826+00:00", "reg_id": "<REG ID>", "type": "company", "tax_id": "<TAX ID>"}, "email": "<EMAIL>", "phone": "PHONE", "id": "<USER ID>"}], "success": true}

Пример запроса/ответа
Запрос
curl -v -X GET "https://sandbox-api.tbt-post.net/api/v1/agent/user/find?phone=380666666666&reg_id=12345&tax_id=321654&company=TestCompany" \
-H "Content-Type: application/json" \
-H "Authorization: Basic dG9rZW46cGFzc3dk"
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Mon, 24 Dec 2018 18:21:05 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 319
Connection: keep-alive
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS
Access-Control-Max-Age: 600
Etag: "9c6365dc6d23240c8fa56d9677d5e9ac2f99644f"
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://sandbox-ui.tbt-post.net
Access-Control-Allow-Headers: Content-Type

{
  "users": [
    {
      "first_name": "test",
      "last_name": "user",
      "company": {
        "reg_id": "12345",
        "modified_at": "2018-12-20T14:40:10.979426+00:00",
        "type": "company",
        "name": "TestCompany",
        "tax_id": "321654"
      },
      "email": "example@gmail.com",
      "phone": "380666666666",
      "id": "cf8b0967-f1d3-4e53-aa48-297940415263"
    }
  ],
  "success": true
}

Контрагенты

Регистрация контрагента

protocol_method

POST

method_name

agent/contragent

method_params

----

request_body

{"name": "<CONTRAGENT NAME>", "reg_id": "<REGISTRATION ID>", "tax_id": "<TAX ID>", "vat": <VALUE ADDED TAX (INT(%))>, "bank_name": "<BANK NAME>", "bank_mfo": "<BANK MFO CODE>", "bank_account": "<ACCOUNT ID>"}

expected_result

200 {"id" : "<CONTRAGENT ID>", "success": true}

Параметры: reg_id — код ЕДРПОУ контрагента, tax_id — ИНН контрагента, vat - ставка НДС в процентах. vat == 0 — эквивалент без НДС.

После регистрации контрагента, необходим запрос почтой на его активацию.

Пример запроса/ответа
Запрос
curl -v -X POST "https://sandbox-api.tbt-post.net/api/v1/agent/contragent" \
-H "Content-Type: application/json" \
-H "Authorization: Basic dG9rZW46cGFzc3dk" \
-d '{"name": "TestAgent LLC", "reg_id": "65465465", "tax_id": "545468", "vat": 15, "bank_name": "ExampleInternational", "bank_mfo": "358697", "bank_account": "2168777"}'
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Wed, 12 Dec 2018 12:41:38 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 63
Connection: keep-alive
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS
Access-Control-Max-Age: 600
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://sandbox-ui.tbt-post.net
Access-Control-Allow-Headers: Content-Type

{
  "id": "e8459d69-e3bc-41bc-978d-28d6c6abda38",
  "success": true
}

Модификация контрагента

protocol_method

PUT

method_name

agent/contragent

method_params

<CONTRAGENT ID>

request_body

{"name": "<CONTRAGENT NAME>", "reg_id": "<REGISTRATION ID>", "tax_id": "<TAX ID>", "vat": <VALUE ADDED TAX (INT(%))>, "bank_name": "<BANK NAME>", "bank_mfo": "<BANK MFO CODE>", "bank_account": "<ACCOUNT ID>"}

expected_result

200 {"success": true}

Все ключи являются опциональными
После модификации контрагента сбрасывается статус активации, и необходимо отправлять запрос активации заново
Пример запроса/ответа
Запрос
curl -v -X PUT "https://sandbox-api.tbt-post.net/api/v1/agent/contragent/e8459d69-e3bc-41bc-978d-28d6c6abda38" \
-H "Content-Type: application/json" \
-H "Authorization: Basic dG9rZW46cGFzc3dk" \
-d '{"name": "Testcontragent LLC"}'
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Thu, 20 Dec 2018 14:59:25 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 17
Connection: keep-alive
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS
Access-Control-Max-Age: 600
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://sandbox-ui.tbt-post.net
Access-Control-Allow-Headers: Content-Type

{"success": true}

Информация о контрагенте

protocol_method

GET

method_name

agent/contragent

method_params

<CONTRAGENT ID>

request_body

----

expected_result

200 {"success": true, "name": "<CONTRAGENT NAME>", "reg_id": "<REGISTRATION ID>", "tax_id": "<TAX ID>", "vat": <VALUE ADDED TAX INT(%)>, "bank_name": "<BANK NAME>", "bank_mfo": "<BANK MFO CODE>", "bank_account": "<ACCOUNT ID>", "enabled": <true|false>, "modified_at": <TIMESTAMP UTC>, "translations": [{"processor": <POS PROCESSOR>, "merchant_id": <POS MERCHANT ID>, {…​}, …​}]}

Пример запроса/ответа
Запрос
curl -v -X GET "https://sandbox-api.tbt-post.net/api/v1/agent/contragent/e8459d69-e3bc-41bc-978d-28d6c6abda38" \
-H "Content-Type: application/json" \
-H "Authorization: Basic dG9rZW46cGFzc3dk"
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Thu, 20 Dec 2018 15:07:04 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 366
Connection: keep-alive
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS
Access-Control-Max-Age: 600
Etag: "6f7149e70c1636e6270cd910279fc2e05f8abdb7"
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://sandbox-ui.tbt-post.net
Access-Control-Allow-Headers: Content-Type

{
  "bank_name": "ExampleInternational",
  "vat": 15,
  "user_id": "44ee4ac5-8e42-4e40-821a-3f3e5f13f680",
  "name": "Testcontragent LLC",
  "success": true,
  "modified_at": "2018-12-20T14:59:25.552359+00:00",
  "translations": null,
  "id": "e8459d69-e3bc-41bc-978d-28d6c6abda38",
  "reg_id": 65465465,
  "bank_mfo": 358697,
  "bank_account": 2168777,
  "enabled": false,
  "tax_id": 545468
}

Справочник контрагентов

protocol_method

GET

method_name

agent/contragent

method_params

list

request_body

----

expected_result

200 {"contragents": [{<CONTRAGENT SPEC>}, …​], "success": true}

Пример запроса/ответа
Запрос
curl -v -X GET "https://sandbox-api.tbt-post.net/api/v1/agent/contragent/list" \
-H "Content-Type: application/json" \
-H "Authorization: Basic dG9rZW46cGFzc3dk"
Ответ

HTTP/1.1 200 OK
< Server: nginx/1.10.3
< Date: Sun, 23 Dec 2018 17:02:51 GMT
< Content-Type: application/json; charset=utf-8
< Content-Length: 334
< Connection: keep-alive
< Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS
< Access-Control-Max-Age: 600
< Etag: "729c4673864e1837373a30078de20909fec609ec"
< Access-Control-Allow-Credentials: true
< Access-Control-Allow-Origin: https://sandbox-ui.tbt-post.net
< Access-Control-Allow-Headers: Content-Type

{
  "contragents": [
    {
      "bank_name": "ExampleInternational",
      "vat": 15,
      "name": "Testcontragent LLC",
      "modified_at": "2018-12-20T15:14:48.007045+00:00",
      "translations": null,
      "id": "e8459d69-e3bc-41bc-978d-28d6c6abda38",
      "reg_id": 65465465,
      "bank_mfo": 358697,
      "bank_account": 2168777,
      "enabled": false,
      "tax_id": 545468
    },
    {
      "bank_name": "ExampleInternational2",
      "vat": 1,
      "name": "Testcontragent2 LLC",
      "modified_at": "2018-12-20T15:14:48.007045+00:00",
      "translations": null,
      "id": "e8459d69-e3bc-41bc-978d-28d6c6abda39",
      "reg_id": 65465447,
      "bank_mfo": 778697,
      "bank_account": 9968777,
      "enabled": false,
      "tax_id": 545668
    }
  ],
  "success": true
}

Финансовые транзакции

Получение финансовой транзакции по id

protocol_method

GET

method_name

agent/fin-transaction

method_params

<TRANSACTION ID>

get_params

----

request_body

----

expected_result

200 {"success": true, "id": "<TRANSACTION ID>", "sender": "<SENDER USER ID>", "contragent": "<CONTRAGENT ID>", "processor": "<POS PROCESSOR TYPE>", "amount": <PRICE as DECIMAL(10,2), "trans_type": "<TRANSACTION TYPE: parcel|p2p>", "trans_ref": "<PARCEL ID>", "addidional_data": {"id": <POSORDER ID>, …​ < OTHER SPECIFIC DATA >}, "created_at": <TIMESTAMP UTC>, "modified_at": <TIMESTAMP UTC>, "completed_at": <TIMESTAMP UTC>, "is_completed": true|false, "is_appiled": true|false}

На данный момент существуют только транзакции с trans_type == "parcel", в таком случае trans_ref ссылается на <PARCEL ID>
processor на данный момент может быть: fcs_term - оплата через терминал, _erp_api - оплата через вызов API agent/parcel/paid
Пример запроса/ответа
Запрос
curl -v -X GET "https://sandbox-api.tbt-post.net/api/v1/agent/fin-transaction/9060af07-169c-4376-ac18-20d073123180" \
-H "Content-Type: application/json" \
-H "Authorization: Basic dG9rZW46cGFzc3dk"
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Mon, 24 Dec 2018 21:17:20 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 535
Connection: keep-alive
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS
Access-Control-Max-Age: 600
Etag: "30a9ee68f228a07a6164fcd90b1063c9f29e1e3d"
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://sandbox-ui.tbt-post.net
Access-Control-Allow-Headers: Content-Type

{
  "is_applied": false,
  "sender": "44ee4ac5-8e42-4e40-821a-3f3e5f13f680",
  "success": true,
  "created_at": "2018-12-23T17:54:18.385932+00:00",
  "contragent": "e8459d69-e3bc-41bc-978d-28d6c6abda38",
  "modified_at": "2018-12-23T17:54:18.429628+00:00",
  "processor": "_erp_api",
  "completed_at": "2018-12-23T17:54:18.385932+00:00",
  "amount": 299,
  "trans_type": "parcel",
  "id": "9060af07-169c-4376-ac18-20d073123180",
  "trans_ref": "30ca60d8-7d9b-47b3-a7b7-e40ff2fdefd2",
  "additional_data": {
    "id": "test0004"
  },
  "extid": 166,
  "is_completed": true
}

Получение списка финансовых транзакций за период

protocol_method

GET

method_name

agent/fin-transactions

method_params

----

get_params

ts_from=<TIMESTAMP UTC> [, ts_to=<TIMESTAMP UTC>, processor=fcs_term|_erp_api, contragent=<CONTRAGENT ID>, is_dirty=true limit=200, offset=0]

request_body

----

expected_result

200 {"success": true, "transactions": [{<TRANSACTION SPEC>}, {<TRANSACTION SPEC>}, …​], "total": <INTEGER>}

Временные параметры ts_from, ts_to задаются в формате timestamp UTS in miliseconds. Параметр is_dirty указывает на получение транзакций, которые не синхронизированы с агентской системой в связи с какими-либо ошибками.
Пример запроса/ответа
Запрос
curl -v -X GET "https://sandbox-api.tbt-post.net/api/v1/agent/fin-transactions?ts_from=1543688645000&ts_to=1546194245000&processor=_erp_api&limit=200&offset=0" \
-H "Content-Type: application/json" \
-H "Authorization: Basic dG9rZW46cGFzc3dk"
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Mon, 24 Dec 2018 21:26:20 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 3167
Connection: keep-alive
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS
Access-Control-Max-Age: 600
Etag: "67f37817137afc911ea493d829aacb0dc20cc9ec"
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://sandbox-ui.tbt-post.net
Access-Control-Allow-Headers: Content-Type

{
  "total": 2,
  "success": true,
  "transactions": [
    {
      "is_applied": false,
      "sender": "44ee4ac5-8e42-4e40-821a-3f3e5f13f680",
      "created_at": "2018-12-23T17:44:09.971429+00:00",
      "contragent": "e8459d69-e3bc-41bc-978d-28d6c6abda38",
      "modified_at": "2018-12-23T17:44:10.162860+00:00",
      "processor": "_erp_api",
      "completed_at": "2018-12-23T17:44:09.971429+00:00",
      "amount": 299,
      "trans_type": "parcel",
      "id": "17a4e31d-4758-4d4e-8700-135bfa91fdad",
      "trans_ref": "30ca60d8-7d9b-47b3-a7b7-e40ff2fdefd2",
      "additional_data": {
        "id": "TEST0001"
      },
      "extid": 163,
      "is_completed": true
    },
    {
      "is_applied": false,
      "sender": "44ee4ac5-8e42-4e40-821a-3f3e5f13f680",
      "created_at": "2018-12-12T13:59:40.263358+00:00",
      "contragent": "e8459d69-e3bc-41bc-978d-28d6c6abda38",
      "modified_at": "2018-12-12T13:59:40.265089+00:00",
      "processor": "_erp_api",
      "completed_at": "2018-12-12T13:59:40.263358+00:00",
      "amount": 299,
      "trans_type": "parcel",
      "id": "5555b600-0b58-45fa-8183-2e901d476018",
      "trans_ref": "30ca60d8-7d9b-47b3-a7b7-e40ff2fdefd2",
      "additional_data": {
        "id": "test0001"
      },
      "extid": 162,
      "is_completed": true
    }
  ]
}

Получение списка финансовых транзакций по посылке

protocol_method

GET

method_name

agent/parcel/fin-transactions

method_params

<PARCEL ID>

get_params

----

request_body

----

expected_result

200 {"success": true, "transactions": [{<TRANSACTION SPEC>}, {<TRANSACTION SPEC>}, …​]}

Пример запроса/ответа
Запрос
curl -v -X GET "https://sandbox-api.tbt-post.net/api/v1/agent/parcel/fin-transactions/30ca60d8-7d9b-47b3-a7b7-e40ff2fdefd2" \
-H "Content-Type: application/json" \
-H "Authorization: Basic dG9rZW46cGFzc3dk"
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Mon, 24 Dec 2018 18:24:57 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 2635
Connection: keep-alive
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS
Access-Control-Max-Age: 600
Etag: "df09d5fee730bd0a96873d24ac60d6cc806e8d1b"
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://sandbox-ui.tbt-post.net
Access-Control-Allow-Headers: Content-Type

{
  "success": true,
  "transactions": [
    {
      "is_applied": false,
      "sender": "44ee4ac5-8e42-4e40-821a-3f3e5f13f680",
      "created_at": "2018-12-23T17:54:18.385932+00:00",
      "contragent": "e8459d69-e3bc-41bc-978d-28d6c6abda38",
      "modified_at": "2018-12-23T17:54:18.429628+00:00",
      "processor": "_erp_api",
      "completed_at": "2018-12-23T17:54:18.385932+00:00",
      "amount": 299,
      "trans_type": "parcel",
      "id": "9060af07-169c-4376-ac18-20d073123180",
      "trans_ref": "30ca60d8-7d9b-47b3-a7b7-e40ff2fdefd2",
      "additional_data": {
        "id": "test0004"
      },
      "extid": 166,
      "is_completed": true
    },
    {
      "is_applied": false,
      "sender": "44ee4ac5-8e42-4e40-821a-3f3e5f13f680",
      "created_at": "2018-12-23T17:44:19.445261+00:00",
      "contragent": "e8459d69-e3bc-41bc-978d-28d6c6abda38",
      "modified_at": "2018-12-23T17:44:19.445966+00:00",
      "processor": "_erp_api",
      "completed_at": "2018-12-23T17:44:19.445261+00:00",
      "amount": 299,
      "trans_type": "parcel",
      "id": "b26e547f-c7be-43b6-8dae-9ef8258f0b84",
      "trans_ref": "30ca60d8-7d9b-47b3-a7b7-e40ff2fdefd2",
      "additional_data": {
        "id": "TEST0003"
      },
      "extid": 165,
      "is_completed": true
    }
  ]
}