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

API сервиса работает по протоколу HTTPS.
BASE_URL = https://tanais.tech/api/v1/
Правило авторизации: Authorization: Basic #строка_авторизации#
где в строку авторизации подставляется закодированная в base64 связка `#логин#:#пароль#`
Заголовок: Content-Type: application/json, означающий, что в теле запроса информация находится в `json`-формате.

Загрузка заказов

Метод: POST
Адрес: /client/order-files/
В теле запроса отправляются заказы в формате json:

{
    "awb": {
        "num": "55511951866",
        "arrivalDate": 1565557200,
        "departureIata": "JFK",
        "arrivalIata": "SVO",
        "placeCount": 300,
        "weight": 456.32,
        "sender": "Pochtoy.com",
        "receiver": "CLIENT_NAME"
    },
    "orders": [
        {
            "num" : "9201990234144400054321",
            "firstName": "Sergey",
            "lastName": "Ivanov",
            "middleName": "Ivanovich",
            "phone": "79991231212",
            "email": "test@example.com",
            "currencyCode": "USD",
            "receivingCity": "Arkhangelsk",
            "receivingPostal": 123123,
            "receivingAddress": "Lenina street 16, k 3, kv 1086",
            "idocTypeCode": 21,
            "idocSeries": "0010",
            "idocNumber": "010101",
            "idocDate": 1565557200,
            "idocOrg": "УФМС России по Московской области",
            "inn": "4513671436",
            "isPaid": false,
            "files": [
                {
                  "type": "image/png",
                  "base64": "iVBORw0KGgoAAAANSUhEUg...//Z"
                },
                {
                  "type": "image/jpeg",
                  "base64": "iVBORw0KGgoAAAANSUhEUg...//Z"
                },
              ],
            "products": [
                {
                    "name": "Футболка",
                    "price": 10.00,
                    "quantity": 2,
                    "netWeight": 0.196,
                    "grossWeight": 0.200,
                    "url": "",
                    "tnved": ""
                },
                {
                    "name": "Джинсы",
                    "price": 23.00,
                    "quantity": 1,
                    "netWeight": 0.400,
                    "grossWeight": 0.410,
                    "url": "",
                    "tnved": ""
                }
            ]
        }
    ]
}

Пример отправки такого запроса на PHP:

<?php
$url = '/client/order-files/';
$orders = [/* заказы */];
$ordersJson = json_encode($orders);
$login = 'client';
$password = '123456';

$request = curl_init($url);
curl_setopt($request, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($request, CURLOPT_POSTFIELDS, $ordersJson);
curl_setopt($request, CURLOPT_RETURNTRANSFER, true);
curl_setopt($request, CURLOPT_HTTPHEADER, [
   'Content-Type: application/json',
   'Authorization: Basic ' . base64_encode("$login:$password"),
]);

$result = curl_exec($request);

Ответ:
```json
{
   "queueId": 5
}

Поле `awb` необязательное.

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

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

`queueId` - это идентификатор записи в очереди.

Получение статуса обработки очереди

Метод: GET
Адрес: /client/order-files/{queueId}/

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

<?php
$queueId = 5;
$url = "/client/order-files/{$queueId}/";
$login = 'client';
$password = '123456';

$request = curl_init($url);
curl_setopt($request, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($request, CURLOPT_RETURNTRANSFER, true);
curl_setopt($request, CURLOPT_HTTPHEADER, [
    'Authorization: Basic ' . base64_encode("$login:$password"),
]);

$result = curl_exec($request);

Ответ:
```json
{
  "queue": [
    {
      "id": 5,
      "status": "uploaded",
      "ordersCount": 0,
      "ordersProgress": 0,
      "awbNum": "TEMP000000001"
    }
  ]
}

Ответ, спустя какое-то время, когда ваш файл начал обрабатываться:

```json
{
  "queue": [
    {
      "id": 5,
      "status": "in progress",
      "ordersCount": 1000,
      "ordersProgress": 576
    }
  ]
}

- `status` может принимать значения `uploaded`, `in -progress`, `finished` и `error`.
- В `ordersCount` хранится количество заказов в файле.
- В `ordersProgress` хранится количество обработанных заказов.

Получение статуса AWB

Метод: GET
Адрес: /client/awb-status/{Номер AWB}

Пример отправки такого запроса на PHP:

<?
$url = '/client/awb-status/12345678/';
$login = 'client';
$password = '123456';

$request = curl_init($url);
curl_setopt($request, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($request, CURLOPT_RETURNTRANSFER, true);
curl_setopt($request, CURLOPT_HTTPHEADER, [
    'Authorization: Basic ' . base64_encode("$login:$password"),
]);

$result = curl_exec($request);

Ответ:
```json
{
  "awbStatus": "new",
  "awbStatusDescription": "Не проверено",
  "orders": []
}

Возможные статусы AWB:

- `new` — Не проверено
- `first check` — Первичная проверка
- `sent to customs` — Таможенное оформление
- `answer from customs` — Поступил ответ от таможни
- `archived` — В архиве

Для статусов `sent to customs` и `answer from customs` в `orders` будет список заказов:

```json
{
  "awbStatus": "answer from customs",
  "awbStatusDescription": "Поступил ответ от таможни",
  "orders": [
    {
      "num": "9201990234144400000001",
      "status": "released",
      "statusRu": "Выпущен без уплаты пошлины"
    }
  ]
}

Если вы хотите получить список заказов при любом статусе, добавьте GET-параметр `with_orders=yes` к запросу.

Пример: `/client/awb-status/12345678/?with_orders=yes`.

```json
{
  "awbStatus": "first check",
  "awbStatusDescription": "Первичная проверка",
  "orders": [
    {
      "num": "9201990234144400000001",
      "status": "ok",
      "statusRu": "Готов к отправке в таможню"
    }
  ]
}

Возможные статусы заказов:

- `not checked` На проверке
- `ok` Готов к отправке в таможню
- `error` Ошибка
- `sent to call center` Отправлен в КЦ
- `sent to customs` Отправлен на таможню
- `released` Выпущен без уплаты пошлины
- `released with payment` Выпущен с уплатой пошлины
- `needs payment` Необходимо оплатить пошлину