[Beta] API de servidor para servidor (S2S) para atribuição web

Resumo: A API S2S para atribuição web permite que você envie visitas e eventos na web para a AppsFlyer diretamente do seu servidor, ignorando as limitações do navegador, como bloqueadores de anúncios e restrições de cookies. Use a API isolada ou junto ao Web SDK para obter dados de atribuição mais completos e com mais qualidade.

Sobre a API S2S para atribuição web

A AppsFlyer disponibiliza duas maneiras de enviar dados da web para atribuição: o Web SDK (lado do cliente) e a API S2S (servidor para servidor). Você pode usar qualquer um dos métodos de maneira independente ou combiná-los dependendo das suas configurações e necessidades.

O Web SDK é executado no navegador. Com a API S2S, você envia os mesmos dados a partir do seu próprio backend. Isso é importante porque navegadores e bloqueadores de anúncios focados na privacidade, incluindo Safari ITP, Firefox ETP e Brave, podem impedir ou limitar a mensuração do lado do cliente. Estimativas da indústria apontam que o bloqueio no nível do navegador afeta entre 25 e 40% dos usuários da web. Como as chamadas S2S têm origem no seu servidor e nunca passam pelo navegador, elas não são afetadas por essas restrições.

Como funciona

  1. Um usuário visita seu site ou aciona um evento no navegador.
  2. Seu servidor recebe o evento.
  3. Seu servidor envia o evento diretamente para o servidor da AppsFlyer para atribuição.

Por que usar

Confira os benefícios de uso da API S2S:

  • Mensuração de eventos do lado do servidor: Algumas conversões nunca passam pelo navegador. Exemplo: renovações de assinatura processadas no backend ou eventos com origem em um sistema de CRM. A API S2S é a única maneira de inseri-los na AppsFlyer e reconectá-los à campanha certa.
  • Maior cobertura de mensuração: As chamadas S2S são provenientes do seu servidor, não do navegador. Portanto, os bloqueadores de anúncios, as restrições de cookies do Safari ITP e outras limitações no nível do navegador não se aplicam. Você pode registrar visitas e conversões que a mensuração do lado do cliente não detectaria.
  • Enriquecimento de dados a partir do backend: Com a API S2S, o seu servidor pode adicionar outros dados aos eventos antes de enviá-los, incluindo Customer User IDs, e-mail ou número de telefone com hash, atributos de CRM, status da assinatura ou qualquer identificador interno. Isso melhora a resolução da identidade e fortalece a qualidade do sinal.
  • Segurança: Dev keys, identificadores de usuário e quaisquer dados adicionados permanecem no seu servidor e são enviados através de uma conexão segura, garantindo controle total sobre o que sai da sua infraestrutura.

Especificação da API

URL base: https://events.appsflyer.com

Autenticação

Todas as solicitações devem incluir um token da API S2S válido e o tipo de conteúdo correto nos cabeçalhos.

Cabeçalho Tipo Descrição
Authorization Token da API

O token da API S2S está incluído no cabeçalho da seguinte forma:

Authorization: Bearer {s2s-token}
Content-Type string Deve ser application/json. Obrigatória em todas as solicitações.

Atenção

Para criar um token da API S2S, consulte as instruções em Gerencie seus tokens da AppsFlyer.

Mensurar um evento

POST /v2.0/s2s/inapps/app/web/{appId}

Mensure um evento da web (por exemplo, uma compra, assinatura ou ação personalizada) para um determinado aplicativo.

Parâmetros do path

Parâmetro Obrigatório Descrição
appId Obrigatório O unified_app_id conforme definido na AppsFlyer. Por exemplo: website-www.example.com.

Corpo da solicitação

Campo Tipo Obrigatório Descrição
user_id objeto Obrigatório Identificador do usuário. Deve conter pelo menos um customer_user_id ou appsflyer_id.
event_name string Obrigatório Nome do evento. 1 a 64 caracteres. Não pode conter @ = + -. Exemplo: af_purchase
event_revenue número (duplo) Opcional Valor da receita para eventos de compra ou monetização.
event_revenue_currency string (ISO-4217) Opcional Código da moeda para o valor da receita. Exemplo: USD ou EUR.
event_value objeto Opcional Parâmetros de evento de formato livre. Compatível com um sub-objeto custom_parameters.
event_url string Opcional URL da página onde o evento ocorreu. URL HTTP válido, máximo de 4.096 caracteres.
timestamp integer (int64) Opcional Tempo Unix em ms (UTC). Se omitido, a AppsFlyer usa o tempo de recebimento. Janela de aceitação tardia: os eventos devem ser recebidos até, no máximo, 00h30 do dia seguinte, considerando o fuso horário do aplicativo.
ip string Opcional Endereço IP do dispositivo (IPv4 ou IPv6). Máximo de 46 caracteres.
user_agent string Opcional String completa do agente do usuário a partir do navegador. Máximo de 1.024 caracteres.
http_referrer string Opcional URL de referência da página atual.
customer_dedup_id string Opcional Identificador de desduplicação fornecido pelo cliente.
email_hashed string Opcional SHA-256 do e-mail normalizado (em letras minúsculas e sem espaços em branco no início e no fim). Deve ser uma string hexadecimal de 64 caracteres.
phone_number_hashed string Opcional SHA256 do número de telefone. Deve ser uma string hexadecimal de 64 caracteres.
phone_number_e164_hashed string Opcional SHA256 do número de telefone no formato E.164 (por exemplo, +14155552671). Deve ser uma string hexadecimal de 64 caracteres.
first_name_hashed string Opcional SHA256 do primeiro nome normalizado. Deve ser uma string hexadecimal de 64 caracteres.
last_name_hashed string Opcional SHA256 do sobrenome normalizado. Deve ser uma string hexadecimal de 64 caracteres.

Exemplo de solicitação

{"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"}

Respostas

Status Descrição
202 Aceito Solicitação aceita. Devolve status, mensagem e messageId opcional.
400 Erro na solicitação Campos inválidos ou ausentes.
401 Não autorizado O aplicativo não existe ou a autenticação falhou.
403 Proibido Todo o tráfego está bloqueado.
415 Tipo de mídia não permitido Content-Type deve ser application/json.

Mensurar uma visita

POST /v2.0/s2s/visits/app/web/{appId}

Mensure uma visita à página de um determinado aplicativo web. Esse endpoint compartilha todos os campos básicos com o endpoint do evento, com duas diferenças principais: event_url é obrigatório e os campos “nome do evento” e “receita” não se aplicam.

Parâmetros do path

Parâmetro Obrigatório Descrição
appId Obrigatório O unified_app_id conforme definido na AppsFlyer. Por exemplo: website-www.example.com.

Corpo da solicitação

Campo Tipo Obrigatório Descrição
user_id objeto Obrigatório Identificador do usuário. Deve conter pelo menos um customer_user_id ou appsflyer_id.
event_url string Obrigatório O URL da página visitada. URL HTTP válido, máximo de 4.096 caracteres.
timestamp integer (int64) Opcional Tempo Unix em ms (UTC). Se omitido, a AppsFlyer usa o tempo de recebimento. Janela de aceitação tardia: as visitas devem ser recebidas até, no máximo, 00h30 do dia seguinte, considerando o fuso horário do aplicativo.
ip string Opcional Endereço IP do dispositivo (IPv4 ou IPv6). Máximo de 46 caracteres.
user_agent string Opcional String completa do agente do usuário a partir do navegador. Máximo de 1.024 caracteres.
http_referrer string Opcional URL de referência da página atual.
event_value objeto Opcional Parâmetros de evento de formato livre, incluindo um sub-objeto custom_parameters.
customer_dedup_id string Opcional Identificador de desduplicação fornecido pelo cliente.
email_hashed string Opcional SHA256 do e-mail normalizado. Deve ser uma string hexadecimal de 64 caracteres.
phone_number_hashed string Opcional SHA256 do número de telefone. Deve ser uma string hexadecimal de 64 caracteres.
phone_number_e164_hashed string Opcional SHA256 do número de telefone no formato E.164. Deve ser uma string hexadecimal de 64 caracteres.
first_name_hashed string Opcional SHA256 do primeiro nome normalizado. Deve ser uma string hexadecimal de 64 caracteres.
last_name_hashed string Opcional SHA256 do sobrenome normalizado. Deve ser uma string hexadecimal de 64 caracteres.

Exemplo de solicitação

{"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"}

Respostas

Status Descrição
202 Aceito Solicitação aceita. Devolve status, mensagem e messageId opcional.
400 Erro na solicitação Campos inválidos ou ausentes.
401 Não autorizado O aplicativo não existe ou a autenticação falhou.
403 Proibido Todo o tráfego está bloqueado.
415 Tipo de mídia não permitido Content-Type deve ser application/json.

Configurar uma integração total do lado do servidor

Se você estiver usando o Web SDK junto à API S2S, veja a seção Como obter o afUserID do Web SDK. Ela é destinada apenas a integrações sem nenhum SDK.

Se você não estiver usando o Web SDK no seu site, você é responsável por todas as suas funções: atribuir o cookie do usuário, enviar os identificadores corretos e manter todas as cargas de evento completas. Se realizada da maneira correta, essa configuração oferece todos os benefícios descritos na seção Por que usar, mas somente se os detalhes estiverem certos.

Envie visitas, e não apenas eventos

Uma visita contém os parâmetros de atribuição necessários para todos os eventos posteriores, e o sistema espera que uma visita seja registrada antes de qualquer evento de um usuário. Se você envia um evento antes de uma visita, o sistema classifica-o como orgânico.

Atribua um cookie first-party via HTTP

Como você não usou o Web SDK para definir o cookie afUserId, você mesmo precisa atribuí-lo e gerenciá-lo, como um HTTP cookie definido no cabeçalho da resposta Set-Cookie, e não como um cookie do lado do cliente escrito em JavaScript.

Isso é importante porque um cookie do lado do cliente (definido via document.cookie) expira rapidamente: tão rápido quanto 7 dias no Safari ou 24 horas em domínios sob ITP. Depois de expirar, o identificador é redefinido e um visitante recorrente parece novo. Um cookie definido pelo seu servidor não está sujeito a essa limitação e pode permanecer armazenado até o período máximo permitido pelo navegador (o Chrome permite até 400 dias). Também pode ser marcado como HttpOnly, para que os scripts da página e os bloqueadores de anúncios não possam acessá-lo nem removê-lo, e ele não depende da execução de nenhum script na página.

Para configurá-lo e acessá-lo:

  1. Na primeira solicitação de um visitante sem cookie, gere um ID único estável no seu servidor (por exemplo, um UUID).
  2. Retorne-o em um cookie first-party:

    Set-Cookie: af_web_id=<generated-id>; Max-Age=34128000; Path=/; Secure; HttpOnly; SameSite=Lax
  3. Em cada solicitação posterior, leia o valor do cabeçalho do cookie recebido e reutilize-o. Não o gere novamente.
  4. Envie esse valor para a AppsFlyer em todas as chamadas, como appsflyer_id dentro do objeto user_id da solicitação.

Você pode nomear o cookie como quiser; a AppsFlyer lê o valor que você envia, não o nome do cookie. Apenas certifique-se de que você o definiu a partir do seu próprio domínio first-party.

Envie os identificadores certos em todas as chamadas

Cada chamada precisa de um objeto user_id com pelo menos um appsflyer_id (o valor do cookie) ou customer_user_id (seu ID de usuário interno). O envio de ambos, quando disponíveis, melhora a resolução de identidade.

Lembre-se: as visitas são, em sua maioria, anônimas, por isso sempre envie o valor do cookie. Para eventos no local, adicione o customer_user_id assim que o usuário for identificado e continue enviando o cookie junto a ele. Para eventos que não têm origem no navegador, o customer_user_id único é suficiente, desde que a AppsFlyer já conheça esse usuário de uma sessão identificada anteriormente.

Considerações

Identificação do usuário

O objeto user_id é obrigatório em cada solicitação. É necessário fornecer pelo menos um dos seguintes identificadores.

Campo Tipo Descrição
customer_user_id string (1 a 64 caracteres) Seu identificador de usuário interno, conforme definido no seu sistema.
appsflyer_id string (mínimo de 1 caractere) Identificador interno da AppsFlyer para o usuário da web. Se você usar o Web SDK da AppsFlyer, o valor appsflyer_id será recuperado do cookie do Web SDK. Obtenha-o de afUserId. Veja Como obter o afUserID do Web SDK

Janelas de aceitação tardia

Os eventos e visitas devem ser recebidos até, no máximo, 00h30 do dia seguinte, considerando o fuso horário do aplicativo. Eventos enviados com atraso utilizam como referência o horário em que foram recebidos pelo servidor.

Campos de PII com hash

Todos os campos de dados pessoais devem ser codificados com hash SHA256 antes do envio. Normalize o texto (convertendo-o para letras minúsculas e removendo os espaços em branco no início e no fim) antes de calcular o hash. Cada hash deve conter exatamente 64 caracteres hexadecimais (sem distinção entre maiúsculas e minúsculas).

  • Padrão para todos os campos com hash: ^[a-fA-F0-9]{64}$
  • Os números de telefone que utilizam o campo phone_number_e164_hashed devem ser compatíveis com o formato E.164 (por exemplo,+14155552671) antes do hash.

Como obter o afUserID do Web SDK

  • O parâmetro afUserId é um identificador exclusivo definido pelo Web SDK quando um usuário visita seu site pela primeira vez.
  • Se você precisar de afUserId, use um dos métodos a seguir.

Obtenha o afUserId do cabeçalho HTTP cookie

  • O afUserId é enviado pelo navegador do visitantes em chamadas para o seu site.
  • Extraia-o do cabeçalho do cookie HTTP, se necessário.

Como visualizar o afUserId no navegador do visitante

  • Visualize o afUserId no navegador do visitante para solução de problemas e depuração.
  • Para que ele esteja disponível, o visitante precisa ter acessado uma página com o Web SDK pelo menos uma vez.
  • O cookie que contém afUserId é um cookie first-party em relação ao seu domínio.
  • O procedimento descrito a seguir foi elaborado com base no Chrome 81. Pode haver diferenças entre navegadores e sistemas operacionais.

Para obter o afUserId do navegador do visitante:

  1. No seu navegador, acesse seu site.
  2. Clique com o botão direito do mouse e selecione Inspecionar. A janela de inspeção de elementos do navegador é aberta.
  3. Vá para a aba (A) Aplicativo.
  4. No menu lateral (B), expanda Cookies.
  5. Selecione o seu site. Se ele não for exibido, atualize o navegador.
  6. No campo (C) Filtro, insira afUserId. O valor de afUserID é exibido.