Criar conta grátis

Referência da API

E-mail

Envie e-mails com Idempotency-Key obrigatória, liste os envios do ambiente da sua chave e acompanhe o status de cada um: entregue, bounce ou reclamação.

  • 3 operações
  • URL basehttps://api.messages.ccxcompany.co
  • AutenticaçãoBearer com a sua chave de API

O texto técnico abaixo vem do contrato público, o openapi.json, no idioma em que o contrato foi escrito.

Lista os emails enviados

GET/v2/email/messages

Devolve os emails do AMBIENTE da credencial: uma chave ccx_test_* nunca vê envio de produção, e vice-versa.

O corpo do email não está aqui e não estará: guardamos bodyBytes, não o conteúdo.

Parâmetros

CampoOndeTipoDescrição
statusopcionalquerystringValores:queuedsentdeliveredbouncedcomplainedfailed
toopcionalquerystring
campaignIdopcionalquerystring
limitopcionalqueryinteger
skipopcionalqueryinteger

Respostas

  • 200Default Response

    Campos e exemplo da resposta
    CampoTipoDescrição
    itemsobrigatórioobject[]
    items[].idobrigatóriostring
    items[].organizationIdobrigatóriostring
    items[].envopcionalstringValores:livetestPadrão:live
    items[].toobrigatóriostring · email
    items[].fromobrigatóriostring
    items[].subjectobrigatóriostring
    items[].bodyBytesobrigatóriointeger
    items[].statusobrigatóriostringValores:queuedsentdeliveredbouncedcomplainedfailed
    items[].reasonopcionalstringValores:invalid_addressmailbox_fullsuppressedcontent_rejectedcomplaintprovider_errorno_verified_sender
    items[].contactIdopcionalstring
    items[].campaignIdopcionalstring
    items[].metadataopcionalobjectMetadados de correlação do seu sistema (ex.: customerId, journeyId), devolvidos intactos em todo webhook desta mensagem. Até 20 chaves; chave começa por letra e usa [A-Za-z0-9_.-] (até 64); valor é texto (até 256), número ou booleano. Não envie dado pessoal aqui.
    items[].sentAtopcionalstring · date-time
    items[].deliveredAtopcionalstring · date-time
    items[].failedAtopcionalstring · date-time
    items[].createdAtobrigatóriostring · date-time
    items[].updatedAtobrigatóriostring · date-time
    totalobrigatóriointeger
    JSON
    {  "items": [    {      "id": "string",      "organizationId": "string",      "env": "live",      "to": "user@example.com",      "from": "string",      "subject": "string",      "bodyBytes": 0,      "status": "queued",      "reason": "invalid_address",      "contactId": "string",      "campaignId": "string",      "metadata": {},      "sentAt": "2026-10-16T12:00:00.000Z",      "deliveredAt": "2026-10-16T12:00:00.000Z",      "failedAt": "2026-10-16T12:00:00.000Z",      "createdAt": "2026-10-16T12:00:00.000Z",      "updatedAt": "2026-10-16T12:00:00.000Z"    }  ],  "total": 0}
  • 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 'https://api.messages.ccxcompany.co/v2/email/messages' \  -H "Authorization: Bearer $CCX_API_KEY"
Só os campos obrigatórios. Troque os valores de exemplo pelos seus.

Envia um email

POST/v2/email/messages

Envio síncrono: a resposta chega depois de o provedor aceitar (ou recusar) a mensagem. Aceite não é entrega — entrega, bounce e reclamação são assíncronos e chegam no seu webhook.

`Idempotency-Key` é obrigatória. Sem ela o envio para com 400. Não derivamos uma do corpo: dois emails idênticos de propósito não podem virar um.

Ambiente: vem da credencial. Uma chave ccx_test_* cai no sandbox, e env: "test" sai carimbado na resposta. Não há como pedir um ambiente pelo corpo do request.

O sandbox mente em exatamente duas coisas, e a lista é fechada:

  1. Nada chega em caixa de entrada nenhuma.
  2. O envio de sandbox não conta no seu volume mensal. O preço em billing.coins é o real — mas um envio de teste nunca desloca o seu TIER.

Fora dessas duas, o sandbox é o produto: cobra de verdade (na carteira de sandbox), mesmo status, mesma latência.

Destinatários mágicos (sandbox): são os endereços do mailbox simulator que a própria SES opera — não uma tabela nossa. Em produção eles produzem exatamente os mesmos desfechos.

todesfecho
success@simulator.amazonses.comaceito; entrega
bounce@simulator.amazonses.comaceito; bounce assíncrono
complaint@simulator.amazonses.comaceito; reclamação assíncrona
ooto@simulator.amazonses.comaceito; resposta automática de ausência
suppressionlist@simulator.amazonses.comrecusa síncrona — endereço na lista de supressão da conta
qualquer outroaceito; entrega

Repare que só suppressionlist falha no POST. Bounce e reclamação são decisão do provedor e chegam DEPOIS — tratá-los no catch é o erro nº1 de quem integra com email.

Preço: billing.coins é o custo do envio, em coins (1 coin = R$ 0,0001). O email não tem faixa de volume (Cl. 8.8): é preço fixo por destinatário. Saldo insuficiente é 402.

Corpo: informe html, text, ou os dois. O corpo não é armazenado — guardamos bodyBytes, e não o conteúdo.

Ou envie por template. Com templateId, o assunto e o corpo vêm do template salvo — inclusive os escritos em MJML, que já ficam compilados. Preencha as {{variáveis}} com variables:

{ "to": "cliente@exemplo.com", "templateId": "etpl_…", "variables": { "nome": "Marina", "empresa": "Padaria Silva" } }

Com templateId, subject é opcional — informá-lo sobrescreve o do template (útil para A/B). Variável declarada no template e não informada aqui cai no example dele; sem exemplo, o placeholder sai vazio (nunca chega {{nome}} cru na caixa de entrada).

Opt-out: destinatário cujo contato pediu para não receber comunicação é recusado com 422 e meta.motivo: "opt_out". Para e-mail transacional (senha, pedido), envie transactional: true.

Permissão: email:send.

Corpo da requisiçãoapplication/json

CampoTipoDescrição
toobrigatóriostring · email
subjectopcionalstring
templateIdopcionalstring
variablesopcionalobject
htmlopcionalstringCorpo HTML. Obrigatório informar html OU text (pelo menos um).
textopcionalstringCorpo texto puro. Obrigatório informar html OU text (pelo menos um).
fromopcionalstring
contactIdopcionalstring
campaignIdopcionalstring
metadataopcionalobjectMetadados de correlação do seu sistema (ex.: customerId, journeyId), devolvidos intactos em todo webhook desta mensagem. Até 20 chaves; chave começa por letra e usa [A-Za-z0-9_.-] (até 64); valor é texto (até 256), número ou booleano. Não envie dado pessoal aqui.
transactionalopcionalbooleantrue para e-mail transacional (senha, pedido): sai mesmo para quem fez opt-out. Ausente ⇒ comunicação, bloqueada para quem saiu.
Exemplo completo do corpo
JSON
{  "to": "user@example.com",  "subject": "string",  "templateId": "string",  "variables": {},  "html": "string",  "text": "string",  "from": "string",  "contactId": "string",  "campaignId": "string",  "metadata": {},  "transactional": true}

Respostas

  • 201Default Response

    Campos e exemplo da resposta
    CampoTipoDescrição
    idobrigatóriostring
    statusobrigatóriostringValores:queuedsentdeliveredbouncedcomplainedfailed
    envobrigatóriostringValores:livetest
    toobrigatóriostring
    fromobrigatóriostring
    subjectobrigatóriostring
    bodyBytesobrigatóriointeger
    replayedobrigatórioboolean
    billingopcionalobject
    billing.coinsobrigatóriointeger
    contactIdopcionalstring
    campaignIdopcionalstring
    metadataopcionalobjectMetadados de correlação do seu sistema (ex.: customerId, journeyId), devolvidos intactos em todo webhook desta mensagem. Até 20 chaves; chave começa por letra e usa [A-Za-z0-9_.-] (até 64); valor é texto (até 256), número ou booleano. Não envie dado pessoal aqui.
    createdAtobrigatóriostring · date-time
    sentAtopcionalstring · date-time
    JSON
    {  "id": "string",  "status": "queued",  "env": "live",  "to": "string",  "from": "string",  "subject": "string",  "bodyBytes": 0,  "replayed": true,  "billing": {    "coins": 0  },  "contactId": "string",  "campaignId": "string",  "metadata": {},  "createdAt": "2026-10-16T12:00:00.000Z",  "sentAt": "2026-10-16T12:00:00.000Z"}
  • 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).

  • 412RFC 7807 problem details for PRECONDITION_FAILED (412).

  • 422RFC 7807 problem details for VALIDATION_ERROR (422).

  • 502RFC 7807 problem details for DEPENDENCY_FAILED (502).

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/email/messages' \  -H "Authorization: Bearer $CCX_API_KEY" \  -H "Idempotency-Key: order-4821" \  -H "Content-Type: application/json" \  -d '{    "to": "user@example.com"  }'
Só os campos obrigatórios. Troque os valores de exemplo pelos seus.

Lê um email pelo id

GET/v2/email/messages/{id}

O status conta a história do envio: queued → sent (o provedor aceitou) → delivered | bounced | complained. failed é recusa antes de sair.

404 também é a resposta para um email de outro ambiente ou de outra organização — distinguir “não existe” de “não é seu” contaria a existência de dado alheio.

Parâmetros

CampoOndeTipoDescrição
idobrigatóriocaminhostring

Respostas

  • 200Default Response

    Campos e exemplo da resposta
    CampoTipoDescrição
    idobrigatóriostring
    organizationIdobrigatóriostring
    envopcionalstringValores:livetestPadrão:live
    toobrigatóriostring · email
    fromobrigatóriostring
    subjectobrigatóriostring
    bodyBytesobrigatóriointeger
    statusobrigatóriostringValores:queuedsentdeliveredbouncedcomplainedfailed
    reasonopcionalstringValores:invalid_addressmailbox_fullsuppressedcontent_rejectedcomplaintprovider_errorno_verified_sender
    contactIdopcionalstring
    campaignIdopcionalstring
    metadataopcionalobjectMetadados de correlação do seu sistema (ex.: customerId, journeyId), devolvidos intactos em todo webhook desta mensagem. Até 20 chaves; chave começa por letra e usa [A-Za-z0-9_.-] (até 64); valor é texto (até 256), número ou booleano. Não envie dado pessoal aqui.
    sentAtopcionalstring · date-time
    deliveredAtopcionalstring · date-time
    failedAtopcionalstring · date-time
    createdAtobrigatóriostring · date-time
    updatedAtobrigatóriostring · date-time
    JSON
    {  "id": "string",  "organizationId": "string",  "env": "live",  "to": "user@example.com",  "from": "string",  "subject": "string",  "bodyBytes": 0,  "status": "queued",  "reason": "invalid_address",  "contactId": "string",  "campaignId": "string",  "metadata": {},  "sentAt": "2026-10-16T12:00:00.000Z",  "deliveredAt": "2026-10-16T12:00:00.000Z",  "failedAt": "2026-10-16T12:00:00.000Z",  "createdAt": "2026-10-16T12:00:00.000Z",  "updatedAt": "2026-10-16T12:00:00.000Z"}
  • 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 'https://api.messages.ccxcompany.co/v2/email/messages/<id>' \  -H "Authorization: Bearer $CCX_API_KEY"
Só os campos obrigatórios. Troque os valores de exemplo pelos seus.

Travou em alguma rota? Fale com quem mantém a API.

Criando a conta pelo site, você ganha R$ 10 de crédito de teste.