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
- Um usuário visita seu site ou aciona um evento no navegador.
- Seu servidor recebe o evento.
- 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:
- Na primeira solicitação de um visitante sem cookie, gere um ID único estável no seu servidor (por exemplo, um UUID).
-
Retorne-o em um cookie first-party:
Set-Cookie: af_web_id=<generated-id>; Max-Age=34128000; Path=/; Secure; HttpOnly; SameSite=Lax - Em cada solicitação posterior, leia o valor do cabeçalho do cookie recebido e reutilize-o. Não o gere novamente.
- Envie esse valor para a AppsFlyer em todas as chamadas, como
appsflyer_iddentro do objetouser_idda 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_hasheddevem 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
afUserIdno 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:
- No seu navegador, acesse seu site.
- Clique com o botão direito do mouse e selecione Inspecionar. A janela de inspeção de elementos do navegador é aberta.
- Vá para a aba (A) Aplicativo.
- No menu lateral (B), expanda Cookies.
- Selecione o seu site. Se ele não for exibido, atualize o navegador.
- No campo (C) Filtro, insira
afUserId. O valor de afUserID é exibido.