Краткий обзор: API S2S для веб-атрибуции позволяет отправлять веб-визиты и события в AppsFlyer напрямую с вашего сервера, обходя ограничения браузера, такие как блокировщики рекламы и ограничения cookie. Используйте его вместе с Web SDK или отдельно, чтобы получить более полные и качественные данные атрибуции.
О S2S API для веб-атрибуции
AppsFlyer поддерживает два способа отправки веб-данных для атрибуции: Web SDK (на стороне клиента) и S2S API (server-to-server, или S2S). Вы можете использовать каждый из этих методов по отдельности или комбинировать их в зависимости от ваших настроек и потребностей.
Web SDK работает в браузере. API S2S вместо этого позволяет отправлять те же данные с вашего собственного бэкенда. Вот почему это важно: браузеры и блокировщики рекламы, ориентированные на конфиденциальность, включая Safari ITP, Firefox ETP и Brave, могут заблокировать или ограничивать измерение на стороне клиента. По оценкам отрасли, блокировка на уровне браузера затрагивает 25–40 % веб-пользователей. Поскольку S2S-запросы инициируются вашим сервером и никогда не проходят через браузер, на них эти ограничения никак не распространяются.
Как это работает
- Пользователь посещает ваш веб-сайт или запускает событие в браузере.
- Ваш сервер получает событие.
- Ваш сервер отправляет событие непосредственно на сервер AppsFlyer для идентификации.
Зачем использовать S2S
Вот что дает вам использование API S2S, с разбивкой по преимуществам:
- Измеряйте события на стороне сервера: Некоторые конверсии вообще не попадают в браузер, например, продление подписки, обрабатываемое в бэкенде , или события, инициированные в CRM-системе. S2S — единственный способ интегрировать их в AppsFlyer и привязать к нужной кампании.
- Расширенный охват измерений: Вызовы S2S исходят с вашего сервера, а не из браузера, поэтому к ним не применяются блокировщики рекламы, лимиты cookie Safari ITP и другие браузерные ограничения. Вы можете отслеживать посещения и конверсии, которые невозможно зафиксировать с помощью одних только измерений на стороне клиента.
- Обогащение данных из бэкенда: Благодаря технологии S2S ваш сервер может добавлять дополнительные данные к событиям перед их отправкой, включая идентификаторы клиента, хешированные адреса электронной почты или номера телефонов, атрибуты CRM, статус подписки или любой внутренний идентификатор. Это улучшает разрешение идентификаторов и повышает качество сигналов.
- Безопасность: Ключи разработчика, пользовательские идентификаторы и любые добавленные данные остаются на вашем сервере и передаются по защищённому соединению, обеспечивая вам полный контроль над тем, что покидает вашу инфраструктуру.
Спецификация API
Базовый URL: https://events.appsflyer.com
Аутентификация
Все запросы должны содержать действительный токен API S2S и корректный тип контента в заголовках запроса.
| header | Тип | Описание |
|---|---|---|
Authorization |
Токен API |
Ваш токен S2S API включен в заголовок в следующем формате: Authorization: Bearer {s2s-token} |
Content-Type |
строка | Должно бытьapplication/json . Обязательно для всех запросов. |
Примечание
Для создания токена API S2S см. инструкции в разделе «Управление токенами AppsFlyer» .
Измерить событие
POST /v2.0/s2s/inapps/app/web/{appId}
Измеряет веб- событие (например, покупку, регистрацию или действие клиента) для конкретного приложения.
Параметры пути
| Параметр | Обязательный | Описание |
|---|---|---|
appId |
Обязательный |
unified_app_id как определено в AppsFlyer. Например: website-www.example.com
|
Тело запроса
| Поле | Тип | Обязательный | Описание |
|---|---|---|---|
user_id |
объект | Обязательный | Идентификатор пользователя Должен содержать хотя бы один из следующих элементов:customer_user_id илиappsflyer_id . |
event_name |
строка | Обязательный | Название события От 1 до 64 символов. Не может содержать@ = + - . Пример: af_purchase
|
event_revenue |
число (двойное) | Необязательно | Сумма дохода для событий покупки или монетизации. |
event_revenue_currency |
string (ISO-4217) | Необязательно | Код валюты для значения дохода. Например: USD или EUR
|
event_value |
объект | Необязательно | Произвольные параметры события. Поддерживаетcustom_parameters подобъект. |
event_url |
строка | Необязательно | URL-адрес страницы, на которой произошло событие . Допустимый URL-адрес HTTP (не более 4096 символов) |
timestamp |
integer (int64) | Необязательно | Время Unix в миллисекундах (UTC). Если параметр опущен, AppsFlyer использует время получения Окно позднего приёма: события должны поступить не позднее 00:30 следующего календарного дня в часовом поясе приложения. |
ip |
строка | Необязательно | IP адрес устройства (IPv4 или IPv6). Максимально 46 символов |
user_agent |
строка | Необязательно | Полная строка пользовательского агента из браузера. Максимально 1,024 символов |
http_referrer |
строка | Необязательно | URL-адрес страницы, с которой был осуществлен переход. |
customer_dedup_id |
строка | Необязательно | Идентификатор дедупликации, предоставленный клиентом. |
email_hashed |
строка | Необязательно | SHA256 нормализованного (в нижнем регистре, без пробелов) адреса электронной почты. Должна представлять собой шестнадцатеричную строку длиной в 64 символа. |
phone_number_hashed |
строка | Необязательно | SHA256 номера телефона. Должна представлять собой шестнадцатеричную строку длиной в 64 символа. |
phone_number_e164_hashed |
строка | Необязательно | SHA256 номера телефона E.164 (например,+14155552671 ). Должна представлять собой шестнадцатеричную строку длиной в 64 символа. |
first_name_hashed |
строка | Необязательно | SHA256 нормализованного имени. Должна представлять собой шестнадцатеричную строку длиной в 64 символа. |
last_name_hashed |
строка | Необязательно | SHA256 нормализованной фамилии. Должна представлять собой шестнадцатеричную строку длиной в 64 символа. |
Пример запроса
{"user_id":{"customer_user_id":"15667737-366d-4994-ac8b-653fe6b2be4a"},"event_name":"af_purchase","event_revenue":49.99,"event_revenue_currency":"USD","event_value":{"af_content_id":"SKU-001","af_quantity":2,"custom_parameters":{"promo_code":"SUMMER10"}},"event_url":"https://example.com/checkout/success","timestamp":1712000000000,"ip":"35.244.183.10","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) ...","email_hashed":"a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2"}Ответы
| Статус | Описание |
|---|---|
| 202 приняты | Запрос принят. Возвращает статус, сообщение и, при необходимости, опциональный параметрmessageId . |
| 400 Неверный запрос | Недопустимые или отсутствующие поля. |
| 401 Не авторизовано | Приложение не существует или аутентификация не удалась. |
| 403 Запрещено | Трафик приложения заблокирован. |
| 415 Неподдерживаемый тип медиа |
Content-Type должно бытьapplication/json . |
Измерить посещение
POST /v2.0/s2s/visits/app/web/{appId}
Измеряет количество посещений страниц для данного веб-приложения. Этот конечный пункт использует все базовые поля совместно с конечным пунктом события , но с двумя ключевыми отличиями: требуетсяevent_url и поля «Название событие» и «Доход» не применяются.
Параметры пути
| Параметр | Обязательный | Описание |
|---|---|---|
appId |
Обязательный |
unified_app_id как определено в AppsFlyer. Например: website-www.example.com
|
Тело запроса
| Поле | Тип | Обязательный | Описание |
|---|---|---|---|
user_id |
объект | Обязательный | Идентификатор пользователя Должен содержать хотя бы один из следующих элементов:customer_user_id илиappsflyer_id . |
event_url |
строка | Обязательный | URL-адрес посещенной страницы. Допустимый URL-адрес HTTP (не более 4096 символов) |
timestamp |
integer (int64) | Необязательно | Время Unix в миллисекундах (UTC). Если параметр опущен, AppsFlyer использует время получения Окно позднего одобрения: заявки на посещение принимаются не позднее 00:30 следующего календарного дня по времени часового пояса приложения. |
ip |
строка | Необязательно | IP адрес устройства (IPv4 или IPv6). Максимально 46 символов |
user_agent |
строка | Необязательно | Полная строка пользовательского агента из браузера. Максимально 1,024 символов |
http_referrer |
строка | Необязательно | URL-адрес страницы, с которой был осуществлен переход. |
event_value |
объект | Необязательно | Произвольные параметры события, включая под-объектcustom_parameters. |
customer_dedup_id |
строка | Необязательно | Идентификатор дедупликации, предоставленный клиентом. |
email_hashed |
string | Необязательно | SHA256 нормализованного адреса электронной почты. Должна представлять собой шестнадцатеричную строку длиной в 64 символа. |
phone_number_hashed |
string | Необязательно | SHA256 номера телефона. Должна представлять собой шестнадцатеричную строку длиной в 64 символа. |
phone_number_e164_hashed |
string | Необязательно | SHA256 номера телефона в формате E.164 Должна представлять собой шестнадцатеричную строку длиной в 64 символа. |
first_name_hashed |
string | Необязательно | SHA256 нормализованного имени. Должна представлять собой шестнадцатеричную строку длиной в 64 символа. |
last_name_hashed |
string | Необязательно | SHA256 нормализованной фамилии. Должна представлять собой шестнадцатеричную строку длиной в 64 символа. |
Пример запроса
{"user_id":{"appsflyer_id":"1234567890abcdef","customer_user_id":"15667737-366d-4994-ac8b-653fe6b2be4a"},"event_url":"https://example.com/products/sneakers","timestamp":1712000000000,"ip":"35.244.183.10","user_agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) ...","http_referrer":"https://www.google.com/","email_hashed":"a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2"}Ответы
| Статус | Описание |
|---|---|
| 202 приняты | Запрос принят. Возвращает статус, сообщение и, при необходимости, опциональный параметрmessageId . |
| 400 Неверный запрос | Недопустимые или отсутствующие поля. |
| 401 Не авторизовано | Приложение не существует или аутентификация не удалась. |
| 403 Запрещено | Трафик приложения заблокирован. |
| 415 Неподдерживаемый тип медиа |
Content-Type должно бытьapplication/json . |
Настройте полную интеграцию на стороне сервера.
Если вы запускаете Web SDK совместно с S2S, используйте вместо этого Извлечение Web SDK afUserID . Этот раздел предназначен только для интеграций, не требующих наличия SDK .
Если на вашем сайте вообще не работает Web SDK , вы несёте ответственность за все, что он обычно делает: присвоение пользовательского cookie, передачу правильных идентификаторов и обеспечение полноты данных каждого события. При правильной настройке вы получите все преимущества, описанные в разделе «Почему стоит использовать S2S» , но это зависит от правильной проработки следующих деталей.
Отправляйте визиты, а не только события
Посещение содержит параметры атрибуции, на которых основывается каждое последующее событие, и система ожидает посещения до любого события от пользователя. Если вы отправляете событие перед посещением, система классифицирует его как органическое.
Присвойте файл cookie первой стороны через HTTP.
Поскольку на сайте не используется Web SDK, который мог бы установить afUserIdcookie за вас, назначать и управлять им придётся самостоятельно – это должен быть HTTP-cookie, задаваемый в Set-Cookieзаголовке ответа, а не cookie на стороне клиента, созданный на JavaScript.
Вот почему это важно: срок действия cookie-файла на стороне клиента (устанавливается черезdocument.cookie) истекает быстро: всего за 7 дней в Safari или за 24 часа в доменах, находящихся под управлением ITP. После истечения срока действия идентификатор сбрасывается, и данные вернувшегося посетителя отображаются как данные нового пользователя. Файл cookie, установленный вашим сервером, не подпадает под это ограничение и может сохраняться в течение максимального срока, установленного браузером (Chrome разрешает до 400 дней). Его также можно пометитьHttpOnly таким образом, что скрипты страницы и блокировщики рекламы не могут прочитать или удалить его, и он вообще не зависит от каких-либо скриптов, запущенных на странице.
Как задать и прочитать его:
- При первом запросе от посетителя, не имеющего cookie-файлов, сгенерируйте на своем сервере стабильный уникальный идентификатор (например, UUID).
-
Отдавайте его в cookie собственного домена.
Set-Cookie: af_web_id=<generated-id>; Max-Age=34128000; Path=/; Secure; HttpOnly; SameSite=Lax - При каждом последующем запросе считывайте значение из входящего заголовка Cookie и используйте его повторно. Не генерируйте его заново.
- Отправляйте это значение в AppsFlyer при каждом вызове следующим образом:
appsflyer_idвнутри объекта запросаuser_id.
Вы можете назвать cookie-файл как угодно; AppsFlyer считывает отправленное вами значение , а не название cookie-файла. Просто убедитесь, что вы указываете его своего собственного домена.
При каждом вызове отправляйте правильные идентификаторы.
Каждый вызов требует объектuser_id, имеющий хотя бы один из параметров:appsflyer_id ( значение cookie) илиcustomer_user_id (ваш внутренний идентификатор пользователя). Отправка обоих, если они у вас есть, повышает точность идентификации.
Вот что следует помнить: посещения в основном анонимны, поэтому всегда отправляйте значение cookie. Для событий на сайте добавляйте customer_user_id после идентификации пользователя и продолжайте передавать cookie вместе с ним. Для событий, которые не инициируются в браузере, достаточноcustomer_user_id, если AppsFlyer уже знает этого пользователя из ранее идентифицированной сессии.
Что следует учесть
Идентификация пользователя
Объектuser_id требуется при каждом запросе. Необходимо указать хотя бы один из следующих идентификаторов.
| Поле | Тип | Описание |
|---|---|---|
customer_user_id |
строка (от 1 до 64 символов) | Ваш внутренний идентификатор пользователя, установленный в вашей системе. |
appsflyer_id |
строка (минимум 1 символ) | Внутренний идентификатор веб-пользователя в AppsFlyer. Если вы используете AppsFlyer Web SDK, тоappsflyer_id значение извлекается из cookie-файла Web SDK . Извлечь его изafUserId . См. Извлечение Web SDK afUserIdWeb SDK afUserId
|
Поздние сроки принятия
Информация о мероприятиях и посещениях должна быть получена не позднее 00:30 следующего календарного дня по времени часового пояса приложения. В случае задержки события учитываются по времени получения данных сервером.
Хэшированные поля PII
Все поля с персональными данными должны быть хешированы с помощью алгоритма SHA256 перед отправкой. Перед хешированием выполните нормализацию текста (преобразование в нижний регистр, обрезка). Каждый хеш должен состоять ровно из 64 шестнадцатеричных символов (регистр не имеет значения).
- Шаблон для всех хешированных полей:
^[a-fA-F0-9]{64}$ - Номера телефонов, использующие поле
phone_number_e164_hashedдолжны соответствовать формату E.164 (например,+14155552671) перед хешированием.
Извлечение afUserID из веб-SDK
-
afUserId— это уникальный идентификатор, устанавливаемый Web SDK при первом посещении пользователем вашего сайта. - Если вам нужен
afUserId, воспользуйтесь одним из следующих способов.
Получение afUserId из заголовка HTTP cookie
- Значение
afUserIdотправляется браузером посетителя при обращении к вашему сайту. - При необходимости извлеките его из заголовка HTTP cookie.
Просмотр afUserId в браузере посетителя
- Просмотрите
afUserIdв браузере посетителя, чтобы устранить неполадки и для отладки. - Чтобы параметр стал доступен, посетитель должен хотя бы один раз зайти на страницу с веб-SDK.
- Файл cookie, содержащий
afUserId, является файлом cookie первой стороны по отношению к вашему домену. - Следующая процедура была подготовлена с использованием Chrome 81. Возможны различия в зависимости от браузера и операционной системы.
Чтобы получить afUserId из браузера посетителя:
- В своём браузере перейдите на свой сайт.
- Нажмите на правую кнопку мыши, выберите Проверить. Откроется окно браузера для проверки элементов.
- Перейти на вкладку (A) Заявка.
- В боковом меню (B) раскройте Cookies.
- Выберите свой сайт. Если он не отображается, обновите браузер.
- В поле (C) фильтр введите
afUserId. Отобразится значение afUserID.