POST/v2/push/tokens
Chame a cada abertura do app. É idempotente por `(app, token)`: reabrir o aplicativo atualiza a linha existente em vez de duplicar o aparelho na sua base.
Ambiente: vem da credencial. Uma chave ccx_test_* grava o aparelho no sandbox, e ele só recebe pushes de sandbox — nunca de uma campanha real.
Web Push exige `p256dh` e `auth` (as keys da subscription do navegador). Sem elas não há como cifrar o payload e o navegador descarta a notificação, então o registro é recusado com 400.
Campos de identificação (externalId, userName, userEmail) são o que faz a busca do compositor achar a pessoa. Mande-os no primeiro registro; nas chamadas seguintes eles podem ser omitidos sem apagar o que já está gravado.
Permissão: push:send.
Corpo da requisiçãoapplication/json
Exemplo completo do corpo
JSON
{ "appId": "string", "token": "string", "platform": "ios", "p256dh": "string", "auth": "string", "externalId": "string", "contactId": "string", "userName": "string", "userEmail": "string", "userPhone": "string", "deviceName": "string", "topics": [ "string" ], "optedIn": true}Respostas
200Default Response
Campos e exemplo da resposta
400RFC 7807 problem details for BAD_REQUEST (400).
401RFC 7807 problem details for UNAUTHORIZED (401).
403RFC 7807 problem details for FORBIDDEN (403).
404RFC 7807 problem details for NOT_FOUND (404).
As respostas de erro seguem o formato RFC 7807 (application/problem+json), com um código estável no campo code. Ver os códigos de erro
Exemplo em curl
cURL
curl -X POST 'https://api.messages.ccxcompany.co/v2/push/tokens' \ -H "Authorization: Bearer $CCX_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "appId": "string", "token": "string" }' Só os campos obrigatórios. Troque os valores de exemplo pelos seus.POST/v2/push/tokens/opt-out
Chame quando o usuário desligar as notificações no aparelho. O aparelho sai de todos os envios seguintes e passa a contar no seu KPI de opt-out.
A linha NÃO é apagada — quem saiu precisa ser contável. Um novo POST /v2/push/tokens com optedIn: true traz o aparelho de volta.
Permissão: push:send.
Corpo da requisiçãoapplication/json
Exemplo completo do corpo
JSON
{ "appId": "string", "token": "string"}Respostas
200Default Response
Campos e exemplo da resposta
401RFC 7807 problem details for UNAUTHORIZED (401).
403RFC 7807 problem details for FORBIDDEN (403).
404RFC 7807 problem details for NOT_FOUND (404).
As respostas de erro seguem o formato RFC 7807 (application/problem+json), com um código estável no campo code. Ver os códigos de erro
Exemplo em curl
cURL
curl -X POST 'https://api.messages.ccxcompany.co/v2/push/tokens/opt-out' \ -H "Authorization: Bearer $CCX_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "appId": "string", "token": "string" }' Só os campos obrigatórios. Troque os valores de exemplo pelos seus.POST/v2/push/dispatches/{id}/opened
Chame quando o usuário TOCAR a notificação. Esta é a única origem da taxa de abertura do canal: nem a APNs nem o FCM contam abertura por você.
O id é o do dispatch, entregue ao app no payload da notificação.
Só a PRIMEIRA abertura conta. Reabrir a mesma notificação devolve counted: false — não é erro, é a proteção contra uma taxa de abertura acima de 100%.
Não afeta cobrança. O que se cobra é o aceite do provedor, não a abertura — ninguém consegue provar que a pessoa viu, e cobrar por isso seria cobrar pela sorte.
Permissão: push:send.
Respostas
200Default Response
Campos e exemplo da resposta
401RFC 7807 problem details for UNAUTHORIZED (401).
403RFC 7807 problem details for FORBIDDEN (403).
404RFC 7807 problem details for NOT_FOUND (404).
As respostas de erro seguem o formato RFC 7807 (application/problem+json), com um código estável no campo code. Ver os códigos de erro
Exemplo em curl
cURL
curl -X POST 'https://api.messages.ccxcompany.co/v2/push/dispatches/<id>/opened' \ -H "Authorization: Bearer $CCX_API_KEY"
Só os campos obrigatórios. Troque os valores de exemplo pelos seus.GET/v2/push/messages
Ordem decrescente de criação. limit default 50, teto 200.
A lista é do ambiente da credencial: uma chave ccx_test_* vê os envios de sandbox e nada mais. Para ler a produção, use uma ccx_live_*.
Paginação por cursor, e não por `skip` — aqui push difere de SMS e e-mail de propósito. Um envio transacional grava uma linha por mensagem, então esta tabela cresce como uma tabela de mensagens; com skip o Mongo caminha por todos os registros pulados e a página 200 rasteja, enquanto o cursor custa o mesmo na primeira e na milésima.
Mande de volta o nextCursor que veio na resposta; quando ele vier ausente, acabou.
Filtros: status, origin (composer = painel, api, automation), from e to por data de criação (ISO-8601). status e origin aceitam repetição (?status=sent&status=sending).
Permissão: push:read.
Respostas
200Default Response
Campos e exemplo da resposta
400RFC 7807 problem details for BAD_REQUEST (400).
401RFC 7807 problem details for UNAUTHORIZED (401).
403RFC 7807 problem details for FORBIDDEN (403).
422RFC 7807 problem details for VALIDATION_ERROR (422).
As respostas de erro seguem o formato RFC 7807 (application/problem+json), com um código estável no campo code. Ver os códigos de erro
Exemplo em curl
cURL
curl 'https://api.messages.ccxcompany.co/v2/push/messages' \ -H "Authorization: Bearer $CCX_API_KEY"
Só os campos obrigatórios. Troque os valores de exemplo pelos seus.POST/v2/push/messages
Cria o envio e materializa uma linha por aparelho na fila. A resposta chega assim que a fila é montada — não depois de a APNs/FCM aceitar: um disparo para 100 mil aparelhos não cabe num request.
Acompanhe pelo GET /v2/push/messages/{id}, que traz metrics com entregues, abertos e falhas.
`Idempotency-Key` é obrigatória. Sem ela o envio para com 400. Não derivamos uma do corpo: duas campanhas idênticas de propósito não podem virar uma.
Público: mande segment ou tokenIds, nunca os dois. segment aceita all_opt_in (toda a base com permissão) ou o id de um segmento salvo de contatos (seg_…).
Ambiente: vem da credencial. Uma chave ccx_test_* só alcança aparelhos de sandbox, debita a carteira de sandbox e não toca APNs/FCM de verdade.
Janela silenciosa: se o horário cair na janela configurada, o envio é ADIADO e a resposta traz quietDeferredTo com o horário real de saída.
Preço: cobrado por aparelho no ACEITE do provedor, pela tabela publicada. simple só texto, rich com imagem ou botão, silent data-only. Use POST /v2/push/preview para saber o custo antes.
Permissão: push:send.
Corpo da requisiçãoapplication/json
Exemplo completo do corpo
JSON
{ "title": "string", "body": "string", "deepLink": "string", "imageUrl": "string", "actions": [ { "label": "string", "link": "string" } ], "platforms": [ "ios" ], "segment": "string", "tokenIds": [ "string" ], "scheduledAt": "2026-10-16T12:00:00.000Z"}Respostas
201Default Response
Campos e exemplo da resposta
400RFC 7807 problem details for BAD_REQUEST (400).
401RFC 7807 problem details for UNAUTHORIZED (401).
402RFC 7807 problem details for PAYMENT_REQUIRED (402).
403RFC 7807 problem details for FORBIDDEN (403).
409RFC 7807 problem details for CONFLICT (409).
422RFC 7807 problem details for VALIDATION_ERROR (422).
As respostas de erro seguem o formato RFC 7807 (application/problem+json), com um código estável no campo code. Ver os códigos de erro
Exemplo em curl
cURL
curl -X POST 'https://api.messages.ccxcompany.co/v2/push/messages' \ -H "Authorization: Bearer $CCX_API_KEY" \ -H "Idempotency-Key: order-4821" \ -H "Content-Type: application/json" \ -d '{ "title": "string", "body": "string", "platforms": [ "ios" ] }' Só os campos obrigatórios. Troque os valores de exemplo pelos seus.GET/v2/push/messages/{id}
Devolve o envio do AMBIENTE da credencial: uma chave ccx_test_* nunca vê disparo de produção, e vice-versa.
metrics.reach é quantos aparelhos entraram na fila; delivered é quantos o provedor ACEITOU; opened só sobe quando o seu app chama POST /v2/push/dispatches/{id}/opened.
breakdown quebra entregues/abertos/falhas por plataforma.
Respostas
200Default Response
Campos e exemplo da resposta
401RFC 7807 problem details for UNAUTHORIZED (401).
403RFC 7807 problem details for FORBIDDEN (403).
404RFC 7807 problem details for NOT_FOUND (404).
As respostas de erro seguem o formato RFC 7807 (application/problem+json), com um código estável no campo code. Ver os códigos de erro
Exemplo em curl
cURL
curl 'https://api.messages.ccxcompany.co/v2/push/messages/<id>' \ -H "Authorization: Bearer $CCX_API_KEY"
Só os campos obrigatórios. Troque os valores de exemplo pelos seus.POST/v2/push/preview
Espelho do POST /v2/sms/preview: diz quantos aparelhos o público alcança e quanto o envio custa, sem criar nada e sem debitar.
rateKind é a modalidade deduzida do conteúdo — rich quando há imagem ou botão, senão simple. Ela decide a linha da tabela de preço.
charged: false significa que a instalação não tem carteira: o envio sairia sem debitar.
Corpo da requisiçãoapplication/json
Exemplo completo do corpo
JSON
{ "platforms": [ "ios" ], "segment": "string", "tokenIds": [ "string" ], "imageUrl": "string", "actions": [ { "label": "string" } ]}Respostas
200Default Response
Campos e exemplo da resposta
400RFC 7807 problem details for BAD_REQUEST (400).
401RFC 7807 problem details for UNAUTHORIZED (401).
403RFC 7807 problem details for FORBIDDEN (403).
As respostas de erro seguem o formato RFC 7807 (application/problem+json), com um código estável no campo code. Ver os códigos de erro
Exemplo em curl
cURL
curl -X POST 'https://api.messages.ccxcompany.co/v2/push/preview' \ -H "Authorization: Bearer $CCX_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "platforms": [ "ios" ] }' Só os campos obrigatórios. Troque os valores de exemplo pelos seus.