> ## Documentation Index
> Fetch the complete documentation index at: https://onlytraffic.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Аутентификация

> Как аутентифицироваться в OnlyTraffic Partners API.

## API-ключ

Все запросы требуют заголовок `Authorization`.

<Steps>
  <Step title="Получите ключ">
    Откройте личный кабинет партнёра и перейдите в **Tools -> API** ([partners.onlytraffic.com/tools/api](https://partners.onlytraffic.com/tools/api)). На странице перечислены ваши ключи: до **5** активных ключей на аккаунт, у каждого есть имя.

    Нажмите **Create key** и выберите имя, уровень доступа (**Full** или **Read-only**) и срок действия (30, 90, 180 или 365 дней, либо бессрочно). Ключ показывается **один раз**, сразу после создания: скопируйте его немедленно. Позже страница показывает только его префикс (`ot_partners_ab12…`), уровень доступа, срок действия и время последнего использования.

    Ключ выглядит как `ot_partners_` и 40 hex-символов после него. Ключ можно отозвать в любой момент: интеграции, которые его используют, сразу перестают работать, а отзыв освобождает один из 5 слотов.

    Если у аккаунта остался старый единственный ключ (формат `XXXXX-XXXXX-XXXXX-XXXXX`), он показан на той же странице как **Legacy key**. Он продолжает работать с полным доступом, пока вы его там не удалите.
  </Step>

  <Step title="Добавьте заголовок">
    Передавайте ключ в каждом запросе:

    ```text theme={null}
    Authorization: your-api-key-here
    ```

    Форма с `Bearer` тоже принимается:

    ```text theme={null}
    Authorization: Bearer your-api-key-here
    ```
  </Step>
</Steps>

<Warning>Ключ Full читает ваши данные и может запускать и останавливать кампании. Храните каждый ключ в секрете; для интеграций, которым нужно только чтение, используйте ключ Read-only.</Warning>

## AI-ассистенты

Эти же ключи используют AI-ассистенты. Когда вы подключаете Claude или ChatGPT к аккаунту, вы выбираете один из ключей (или создаёте новый) на странице согласия, никуда его не вставляя. Ассистент получает ровно уровень доступа этого ключа, а отзыв ключа отключает ассистента. См. [AI-ассистенты](/docs/ru/partners/api/ai-assistants).

## Уровни доступа

| Доступ        | Что может ключ                                                                                                              |
| ------------- | --------------------------------------------------------------------------------------------------------------------------- |
| **Full**      | Все эндпоинты, чтение и запись                                                                                              |
| **Read-only** | Все `GET`-эндпоинты. Вызовы эндпоинтов записи (`POST`) отвечают `error_code` `403` с сообщением `This API key is read-only` |

Истёкшие и отозванные ключи отклоняются так же, как неизвестные: `error_code` `403`, сообщение `Error! Access denied`.

Лимиты запросов считаются на аккаунт, а не на ключ: все ключи аккаунта делят одни и те же **120 чтений / 30 записей в минуту**.

## Base URL

```text theme={null}
https://partners.onlytraffic.com
```

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

<CodeGroup>
  ```bash cURL theme={null}
  curl "https://partners.onlytraffic.com/api/marketer/revshare/campaigns?limit=10" \
    -H "Authorization: your-api-key-here"
  ```

  ```python Python theme={null}
  import requests

  response = requests.get(
      "https://partners.onlytraffic.com/api/marketer/revshare/campaigns",
      params={"limit": 10},
      headers={"Authorization": "your-api-key-here"}
  )
  data = response.json()
  ```

  ```javascript JavaScript theme={null}
  const response = await fetch(
    "https://partners.onlytraffic.com/api/marketer/revshare/campaigns?limit=10",
    {
      headers: { "Authorization": "your-api-key-here" }
    }
  );
  const data = await response.json();
  ```
</CodeGroup>

## Лимиты запросов

Лимиты действуют на аккаунт и общие для всех его ключей: **120 запросов в минуту** для эндпоинтов чтения и **30 в минуту** для эндпоинтов записи. При превышении лимита ответ содержит `error_code` `429` и заголовок `Retry-After` с числом секунд, которое нужно подождать.

## Ошибки

Все ответы возвращают HTTP `200`. Фактический результат смотрите в поле `status`.

<AccordionGroup>
  <Accordion title="403 — Доступ запрещён">
    | Код ошибки | Описание                                                                                                                                                                                                              |
    | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
    | `403`      | Ключ не передан, неизвестен, истёк или отозван, либо аккаунт не является активным партнёром (`Error! Access denied`). Также возвращается, когда ключ Read-only вызывает эндпоинт записи (`This API key is read-only`) |
  </Accordion>

  <Accordion title="404 — Не найдено">
    | Код ошибки | Описание                                                 |
    | ---------- | -------------------------------------------------------- |
    | `404`      | Кампания или заказ не существует либо не принадлежит вам |
  </Accordion>

  <Accordion title="422 — Некорректные параметры">
    | Код ошибки | Описание                                                                            |
    | ---------- | ----------------------------------------------------------------------------------- |
    | `422`      | В запросе некорректные или отсутствующие параметры. В `message` сказано, что не так |
  </Accordion>

  <Accordion title="429 — Лимит запросов">
    | Код ошибки | Описание                                                                                                                                                 |
    | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- |
    | `429`      | Слишком много запросов: подождите `Retry-After` секунд и повторите. Также возвращается, когда для вашего аккаунта ещё выполняется другой запуск кампании |
  </Accordion>

  <Accordion title="500 — Ошибка сервера">
    | Код ошибки | Описание                                              |
    | ---------- | ----------------------------------------------------- |
    | `500`      | Что-то пошло не так на нашей стороне. Повторите позже |
  </Accordion>

  <Accordion title="503 — Сервис временно недоступен">
    | Код ошибки | Описание                                                                                                                                                                                      |
    | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
    | `503`      | Запись, проксируемая на платформу, не уложилась в таймаут. Повторите позже. Действие всё же могло быть применено: перед повторным запуском кампании проверьте соответствующий эндпоинт чтения |
  </Accordion>
</AccordionGroup>
