Колбэки о продажах связывают продажи в магазине с кликами по ссылкам, а «Custom (API)» передаёт на страницу живые данные из ваших инструментов.
LinkHarbor принимает и данные извне. Для двух случаев есть отдельные эндпоинты со своими секретами — API-ключ для них не нужен: колбэки о продажах сообщают о продажах в вашем магазине, чтобы в статистике было видно, какая ссылка принесла выручку. Интеграция «Custom (API)» выводит живые данные из ваших собственных инструментов на страницу в виде виджета и может запускать push-уведомления.
Колбэки о продажах: сопоставление продаж
Как связаны ID клика (lt_click_id), сопоставление и отчёты, объясняется в статье Учёт конверсий и продаж; здесь собраны все поля и ответы для разработчиков. Вкратце: когда LinkHarbor перенаправляет учтённый клик на цель с http или https, он добавляет параметр lt_click_id; ваш магазин запоминает его и отправляет обратно после покупки.
Создание секрета колбэка
- Откройте «Callback и API»
- В карточке «Секреты колбэков» нажмите «+ Создать секрет»
- При желании задайте название, например «Колбэк магазина», и нажмите «Создать секрет»
- Сразу скопируйте секрет — он показывается только один раз
- Кто
- Владельцы и админы, начиная с Creator Pro. В Creator Free написано «Секреты колбэков доступны начиная с Creator Pro.»
- Сколько
- До 5 секретов на рабочее пространство, например по одному на магазин.
- «Изменить»
- Измените название и установите статус «Активен» или «Неактивен». С неактивным секретом API отклоняет колбэки.
- «↺ Перевыпустить»
- Создаёт новый секрет; старый сразу перестаёт действовать.
- «Последний колбэк:»
- Показывает, когда секрет последний раз успешно использовался.
Отправка колбэка
curl -X POST https://dock.at-harbor.com/v1/callbacks/sale \
-H "Content-Type: application/json" \
-H "X-Callback-Secret: $LH_CALLBACK_SECRET" \
-d '{
"click_id": "3f1c2a9e-8d4b-4a51-9f0e-6b7c1d2e3f40",
"order_id": "A-10023",
"amount": "49.90",
"currency": "EUR",
"occurred_at": "2026-11-01T10:15:00Z"
}'
# → {"ok":true,"conversion_id":123} | Поле | Обязательно | Значение |
|---|---|---|
| click_id | Да | Значение lt_click_id (10–36 символов) |
| order_id | Да | Ваш номер заказа (1–128 символов); каждый номер заказа учитывается в рабочем пространстве только один раз |
| amount | Да | Сумма в виде десятичного числа, например "49.90"; отрицательные значения не допускаются |
| currency | Да | Валюта в виде трёхбуквенного кода, например EUR; строчные буквы API преобразует |
| occurred_at | Нет | Время покупки (ISO 8601) |
| amount_base_minor, base_currency, fx_rate | Нет | Пересчитанная сумма в наименьших единицах, базовая валюта и обменный курс, если вы продаёте в нескольких валютах |
| meta | Нет | Ваши дополнительные данные в виде плоского объекта: до 50 ключей длиной 1–64 символа; значения — текст (до 500 символов), число, true/false или null; вложенные объекты и списки отклоняются |
| workspace_id | Нет | ID вашего рабочего пространства; с ним API сообщает о неизвестном click_id как 404, а не 403 |
| Ответ | Значение |
|---|---|
| 200 {"ok":true,"conversion_id":…} | Продажа сохранена — или этот order_id уже был сохранён (тогда возвращается ID существующей конверсии) |
| 403 forbidden | Неверный секрет или подпись, или неизвестный click_id (без workspace_id) |
| 403 secret_inactive | Секрет имеет статус «Неактивен» |
| 404 not_found | Неизвестный click_id (только с workspace_id и действительным секретом) |
| 413 request_too_large | Тело больше 1 МБ |
| 422 validation_failed | Поле отсутствует или недопустимо, например слишком длинное или вложенное значение в meta |
| 429 rate_limited | Больше 120 колбэков в минуту с вашего IP-адреса |
Необязательная подпись
Помимо секрета можно отправлять заголовок X-Callback-Signature. Он содержит sha256= и подпись HMAC-SHA256 исходного тела в hex. Ключ — не сам секрет, а его хеш SHA-256 в двоичном виде. Если вы отправляете заголовок, он должен быть правильным — иначе колбэк отклоняется.
<?php
$body = json_encode($payload);
$key = hash('sha256', getenv('LH_CALLBACK_SECRET'), true); // двоичный хеш секрета
$sig = 'sha256=' . hash_hmac('sha256', $body, $key);
// Заголовки: X-Callback-Secret и X-Callback-Signature: $sig, тело: $body Где видны продажи
Переданные продажи отображаются в статистике как конверсии, см. Учёт конверсий и продаж. Через API их можно прочитать с read:stats в /v1/stats/…/conversions/breakdown.
Custom (API): ваши собственные живые данные
С интеграцией «Custom (API)» любая программа, умеющая отправлять HTTP-запросы, — плагин игрового сервера, бот, cron-скрипт — может передавать данные в LinkHarbor. Из них получается живой виджет на вашей странице, а правила push могут уведомлять ваших подписчиков.
Подключение
- Откройте в рабочем пространстве «Интеграции»
- Выберите «Custom (API)» и введите название
- После подключения в диалоге видны «Ingest-URL» и «Секрет» (с кнопкой «Показать секрет»)
- Сохраните оба значения в своём инструменте
Интеграции доступны начиная с Creator Pro. Ingest-URL и секрет видят только владельцы и админы, в том числе позже в подробном представлении интеграции. При отключении и повторном подключении создаётся новый секрет. Как подключать интеграции в целом, объясняется в статье Подключение интеграции.
Отправка данных
curl -X POST "$INGEST_URL" \
-H "Authorization: Bearer $INGEST_SECRET" \
-H "Content-Type: application/json" \
-d '{
"event": "player.joined",
"event_id": "join-2026-11-01T20:01:02Z-steve",
"data": { "player": "Steve" },
"state": {
"type": "game_server",
"name": "Survival SMP",
"online": true,
"players_online": 3,
"players_max": 20
}
}'
# → {"ok":true,"event_id":4711,"duplicate":false,"event_type":"player.joined"} - event
- Произвольное название события, например player.joined. Оно приводится к нижнему регистру, и именно на него реагируют правила push. Без event событие называется state.updated.
- event_id
- Необязательный ключ, который защищает от двойной обработки. Если тот же event_id приходит снова, LinkHarbor отвечает duplicate: true и ничего не делает.
- data
- Значения для плейсхолдеров в текстах push, например {player}. До 40 ключей, только простые значения.
- state
- Полное состояние виджета. Оно целиком заменяет предыдущее. type — game_server (карточка игрового сервера) или status (карточка статуса).
Вместо Authorization: Bearer секрет можно также передавать в заголовке X-LinkHarbor-Secret. С одного IP-адреса допускается 120 вызовов в минуту. При желании подписывайте тело: заголовок X-LinkHarbor-Signature содержит sha256= и подпись HMAC-SHA256 исходного тела с секретом в качестве ключа. Если вы его отправляете, он должен быть правильным.
| Ответ | Значение |
|---|---|
| 200 {"ok":true,…} | Событие сохранено, с duplicate: true для уже известного event_id |
| 400 invalid_json | Тело не является JSON-объектом |
| 401 invalid_secret | Неверный секрет или неизвестный Ingest-URL |
| 401 signature_invalid | X-LinkHarbor-Signature не соответствует телу |
| 413 request_too_large | Тело больше 64 КБ |
| 422 validation_failed | В теле нет ни event, ни state |
| 429 rate_limited | Больше 120 вызовов в минуту с вашего IP-адреса |
Вам также может пригодиться
Ничего не нашли?
Напишите, что вам нужно, и наша служба поддержки поможет вам лично.