TbT Platform Docs

Logo

TbT Docs at GitHub Pages.

View My GitHub Profile

TbT API

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

Доступ к API осуществляется:

  • из всех мест вне локальной инфраструктуры - по протоколу HTTPS

Внешний доступ к текущему апи — https://api.tbt-post.net

Следующая версия апи — http://api-next.tbt-post.net

Версия для разработки — http://sandbox-api.tbt-post.net

Если явно не указаного обратного, по-умолчанию формат данных (content-type) подразумевается как application/json, кодировка (encoding/charset) UTF-8, использование BOM (ByteOrderMark для Windows клиентов) - отключено.
Если явно не указано обратного, текстовые поля в структурах данных (как ключи, так и значения) — чувствительны к регистру (case sensitive)

Формат URI для доступа к 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}

опциональные параметры для метода/обработчика

Также, в описании API используются:

{protocol_method}

HTTP метод

{request_body}

описание формата тела запроса

{expected_result}

описание формата возвращаемого в случае успеха результата в формате <Code> <Response body>

Форматы протокола

Формат обмена данными:

  • JSON - комплекскные формы и структуры данных

  • LINK PARAMS - параметризированный URI

  • REQUEST BODY - для передачи бинарных банных

  • REQUEST HEADER - для передачи заголовочной информации

Формат возвращаемого ответа:

HTTP Response Code + JSON payload

Типы данных

Для унификации работы с данными в различных использованных наборах инструментов приняты такие типы данных и таковая их трактовка:

Table 1. Типы данных
# Название типа Описание типа Пример

1

integer

Целое число длиной 4 байта (32 бита)

123456

2

long

Целое число длиной 8 байт (64 бита)

123456890

3

float

Вещественное число с разделителем "." длиной 8 байт (64 бита)

123456890.12 0.12345

4

string (text)

Строка в формате unicode

u'строка'

5

datatime

Дата и время в формате ISO 8601 (UTC+0) YYYY-MM-DDTHH:MM:SSZ

2016-02-29T06:12:20Z

6

boolean

Логический тип

true false

7

Number/BigInteger

Целое число длиной более 8 байт (>64 бит)

174554483551928087757411873995522791996L

8

uuid (UUID)

Universally Unique Identifier — 16-байтный (128-битный) номер, передается в текстовой форме как hexadecimal representation в виде строки, в бинарной форме — как Number

u'8351f87e-7b89-4503-bc9a-76add66f5a3c' 174554483551928087757411873995522791996L

Система использует форматы UUID версий v0,v1,v2 и v4 (форматы v3 и v5 поддерживаются, но не используются)
В случае явного указания в API и/или протоколе версии для типа UUID, подразумевается использование исключительно указанной версии

Для хранения меток времени created_at,modified_at и т.п. используется uuid версии 1

HTTP Методы

При работе с API используются следующие HTTP методы для выполнения той или иной функции:

Table 2. Методы протокола
# Method Описание

1

GET

Выборка данных, немодифицирующие запросы

2

POST

Создание данных

3

PUT

Обновление данных

4

DELETE

Удаление данных

HTTP Статусы

Возвращаемые методами статусы должны следовать стандартам HTTP протокола в соответствии с IETF RFC7231

Основные используемые в системе коды приведены ниже:

Table 3. Статусы протокола
Code Значение Описание

200

OK

Запрос выполнен успешно.

201

Created

Запрос был выполнен, и, в результате, создан новый ресурс. Вновь созданный ресурс может быть, на который ссылается URI (ы) возвращается в объекте ответа, с самым конкретным URI для ресурса отдается в поле заголовка Location. Ответ СЛЕДУЕТ включить объект, содержащий список характеристик и местоположения (ы), из которых пользователь или агент пользователя может выбрать наиболее подходящий. Формат объекта определяется тип носителя приведены в Content-Type заголовка поля. Первоначальный сервер ДОЛЖЕН создать ресурс перед возвратом кода состояния 201. Если действие не может быть выполнено немедленно, сервер должен ответить 202 (Принято) вместо ответа.

202

Accepted

Запрос принят в обработку, но еще не завершен. Нет никаких гарантий, что запрос успешно выполнится в процессе обработки данных. Из-за асинхронного типа выполняемой операции отсутствует возможность повторной отправки статуса.

204

No Content

Запрос был успешно обработан, но нет необходимости возвращать какие-либо данные. Так же в ответе может возвращаться новая, или обновленная информация, однако в итоге она не будет отличаться о того, что было изначально послано на сервер и, таким образом, считается что клиент и так обладает актуальной информацией.

301

Moved Permanently

Запрашиваемому ресурсу был установлен новый URI и будущие обращения к этому ресурсу должны осуществляться по возвращенному URI. Клиенты с возможностью редактирования должны автоматически переопределить ссылки на Request-URI для одной или более новых ссылок, возвращенных сервером, где это возможно. Этот ответ является кэшируемы если не указано иное.

304

Not Modified

Если клиент выполнил условный запрос GET и доступ разрешен, но документ не был изменен, сервер должен ответить, используя этот код состояния.

400

Bad Request

Запрос не удалось обработать из-за синтаксической ошибки или ошибки протокола

401

Not Unauthorized

Запрос требует аутентификации пользователя. Ответ должен содердать WWW-Authenticate заголовок (раздел 14.47). Клиент может повторить запрос с корректным Authorization заголовком (раздел 14.8). Если запрос уже содержит информацию для авторизации, в таком случае 401 код ответа показывает, что авторизация была отклонена.

403

Forbidden

Сервер понял запрос, но отказывается его обрабатывать. Авторизация не поможет и этот запрос НЕ СЛЕДУЕТ повторять.

404

Not Found

Сервер не нашел по указанному URI никаких ресурсов. Нет никаких указаний о том, постоянное это состояние или нет. СЛЕДУЕТ использовать статус 410 (Gone), если серверу известно, что старый ресурс недоступен постоянно и у него нет адреса пересылки.

409

Conflict

Запрос нельзя обработать из-за конфликта в текущем состоянии ресурса. Этот код разрешается использовать только в тех случаях, когда ожидается, что пользователь может самостоятельно разрешить этот конфликт и повторить запрос.

410

Gone

Требуемый ресурс больше не доступен на сервере и адрес его расположения не известен. Предполагается, что это состояние постоянно. Клиентам с возможностью редактирования ссылки СЛЕДУЕТ удалить ссылки на запрошенный URL после подтверждения

422

Unprocessable Entity

Сервер понимает указанный вид данных, (т.е., статус 415 использовать нельзя), синтаксис запроса корректен (т.е. статус 400 использовать некорректно), однако содержащиеся в запросе инструкции нельзя выполнить ( Например, тело запроса синтаксически правильно, но содержит семантическую ошибку или некорректно обрабатывается нижним уровнем БД)

429

Too Many Requests

Возвращается баллансировщикам (т.е. исключительно внутренним/доверенным сервисам) в случае, когда сервис может самостоятельно оценить превышение нагрузки. В случае с внешними клиентами — задача оценки потока и блокирования трафика — целиком и полностью задача внешнего периметра системы. Т.о. данных статус — исключительно вспомогателен и должен использоваться с аккуратностью.

500

Internal Server Error

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

501

Not Implemented

Сервер не поддерживает функциональных возможностей, необходимых для выполнения запроса. Это типичный ответ, когда сервер не понимает метод в запросе и не способен выполнить запрос для ресурса. Если же метод серверу известен, но он не применим к данному ресурсу, то нужно вернуть ответ 405.

API

Все методы пользовательского api (<api base uri>/api/…​) отдекорированы асинхронным методом @authenticated.
Все методы api с префиксом op/ предназначены для операторского интерфейса, и требуют от пользователя соответствующих прав доступа.
методы, подразумевающие работу со структураци данных осуществляют базовою валидацию полей на стороне сервера
Содержимое полей запроса в <> — указание на определенный тип поля
Для обозначения пустого (осутствующего) содержимого в описании используется ----. Использовать его как значение НЕ РЕКОМЕНДУЕТСЯ
Для проверки запросов в командной строке/терминале, используйте User-Agent: curl, не ниже 7.47.0
Запросы без указания -H "Authorization можно выполнить без регистрации.
Для запросов требующих авторизации учетной записи, в т.ч с правами оператора [/op], будут использованы HTTP cookies
Используемое кодирование для кирилицы и спец символов в GET запросах - UTF-8 В ответе - текст закодированный функцией escape
Table 4. Типы полей в запросах
Поле тип Описание Пример

USER ID

text

ID пользователя в системе (UUID в текстовом виде)

"3ea7a7b6-5623-48ba-9fb7-1bcfd4c15fa7"

USER EMAIL

text

Почтовый адрес пользователя (используется в качестве login)

"testuset@example.com"

USER PASSWORD, NEW PASSWORD, OLD PASSWORD

text

Пароль пользователя в открытом виде

"123456"

PHONE

text

Телефон пользователя в формате 380XXYYYYYYY

"380997788999"

FIRST NAME

text

Имя пользователя

"Иван"

LAST NAME

text

Фамилия пользователя

"Иванов"

GENDER

text

Пол пользователя (словарный тип: 'undef','male','female')

"male"

OTC

text

Одноразовый код (обычно - UUID в текстовом виде)

"046e053c-c35c-408f-a422-9fe20f50c35b"

true/false

boolean / text

Логический флаг. Может передаваться как boolean или как строковой литерал словарного типа 'true'/'false' (строковая форма — предпочтительнее по причине лучшей совместимости с разными типами протоколов и серверного ПО)

true / "true"

USER RATE

long

Совокупный показатель рейтинга пользователя в системе

123456789

BIRTHDAY

text

Дата рождения пользователя в формате YYYY-MM-DD или null (как тип)

"2000-01-02"

TIMESTAMP UTC, TIMESTAMP LOCAL

text

Временная метка в текстовом представлении ISO формата. UTC/LOCAL — без/с учетом локальной временной зоны

"2016-08-12 15:30:21.341210+00:00"

USER SOURCE

text

Источник создания пользователя (собственный или из внешнего API, словарный тип: 'local','kasta'

"kasta"

USER ROLE

text

Роль(-и) пользователя в системе (словарный тип: 'guest', 'user', 'agent', 'courier', 'forwarder', 'operator', 'officer', 'manager', 'analyst', 'op_support', 'techician', 'admin')

"user"

LANG

text

Источник создания пользователя (собственный или из внешнего API, словарный тип: 'en','ru','uk'

"uk"

Регистрация

Создание пользователя

protocol_method

POST

method_name

user/reg

method_params

----

request_body

{"email":"<USER EMAIL>","password":"<USER PASSWORD>", "phone": "<PHONE 380XXYYYYYYY>", "first_name": "<FIRST NAME>", "last_name": "<LAST NAME>", "gender": "<GENDER>", "prefered_lang" : "<LANG>"}

expected_result

200 {"success": true}

поле prefered_lang является опциональным и, по-умолчанию, заполняется при создании пользователя в значение языка пользовательского интерфейса.
Пример запроса/ответа
Запрос
curl -v -X POST "https://sandbox-api.tbt-post.net/api/v1/user/reg" \
-H "Content-Type: application/json" \
-d '{"email":"examplemail1@exampledomain.io","password":"examplepass", "phone": "380666666667", "first_name": "Vasia", "last_name": "Pipkin", "gender": "male", "prefered_lang" : "ru"}'
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Sat, 12 Jan 2019 13:20:37 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

op/user/reg

method_params

----

request_body

{"email":"<USER EMAIL>", "phone": "<PHONE 380XXYYYYYYY>", "first_name": "<FIRST NAME>", "last_name": "<LAST NAME>", "gender": "<GENDER>", "prefered_lang" : "<LANG>", "activate": <true/false>}

expected_result

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

Если параметр activate false (по-умолчанию), пользователь будет создан с флагом is_poor, если true, то новый пользователь будет активирован.
Обычно запрос ипользуется для служебных целей.
Пример запроса/ответа
Запрос
curl -v -X POST "https://sandbox-api.tbt-post.net/api/v1/op/user/reg" \
-b cookie-jar.txt \
-H "Content-Type: application/json" \
-d '{"email":"examplemail2@exampledomain.io", "phone": "380666666668", "first_name": "Sara", "last_name": "Pipkin", "gender": "female", "prefered_lang" : "ru", "activate": false}'
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Sat, 12 Jan 2019 14:01:19 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": "75c755df-f40a-4c85-a42b-e3c1ddeec93a",
  "success": true
}

Потдтверждение регистрации

Запрос ОТС
protocol_method

POST

method_name

otc

method_params

new

request_body

{"otc_type": "REGISTRATION", "email": "<USER EMAIL>"}

expected_result

200 {"success": true}

Пример запроса/ответа
Запрос
curl -v -X POST "https://sandbox-api.tbt-post.net/api/v1/otc/new" \
-H "Content-Type: application/json" \
-d '{"otc_type": "REGISTRATION", "email": "examplemail2@exampledomain.io"}'
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Sat, 12 Jan 2019 14:17:50 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

otc

method_params

validate

request_body

{"otc_type": "REGISTRATION", "otc": "<OTC>"}

expected_result

200 {"success": true}

Пример запроса/ответа
Запрос
curl -v -X POST "https://sandbox-api.tbt-post.net/api/v1/otc/validate" \
-H "Content-Type: application/json" \
-d '{"otc_type": "REGISTRATION", "otc": "046e053c-c35c-408f-a422-9fe20f50c35b"}'
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Wed, 16 Jan 2019 13:38:19 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

auth

method_params

login

request_body

{"username":"<USER EMAIL>","password":"<USER PASSWORD>", "remember_me": "<true/false>"}

expected_result

200 {"success": true}

Пример запроса/ответа
Запрос
curl -v -X POST https://sandbox-api.tbt-post.net/api/v1/auth/login \
-H "Content-Type: application/json; charset=utf-8" \
-d '{"username":"examplemail1@exampledomain.io","password":"examplepass","remember_me":"true"}'
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Sat, 12 Jan 2019 15:17:55 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 37
Connection: keep-alive
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS
Access-Control-Max-Age: 600
Set-Cookie: TBT_AUTH="2|1:0|10:1547646244|8:TBT_AUTH|48:ODBkYTFkY2EtOThkMy00ODVjLWI4Y2YtOTE4M2MxMDYzMzQ0|9e9a3f3ac84bb2d8ebba1f75ed94ea6898ccf5b4dac2e2bf7faae3772c218685"; Domain=.tbt-post.net; expires=Fri, 15 Feb 2019 15:57:24 GMT; Path=/
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://sandbox-ui.tbt-post.net
Access-Control-Allow-Headers: Content-Type

{
  "success": true,
  "roles": []
}

Выход

protocol_method

GET

method_name

auth

method_params

logout

get_params

[mode=full|other|self]

expected_result

200 {"success": true}

Пример запроса/ответа
Запрос
curl -v -X GET "https://sandbox-api.tbt-post.net/api/v1/auth/logout?mode=full" \
-H "Content-Type: application/json"
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Sat, 12 Jan 2019 15:21:15 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
Cache-Control: no-cache, no-store, must-revalidate
Etag: "484b3032619fa1acd135d114565b0a5166281c22"
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://sandbox-ui.tbt-post.net
Access-Control-Allow-Headers: Content-Type

{
  "success": true
}
Table 5. Типы параметров logout::
параметр тип

self

по-умолчанию, выход из текущей сессии

full

завершение всех сессий

other

завершение других сессий, кроме собственной

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

Запрос ОТС

protocol_method

POST

method_name

otc

method_params

new

request_body

{"otc_type": "RESTORE_PASSWORD", "email": "<USER EMAIL>"}

expected_result

200 {"success": true}

Пример запроса/ответа
Запрос
curl -v -X POST "https://sandbox-api.tbt-post.net/api/v1/otc/new" \
-H "Content-Type: application/json" \
-d '{"otc_type": "RESTORE_PASSWORD", "email": "examplemail1@exampledomain.io"}'
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Wed, 16 Jan 2019 13:53:09 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

otc

method_params

validate

request_body

{"otc_type": "RESTORE_PASSWORD", "otc": "<OTC>"}

expected_result

200 {"success": true}

Пример запроса/ответа
Запрос
curl -v -X POST "https://sandbox-api.tbt-post.net/api/v1/otc/validate" \
-H "Content-Type: application/json" \
-d '{"otc_type": "RESTORE_PASSWORD", "otc": "1a0fd578-fa4b-435d-9f8f-8933d4528f45"}'
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Wed, 16 Jan 2019 14:15:35 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
}
Если ОТС не проходит валидацию, ответ будет выглядеть так
{
  "message": "Invalid OTC",
  "success": false
}

Изменение пароля

protocol_method

POST

method_name

user/profile

method_params

password

request_body

{"new_password": "<NEW PASSWORD>", "otc": "<OTC>"}

expected_result

200 {"success": true}

Пример запроса/ответа
Запрос
curl -v -X POST "https://sandbox-api.tbt-post.net/api/v1/user/profile/password" \
-H "Content-Type: application/json" \
-d '{"new_password": "examplepass-new", "otc": "498c9940-4720-40bd-83b2-4edbbed5ed76"}'
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Wed, 16 Jan 2019 14:09:20 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 0
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

user/profile

method_params

password

request_body

{"new_password": "<NEW PASSWORD>", "old_password": "<OLD PASSWORD>"}

expected_result

200 {"success": true}

Пример запроса/ответа
Запрос
curl -v -X PUT "https://sandbox-api.tbt-post.net/api/v1/user/profile/password" \
-H "Content-Type: application/json" \
-b cookie-jar.txt \
-d '{"new_password": "examplepass", "old_password": "examplepass-new"}'
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Wed, 16 Jan 2019 17:09:29 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

user/profile

method_params

----

request_body

----

expected_result

200 {"success": true, "first_name": "<FIRST NAME>", "last_name": "<LAST NAME>", "is_external": <true/false>, "phone": "<PHONE 380XXYYYYYYY>", "gender": "<GENDER>", "created_at": "<TIMESTAMP UTC>", "activated_at": "TIMESTAMP UTC", "modified_at": "TIMESTAMP UTC", "password_changed": "TIMESTAMP UTC", "additional_data": {}, "is_active": <true/false>, "sourced_by": "<USER SOURCE>", "rate": <USER RATE>, "birthday": <BIRTHDAY>, "id": "<USER ID>", "is_poor": <true/false>, "is_disabled": <true/false>, "email": "<USER EMAIL>", …​}

Пример запроса/ответа
Запрос
curl -v -X GET "https://sandbox-api.tbt-post.net/api/v1/user/profile" \
-H "Content-Type: application/json" \
-b cookie-jar.txt
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Sun, 13 Jan 2019 10:29:00 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 953
Connection: keep-alive
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS
Access-Control-Max-Age: 600
Etag: "03aceef3d3ae3b3eb91cda7ebfa1677c4838dcc5"
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://sandbox-ui.tbt-post.net
Access-Control-Allow-Headers: Content-Type

{
  "last_name": "Pipkin",
  "confirmed_at": null,
  "rate": 0,
  "roles": [],
  "id": "6cca769e-f380-4385-805c-84232c51a60c",
  "first_name": "Vasia",
  "is_confirmed": false,
  "is_phone_valid": false,
  "email": "examplemail1@exampledomain.io",
  "parent": null,
  "is_disabled": false,
  "activated_at": "2019-01-16T13:38:19.206955+00:00",
  "is_active": true,
  "password_changed": "2019-01-16T17:09:29.347996+00:00",
  "phone": "380666666667",
  "birthday": null,
  "confirmed_by": null,
  "is_external": false,
  "nsid": 0,
  "sourced_by": "local",
  "gender": "male",
  "created_at": "2019-01-12T13:20:35.009201+00:00",
  "modified_at": "2019-01-16T17:09:29.031432+00:00",
  "success": true,
  "is_badge": false,
  "is_poor": false,
  "additional_data": {
    "prefered_lang": "ru",
    "last_login": "2019-01-16T17:08:07.319400+00:00"
  }
}

Обновление собственного профиля

Неактуальные для контекста поля — игнорируются. Передавать можно только часть параметров из набора.
protocol_method

PUT

method_name

user/profile

method_params

----

request_body

{"first_name": "<FIRST NAME>", "last_name": "<LAST NAME>", "gender": "<GENDER>", "birthday": "<YYYY-MM-DD>", "prefered_lang": "<LANG>"}

expected_result

202 {"success": true}

Пример запроса/ответа
Запрос
curl -v -X PUT "https://sandbox-api.tbt-post.net/api/v1/user/profile" \
-H "Content-Type: application/json" \
-b cookie-jar.txt \
-d '{"first_name": "Vasilii", "last_name": "Pypkin", "gender": "male", "birthday": "1980-10-20", "prefered_lang": "ru"}'
Ответ

HTTP/1.1 202 Accepted
Server: nginx/1.10.3
Date: Wed, 16 Jan 2019 17:18:50 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

user/resolve

method_params

<USER ID>

get_params

----

request_body

----

expected_result

200 {"success": true, "id": "<USER_ID>," "first_name": "<FIRST NAME>", "last_name": "<LAST NAME>", "phone": "<PHONE 380XXYYYYYYY>"}

Часть цифр номера телефона пользователя скрывается для обеспечения анонимности
Пример запроса/ответа
Запрос
curl -v -X GET "https://sandbox-api.tbt-post.net/api/v1/user/resolve/6cca769e-f380-4385-805c-84232c51a60c" \
-H "Content-Type: application/json" \
-b cookie-jar.txt
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Wed, 16 Jan 2019 17:23:28 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 136
Connection: keep-alive
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS
Access-Control-Max-Age: 600
Etag: "22d3f11c1121b6ef294a79dcf02f533dd9076ba8"
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://sandbox-ui.tbt-post.net
Access-Control-Allow-Headers: Content-Type

{
  "phone": "38066XXX6667",
  "first_name": "Vasilii",
  "last_name": "Pypkin",
  "id": "6cca769e-f380-4385-805c-84232c51a60c",
  "success": true
}

Получение базовых данных списка пользователей

protocol_method

GET

method_name

user/resolve/list

method_params

----

get_params

id[]=<USER ID>&id[]=<USER ID>&…​

request_body

----

expected_result

200 {"success": true, "users": [<USER RESOLVE>, <USER RESOLVE>, …​]}

Значение <USER RESOLVE> является таким же, как и выходные данные метода user/resolve/<USER ID>
Пример запроса/ответа
Запрос
curl -v -X GET "https://sandbox-api.tbt-post.net/api/v1/user/resolve/list?id%5B%5D=6cca769e-f380-4385-805c-84232c51a60c&id%5B%5D=0d554821-c0ce-43d8-9823-d3ad8d0103fd" \
-H "Content-Type: application/json" \
-b cookie-jar.txt
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Thu, 17 Jan 2019 10:42:35 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: "8aaf42d18c0f6ab1afac029e64660293e9dc709e"
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://sandbox-ui.tbt-post.net
Access-Control-Allow-Headers: Content-Type

{
  "users": [
    {
      "phone": "38066XXX6667",
      "first_name": "Peter",
      "last_name": "Abramovich",
      "id": "6cca769e-f380-4385-805c-84232c51a60c"
    },
    {
      "phone": "38050XXX0752",
      "first_name": "Сара",
      "last_name": "Абибок",
      "id": "0d554821-c0ce-43d8-9823-d3ad8d0103fd"
    }
  ],
  "success": true
}

Получение профиля пользователя

protocol_method

GET

method_name

op/user/profile

method_params

<USER ID>

get_params

<phone>/<email>

request_body

----

expected_result

200 {"success": true, "first_name": "<FIRST NAME>", "last_name": "<LAST NAME>", "is_external": <true/false>, "phone": "<PHONE 380XXYYYYYYY>", "gender": "<GENDER>", "created_at": "<TIMESTAMP UTC>", "activated_at": "TIMESTAMP UTC", "modified_at": "TIMESTAMP UTC", "password_changed": "TIMESTAMP UTC", "additional_data": {}, "is_active": <true/false>, "sourced_by": "<USER SOURCE>", "rate": <USER RATE>, "birthday": <BIRTHDAY>, "id": "<USER ID>", "is_poor": <true/false>, "is_disabled": <true/false>, "email": "<USER EMAIL>", "roles": [<ROLES LIST>], …​}

user_id имеет более высокий приоритет
Пример запроса/ответа
Запрос
curl -v -X GET "https://sandbox-api.tbt-post.net/api/v1/op/user/profile?email=examplemail1@exampledomain.io" \
-H "Content-Type: application/json" \
-b cookie-jar1.txt
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Thu, 17 Jan 2019 08:35:55 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 813
Connection: keep-alive
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS
Access-Control-Max-Age: 600
Etag: "bec27b54affb5363ee1afcf47720a73b93b55c8f"
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://sandbox-ui.tbt-post.net
Access-Control-Allow-Headers: Content-Type

{
  "last_name": "Pypkin",
  "confirmed_at": null,
  "rate": 0,
  "roles": [],
  "id": "6cca769e-f380-4385-805c-84232c51a60c",
  "first_name": "Vasilii",
  "is_confirmed": false,
  "is_phone_valid": false,
  "email": "examplemail1@exampledomain.io",
  "parent": null,
  "is_disabled": false,
  "activated_at": "2019-01-16T13:38:19.206955+00:00",
  "is_active": true,
  "password_changed": "2019-01-16T17:09:29.347996+00:00",
  "phone": "380666666667",
  "birthday": "1980-10-20",
  "confirmed_by": null,
  "block_status": null,
  "is_external": false,
  "nsid": 0,
  "sourced_by": "local",
  "gender": "male",
  "created_at": "2019-01-12T13:20:35.009201+00:00",
  "modified_at": "2019-01-16T17:18:50.255000+00:00",
  "success": true,
  "is_badge": false,
  "is_poor": false,
  "additional_data": {
    "prefered_lang": "ru",
    "last_login": "2019-01-16T17:08:07.319400+00:00"
  }
}

Обновление профиля пользователя

неактуальные для контекста поля — игнорируются. Передавать можно только часть параметров из набора.
protocol_method

PUT

method_name

op/user/profile

method_params

<USER ID>

request_body

{"first_name": "<FIRST NAME>", "last_name": "<LAST NAME>", "gender": "<GENDER>", "birthday": "<YYYY-MM-DD>", "prefered_lang": "<LANG>"}

expected_result

202 {"success": true}

Пример запроса/ответа
Запрос
curl -v -X PUT "https://sandbox-api.tbt-post.net/api/v1/op/user/profile/6cca769e-f380-4385-805c-84232c51a60c" \
-H "Content-Type: application/json" \
-b cookie-jar1.txt \
-d '{"first_name": "Peter", "last_name": "Abramovich", "gender": "male", "birthday": "1985-05-05", "prefered_lang": "en"}'
Ответ

HTTP/1.1 202 Accepted
Server: nginx/1.10.3
Date: Thu, 17 Jan 2019 08:41:10 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

op/user/profile

method_params

confirm

request_body

{"user_id": "<USER ID>"}

expected_result

200 {"success": true}

Пример запроса/ответа
Запрос
curl -v -X POST "https://sandbox-api.tbt-post.net/api/v1/op/user/profile/confirm" \
-H "Content-Type: application/json" \
-b cookie-jar1.txt \
-d '{"user_id": "6cca769e-f380-4385-805c-84232c51a60c"}'
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Thu, 17 Jan 2019 08:44:02 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
}

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

protocol_method

GET

method_name

op/user/list

method_params

----

get_params

id[]=<USER ID>&id[]=<USER ID>&…​

request_body

----

expected_result

200 {"success": true, "users": [<USER PROFILE>, <USER PROFILE>, …​]}

Значение <USER PROFILE> является таким же, как и выходные данные метода op/user/profile/<USER ID>
Пример запроса/ответа
Запрос
curl -v -X GET "https://sandbox-api.tbt-post.net/api/v1/op/user/list?id%5B%5D=6cca769e-f380-4385-805c-84232c51a60c&id%5B%5D=0d554821-c0ce-43d8-9823-d3ad8d0103fd" \
-H "Content-Type: application/json" \
-b cookie-jar1.txt
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Thu, 17 Jan 2019 10:47:04 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 1565
Connection: keep-alive
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS
Access-Control-Max-Age: 600
Etag: "6a44d9ea2b31f9974f50d93e413fc4e44648e97a"
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://sandbox-ui.tbt-post.net
Access-Control-Allow-Headers: Content-Type

{
  "users": [
    {
      "last_name": "Abramovich",
      "confirmed_at": "2019-01-17T08:44:01.981119+00:00",
      "rate": 0,
      "id": "6cca769e-f380-4385-805c-84232c51a60c",
      "first_name": "Peter",
      "is_confirmed": true,
      "is_phone_valid": false,
      "email": "examplemail1@exampledomain.io",
      "parent": null,
      "activated_at": "2019-01-16T13:38:19.206955+00:00",
      "is_active": true,
      "password_changed": "2019-01-16T17:09:29.347996+00:00",
      "phone": "380666666667",
      "birthday": "1985-05-05",
      "confirmed_by": "4f90b36a-8622-4f43-a285-f622186f4ee8",
      "is_external": false,
      "block_status": null,
      "roles": null,
      "nsid": 0,
      "sourced_by": "local",
      "gender": "male",
      "created_at": "2019-01-12T13:20:35.009201+00:00",
      "modified_at": "2019-01-17T08:44:01.981201+00:00",
      "is_badge": false,
      "is_poor": false,
      "additional_data": {
        "prefered_lang": "ru",
        "last_login": "2019-01-16T17:08:07.319400+00:00"
      }
    },
    {
      "last_name": "Абибок",
      "confirmed_at": null,
      "rate": 0,
      "id": "0d554821-c0ce-43d8-9823-d3ad8d0103fd",
      "first_name": "Сара",
      "is_confirmed": false,
      "is_phone_valid": false,
      "email": "SaraAbibok@inbox.com",
      "parent": null,
      "activated_at": null,
      "is_active": false,
      "password_changed": null,
      "phone": "380505005002,
      "birthday": null,
      "confirmed_by": null,
      "is_external": false,
      "block_status": null,
      "roles": null,
      "nsid": 0,
      "sourced_by": "kasta",
      "gender": "undef",
      "created_at": "2016-12-10T04:06:19.100235+00:00",
      "modified_at": "2016-12-10T04:06:19.100247+00:00",
      "is_badge": false,
      "is_poor": true,
      "additional_data": {
        "foreign_id": 1747577
      }
    }
  ],
  "success": true
}

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

protocol_method

GET

method_name

op/user/search

method_params

----

get_params

<user_model_field>,sort_by,sort_order,limit,offset

request_body

----

expected_result

200 {"success": true, "users": [<USER PROFILE>, <USER PROFILE>, …​], "total": <search_result_length>}

Table 6. Типы параметров поиска:
параметр тип

limit

<num>

offset

<offset>

sort_by

<user_model_field>

sort_order

asc/desc

<user_model_field>

['first_name', 'last_name', 'gender', 'birthday', 'sourced_by', 'block_status', 'parent', 'confirmed_by', 'is_poor', 'is_active', 'is_external', 'is_phone_valid', 'is_confirmed']

Пример запроса/ответа
Запрос
curl -v -X GET "https://sandbox-api.tbt-post.net/api/v1/op/user/search?first_name=Test&last_name=User" \
-H "Content-Type: application/json" \
-b cookie-jar1.txt
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Thu, 17 Jan 2019 08:50:38 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 784
Connection: keep-alive
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS
Access-Control-Max-Age: 600
Etag: "8d811a61b639ba2f4ce704bd1106e5febada2f0e"
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://sandbox-ui.tbt-post.net
Access-Control-Allow-Headers: Content-Type

{
  "total": 1,
  "users": [
    {
      "last_name": "User",
      "confirmed_at": null,
      "rate": 0,
      "id": "cf8b0967-f1d3-4e53-aa48-297940415263",
      "first_name": "Test",
      "is_confirmed": false,
      "is_phone_valid": false,
      "email": "example@example.com",
      "parent": null,
      "activated_at": "2016-10-12T08:22:08.871838+00:00",
      "is_active": false,
      "password_changed": "2019-01-12T15:04:06.391445+00:00",
      "phone": "380666666666",
      "birthday": "1980-01-01",
      "confirmed_by": null,
      "is_external": false,
      "block_status": null,
      "roles": null,
      "nsid": 0,
      "sourced_by": "local",
      "gender": "male",
      "created_at": "2016-10-12T08:22:08.871824+00:00",
      "modified_at": "2019-01-12T15:04:06.073544+00:00",
      "is_badge": false,
      "is_poor": true,
      "additional_data": {
        "created_by": "44ee4ac5-8e42-4e40-821a-3f3e5f13f680"
      }
    }
  ],
  "success": true
}

Вход по номеру телефона

Запрос кода

приватная часть кода <SMS CODE> будет выслана на указанный в запросе номер в случае его актуальности и валидности
protocol_method

POST

method_name

auth/phone

method_params

new

request_body

{"phone": "<PHONE 380XXYYYYYYY>" }

expected_result

200 {"otc": "<OTC>", "success": true}

Пример запроса/ответа
Запрос
curl -v -X POST "https://sandbox-api.tbt-post.net/api/v1/auth/phone/new" \
-H "Content-Type: application/json" \
-d '{"phone": "380666666667"}'
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Thu, 17 Jan 2019 08:54:42 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 64
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

{
  "otc": "d346e741-473e-4edf-8a3f-903c3ac99f72",
  "success": true
}

Авторизация

protocol_method

POST

method_name

auth/phone

method_params

login

request_body

{"otc": "<OTC>", "sms_code": "<SMS CODE>", "remember_me": true|false}

expected_result

200 {"success": true}

Пример запроса/ответа
Запрос
curl -v -X POST "https://sandbox-api.tbt-post.net/api/v1/auth/phone/login" \
-H "Content-Type: application/json" \
-d '{"otc": "ec0b678e-728c-4465-a20e-91a6b1d1ea18", "sms_code": "303941890", "remember_me": true}'
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Thu, 17 Jan 2019 11:11:36 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 30
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,
  "roles": []
}

Изменение телефона

Запрос ОТС

protocol_method

POST

method_name

otc

method_params

new

request_body

{"otc_type": "PHONE_CHANGE", "phone": "<PHONE 380XXYYYYYYY>" }

expected_result

200 {"otc": "<OTC>", "success": true}

Пример запроса/ответа
Запрос
curl -v -X POST "https://sandbox-api.tbt-post.net/api/v1/otc/new" \
-H "Content-Type: application/json" \
-b cookie-jar.txt \
-d '{"otc_type": "PHONE_CHANGE", "phone": "380666666677"}'
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Thu, 17 Jan 2019 11:20:30 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 64
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

{
  "otc": "5a266aaa-da39-404e-9c21-11207a1b47a6",
  "success": true
}
В запросе необходимо указывать необходимый для смены номер.

Подтверждение

protocol_method

POST

method_name

otc

method_params

validate

request_body

{"otc_type": "PHONE_CHANGE", "otc": "<OTC>", "sms_code": "<SMS CODE>"}

expected_result

200 {"success": true}

Пример запроса/ответа
Запрос
curl -v -X POST "https://sandbox-api.tbt-post.net/api/v1/otc/validate" \
-H "Content-Type: application/json" \
-d '{"otc_type": "PHONE_CHANGE", "otc": "5a266aaa-da39-404e-9c21-11207a1b47a6", "sms_code": "872386376"}'
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Thu, 17 Jan 2019 11:33: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
}

Изменение email

Запрос ОТС

protocol_method

POST

method_name

otc

method_params

new

request_body

{"otc_type": "EMAIL_CHANGE", "email": "<USER EMAIL>" }

expected_result

200 {"success": true}

Пример запроса/ответа
Запрос
curl -v -X POST "https://sandbox-api.tbt-post.net/api/v1/otc/new" \
-H "Content-Type: application/json" \
-b cookie-jar.txt \
-d '{"otc_type": "EMAIL_CHANGE", "email": "example@exampledomain.io" }'
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Thu, 17 Jan 2019 11:37:28 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

otc

method_params

validate

request_body

{"otc_type": "EMAIL_CHANGE", "otc": "<OTC>"}

expected_result

200 {"success": true}

Пример запроса/ответа
Запрос
curl -v -X POST "https://sandbox-api.tbt-post.net/api/v1/otc/validate" \
-H "Content-Type: application/json" \
-d '{"otc_type": "EMAIL_CHANGE", "otc": "8dfe3d63-a9b2-482a-9217-daae0b126f90"}'
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Thu, 17 Jan 2019 11:41: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
}

ACL

Роли пользоватлея

protocol_method

GET

method_name

user

method_params

roles

request_body

----

expected_result

200 {"success": true, "roles": ["<USER ROLE>", …​]}

Пример запроса/ответа
Запрос
curl -v -X GET "https://sandbox-api.tbt-post.net/api/v1/user/roles" \
-H "Content-Type: application/json" \
-b cookie-jar.txt
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Sun, 13 Jan 2019 10:45:00 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 100
Connection: keep-alive
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS
Access-Control-Max-Age: 600
Etag: "cf70b22ea6546b1f69cb5fbc06b683d6932caf92"
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://sandbox-ui.tbt-post.net
Access-Control-Allow-Headers: Content-Type

{
  "success": true,
  "roles": [
    "user",
    "operator"
  ]
}

Посылки

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

protocol_method

GET

method_name

[op/] 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>", "paid_amount": <PAYMENTS TOTAL as DECIMAL(10,2)>, "type": <TYPE CODE>, "parent": <PARCEL ID or null>, "price": <PRICE as DECIMAL(10,2)>, "cod_amount": <PRICE 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>", "delivery_type": "<DELIVERY TYPE>", "additional_data": {…​}, …​}

parcel_id имеет более высокий приоритет, чем code
Пример запроса/ответа
Запрос
curl -v -X GET "https://sandbox-api.tbt-post.net/api/v1/op/parcel/4d52c496-9137-4e8a-bb1b-56f378669ac0" \
-H "Content-Type: application/json" \
-b cookie-jar1.txt
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Thu, 17 Jan 2019 09:12:04 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 1477
Connection: keep-alive
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS
Access-Control-Max-Age: 600
Etag: "ab05045ba94b1887181caa4218bd241a30b5702f"
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": "TEST0002",
  "weight": 1520,
  "agent": "44ee4ac5-8e42-4e40-821a-3f3e5f13f680",
  "is_dirty": false,
  "is_open": true,
  "paid_at": null,
  "closed_at": null,
  "id": "4d52c496-9137-4e8a-bb1b-56f378669ac0",
  "paid_amount": 0,
  "state": "PU0007",
  "mark": null,
  "last_seen_at": null,
  "type": "fragile",
  "delivery_type": "W2W",
  "parent": null,
  "price": 2500,
  "checked_in_at": "2018-12-12T13:50:42.870075+00:00",
  "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-12T13:51:10.483000+00:00",
  "success": true,
  "additional_data": {
    "erp_token": "510ad08a-830e-46aa-ab63-dfade75a00a7",
    "_receiver": {
      "phone": "380666666666",
      "first_name": "Test",
      "last_name": "User",
      "id": 0,
      "email": "example@expmail.com"
    },
    "invoices": [
      {
        "origin": "4f90b36a-8622-4f43-a285-f622186f4ee8",
        "sms_notifications": 0.6,
        "office_delivery": 24,
        "owner": "e0b05432-63a7-4e2e-9c7d-9d1eaaa04b78",
        "serial": "a6e96cc0-fe04-11e8-8a37-148b3fc90e15",
        "main_transportation": 10.01,
        "delivery_insurance": 16.25
      }
    ],
    "checked_in_loc": "26b10dbb-4f1b-4d45-9c19-ec3cb85d4253",
    "ttl_days_default": 15,
    "ttl_days": 15
  },
  "receiver": "67719cba-5cd5-4dd0-84c9-6b6864a75066",
  "cod_amount": 0,
  "created_at": "2018-12-11T14:23:51.628901+00:00",
  "goes_back": false
}

Получение графических кодов

protocol_method

GET

method_name

[op/] parcel/codes

method_params

<PARCEL ID>

get_params

----

request_body

----

expected_result

200 {"success": true, "qr": <IMAGE DATA URI>", "bcode": "<IMAGE DATA URI>"}

DATA URI is according to RFC-2397: data:[<media type>][;base64],<data>
Пример запроса/ответа
Запрос
curl -v -X GET "https://sandbox-api.tbt-post.net/api/v1/op/parcel/codes/4d52c496-9137-4e8a-bb1b-56f378669ac0" \
-H "Content-Type: application/json" \
-b cookie-jar1.txt
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Thu, 17 Jan 2019 09:16:24 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,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",
  "success": true
}
Если вставить полученный код в строке браузера, напримпр: "Crhome", то в результате получим изображение необходимого кода. Копировать необходимо без скобок, например: data:image/png;base64,iV…​<body>…​U5ErkJggg==

Поиск

protocol_method

GET

method_name

op/parcel/search

method_params

----

get_params

<<parcel_model_field>office_id/pentity/receiver_phone/sender_phone/participant_phone/sender_email/pattern_id/pattern_code/state[]/interval_from/interval_to>

request_body

----

expected_result

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

Table 7. Типы параметров поиска:
параметр тип

limit

<num>

offset

<offset>

sort_by

<parcel_model_field>

sort_order

asc/desc

<parcel_model_field>

['sender', 'receiver', 'agent', 'parent', 'address_id', 'transfer_via', 'type', 'class', 'state', 'is_open', 'is_paid', 'goes_back']

office_id

<uuid>

pentity - рекурсивный поиск по ресурсу отделения

<uuid>

state[]

<parcel state list>

receiver_phone

<phone>

sender_phone

<phone>

participant_phone

<phone>

sender_email

<email>

pattern_id

<like pattern>

pattern_code

<like pattern>

interval_from

<date-time>

interval_to

<date-time>

interval_field

created_at/modified_at/checked_in_at (default created_at)

pentity_recur

true/false - поиск рекурсивно по полю pentity

Пример запроса/ответа
Запрос
curl -v -X GET "https://sandbox-api.tbt-post.net/api/v1/op/parcel/search?state=PU0007&interval_field=created_at&interval_from=2018-12-01&interval_to=2018-12-31" \
-H "Content-Type: application/json" \
-b cookie-jar1.txt
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Thu, 17 Jan 2019 09:29:07 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 3098
Connection: keep-alive
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS
Access-Control-Max-Age: 600
Etag: "5eb3fd5a38a07fe3247bb6871368e8b52d6bf29f"
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://sandbox-ui.tbt-post.net
Access-Control-Allow-Headers: Content-Type

{
  "total": 2,
  "parcels": [
    {
      "address_id": "f50a7aaa-8a1d-11e6-8a66-83b0de5b609d",
      "code": "TEST0002",
      "weight": 1520,
      "agent": "44ee4ac5-8e42-4e40-821a-3f3e5f13f680",
      "is_dirty": false,
      "is_open": true,
      "paid_at": null,
      "closed_at": null,
      "id": "4d52c496-9137-4e8a-bb1b-56f378669ac0",
      "paid_amount": 0,
      "state": "PU0007",
      "mark": null,
      "last_seen_at": null,
      "type": "fragile",
      "delivery_type": "W2W",
      "parent": null,
      "price": 2500,
      "checked_in_at": "2018-12-12T13:50:42.870075+00:00",
      "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-12T13:51:10.483000+00:00",
      "additional_data": {
        "erp_token": "510ad08a-830e-46aa-ab63-dfade75a00a7",
        "_receiver": {
          "phone": "380667224455",
          "first_name": "Vasia",
          "last_name": "pipkin",
          "id": 0,
          "email": "pipkin@gmail.com"
        },
        "invoices": [
          {
            "origin": "4f90b36a-8622-4f43-a285-f622186f4ee8",
            "sms_notifications": 0.6,
            "office_delivery": 24,
            "owner": "e0b05432-63a7-4e2e-9c7d-9d1eaaa04b78",
            "serial": "a6e96cc0-fe04-11e8-8a37-148b3fc90e15",
            "main_transportation": 10.01,
            "delivery_insurance": 16.25
          }
        ],
        "checked_in_loc": "26b10dbb-4f1b-4d45-9c19-ec3cb85d4253",
        "ttl_days_default": 15,
        "ttl_days": 15
      },
      "receiver": "67719cba-5cd5-4dd0-84c9-6b6864a75066",
      "cod_amount": 0,
      "created_at": "2018-12-11T14:23:51.628901+00:00",
      "goes_back": false
    },
    {
      "address_id": "f50a7aaa-8a1d-11e6-8a66-83b0de5b609d",
      "code": "TEST0004",
      "weight": 145,
      "agent": "44ee4ac5-8e42-4e40-821a-3f3e5f13f680",
      "is_dirty": false,
      "is_open": true,
      "paid_at": null,
      "closed_at": null,
      "id": "30ca60d8-7d9b-47b3-a7b7-e40ff2fdefd2",
      "paid_amount": 0,
      "state": "PU0007",
      "mark": null,
      "last_seen_at": null,
      "type": "fragile",
      "delivery_type": "W2W",
      "parent": null,
      "price": 350,
      "checked_in_at": "2018-12-12T14:08:44.447137+00:00",
      "class": "A.COD.NR.NA.S000",
      "pentity": null,
      "transfer_via": "e0b05432-63a7-4e2e-9c7d-9d1eaaa04b78",
      "sender": "44ee4ac5-8e42-4e40-821a-3f3e5f13f680",
      "nsid": 0,
      "is_paid": false,
      "modified_at": "2019-01-08T09:12:25.375000+00:00",
      "additional_data": {
        "erp_token": "510ad08a-830e-46aa-ab63-dfade75a00a7",
        "_receiver": {
          "phone": "380674552233",
          "first_name": "Peter",
          "last_name": "Abrmovich",
          "id": 0,
          "email": "Abrmovich@gmail.com"
        },
        "_dimensions": [
          250,
          400,
          80
        ],
        "invoices": [
          {
            "origin": "4f90b36a-8622-4f43-a285-f622186f4ee8",
            "sms_notifications": 0.6,
            "office_delivery": 24,
            "owner": "e0b05432-63a7-4e2e-9c7d-9d1eaaa04b78",
            "serial": "0335d220-fe14-11e8-8a37-148b3fc90e15",
            "main_transportation": 10.01,
            "delivery_insurance": 5
          }
        ],
        "_comment": "test parcel",
        "checked_in_loc": "26b10dbb-4f1b-4d45-9c19-ec3cb85d4253",
        "ttl_days_default": 10,
        "is_weighed": true,
        "ttl_days": 0,
        "contragent_id": "e8459d69-e3bc-41bc-978d-28d6c6abda38"
      },
      "receiver": "67719cba-5cd5-4dd0-84c9-6b6864a75066",
      "cod_amount": 299,
      "created_at": "2018-12-12T13:39:28.729083+00:00",
      "goes_back": false
    }
  ],
  "success": true
}

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

protocol_method

GET

method_name

op/parcel/list

method_params

----

get_params

id[]=<PARCEL ID>&id[]=<PARCEL ID>&…​

request_body

----

expected_result

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

Пример запроса/ответа
Запрос
curl -v -X GET "https://sandbox-api.tbt-post.net/api/v1/op/parcel/list?id%5B%5D=30ca60d8-7d9b-47b3-a7b7-e40ff2fdefd2&id%5B%5D=4d52c496-9137-4e8a-bb1b-56f378669ac0" \
-H "Content-Type: application/json" \
-b cookie-jar1.txt
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Thu, 17 Jan 2019 10:50:56 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 3086
Connection: keep-alive
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS
Access-Control-Max-Age: 600
Etag: "6e10481eb926db866fbe64c9332606a9b1b3e37f"
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": "TEST0004",
      "weight": 145,
      "agent": "44ee4ac5-8e42-4e40-821a-3f3e5f13f680",
      "is_dirty": false,
      "is_open": true,
      "paid_at": null,
      "closed_at": null,
      "id": "30ca60d8-7d9b-47b3-a7b7-e40ff2fdefd2",
      "paid_amount": 0,
      "state": "PU0007",
      "mark": null,
      "last_seen_at": null,
      "type": "fragile",
      "delivery_type": "W2W",
      "parent": null,
      "price": 350,
      "checked_in_at": "2018-12-12T14:08:44.447137+00:00",
      "class": "A.COD.NR.NA.S000",
      "pentity": null,
      "transfer_via": "e0b05432-63a7-4e2e-9c7d-9d1eaaa04b78",
      "sender": "44ee4ac5-8e42-4e40-821a-3f3e5f13f680",
      "nsid": 0,
      "is_paid": false,
      "modified_at": "2019-01-08T09:12:25.375000+00:00",
      "additional_data": {
        "erp_token": "510ad08a-830e-46aa-ab63-dfade75a00a7",
        "_receiver": {
          "phone": "380666666666",
          "first_name": "Test",
          "last_name": "User",
          "id": 0,
          "email": "example@gmail.com"
        },
        "_dimensions": [
          250,
          400,
          80
        ],
        "invoices": [
          {
            "origin": "4f90b36a-8622-4f43-a285-f622186f4ee8",
            "sms_notifications": 0.6,
            "office_delivery": 24,
            "owner": "e0b05432-63a7-4e2e-9c7d-9d1eaaa04b78",
            "serial": "0335d220-fe14-11e8-8a37-148b3fc90e15",
            "main_transportation": 10.01,
            "delivery_insurance": 5
          }
        ],
        "_comment": "test parcel",
        "checked_in_loc": "26b10dbb-4f1b-4d45-9c19-ec3cb85d4253",
        "ttl_days_default": 10,
        "is_weighed": true,
        "ttl_days": 0,
        "contragent_id": "e8459d69-e3bc-41bc-978d-28d6c6abda38"
      },
      "receiver": "67719cba-5cd5-4dd0-84c9-6b6864a75066",
      "cod_amount": 299,
      "created_at": "2018-12-12T13:39:28.729083+00:00",
      "goes_back": false
    },
    {
      "address_id": "f50a7aaa-8a1d-11e6-8a66-83b0de5b609d",
      "code": "TEST0002",
      "weight": 1520,
      "agent": "44ee4ac5-8e42-4e40-821a-3f3e5f13f680",
      "is_dirty": false,
      "is_open": true,
      "paid_at": null,
      "closed_at": null,
      "id": "4d52c496-9137-4e8a-bb1b-56f378669ac0",
      "paid_amount": 0,
      "state": "PU0007",
      "mark": null,
      "last_seen_at": null,
      "type": "fragile",
      "delivery_type": "W2W",
      "parent": null,
      "price": 2500,
      "checked_in_at": "2018-12-12T13:50:42.870075+00:00",
      "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-12T13:51:10.483000+00:00",
      "additional_data": {
        "erp_token": "510ad08a-830e-46aa-ab63-dfade75a00a7",
        "_receiver": {
          "phone": "380666666666",
          "first_name": "Test",
          "last_name": "User",
          "id": 0,
          "email": "example@gmail.com"
        },
        "invoices": [
          {
            "origin": "4f90b36a-8622-4f43-a285-f622186f4ee8",
            "sms_notifications": 0.6,
            "office_delivery": 24,
            "owner": "e0b05432-63a7-4e2e-9c7d-9d1eaaa04b78",
            "serial": "a6e96cc0-fe04-11e8-8a37-148b3fc90e15",
            "main_transportation": 10.01,
            "delivery_insurance": 16.25
          }
        ],
        "checked_in_loc": "26b10dbb-4f1b-4d45-9c19-ec3cb85d4253",
        "ttl_days_default": 15,
        "ttl_days": 15
      },
      "receiver": "67719cba-5cd5-4dd0-84c9-6b6864a75066",
      "cod_amount": 0,
      "created_at": "2018-12-11T14:23:51.628901+00:00",
      "goes_back": false
    }
  ],
  "success": true
}

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

protocol_method

GET

method_name

parcel/list

method_params

----

get_params

participant

request_body

----

expected_result

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

Table 8. Типы параметров поиска:
параметр тип

participant

all/sender/receiver

limit

<num>

offset

<offset>

sort_by

['weight', 'price', 'paid_amount', 'created_at', 'modified_at', 'paid_at', 'type', 'class', 'state', 'goes_back']

sort_order

asc/desc

Пример запроса/ответа
Запрос
curl -v -X GET "https://sandbox-api.tbt-post.net/api/v1/parcel/list?participant=sender&sort_by=state&limit=2" \
-H "Content-Type: application/json" \
-b cookie-jar1.txt
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Thu, 17 Jan 2019 09:45:56 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 2118
Connection: keep-alive
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS
Access-Control-Max-Age: 600
Etag: "eeed0101eb2a9110a6833b9bba8a0f4f63e353b0"
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://sandbox-ui.tbt-post.net
Access-Control-Allow-Headers: Content-Type

{
  "total": 4,
  "parcels": [
    {
      "address_id": "8579d836-8a2f-11e6-8a66-1b7b94d1a2c3",
      "code": "T1PR6NA6R",
      "weight": 1,
      "agent": "4f90b36a-8622-4f43-a285-f622186f4ee8",
      "is_dirty": false,
      "is_open": true,
      "paid_at": null,
      "closed_at": null,
      "id": "94936244-3461-406d-b773-f1f0852074bb",
      "paid_amount": 0,
      "state": "PU0003",
      "mark": null,
      "last_seen_at": null,
      "type": "undef",
      "delivery_type": "W2W",
      "parent": null,
      "price": 1,
      "checked_in_at": "2018-05-14T16:45:52.602469+00:00",
      "class": "I.PRP.NR.NA.S000",
      "pentity": "fcf598ce-7cba-47b6-9871-407b6db81ea6",
      "transfer_via": "9bfdef40-d03d-4041-92fe-c3944650f173",
      "sender": "4f90b36a-8622-4f43-a285-f622186f4ee8",
      "nsid": 0,
      "is_paid": false,
      "modified_at": "2018-08-09T08:32:31.371242+00:00",
      "additional_data": {
        "ttl_days": 30,
        "ttl_days_default": 15,
        "agent_office": "26b10dbb-4f1b-4d45-9c19-ec3cb85d4253",
        "checked_in_loc": "9bfdef40-d03d-4041-92fe-c3944650f173"
      },
      "receiver": "4f90b36a-8622-4f43-a285-f622186f4ee8",
      "cod_amount": 0,
      "created_at": "2018-05-14T16:38:51.780360+00:00",
      "goes_back": false
    },
    {
      "address_id": "0c722922-8a1e-11e6-8a66-b356fd9f196a",
      "code": "T1BR5NB8M",
      "weight": 2,
      "agent": "4f90b36a-8622-4f43-a285-f622186f4ee8",
      "is_dirty": false,
      "is_open": true,
      "paid_at": null,
      "closed_at": null,
      "id": "106c252b-ebb6-426f-920a-ff8f616faf3b",
      "paid_amount": 0,
      "state": "PU0003",
      "mark": null,
      "last_seen_at": null,
      "type": "undef",
      "delivery_type": "W2W",
      "parent": null,
      "price": 0,
      "checked_in_at": "2018-03-18T14:11:56.539406+00:00",
      "class": "I.COD.RA.NA.S000",
      "pentity": "18b98336-3c75-4690-8298-f65545e7df3c",
      "transfer_via": "26b10dbb-4f1b-4d45-9c19-ec3cb85d4253",
      "sender": "4f90b36a-8622-4f43-a285-f622186f4ee8",
      "nsid": 0,
      "is_paid": false,
      "modified_at": "2018-08-09T08:32:31.498520+00:00",
      "additional_data": {
        "ttl_days": 20,
        "ttl_days_default": 10,
        "agent_office": "26b10dbb-4f1b-4d45-9c19-ec3cb85d4253",
        "checked_in_loc": "26b10dbb-4f1b-4d45-9c19-ec3cb85d4253"
      },
      "receiver": "4f90b36a-8622-4f43-a285-f622186f4ee8",
      "cod_amount": 0,
      "created_at": "2018-03-18T14:04:13.671252+00:00",
      "goes_back": false
    }
  ],
  "success": true
}

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

protocol_method

POST

method_name

op/parcel

method_params

----

request_body

{"type": <TYPE CODE>, "class": "<CLASS ID>", "sender": "<USER ID>", "receiver":"<USER ID>", "address_id": "<SHIPPING ADDRESS ID>", "weight": <WEIGHT GRAM as INTEGER)>, "price": <PRICE as DECIMAL(10,2)>, "cod_amount": <PRICE as DECIMAL(10,2)>}

expected_result

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

Пример запроса/ответа
Запрос
curl -v -X POST "https://sandbox-api.tbt-post.net/api/v1/op/parcel" \
-H "Content-Type: application/json" \
-b cookie-jar1.txt \
-d '{"type": "fragile", "class": "A.PRP.NR.NA.S000", "sender": "44ee4ac5-8e42-4e40-821a-3f3e5f13f680", "receiver":"6cca769e-f380-4385-805c-84232c51a60c", "address_id": "f50a7aaa-8a1d-11e6-8a66-83b0de5b609d", "weight": 1500, "price": 300, "cod_amount": 300}'
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Thu, 17 Jan 2019 09:56: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": "728827e9-ca3e-49f3-9670-3b752736ecec",
  "success": true
}

Изменение посылки

protocol_method

PUT

method_name

op/parcel

method_params

<PARCEL ID>

request_body

{"state": "<STATE ID>", "type": <TYPE CODE>, "class": "<CLASS ID>", "sender": "<USER ID>", "receiver":"<USER ID>", "address_id": "<SHIPPING ADDRESS ID>", "transfer_via": "<SHIPPING ADDRESS ID>", "weight": <WEIGHT GRAM as INTEGER>, "price": <PRICE as DECIMAL(10,2)>, "paid_amount": <PRICE as DECIMAL(10,2)>, "cod_amount": <PRICE as DECIMAL(10,2)>}

expected_result

202 {"success": true}

необходимо передавать подмножество описанных параметров для изменения посылки.
Пример запроса/ответа
Запрос
curl -v -X PUT "https://sandbox-api.tbt-post.net/api/v1/op/parcel/728827e9-ca3e-49f3-9670-3b752736ecec" \
-H "Content-Type: application/json" \
-b cookie-jar1.txt \
-d '{"state": "PU0001", "type": "foods", "class": "A.PRP.NR.NA.S000", "sender": "44ee4ac5-8e42-4e40-821a-3f3e5f13f680", "receiver":"6cca769e-f380-4385-805c-84232c51a60c", "address_id": "f50a7aaa-8a1d-11e6-8a66-83b0de5b609d", "transfer_via": "f50a7aaa-8a1d-11e6-8a66-83b0de5b609d", "weight": 5000, "price": 675, "paid_amount": 675, "cod_amount": 675}'
Ответ

HTTP/1.1 202 Accepted
Server: nginx/1.10.3
Date: Thu, 17 Jan 2019 10:03:23 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

op/parcel

method_params

office-stat

expected_result

200 { "success": true, "rules": {"<RULE ID>": ["<PARCEL STATE>", "<PARCEL STATE>",<…​>], "<RULE ID>": […​], …​}, "total": <PARCEL COUNT as INTEGER>, "stats": {"<RULE ID>": <PARCEL COUNT BY RULE as INTEGER>, "<RULE ID>": <…​>, …​}, "filters": {"<FILTER ID>": <PARCEL COUNT BY FILTER as INTEGER>, "<FILTER ID>": <…​>, …​} }

значения rules: ['delivered', 'on_stock', 'in', 'release', 'new', 'in_progress', 'trans', 'out']
значения filters: ['returns', 'cancellations']
Пример запроса/ответа
Запрос
curl -v -X GET "https://sandbox-api.tbt-post.net/api/v1/op/parcel/office-stat" \
-H "Content-Type: application/json" \
-b cookie-jar1.txt
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Thu, 17 Jan 2019 12:08:13 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 491
Connection: keep-alive
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS
Access-Control-Max-Age: 600
Etag: "97b8b9253b9cda00b159d122ffa5025bee3af665"
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://sandbox-ui.tbt-post.net
Access-Control-Allow-Headers: Content-Type

{
  "rules": {
    "delivered": [
      "PU0007"
    ],
    "on_stock": [
      "PU0003",
      "PO0003",
      "PO0004"
    ],
    "in": [
      "PO0010",
      "PO0011"
    ],
    "release": [
      "PU0004"
    ],
    "new": [
      "PU0000",
      "PO0001",
      "PO0002"
    ],
    "in_progress": [
      "PO0005",
      "PO0006"
    ],
    "trans": [
      "PU0002",
      "PU0005",
      "PU0006",
      "PO0009"
    ],
    "out": [
      "PU0001",
      "PO0007",
      "PO0008"
    ]
  },
  "total": 65,
  "stats": {
    "delivered": 0,
    "on_stock": 14,
    "in": 0,
    "release": 0,
    "new": 0,
    "in_progress": 0,
    "trans": 2,
    "out": 42
  },
  "success": true,
  "filters": {
    "returns": 0,
    "cancellations": 0
  }
}

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

protocol_method

GET

method_name

op/parcel

method_params

grouped-list

get_params

office_id

expected_result

200 { "success": true, "grouped": { "<GROUP>": ["<PARCEL>", "<PARCEL>", …​], …​} }

Пример запроса/ответа
Запрос
curl -v -X GET "https://sandbox-api.tbt-post.net/api/v1/op/parcel/grouped-list?office_id=7dea0898-865d-4f11-af5b-337acf3464f2" \
-H "Content-Type: application/json" \
-b cookie-jar1.txt
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Thu, 17 Jan 2019 12:12:50 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 8468
Connection: keep-alive
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS
Access-Control-Max-Age: 600
Etag: "5dbd204337166e3104e2671a00257d32a72ca716"
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://sandbox-ui.tbt-post.net
Access-Control-Allow-Headers: Content-Type

{
  "grouped": [
    {
      "group": "inbox",
      "parcels": [
        {
          "address_id": "5acc5178-8bb9-11e6-9a61-83019362fcae",
          "code": "T8BMY33DM",
          "weight": 0,
          "agent": "44823a06-067c-4cbc-9193-675abaf35e4b",
          "is_dirty": false,
          "is_open": true,
          "paid_at": null,
          "closed_at": null,
          "id": "2bab4b39-1a6f-417e-a8e7-4ad59bfbfdd3",
          "paid_amount": 0,
          "entity_type": "shelf",
          "state": "PU0099",
          "mark": "R",
          "last_seen_at": "2018-06-26T13:39:30.556186+00:00",
          "type": "undef",
          "delivery_type": "W2W",
          "parent": null,
          "price": 0,
          "checked_in_at": null,
          "class": "I.PRP.NR.NA.S000",
          "pentity": "0223928d-46c1-4d00-940b-63a4e430295e",
          "transfer_via": null,
          "sender": "7dea0898-865d-4f11-af5b-337acf3464f2",
          "nsid": 0,
          "is_paid": false,
          "modified_at": "2018-05-03T07:49:31.912000+00:00",
          "additional_data": {
            "ttl_days": 15,
            "ttl_days_default": 15,
            "agent_office": "7dea0898-865d-4f11-af5b-337acf3464f2",
            "document_id": "04f1546e-6d55-11e7-94f9-00163e8cc029",
            "label": "+Возврат-T8-200717/001"
          },
          "entity_label": "inbox",
          "receiver": "1678166e-a050-430b-878a-5244ca5d8659",
          "cod_amount": 0,
          "created_at": "2017-07-20T14:09:17.620979+00:00",
          "goes_back": true
        },
        {
          "address_id": "26b6ea98-4f4a-11e6-b08e-1f448ec92245",
          "code": "M1A0PE0",
          "weight": 1000,
          "agent": "1678166e-a050-430b-878a-5244ca5d8659",
          "is_dirty": false,
          "is_open": true,
          "paid_at": null,
          "closed_at": null,
          "id": "3a7c9413-4c11-4a89-ac07-4f28e61de5b6",
          "paid_amount": 0,
          "entity_type": "shelf",
          "state": "PU0099",
          "mark": null,
          "last_seen_at": "2018-06-26T13:39:25.725169+00:00",
          "type": "undef",
          "delivery_type": "W2W",
          "parent": null,
          "price": 152,
          "checked_in_at": "2017-09-15T09:35:09.740110+00:00",
          "class": "I.COD.NR.NA.S000",
          "pentity": "0223928d-46c1-4d00-940b-63a4e430295e",
          "transfer_via": "e0b05432-63a7-4e2e-9c7d-9d1eaaa04b78",
          "sender": "1678166e-a050-430b-878a-5244ca5d8659",
          "nsid": 0,
          "is_paid": false,
          "modified_at": "2018-05-03T07:55:02.529000+00:00",
          "additional_data": {
            "erp_token": "8ce6be3f-157d-4165-a52e-5e0d0f951eea",
            "_receiver": {
              "phone": "38063XXXX682",
              "first_name": "Test",
              "last_name": "Customer2",
              "id": 903370,
              "email": "TestCustomer2@mail.ru"
            },
            "return_via": "e0b05432-63a7-4e2e-9c7d-9d1eaaa04b78",
            "checked_in_loc": "7dea0898-865d-4f11-af5b-337acf3464f2",
            "agent_office": "e0b05432-63a7-4e2e-9c7d-9d1eaaa04b78",
            "ttl_days_default": 5,
            "ttl_days": 7
          },
          "entity_label": "inbox",
          "receiver": "ecfb88c6-e753-44e9-83be-6e974ecab82c",
          "cod_amount": 152,
          "created_at": "2016-12-28T13:57:21.038967+00:00",
          "goes_back": true
        }
      ]
    },
    {
      "group": "store",
      "parcels": [
        {
          "address_id": "26b6ea98-4f4a-11e6-b08e-1f448ec92245",
          "code": "M1A009A",
          "weight": 1000,
          "agent": "1678166e-a050-430b-878a-5244ca5d8659",
          "is_dirty": false,
          "is_open": true,
          "paid_at": null,
          "closed_at": null,
          "id": "b0e5b3cc-44cf-41e8-b681-4e039cddbf3b",
          "paid_amount": 191,
          "entity_type": "shelf",
          "state": "PU0007",
          "mark": null,
          "last_seen_at": "2018-06-26T13:39:12.792419+00:00",
          "type": "undef",
          "delivery_type": "W2W",
          "parent": null,
          "price": 191,
          "checked_in_at": "2017-02-05T18:36:48.570000+00:00",
          "class": "I.COD.NR.NA.S000",
          "pentity": "240f772c-65d6-4ee5-bb33-73b2f1319725",
          "transfer_via": "7dea0898-865d-4f11-af5b-337acf3464f2",
          "sender": "1678166e-a050-430b-878a-5244ca5d8659",
          "nsid": 0,
          "is_paid": true,
          "modified_at": "2018-04-19T10:41:11.068573+00:00",
          "additional_data": {
            "erp_token": "8ce6be3f-157d-4165-a52e-5e0d0f951eea",
            "_receiver": {
              "phone": "38063XXXX471",
              "first_name": "Test",
              "last_name": "Customer",
              "id": 2300700,
              "email": "testCustomer@ukr.net"
            },
            "return_via": "e0b05432-63a7-4e2e-9c7d-9d1eaaa04b78",
            "agent_office": "e0b05432-63a7-4e2e-9c7d-9d1eaaa04b78",
            "ttl_days_default": 5,
            "ttl_days": 5
          },
          "entity_label": "01",
          "receiver": "ae9ad33d-f07a-4694-b414-484095b111da",
          "cod_amount": 191,
          "created_at": "2016-12-28T14:27:05.295523+00:00",
          "goes_back": false
        }
      ]
    }
  ],
  "success": true
}

Статистика по посылкам для пользователя

protocol_method

GET

method_name

parcel

method_params

stat

expected_result

200 {"success": true, "receiver": <PARCEL COUNT as INTEGER>, "sender": <PARCEL COUNT as INTEGER>, "on_release": <PARCEL COUNT as INTEGER>}

значения on_relese - это подмножество посылок из receiver, готовых к выдачи пользователю.
Пример запроса/ответа
Запрос
curl -v -X GET "https://sandbox-api.tbt-post.net/api/v1/parcel/stat" \
-H "Content-Type: application/json" \
-b cookie-jar1.txt
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Thu, 17 Jan 2019 12:27:29 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
Etag: "59b2fc69991ec211dedb998f5abaeeff438f4281"
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://sandbox-ui.tbt-post.net
Access-Control-Allow-Headers: Content-Type

{
  "on_release": 0,
  "sender": 4,
  "success": true,
  "receiver": 22
}

Трекинговая информация о пользовательских посылках

protocol_method

GET

method_name

parcel

method_params

track

expected_result

200 { "success": true, "sender": [{"id": "<PARCEL ID>", "state": "<PARCEL STATE>", "goes_back": <true/false>, "sender": "<USER ID>", "receiver": "<USER ID>", "lat": <LATITUDE>, "lon": <LONGITUDE>}, {…​}, …​], "receiver": [{"id": "<PARCEL ID>", "state": "<PARCEL STATE>", "goes_back": <true/false>, "sender": "<USER ID>", "receiver": "<USER ID>", "lat": <LATITUDE>, "lon": <LONGITUDE>}, {…​}, …​] }

Пример запроса/ответа
Запрос
curl -v -X GET "https://sandbox-api.tbt-post.net/api/v1/parcel/track" \
-H "Content-Type: application/json" \
-b cookie-jar1.txt
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Thu, 17 Jan 2019 12:30:45 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 1510
Connection: keep-alive
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS
Access-Control-Max-Age: 600
Etag: "f93ff5a5cee4f3d4ad10ce2ed3ec110a5aa1b757"
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://sandbox-ui.tbt-post.net
Access-Control-Allow-Headers: Content-Type

{
  "sender": [
    {
      "code": "T1PR6NA6R",
      "sender": "4f90b36a-8622-4f43-a285-f622186f4ee8",
      "lon": 30.45632,
      "state": "PU0003",
      "goes_back": false,
      "receiver": "4f90b36a-8622-4f43-a285-f622186f4ee8",
      "lat": 50.431722,
      "id": "94936244-3461-406d-b773-f1f0852074bb"
    },
    {
      "code": "T1BR5NB8M",
      "sender": "4f90b36a-8622-4f43-a285-f622186f4ee8",
      "lon": 30.679338,
      "state": "PU0003",
      "goes_back": false,
      "receiver": "4f90b36a-8622-4f43-a285-f622186f4ee8",
      "lat": 50.405237,
      "id": "106c252b-ebb6-426f-920a-ff8f616faf3b"
    }
  ],
  "success": true,
  "receiver": [
    {
      "code": "K26V49E",
      "sender": "1678166e-a050-430b-878a-5244ca5d8659",
      "lon": 30.679338,
      "state": "PU0099",
      "goes_back": false,
      "receiver": "4f90b36a-8622-4f43-a285-f622186f4ee8",
      "lat": 50.405237,
      "id": "be803f61-84dc-4be2-8fb2-d687acd4d7bc"
    },
    {
      "code": "K26ZXT0",
      "sender": "1678166e-a050-430b-878a-5244ca5d8659",
      "lon": 30.599589,
      "state": "PU0003",
      "goes_back": false,
      "receiver": "4f90b36a-8622-4f43-a285-f622186f4ee8",
      "lat": 50.450822,
      "id": "71d73f6a-c0e7-4053-850e-fd22fd445c18"
    },
    {
      "code": "K2700L2",
      "sender": "1678166e-a050-430b-878a-5244ca5d8659",
      "lon": 30.599589,
      "state": "PU0003",
      "goes_back": false,
      "receiver": "4f90b36a-8622-4f43-a285-f622186f4ee8",
      "lat": 50.450822,
      "id": "24a407c0-7601-4262-a07e-75551959529e"
    },
    {
      "code": "M21B01B",
      "sender": "1678166e-a050-430b-878a-5244ca5d8659",
      "lon": 30.520706,
      "state": "PU0099",
      "goes_back": false,
      "receiver": "4f90b36a-8622-4f43-a285-f622186f4ee8",
      "lat": 50.442561,
      "id": "8328aba4-1526-4f13-92f5-c6090d184597"
    }
  ]
}

Адреса и отделения

Справочники адресов для разных языков могут отличаться. Для получения информации на конкретном языке в строке запроса можно специфировать язык при помощи параметра lang=<LANG>.

Если язык не указан, то будет выбран либо язык пользовательского предпочтения в интерфейсе, либо язык, установленный в пользовательском профиле.

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

protocol_method

GET

method_name

offices

get_params

<lang, all=true|false>

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 }

в случае указания параметра all=true в списке будут отображаться так-же внутренние отделения системы.
Пример запроса/ответа
Запрос
curl -v -X GET "https://sandbox-api.tbt-post.net/api/v1/offices?all=true" \
-H "Content-Type: application/json" \
-b cookie-jar1.txt
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Thu, 17 Jan 2019 12:55:05 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 45165
Connection: keep-alive
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS
Access-Control-Max-Age: 600
Etag: "9cfa686056f0608e98a9f2ac1b9a8a70d5a91d2f"
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": "02121"
      },
      "name": "Киев, Отделение Склад",
      "descr": "Киев, Отделение Склад",
      "schedule": {},
      "is_internal": true,
      "number": 0,
      "photos": [],
      "id": "e0b05432-63a7-4e2e-9c7d-9d1eaaa04b78",
      "pay_cash": null,
      "phone": "380110000000",
      "email": "kiev_0@tbt-post.net",
      "way_photos": [],
      "optimal_hours": {},
      "services": [
        "warehouse"
      ],
      "additional_data": {
        "label": "Склад-0 (МК)",
        "code_prefix": "T0",
        "sms_addr": "Kiev, sklad modnaKasta"
      },
      "ui_address": "м.Київ, Харківське шосе 201-203к1А",
      "address": {
        "lang": "ru",
        "city": "Киев",
        "building": "201-203к1А",
        "area": null,
        "country": "UA",
        "region": "Киев",
        "lon": 30.679338,
        "geo_object": {},
        "addr_type": "fc_office",
        "note": "Отделение Склад",
        "modified_at": "2016-10-06T11:38:08.992923+00:00",
        "street": "Харьковское шоссе",
        "geo_source": "yandex",
        "lat": 50.405237,
        "id": "5acc5178-8bb9-11e6-9a61-83019362fcae",
        "accuracy": "exact"
      },
      "pay_card": null
    },
    {
      "address_data": {
        "index": "65011"
      },
      "name": "Одесса, Склад №1",
      "descr": "Одесса, Отделение Склад №1",
      "schedule": {
        "1": "09:00-20:00",
        "2": "09:00-20:00",
        "3": "09:00-20:00",
        "4": "09:00-20:00",
        "5": "09:00-20:00",
        "6": "09:00-20:00",
        "7": "-"
      },
      "is_internal": true,
      "number": 0,
      "photos": [],
      "id": "b4d9d2da-be3e-4682-b7cf-fd645f14c5e5",
      "pay_cash": true,
      "phone": "380111000000",
      "email": "odessa_0@tbt-post.net",
      "way_photos": [],
      "optimal_hours": {},
      "services": [
        "warehouse"
      ],
      "additional_data": {
        "uk:label": "Одеса-Склад-1",
        "label": "Одесса-Cклад-1",
        "code_prefix": "TK",
        "uk:sms_addr": "Odessa, viddilennia sklad 1",
        "sms_addr": "Odessa, otdelenie sklad 1"
      },
      "ui_address": "м.Одеса, Базарна вулиця 80",
      "address": {
        "lang": "ru",
        "city": "Одесса",
        "building": "80",
        "area": "Одесский городской совет",
        "country": "UA",
        "region": "Одесская область",
        "lon": 30.737777,
        "geo_object": {},
        "addr_type": "cc_office",
        "note": "Склад-1",
        "modified_at": "2018-05-08T12:12:01.037399+00:00",
        "street": "Базарная улица",
        "geo_source": "yandex",
        "lat": 46.474389,
        "id": "032af2ee-52b9-11e8-b7d9-93c11d54d8c4",
        "accuracy": "exact"
      },
      "pay_card": false
    }
  ],
  "success": true
}

Список адресов отделений

protocol_method

GET

method_name

address

method_params

list

get_params

addr_type=<cc_office|fc_office> / id[]=<ADDRESS ID>&id[]=<ADDRESS ID>&…​

request_body

----

expected_result

200 {"address_list": [<ADDRESS1>, <ADDRESS2>, …​], "success": true}

где:

cc_office

собственные отделения

fc_office

агентские отделения

Пример запроса/ответа
Запрос
curl -v -X GET "https://sandbox-api.tbt-post.net/api/v1/address/list?id%5B%5D=5acc5178-8bb9-11e6-9a61-83019362fcae&id%5B%5D=032af2ee-52b9-11e8-b7d9-93c11d54d8c4" \
-H "Content-Type: application/json" \
-b cookie-jar1.txt
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Thu, 17 Jan 2019 13:12:21 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 1331
Connection: keep-alive
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS
Access-Control-Max-Age: 600
Etag: "3cc061dde859dd8f779f8f10e98fd468a94f2522"
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://sandbox-ui.tbt-post.net
Access-Control-Allow-Headers: Content-Type

{
  "success": true,
  "address_list": [
    {
      "lang": "ru",
      "city": "Одесса",
      "building": "80",
      "area": "Одесский городской совет",
      "country": "UA",
      "region": "Одесская область",
      "lon": 30.737777,
      "geo_object": {},
      "id": "032af2ee-52b9-11e8-b7d9-93c11d54d8c4",
      "note": "Склад-1",
      "modified_at": "2018-05-08T12:12:01.037399+00:00",
      "street": "Базарная улица",
      "geo_source": "yandex",
      "lat": 46.474389,
      "addr_type": "cc_office",
      "accuracy": "exact"
    },
    {
      "lang": "ru",
      "city": "Киев",
      "building": "201-203к1А",
      "area": null,
      "country": "UA",
      "region": "Киев",
      "lon": 30.679338,
      "geo_object": {},
      "id": "5acc5178-8bb9-11e6-9a61-83019362fcae",
      "note": "Отделение Склад",
      "modified_at": "2016-10-06T11:38:08.992923+00:00",
      "street": "Харьковское шоссе",
      "geo_source": "yandex",
      "lat": 50.405237,
      "addr_type": "fc_office",
      "accuracy": "exact"
    }
  ]
}

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

protocol_method

GET

method_name

address

method_params

<SHIPPING ADDRESS ID>

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-параметров указывается либо пара гео-координат, либо составные параметры адреса, либо id адреса.
id в качестве параметра метода имеет боле высокий приоритет
Пример запроса/ответа
Запрос
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" \
-b cookie-jar1.txt
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Thu, 17 Jan 2019 13:16:30 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"
}

Получение списка фильтров (агрегации) адресов

protocol_method

GET

method_name

address

method_params

filters

get_params

field=<region|city|street|building>,[region=<AGG REGION>,city=<AGG CITY>,street=<AGG STREET>, pattern=<FILTER PATTERN>, lang]

request_body

----

expected_result

200 {"success": true, "filters": [<field_value_1>, .. <field_value_N>]}

Для получения списка фильтиров (агрегации) для поля адреса более нижнего уровня, необходимо задать через get-параметры значения полей более высокого уровня в соответствии с древовидной структурой адреса: region → city → street → building.
Дополнительный параметр pattern используется для дополнительной фильтрации результирующего списка фильтров.
Пример запроса/ответа
Запрос
curl -v -X GET "https://sandbox-api.tbt-post.net/api/v1/address/filters?field=street&region=%D0%A7%D0%B5%D1%80%D0%BA%D0%B0%D1%81%D1%8C%D0%BA%D0%B0%20%D0%BE%D0%B1%D0%BB%D0%B0%D1%81%D1%82%D1%8C&city=%D0%A7%D0%B5%D1%80%D0%BA%D0%B0%D1%81%D0%B8" \
-H "Content-Type: application/json" \
-b cookie-jar1.txt
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Sun, 20 Jan 2019 12:54:00 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 2593
Connection: keep-alive
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS
Access-Control-Max-Age: 600
Etag: "40e2be2ddfd8b645656f04ee65b10296c6fc5fe7"
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://sandbox-ui.tbt-post.net
Access-Control-Allow-Headers: Content-Type

{
  "success": true,
  "filters": [
    "бульвар Шевченка",
    "вулиця Байди Вишневецького",
    "вулиця Благовісна",
    "вулиця Вернигори",
    "вулиця Віталія Вергая",
    "вулиця В'ячеслава Чорновола",
    "вулиця Гагаріна",
    "вулиця Генерала Момота",
    "вулиця Дахнівська",
    "вулиця Лесі Українки",
    "вулиця Луценка",
    "вулиця Максима Залізняка",
    "вулиця Надпільна",
    "вулиця Нарбутівська",
    "вулиця Небесної Сотні",
    "вулиця Остафія Дашковича",
    "вулиця Самійла Кішки",
    "вулиця Сержанта Волкова",
    "вулиця Сержанта Смирнова",
    "вулиця Слави",
    "вулиця Сумгаїтська",
    "вулиця Тараскова",
    "вулиця Чехова"
  ]
}

Создание адреса в справочнике

Кодирование и декодирование проиходят с нормализацией гео-позиции (т.е. результат соответствует геометрическому центру результирующего объекта)

Для создания адреса, как правило, достаточно указания в теле запроса:

  • city — город/населенный пункт

  • street — улица

  • building — дом

однако, ввиду того, что одно и то же название населенного пункта может присутствовать несколько раз в различных местностях, а улицы — в разных районах одного города, возможно (а в ряде случаев и рекомендовано) использовать дополнительные опциональные параметры:

  • region — область/регион

  • area — район/местность

Указание в теле запроса ключа lang приводит к переключению распознавания ввода и изменению языка вывода результата.

Резолвинг происходит автоматически, т.е. фактическая процедура происходит по принципу resolve and set.

protocol_method

POST

method_name

address

method_params

----

request_body

{"city": "<CITY>", "street": "<STREET>", "building": "<BUILDING>"}

expected_result

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

Пример запроса/ответа
Запрос
curl -v -X POST "https://sandbox-api.tbt-post.net/api/v1/address" \
-H "Content-Type: application/json" \
-b cookie-jar.txt \
-d '{"region": "Вінницька область","city": "Крижопіль", "street": "вулиця Героїв України", "building": "18", "lang": "ua" }'
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Sun, 20 Jan 2019 13:04:23 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 583
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

{
  "building": "18",
  "street": "вулиця Героїв України",
  "lat": 48.3836026,
  "lang": "ru",
  "city": "Крижопіль",
  "success": true,
  "area": "Крижопільський район",
  "country": "UA",
  "region": "Вінницька область",
  "lon": 28.8663538,
  "geo_source": "google",
  "accuracy": "other"
}

Для обратного кодирования в теле запроса необходимо указывать координаты.

protocol_method

POST

method_name

address

method_params

----

request_body

{"lat": <LATITUDE>, "lon": <LONGITUDE>}

expected_result

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

Пример запроса/ответа
Запрос
curl -v -X POST "https://sandbox-api.tbt-post.net/api/v1/address" \
-H "Content-Type: application/json" \
-b cookie-jar.txt \
-d '{"lat": 48.386047, "lon": 28.865174}'
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Sun, 20 Jan 2019 13:11:18 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 626
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

{
  "building": "18",
  "street": "вулиця Героїв України",
  "lat": 48.386302,
  "id": "2ce89d5e-1cb5-11e9-88a7-ab8c8bd7420b",
  "lang": "ru",
  "city": "Крижопіль",
  "success": true,
  "area": "Крижопільський район",
  "country": "UA",
  "region": "Вінницька область",
  "lon": 28.865319,
  "geo_source": "google",
  "accuracy": "exact"
}

Список пользовательских адресов

protocol_method

GET

method_name

user/address

method_params

----

get_params

----

request_body

----

expected_result

200 {"success": true, "address_list": [{"building": "<BUILDING>", "city": "<CITY>", "address_id": "<SHIPPING ADDRESS ID>", "service": "<ADDRESS SERVICE>", "apartment": "<APARTMENT>", "lang": "<LANG>", "title": "<ADDRESS TITLE>", "country": "<COUNTRY CODE>", "notes": "<TEXT or null>", "area": <ADDRESS AREA or null>, "lon": <LONGITUDE>, "is_default": <true/false>, "street": "<STREET>", "lat": <LATITUDE>, "region": "<CITY REGION or null>"}]}

расширение параметризации метода идентификатором адреса (т.е.<SHIPPING ADDRES ID>) возвращает описание отдельного адреса (редуцирует выборку)
Пример запроса/ответа
Запрос
curl -v -X GET "https://sandbox-api.tbt-post.net/api/v1/user/address" \
-H "Content-Type: application/json" \
-b cookie-jar.txt
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Sun, 20 Jan 2019 13:40:35 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 738
Connection: keep-alive
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS
Access-Control-Max-Age: 600
Etag: "d6acb020c6f10b09190fa38a776c35472dbd7145"
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://sandbox-ui.tbt-post.net
Access-Control-Allow-Headers: Content-Type

{
  "success": true,
  "address_list": [
    {
      "building": "18",
      "city": "Крижопіль",
      "address_id": "2ce89d5e-1cb5-11e9-88a7-ab8c8bd7420b",
      "apartment": "1",
      "lang": "ru",
      "service": "courier",
      "title": "Крижопіль, вулиця Героїв України, 18",
      "country": "UA",
      "notes": "TEST",
      "area": "Крижопільський район",
      "modified_at": "2019-01-20T13:50:34.707572+00:00",
      "lon": 28.865319,
      "is_default": false,
      "street": "вулиця Героїв України",
      "additional_data": {},
      "lat": 48.386302,
      "region": "Вінницька область"
    }
  ]
}

Добавление пользовательского адреса

protocol_method

POST

method_name

user/address

method_params

----

request_body

{"address_id" : "<SHIPPING ADDRESS ID>", "service": "<ADDRESS SERVICE>", "title": "ADDRESS TITLE", "apartment": "<APARTMENT>", "notes": "TEXT"}

expected_result

200 {"success": true}

Пример запроса/ответа
Запрос
curl -v -X POST "https://sandbox-api.tbt-post.net/api/v1/user/address" \
-H "Content-Type: application/json" \
-b cookie-jar.txt \
-d '{ "address_id" : "2ce89d5e-1cb5-11e9-88a7-ab8c8bd7420b", "service": "courier", "title": "Крижопіль, вулиця Героїв України, 18", "apartment": "1", "notes": "TEST"}'
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Sun, 20 Jan 2019 13:50:34 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

op/user/address

method_params

<USER ID>

get_params

----

request_body

----

expected_result

200 {"success": true, "address_list": [{"building": "<BUILDING>", "city": "<CITY>", "address_id": "<SHIPPING ADDRESS ID>", "apartment": "<APARTMENT>", "lang": "<LANG>", "title": "<ADDRESS TITLE>", "country": "<COUNTRY CODE>", "notes": "<TEXT or null>", "area": <ADDRESS AREA or null>, "lon": <LONGITUDE>, "is_default": <true/false>, "street": "<STREET>", "lat": <LATITUDE>, "region": "<CITY REGION or null>"}]}

расширение параметризации метода идентификатором адреса (т.е. <USER ID>/<SHIPPING ADDRES ID>) возвращает описание отдельного адреса (редуцирует выборку)
Пример запроса/ответа
Запрос
curl -v -X GET "https://sandbox-api.tbt-post.net/api/v1/op/user/address/	cf8b0967-f1d3-4e53-aa48-297940415263" \
-H "Content-Type: application/json" \
-b cookie-jar1.txt
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Sun, 20 Jan 2019 14:08:43 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 2141
Connection: keep-alive
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS
Access-Control-Max-Age: 600
Etag: "b63d0f8a91f618d03e2cbb3213d77c6f6837da72"
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://sandbox-ui.tbt-post.net
Access-Control-Allow-Headers: Content-Type

{
  "success": true,
  "address_list": [
    {
      "building": "18",
      "city": "Крижопіль",
      "address_id": "2ce89d5e-1cb5-11e9-88a7-ab8c8bd7420b",
      "apartment": "2",
      "lang": "ru",
      "service": "courier",
      "title": "Крижопіль, вулиця Героїв України, 18",
      "country": "UA",
      "notes": "TEST",
      "area": "Крижопільський район",
      "modified_at": "2019-01-20T13:50:34.707572+00:00",
      "lon": 28.865319,
      "is_default": false,
      "street": "вулиця Героїв України",
      "additional_data": {},
      "lat": 48.386302,
      "region": "Вінницька область"
    }
  ]
}

Добавление пользовательского адреса произвольного пользователя

protocol_method

POST

method_name

op/user/address

method_params

<USER ID>

request_body

{"address_id" : "<SHIPPING ADDRESS ID>", "service": "<ADDRESS SERVICE>", "title": "ADDRESS TITLE", "apartment": "<APARTMENT>", "notes": "TEXT"}

expected_result

200 {"success": true}

Пример запроса/ответа
Запрос
curl -v -X POST "https://sandbox-api.tbt-post.net/api/v1/op/user/address/86761ba9-be25-47e1-8483-cb43ee3f241e" \
-H "Content-Type: application/json" \
-b cookie-jar1.txt \
-d '{ "address_id" : "2ce89d5e-1cb5-11e9-88a7-ab8c8bd7420b", "service": "courier", "title": "Крижопіль, вулиця Героїв України, 18", "apartment": "2", "notes": "TEST"}'
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Sun, 20 Jan 2019 14:15:43 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
}

Сущности и справочники

Ресурсы отделения

Cоздание ресурса отеления

protocol_method

POST

method_name

op/entity

method_params

----

get_params

----

request_body

{"type": "<ENTITY TYPE>", "parent": "<ENTITY ID>", "descr": "<ENTITY DESCRIPTION>", "label": "<ENTITY LABEL>", "path": "<PATH (1C FORMAT)>"}

expected_result

200 {"success": true, "id": "<ENTITY ID>", "type": "<ENTITY TYPE>", "owner": "<OFFICE USER ID>", "parent": "<ENTITY ID>", "descr": "<ENTITY DESCRIPTION>" "properties": {"label": "<ENTITY LABEL>", "path": "<PATH (1C FORMAT)>", "db_path": ["<PARENT ENTITY ID>", "<PARENT ENTITY ID>", …​]}]}

Пример запроса/ответа
Запрос
curl -v -X POST "https://sandbox-api.tbt-post.net/api/v1/op/entity" \
-H "Content-Type: application/json" \
-b cookie-jar1.txt \
-d '{"type": "rack", "parent": "d4ef2889-2dea-48ad-b86e-8dfe1b3cd0f9", "descr": "Test", "label": "test inbox", "path": "tst/test inbox"}'
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Mon, 21 Jan 2019 15:03:26 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 333
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

{
  "parent": "d4ef2889-2dea-48ad-b86e-8dfe1b3cd0f9",
  "descr": "Test",
  "success": true,
  "properties": {
    "code": "$Er$F0:0014$",
    "path": "test inbox",
    "db_path": [
      "d4ef2889-XXXX-8dfe1b3cd0f9"
    ],
    "label": "test inbox"
  },
  "owner": "6beaa91b-XXXX-d8f89d700e4c",
  "type": "rack",
  "id": "afecf905-2b52-4975-9569-51c5068d4b1a"
}
Возможные параметры ENTITY_TYPE

box: Коробка

cell: Ячейка

shelf: Полка

rack: Стелаж

row: Ряд

stock: Склад

car: Машина

office: Отделение

Изменение ресурса отеления

protocol_method

PUT

method_name

op/entity

method_params

<ENTITY ID>

get_params

----

request_body

{"descr": "<ENTITY DESCRIPTION>", "label": "<ENTITY LABEL>", "path": "<PATH (1C FORMAT)>"}

expected_result

200 {"success": true, "id": "<ENTITY ID>", "type": "<ENTITY TYPE>", "owner": "<OFFICE USER ID>", "parent": "<ENTITY ID>", "descr": "<ENTITY DESCRIPTION>" "properties": {"label": "<ENTITY LABEL>", "path": "<PATH (1C FORMAT)>", "db_path": ["<PARENT ENTITY ID>", "<PARENT ENTITY ID>", …​]}]}

требуется указать только необходимые параметры для модификации ресурса.
Пример запроса/ответа
Запрос
curl -v -X PUT "https://sandbox-api.tbt-post.net/api/v1/op/entity/afecf905-2b52-4975-9569-51c5068d4b1a" \
-H "Content-Type: application/json" \
-b cookie-jar1.txt \
-d '{"descr": "New desc", "label": "new inbox", "path": "tst/new_inbox"}'
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Mon, 21 Jan 2019 15:06:23 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

DELETE

method_name

op/entity

method_params

<ENTITY ID>

get_params

----

request_body

----

expected_result

200 {"success": true}

удаление возможно только ресурса, который не имеет подчиненных ресурсов
Пример запроса/ответа
Запрос
curl -v -X DELETE "https://sandbox-api.tbt-post.net/api/v1/op/entity/afecf905-2b52-4975-9569-51c5068d4b1a" \
-H "Content-Type: application/json" \
-b cookie-jar1.txt
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Mon, 21 Jan 2019 15:16:24 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

op/entity

method_params

<ENTITY ID>

get_params

code=<ENTITY BARCODE>

request_body

----

expected_result

200 {"success": true, "id": "<ENTITY ID>", "type": "<ENTITY TYPE>", "owner": "<OFFICE USER ID>", "parent": "<ENTITY ID>", "descr": "<ENTITY DESCRIPTION>" "properties": {"code": "<ENTITY BARCODE>", "bcode": "<DATA URI: ENTITY BARCODE>", "label": "<ENTITY LABEL>", "path": "<PATH (1C FORMAT)>", "db_path": ["<PARENT ENTITY ID>", "<PARENT ENTITY ID>", …​]}]}

получение сущности выполняется или по <ENTITY ID> в method_params или по <ENTITY BARCODE> в get_params
Пример запроса/ответа
Запрос
curl -v -X GET "https://sandbox-api.tbt-post.net/api/v1/op/entity/95112660-f50e-4b7c-8b81-92139cda3aa4" \
-H "Content-Type: application/json" \
-b cookie-jar1.txt

Или

curl -v -X GET "https://sandbox-api.tbt-post.net/api/v1/op/entity?code=%24EC%24F0%3A0006%24" \
-H "Content-Type: application/json" \
-b cookie-jar1.txt
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Sun, 20 Jan 2019 15:05:05 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 3709
Connection: keep-alive
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS
Access-Control-Max-Age: 600
Etag: "e72d99d2e626912b9b524ec818529624a4c4ae91"
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://sandbox-ui.tbt-post.net
Access-Control-Allow-Headers: Content-Type

{
  "descr": "Киев, курьерское отделение, Ряд 00, Стелаж 00, Ячейка inbox",
  "parent": "a745e8ab-9733-45cd-9650-776b06d3bbf7",
  "success": true,
  "id": "95112660-f50e-4b7c-8b81-92139cda3aa4",
  "owner": "6beaa91b-XXXX-d8f89d700e4c",
  "type": "cell",
  "properties": {
    "path": "00.00/inbox",
    "bcode": "data:image/png;base64,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",
    "code": "$EC$F0:0006$",
    "db_path": [
      "d4ef2889-XXXX-8dfe1b3cd0f9",
      "642fc9dc-XXXX-ac4864b1c452",
      "a745e8ab-XXXX-776b06d3bbf7"
    ],
    "label": "inbox"
  }
}
Если вставить полученный код в строке браузера, напримпр: "Crhome", то в результате получим изображение необходимого кода. Копировать необходимо без скобок, например: data:image/png;base64,iV…​<body>…​U5ErkJggg==

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

protocol_method

GET

method_name

op/entity

method_params

list

get_params

[office_id=<OFFICE USER ID>] / parent=<ENTITY ID> / type=<ENTITY TYPE>

request_body

----

expected_result

200 {"success": true, "entities": [<ENTITY RECORD>, <ENTITY RECORD>, …​]

по-умолчанию office_id берется из данных операторского аккаунта, <ENTITY RECORD> соответсвует описанию результата для получения одиночной сущности за исключением поля "properties"/"barcode"
Пример запроса/ответа
Запрос
curl -v -X GET "https://sandbox-api.tbt-post.net/api/v1/op/entity/list" \
-H "Content-Type: application/json" \
-b cookie-jar1.txt
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Sun, 20 Jan 2019 14:51:20 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 5359
Connection: keep-alive
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS
Access-Control-Max-Age: 600
Etag: "42a61e2e40bedd8d514632d6a9b4010b4b4367de"
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://sandbox-ui.tbt-post.net
Access-Control-Allow-Headers: Content-Type

{
  "entities": [
    {
      "descr": "Киев, курьерское отделение",
      "parent": "d4ef2889-2dea-48ad-b86e-8dfe1b3cd0f9",
      "id": "d4ef2889-2dea-48ad-b86e-8dfe1b3cd0f9",
      "owner": "6beaa91b-XXXX-d8f89d700e4c",
      "type": "office",
      "properties": {
        "label": "F0"
      }
    },
    {
      "descr": "Киев, курьерское отделение, Ряд 00",
      "parent": "d4ef2889-2dea-48ad-b86e-8dfe1b3cd0f9",
      "id": "642fc9dc-6e45-4916-ba4f-ac4864b1c452",
      "owner": "6beaa91b-XXXX-d8f89d700e4c",
      "type": "row",
      "properties": {
        "path": "00",
        "code": "$ER$F0:0002$",
        "label": "00",
        "db_path": [
          "d4ef2889-XXXX-8dfe1b3cd0f9"
        ]
      }
    },
    {
      "descr": "Киев, курьерское отделение, Ряд 00, Стелаж 00, Ячейка inbox",
      "parent": "a745e8ab-9733-45cd-9650-776b06d3bbf7",
      "id": "95112660-f50e-4b7c-8b81-92139cda3aa4",
      "owner": "6beaa91b-XXXX-d8f89d700e4c",
      "type": "cell",
      "properties": {
        "path": "00.00/inbox",
        "code": "$EC$F0:0006$",
        "db_path": [
          "d4ef2889-XXXX-8dfe1b3cd0f9",
          "642fc9dc-XXXX-ac4864b1c452",
          "a745e8ab-XXXX-776b06d3bbf7"
        ],
        "label": "inbox"
      }
    }
  ],
  "success": true
}

Пeреназначение иерархии для ресурса отделения

protocol_method

POST

method_name

op/entity/reparent

method_params

<ENTITY ID>

get_params

----

request_body

{"parent": "<ENTITY ID>"}

expected_result

200 {"success": true}

Пример запроса/ответа
Запрос
curl -v -X POST "https://sandbox-api.tbt-post.net/api/v1/op/entity/reparent/afecf905-2b52-4975-9569-51c5068d4b1a" \
-H "Content-Type: application/json" \
-b cookie-jar1.txt \
-d '{"parent": "d4ef2889-2dea-48ad-b86e-8dfe1b3cd0f9"}'
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Sun, 20 Jan 2019 14:59:26 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 78
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

{
  "descr": "New desc",
  "parent": "d4ef2889-2dea-48ad-b86e-8dfe1b3cd0f9",
  "success": true,
  "id": "afecf905-2b52-4975-9569-51c5068d4b1a",
  "owner": "6beaa91b-XXXX-d8f89d700e4c",
  "type": "rack",
  "properties": {
    "path": "new inbox",
    "code": "$Er$F0:0014$",
    "db_path": [
      "d4ef2889-XXXX-8dfe1b3cd0f9"
    ],
    "label": "new inbox"
  }
}

Словари

Сообщения для состояний отправлений

protocol_method

GET

method_name

dict/parcel

method_params

states

get_params

lang=<ru|uk|en> default: ru

expected_result

200 { "success": true, "states": {"<STATE ID>": "<STATE MESSAGE>", "<STATE ID>": "<STATE MESSAGE>", …​} }

Пример запроса/ответа
Запрос
curl -v -X GET "https://sandbox-api.tbt-post.net/api/v1/dict/parcel/states?lang=ru" \
-H "Content-Type: application/json" \
-b cookie-jar.txt
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Sun, 20 Jan 2019 14:29:06 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 1555
Connection: keep-alive
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS
Access-Control-Max-Age: 600
Etag: "fb896b919bce41cf32ed9227daba8fea8ab100fd"
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://sandbox-ui.tbt-post.net
Access-Control-Allow-Headers: Content-Type

{
  "states": {
    "PU0098": "В процессе обработки",
    "PU0099": "Отменено",
    "PU0096": "Расформировано",
    "PU0097": "Возврат отправителю",
    "PU0003": "В отделении",
    "PU0002": "Перемещается между отделениями",
    "PU0001": "Отправление принято к доставке",
    "PU0000": "Заявка зарегистрирована в системе",
    "PU0007": "Доставлено",
    "PU0006": "Ожидает вручения (в процессе доставки)",
    "PU0005": "Передано курьеру",
    "PU0004": "Ожидает выдачи"
  },
  "success": true
}

Сообщения для действий по отправлениям

protocol_method

GET

method_name

dict/parcel

method_params

actions

get_params

lang=<ru|uk|en> default: ru

expected_result

200 { "success": true, "actions": {"<STATE ID>": "<STATE ACTION MESSAGE>", "<STATE ID>": "<STATE ACTION MESSAGE>", …​} }

Пример запроса/ответа
Запрос
curl -v -X GET "https://sandbox-api.tbt-post.net/api/v1/dict/parcel/actions?lang=ru" \
-H "Content-Type: application/json" \
-b cookie-jar.txt
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Sun, 20 Jan 2019 14:31:37 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 1291
Connection: keep-alive
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS
Access-Control-Max-Age: 600
Etag: "50cc289c90d05c376c7564e44dde2585b3cfbc1b"
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://sandbox-ui.tbt-post.net
Access-Control-Allow-Headers: Content-Type

{
  "success": true,
  "actions": {
    "PU0098": "В процессе обработки",
    "PU0099": "Отмена",
    "PU0096": "Расформировать",
    "PU0097": "Вернуть отправителю",
    "PU0003": "Оприходовать",
    "PU0002": "Перемещается между отделениями",
    "PU0001": "Принять к доставке",
    "PU0000": "Отменить все статусы",
    "PU0007": "Выдать",
    "PU0006": "Адресная доставка",
    "PU0005": "Передать курьеру",
    "PU0004": "Готово к выдаче"
  }
}

Множественная (batch) обработка действий

protocol_method

POST

method_name

op/batch

method_params

----

request_body

{"action": "<parcel_update|entity_reparent|…​>", "batches": {"<BATCH_KEY>": {"<PARAM>": "<VALUE>", "<PARAM2>": "<VALUE>", …​}, <"BATCH_KEY">: {…​}, …​}

expected_result

200 {"success": true, "<BATCH_KEY>": {"status": <STATUS_CODE>, "<RESULT_KEY>": <VALUE>, …​}, "<BATCH_KEY>": {…​}, …​}

Для action = parcel_update <BATCH_KEY> является parcel_id, для action = entity_reparent <BATCH_KEY> является entity_id

Пример запроса/ответа
Запрос
curl -v -X POST "https://sandbox-api.tbt-post.net/api/v1/op/batch" \
-H "Content-Type: application/json" \
-b cookie-jar1.txt \
-d '{"action":"parcel_update","batches":{"252395d6-5764-4232-baeb-2020db2d8c2c":{"state":"PU0003","delivery_type":"W2W"},"0e1837e3-609f-4bc6-a121-3b21c0f11a5b":{"state":"PU0003","delivery_type":"W2W"}}}'
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Mon, 21 Jan 2019 11:18:36 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 131
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

{
  "0e1837e3-609f-4bc6-a121-3b21c0f11a5b": {
    "status": 202
  },
  "252395d6-5764-4232-baeb-2020db2d8c2c": {
    "status": 202
  },
  "success": true
}

Уведомления

Отчет интерфейса оператора

protocol_method

POST

method_name

op/report

method_params

----

request_body

<ANY REPORT DATA>

expected_result

202 {"success": true, "document_id": "<ID>"}

Ограничение объема передаваемых в запросе данных — 2М
Пример запроса/ответа
Запрос
curl -v -X POST "https://sandbox-api.tbt-post.net/api/v1/op/report" \
-H "Content-Type: application/json" \
-b cookie-jar1.txt \
-d '{"state": "PU0001", "type": "foods", "class": "A.PRP.NR.NA.S000", "sender": "44ee4ac5-8e42-4e40-821a-3f3e5f13f680"}'
Ответ

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Mon, 21 Jan 2019 14:41:18 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 72
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,
  "document_id": "9ccc7232-1d8a-11e9-bda0-00163e8cc029"
}
Применимо для отправки данных о работе оператора в графическом интерфейсе.

Клиент→Система

Забор отправления в отделении

protocol_method

POST

method_name

ev/parcel/sched

method_params

<PARCEL ID>

request_body

{"type" : "receiving", "sched" : "<TIMESTAMP UTC>"}

expected_result

202 {"success": true}

Пример запроса/ответа
Запрос
curl -v -X POST "https://sandbox-api.tbt-post.net/api/v1/ev/parcel/sched/f1a7f050-59f7-4d9e-812a-15940e13560c" \
-H "Content-Type: application/json" \
-b cookie-jar.txt \
-d '{"type" : "receiving", "sched" : "1548060981786"}'
Ответ

HTTP/1.1 202 Accepted
Server: nginx/1.10.3
Date: Mon, 21 Jan 2019 14:36:34 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
}
Требует авторизации. Применимо для запроса на продление срока хранения собственного отправления.