# Требования и ограничения

## Ограничения при работе с API

Ограничение частоты запросов — не более _10 запросов в секунду на контакт_.

При количестве запросов более 10 rps, сервер ответит статусом — код `429 Too Many Requests`.

Повторите запрос через 100 мс, в случае повторного получения ответа 429 увеличивайте время ожидания в два раза (100 мс, 200 мс, 400мс и т.д.).

### Ограничения при работе с конкретными эндпоинтами

#### `PUT api.ati.su/v2/cargos/{guid}`

**Ограничение частоты:** не более 5000 запросов за 24 часа на один контакт.
При достижении лимита сервер возвращает 429 Too Many Requests в течение 24 часов.

#### `PUT api.ati.su/v2/cargos/{guid}/refresh`

Обновление груза доступно не чаще одного раза в 60 минут.
При более частом вызове метод возвращает ошибку c HTTP статусом 403 и кодом cargo_application_delay_not_ellapsed.

#### `PUT api.ati.su/v2/cargos/refresh`

Обновление выполняется только для тех грузов, у которых с прошлого обновления прошло более 60 минут.
Для грузов, по которым 60-минутная пауза еще не истекла, в ответе возвращается ошибка по конкретному грузу с кодом cargo_application_delay_not_ellapsed.
HTTP-статус метода будет 200 OK даже если часть грузов не была обновлена.

#### `POST api.ati.su/v2/cargos`
#### `POST api.ati.su/v1.0/loads`

**Ограничение частоты:** не более **500** запросов на создание грузов **за 24 часа на один контакт**. Лимит обнуляется ежедневно в **00:00**.<br/>
**Общий лимит для фирмы рассчитывается так:** количество контактов × 500 — это суточный суммарный лимит на все операции всех контактов.<br/>
**При достижении лимита сервер возвращает статус-код** `429 Too Many Requests`. Новые запросы будут отклоняться до следующего обнуления в 00:00.<br/>

> Пример. У фирмы 3 контакта — общий лимит 3 × 500 = 1500 операций в сутки. После достижения 1500 операций все последующие запросы на выполнение операции до 00:00 будут отклоняться сервером с кодом `429 Too Many Requests`.

## Требования к http запросам

С 1 июля 2022 года не гарантируется работоспособность интеграций, которые не удовлетворяют следующим требованиям

### Передавать обязательные заголовки

- `Accept-Encoding`: `gzip, deflate, br`. Ожидается, что приложение должно уметь принимать сжатый контент.
- `User-Agent`: `ati_integrator_<код в ATI.SU>`, например, `ati_integrator_64357`
- `Authorization`: `Bearer {authorizationToken}`, кроме [метода получения токена](https://ati.su/developers/raw/auth/auth.md)
- `Content-Type`: `application/json`
- `Accept`: `application/json` или `text/xml`

<br />

### Использовать `https` (TLS 1.2 или TLS 1.3)

Поддержка схемы `http` прекращается с 1 августа 2022 года

<br />

### Поддержать автоматический редирект

В случае ответов сервера со статусами `301` и `302`, необходимо следовать редиректам по указанному в заголовке `Location` адресу.

<br />

### Делать retry на запросы, упавшие с ошибкой сокета

Симптомы: ошибки `ECONNRESET(104)` и `ENOTCONN (107)`

Пример реализации на C#

```c#
private HttpClient _client = new HttpClient();
private async Task<T> DoHttpCall<T>(string url)
{
    var tries = 3;
    do
    {
        try
        {
            var response = await _client.GetAsync(url);
            var result = await response.Content.ReadFromJsonAsync<T>();
            return result;
        }
        catch (HttpRequestException)
        {
        }
        tries--;
    } while (tries > 0);
    return default;
}
```