> ## 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.

# Типы подключения

> Widget, Backend + First-party и Backend (S2S): как идёт клик, что передавать и когда какой тип выбирать.

Есть три способа показывать карточки моделей. Отличаются они тем, кто рендерит карточки и куда ведёт клик-ссылка на вашей странице.

|                                 | Widget                          | Backend + First-party                                                            | Backend (S2S)                                      |
| ------------------------------- | ------------------------------- | -------------------------------------------------------------------------------- | -------------------------------------------------- |
| Карточки рендерит               | наш скрипт, в браузере          | ваш сервер                                                                       | ваш сервер                                         |
| Клик-ссылка на странице         | наш трекинг-домен               | **ваш собственный домен**                                                        | наш трекинг-домен                                  |
| Клик резолвит                   | браузер посетителя              | ваш сервер через resolve API                                                     | браузер посетителя                                 |
| Внешние рекламные ссылки в HTML | есть                            | **нет**                                                                          | есть                                               |
| Подключение                     | вставить сниппет                | запрос к API + небольшой relay-эндпоинт                                          | запрос к API                                       |
| Кому подходит                   | обычные страницы, быстрый старт | страницы, которые ранжируются в поиске; площадки, чувствительные к блокировщикам | серверный рендеринг, когда профиль ссылок не важен |

## Widget

Вставьте один сниппет там, где должны появиться карточки; рендеринг, показы и клики обрабатываются автоматически. Раскладки, темы и свои шаблоны описаны в разделе [Виджеты](/ru/partners/cpc-widgets).

## Backend (S2S)

Ваш сервер запрашивает креативы как JSON по API-ключу виджета и строит собственный HTML. Карточки ссылаются на готовые трекинг-ссылки из ответа. Правила и примеры: [Виджеты, Backend (S2S)](/ru/partners/cpc-widgets#backend-s2s).

## Backend + First-party

Серверный рендеринг как в S2S, плюс first-party клик-ссылки: каждая ссылка на странице остаётся на вашем домене, а ваш сервер резолвит каждый клик через наш API и сам редиректит посетителя.

Зачем выбирать этот тип:

* **Чистый профиль ссылок.** В вашем HTML нет внешних рекламных ссылок, поэтому у ранжирующихся страниц нет футпринта рекламной сети.
* **Блокировщики не режут путь клика.** Ссылку на собственный домен нельзя заблокировать, не сломав сам сайт.
* **Referrer под вашим контролем.** URL страницы передаётся в resolve-запросе явно, а на финальном редиректе вы сами решаете, что увидит сайт назначения: заголовок `Referrer-Policy: no-referrer` полностью скрывает ваш домен.

Каждый клик по-прежнему проходит через OnlyTraffic: токен в каждой карточке выдаём мы, и клик засчитывается (и оплачивается) только после того, как ваш сервер его отрезолвил.

### Как это работает

<Steps>
  <Step title="Запросите креативы">
    Тот же запрос, что и в Backend (S2S): вызовите эндпоинт виджета со своего сервера с заголовком `X-Api-Key`, передавая `uip`, `uua` и `page` посетителя.
  </Step>

  <Step title="Отрендерите first-party ссылки">
    У каждого креатива есть `click_token` и `click_fallback`. Ссылайте карточку на собственный роут, например `https://yoursite.com/go?t=<click_token>&s=<click_fallback>`. Не используйте `click_url` в этом режиме: клики напрямую по `click_url` у first-party виджета не оплачиваются. Пиксель показа (`impression_url`) работает так же, как в S2S.
  </Step>

  <Step title="Отрезолвьте клик">
    Когда посетитель кликает по вашей ссылке, вызовите resolve-эндпоинт сервер-к-серверу:

    ```text theme={null}
    GET https://otsync.com/re?t=<click_token>&uip=<IP посетителя>&uua=<user agent посетителя>&uref=<URL страницы>
    X-Api-Key: <API-ключ виджета>
    ```
  </Step>

  <Step title="Сделайте редирект">
    В ответе придёт URL назначения. Ответьте посетителю `302 Location: <url>`. По желанию добавьте `Referrer-Policy: no-referrer`, чтобы сайт назначения не видел ваш домен.
  </Step>
</Steps>

### Что передавать при каждом резолве

| Поле                          | Обязательно   | Что это                                                                                                                                                            |
| ----------------------------- | ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `t`                           | да            | `click_token` из креатива                                                                                                                                          |
| Заголовок `X-Api-Key`         | да            | API-ключ виджета; подтверждает, что запрос идёт с вашего сервера                                                                                                   |
| `uip`                         | да            | IP-адрес посетителя                                                                                                                                                |
| `uua`                         | да            | User-Agent посетителя                                                                                                                                              |
| `uref`                        | рекомендуется | URL страницы, на которой произошёл клик; пустое значение даёт только предупреждение                                                                                |
| `s`                           | нет           | `click_fallback` креатива, прокинутый из вашей клик-ссылки; клики с устаревших закешированных страниц продолжают резолвиться (логируются, никогда не оплачиваются) |
| `asn`                         | нет           | ASN сети посетителя. На Cloudflare выведите `ip.src.asnum` через Transform Rule и передавайте его                                                                  |
| `country`                     | нет           | ISO2-переопределение; обычно страна определяется по `uip`                                                                                                          |
| Заголовок `X-OT-Bot-Score`    | нет           | Bot score от Cloudflare, если доступен на вашем тарифе                                                                                                             |
| Заголовок `X-OT-Verified-Bot` | нет           | Флаг verified-bot от Cloudflare (`1` или `true`)                                                                                                                   |

Значения должны описывать запрос посетителя к вашему сайту, а не ваш сервер: валидация кликов, гео-статистика и уникальность считаются по тому, что вы передали. Клик без валидного `uip` или без `uua` не оплачивается никогда (в ответе увидите `no_uip` / `no_uua`). Пустой `uref` даёт только предупреждение, клик оплачивается. Опциональные поля включают дополнительные фильтры антифрода: чем больше вы передаёте, тем привлекательнее ваша площадка для рекламодателей.

<Warning>
  Вызывайте resolve-эндпоинт только со своего сервера, на каждый клик, и никогда не кешируйте ответ. Один токен даёт не больше одного оплачиваемого клика: повторы, подозрительные и неуникальные клики редиректятся, но не оплачиваются.
</Warning>

### Ответ

```json theme={null}
{ "url": "https://...", "billable": true, "reason": "", "via": "proxy" }
```

* `url`: куда редиректить посетителя. Для живого токена присутствует всегда. `null` означает, что токен истёк и `s` не был передан: отправьте посетителя на собственную страницу. С прокинутым `s` даже истёкшие токены резолвятся на страницу модели (логируется, не оплачивается).
* `billable`: прошёл ли клик валидацию и засчитан ли в заработок. Только для диагностики; редиректить нужно в любом случае.
* `reason`: почему клик не оплачен. Частые значения: `duplicate` (токен уже отрезолвлен), `not_unique` (тот же посетитель и та же модель в окне уникальности), `no_uip` / `no_uua` (не передан обязательный контекст), `stale_token`, бот-маркеры. `ref_not_forwarded` это предупреждение: клик оплачен, но `uref` был пуст, интеграцию стоит поправить.

### Пример relay-эндпоинта

Быстрая проверка с `click_token` из свежего ответа виджета:

```bash cURL theme={null}
curl "https://otsync.com/re?t=CLICK_TOKEN&uip=203.0.113.10&uua=Mozilla%2F5.0&uref=https%3A%2F%2Fyoursite.com%2Fpage" \
  -H "X-Api-Key: YOUR_WIDGET_API_KEY"
```

Сам relay-роут (путь, здесь `/go`, выбираете вы):

```javascript Node theme={null}
app.get('/go', async (req, res) => {
  const visitorIp = req.headers['cf-connecting-ip'] || req.ip;
  let url = 'https://otsync.com/re?t=' + encodeURIComponent(req.query.t || '')
    + '&uip=' + encodeURIComponent(visitorIp)
    + '&uua=' + encodeURIComponent(req.headers['user-agent'] || '')
    + '&uref=' + encodeURIComponent(req.headers['referer'] || '');
  if (req.query.s) url += '&s=' + encodeURIComponent(req.query.s);

  const r = await fetch(url, { headers: { 'X-Api-Key': 'YOUR_WIDGET_API_KEY' } });
  const data = await r.json();
  if (!data.url) return res.redirect(302, '/');

  res.set('Referrer-Policy', 'no-referrer');
  res.redirect(302, data.url);
});
```

`uref` обычно берётся из заголовка Referer клика по ссылке того же домена. Если на сайте стоит глобальная политика `no-referrer`, добавляйте URL страницы к своим клик-ссылкам сами (например `/go?t=...&p=<URL страницы>`) и передавайте это значение как `uref`.

В форме виджета есть полные примеры для копирования на Node и PHP (рендер страницы плюс relay) и готовый промпт для ИИ-ассистента.

## Какой тип выбрать

* Страница ранжируется в поиске или важен чистый профиль исходящих ссылок: **Backend + First-party**.
* Рендерите на сервере и нужен самый быстрый бэкенд-вариант: **Backend (S2S)**.
* Всё остальное: **Widget**.
