INTEGRATION GUIDE
Один контракт.
Любая компания.
Подключите подтверждённые события вашего приложения к Online24. Банки, страховые и другие компании используют единый протокол.
Быстрый старт
- Создайте карточку партнёра и ссылки приложений в кабинете.
- В разделе «Интеграции» выпустите Sandbox-ключ. Сохраните секрет: он показывается один раз.
- Настройте получение
click_idчерез согласованный канал атрибуции. - Отправьте подписанное событие и проверьте журнал и отчёты в режиме Sandbox.
- После проверки выпустите отдельный Production-ключ.
01 / Переходы и атрибуция
GET /go/{slug}?platform=android&campaign=telegram создаёт переход и перенаправляет на сохранённый адрес приложения. Параметр offer_id выбирает активное предложение этого партнёра.
В карточке партнёра можно задать URL атрибуции с {click_id}. Его точный домен должен быть включён оператором в REDIRECT_HOSTS. URL должен вести к согласованной системе атрибуции, которая сохраняет идентификатор и выбирает магазин приложения.
Событие подтверждается, если переход принадлежит партнёру, произошло после перехода в пределах окна события и не помечено как обращение бота. Неизвестный переход сохраняется со статусом review и не создаёт начисление.
02 / Подпись запроса
Секрет используется как строка в том виде, в котором вы получили его при создании. Подписывайте точные байты тела; изменение пробелов изменит подпись.
HMAC-SHA256(secret, timestamp + "." + raw_json_body)
X-Key-Id: key_example
X-Event-Timestamp: <Unix timestamp in seconds>
X-Signature: sha256=<lowercase hexadecimal digest>
Content-Type: application/jsonРазница с серверным временем — не более 300 секунд. Максимальный размер тела — 64 КБ. Используйте HTTPS и синхронизацию часов.
Пример на PHP
03 / Отправка событий
{
"event_id": "evt_unique_123",
"click_id": "clk_received_from_attribution",
"event_type": "registration_completed",
"occurred_at": "2026-10-14T10:30:00Z",
"external_customer_id": "opaque_customer_456",
"external_reference": "opaque_application_789",
"amount_minor": 0,
"currency": "UZS"
}event_id уникален в пределах партнёра. occurred_at — реальное время события, в ISO 8601 с часовым поясом. Суммы передаются целыми минимальными единицами (100 = 1 UZS / USD / EUR). Не передавайте ФИО, паспорт, телефон или кредитное досье. Непрозрачные внешние идентификаторы сохраняются как хеши с ключом.
| Событие | Значение |
|---|---|
app_install | Подтверждённая установка |
registration_completed | Завершённая регистрация |
application_submitted | Отправленная заявка |
application_approved | Одобрение заявки |
application_rejected | Отказ по заявке |
loan_disbursed | Выдача кредита |
conversion_reversed | Отмена; обязательное поле reversed_event_id |
Названия событий партнёра можно сопоставить с универсальными кодами. Суперадминистратор может добавить новое событие без изменения кода.
04 / Ответы и повторная отправка
{"accepted":true,"duplicate":false,"status":"confirmed","reason":"","event_id":"evt_unique_123"}Повтор с тем же partner + event_id возвращает duplicate: true. Новое начисление не создаётся. Для повторов обновляйте timestamp и подпись, сохраняя event_id.
| HTTP | Действие партнёра |
|---|---|
| 200 | Принято, включая duplicate / review. Автоматический повтор не нужен. |
| 400 / 413 / 422 | Исправьте JSON, размер тела или данные. |
| 401 | Проверьте подпись, ключ и время. |
| 403 | Переход принадлежит другому партнёру. |
| 409 | Event ID уже использован с другим типом события или в другой среде. Используйте отдельный ID; не перезаписывайте исходное событие. |
| 429 / 503 | Повторите через 5, 15, 60, 300 секунд с jitter. Далее используйте свою надёжную очередь. |
Отмена меняет статус исходного события и начисления на reversed. История сохраняется. Sandbox и Production используют общий namespace идентификаторов: не повторяйте тестовые event_id в боевых запросах.
05 / Mapping и собственные адаптеры
В настройках нового ключа укажите JSON-словарь внешних имён и внутренних кодов:
{"signed_up":"registration_completed","credit_paid":"loan_disbursed"}Для нестандартных payload создайте PHP-класс, реализующий Online24\Integrations\Contracts\EventAdapter, и передайте его в Postback. Адаптер нормализует данные, а подпись, валидация, изоляция и начисления остаются в ядре. Произвольный PHP в кабинете не исполняется.
Получение событий по API
В кабинете суперадминистратор разрешает точный домен API в настройках и создаёт API-подключение: HTTPS endpoint, Bearer token, ключ своей компании и интервал. Ответ партнёра: {"events":[...],"next_cursor":"..."}, до 200 событий за страницу. Следующий запрос передаёт курсор в query-параметре cursor. Пустой next_cursor сохраняет прежний watermark.
Планировщик хостинга запускает php bankflow-private/bin/console.php integrations:sync. При ошибке курсор не продвигается; повторы проходят дедупликацию. Секрет Bearer шифруется. Частные, служебные и неглобальные IP запрещены; DNS фиксируется на запрос, HTTP-редиректы не разрешены.
CSV и ручная сверка
CSV-импорт доступен суперадминистратору в интеграциях: UTF-8, до 32 КБ, 200 событий. Есть предварительный просмотр и результат каждой строки. Обязательные колонки: event_id, event_type, occurred_at. Колонки остальных полей совпадают с Postback. Импорт использует выбранный ключ и ту же проверку атрибуции. В журнале конверсий событие review можно связать с реальным переходом компании или отклонить; решение и основание записываются в аудит.
06 / Безопасная проверка
Sandbox-ключ проходит те же проверки подписи и атрибуции. Тестовые конверсии видны только при выборе Sandbox и никогда не создают финансовые начисления. Секрет недоступен повторно; при утрате выпустите новый ключ и отзовите старый.
Журнал содержит результат проверки, время и key_id, без секрета и полного тела запроса. Активность каждого ключа видна в разделе интеграций.
07 / API Reference
Скачать OpenAPI 3.1/api/v1/partnersОпубликованные партнёры/api/v1/offersАктивные предложения/go/{slug}Переход и redirect/api/v1/postbacks/{slug}Подписанное событие/api/v1/admin/reportРолевая сессия/api/v1/admin/exportCSV по фильтрам и правамОтчёты принимают from, to (YYYY-MM-DD), partner_id, mode, platform, source, campaign_id. Журнал конверсий также принимает status, event_code, page и per_page (1–200). Период задаётся в часовом поясе отчётности. Представитель партнёра всегда видит только свою компанию.
Административные изменения требуют сессию и X-CSRF-Token. Публичные API не используют сессионный доступ к данным партнёров. Новые несовместимые контракты получают новый путь версии.