Gerador de Payload JSON para Notificações Push FCM e APNs
Monte payloads de teste para notificações push mobile nos formatos do Firebase Cloud Messaging (FCM HTTP v1) e do Apple Push Notification service (APNs) lado a lado. Digite o título, o corpo, o contador de badge, a flag de som e qualquer dado personalizado em chave-valor em um único formulário, e copie o JSON resultante direto para o Postman, curl ou seu backend. Útil para validar a estrutura da notificação antes de plugar o Firebase Admin SDK ou o endpoint HTTP/2 do APNs.
💡 Sobre esta ferramenta
FCM e APNs codificam a mesma notificação com estruturas JSON diferentes. O FCM HTTP v1 coloca os campos comuns em message.notification.title/body, transporta os dados personalizados em message.data (apenas valores string) e expõe overrides por plataforma em message.android.notification e message.apns.payload.aps. O payload APNs direto aninha o alerta em aps.alert.title/body, coloca badge e sound dentro de aps e espera dados personalizados na raiz — fora do dicionário aps. Trocar entre os formatos manualmente leva facilmente a erros, então este gerador mostra as duas estruturas a partir de uma entrada única.
🧐 Perguntas frequentes
Q: A saída é compatível com a API legacy /fcm/send do FCM?
A: Não. A ferramenta gera payloads do endpoint FCM HTTP v1 (https://fcm.googleapis.com/v1/projects/{project}/messages:send). O endpoint legacy foi descontinuado em junho de 2024 e o formato de resposta, a autenticação e o wrapper message mudaram todos na v1.
Q: Os valores dos dados personalizados podem ser números ou objetos JSON aninhados?
A: A ferramenta envia todos os valores como string. O FCM HTTP v1 exige que os valores do map data sejam strings; passar números ou objetos aninhados ali retorna um 400. O APNs na raiz é mais permissivo, mas código multiplataforma costuma manter tudo como string para garantir simetria.
Q: Dá para configurar aps.sound com um arquivo de som personalizado?
A: O toggle aqui emite "sound": "default". Para usar um arquivo .caf empacotado no app, copie o JSON e troque "default" pelo nome do arquivo. Para alertas críticos, troque a string pelo dicionário {name, critical, volume} documentado na especificação do APNs.
Q: Qual a diferença entre deixar badge vazio e mandar 0?
A: Deixar vazio omite o campo badge, então o badge atual do app continua igual. Mandar "badge": 0 limpa o contador explicitamente — útil quando o usuário leu as mensagens e você quer zerar o número. Adicione o 0 à mão depois de copiar se precisar desse comportamento.
Q: Dá para mandar o JSON gerado direto? A: A estrutura do payload está conforme a especificação, mas ainda é necessário anexar um bearer token OAuth 2.0 para o FCM v1 ou um header JWT e um device token do APNs antes de enviar. A ferramenta gera apenas o corpo, não o transporte.
📚 FCM vs APNs direto: quando vale a pena cada um
Times que já têm Firebase configurado costumam mandar todas as notificações — Android, iOS e Web Push — via FCM HTTP v1, porque um único endpoint unifica a entrega multiplataforma e o Firebase Admin SDK abstrai OAuth 2.0 e a gestão de tópicos. Mas em apps brasileiros de delivery, fintech ou marketplace (iFood, Nubank, Mercado Livre), o time muitas vezes precisa de controle fino: latência mínima para alertas de pedido em tempo real, suporte a Live Activity no iOS (Dynamic Island), ou notificações VoIP via PushKit para chamadas. Esses cenários exigem falar com o APNs direto.
O header apns-priority (10 = imediato, 5 = econômico em bateria) e o apns-push-type (alert, background, voip, complication, fileprovider, mdm) são controles granulares que o APNs expõe nativamente e que o FCM resume em abstrações de nível mais alto. Para apps que rodam em redes 3G/4G mais lentas (comum em áreas rurais brasileiras), enviar um payload curto via APNs direto pode reduzir a latência percebida em algumas centenas de milissegundos comparado ao salto extra Firebase → Apple. Comparando os dois painéis aqui, você também detecta quando uma chave de dados personalizada precisa ser movida de message.data (FCM) para a raiz (APNs direto), evitando que valores cruciais cheguem em campos diferentes dependendo da plataforma.