Start free

API reference

RCS

Send RCS messages with SMS fallback, list the sends in your key's environment and check which channel each message actually reached the device on.

  • 3 operations
  • Base URLhttps://api.messages.ccxcompany.co
  • AuthenticationBearer with your API key

The technical text below comes from the public contract, openapi.json, in the language the contract was written in.

Lista mensagens RCS

GET/v2/rcs/messages

As mensagens da sua organização, mais recentes primeiro. O ambiente vem da credencial: uma chave de sandbox lista só o que saiu no sandbox.

Permissão: rcs:read.

Parameters

FieldInTypeDescription
statusoptionalquerystringValues:queuedsentdeliveredreadfailed
channeloptionalquerystringValues:rcssms
campaignIdoptionalquerystring
limitoptionalqueryinteger

Responses

  • 200Default Response

    Response fields and example
    FieldTypeDescription
    itemsrequiredobject[]
    items[].idrequiredstring
    items[].torequiredstring
    items[].contentrequiredobject
    items[].content.textoptionalstring
    items[].content.cardoptionalobject
    items[].routerequiredstringValues:easy_rcseasy_otp_rcs
    items[].statusrequiredstringValues:queuedsentdeliveredreadfailed
    items[].channeloptionalstringValues:rcssms
    items[].envrequiredstringValues:livetest
    items[].contactIdoptionalstring
    items[].campaignIdoptionalstring
    items[].metadataoptionalobjectMetadados 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[].failureReasonoptionalstring
    items[].sentAtoptionalstring · date-time
    items[].deliveredAtoptionalstring · date-time
    items[].readAtoptionalstring · date-time
    items[].createdAtrequiredstring · date-time
    nextCursoroptionalstring
    JSON
    {  "items": [    {      "id": "string",      "to": "string",      "content": {        "text": "string"      },      "route": "easy_rcs",      "status": "queued",      "channel": "rcs",      "env": "live",      "contactId": "string",      "campaignId": "string",      "metadata": {},      "failureReason": "string",      "sentAt": "2026-10-16T12:00:00.000Z",      "deliveredAt": "2026-10-16T12:00:00.000Z",      "readAt": "2026-10-16T12:00:00.000Z",      "createdAt": "2026-10-16T12:00:00.000Z"    }  ],  "nextCursor": "string"}
  • 401RFC 7807 problem details for UNAUTHORIZED (401).

  • 403RFC 7807 problem details for FORBIDDEN (403).

Error responses follow RFC 7807 (application/problem+json), with a stable code in the code field. See the error codes

curl example

cURL
curl 'https://api.messages.ccxcompany.co/v2/rcs/messages' \  -H "Authorization: Bearer $CCX_API_KEY"
Required fields only. Swap the sample values for your own.

Envia uma mensagem RCS

POST/v2/rcs/messages

Envio síncrono: a resposta chega depois de o provedor aceitar (ou recusar). A entrega é assíncrona e chega no seu webhook como rcs.delivered, rcs.read ou rcs.failed (com data.channel dizendo se saiu por RCS ou pelo fallback de SMS).

`Idempotency-Key` é obrigatória. Repetir a chave com o mesmo corpo devolve a resposta original e não envia nada; corpo diferente é 409.

Conteúdo — dois formatos, e o campo escolhe a rota interna:

contentvira
{ "text": "…" }mensagem simples, até 160 caracteres
{ "card": { … } }cartão com título, descrição, imagem e até 4 botões

Botões (suggestions) aceitam openUrl, call e reply. fileUrl precisa ser HTTPS em domínio público — o aparelho baixa a mídia direto.

Fallback para SMS — o RCS não chega em todo aparelho. Quando você declara fallback, quem não tem RCS recebe um SMS com aquele texto; sem `fallback`, essa pessoa não recebe nada. O texto do fallback é limitado a 160 caracteres sem acentos: acento leva o SMS para UCS-2 e muda o que ele custa.

Canal do desfecho: a resposta traz channel só depois que o provedor informa por onde a mensagem saiu (rcs ou sms). No aceite ele vem ausente — e ausente significa "ainda não se sabe", nunca "foi por RCS".

Ambiente: vem da credencial, nunca do corpo.

Preço: cobrado por MENSAGEM (não por segmento, como o SMS): um cartão longo custa o mesmo que um texto curto. Rotas: easy_rcs e easy_otp_rcs (Cl. 8.7). Saldo insuficiente é 402.

Opt-out: na rota easy_rcs, destinatário cujo contato pediu para não receber comunicação é recusado com 422 e meta.motivo: "opt_out". easy_otp_rcs é transacional e sai sempre.

Permissão: rcs:send.

Request bodyapplication/json

FieldTypeDescription
torequiredstring
contentrequiredobjectConteúdo: {text} para mensagem simples (até 160) ou {card} para cartão com imagem e até 4 botões.
content.textoptionalstring
content.cardoptionalobject
content.card.titlerequiredstring
content.card.descriptionrequiredstring
content.card.fileUrloptionalstring · uri
content.card.suggestionsoptionalobject[]
routerequiredstringRota tarifária (obrigatória): easy_rcs | easy_otp_rcs.Values:easy_rcseasy_otp_rcs
fallbackoptionalobjectTexto enviado por SMS quando o aparelho não suporta RCS. Sem ele, o destinatário sem RCS não recebe nada.
fallback.textrequiredstring
contactIdoptionalstring
campaignIdoptionalstring
metadataoptionalobjectMetadados 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.
trackLinksoptionalbooleantrue troca as URLs do texto e dos botões openUrl por links curtos e publica rcs.clicked a cada clique. fileUrl não é trocada.
Full body example
JSON
{  "to": "string",  "content": {    "text": "string"  },  "route": "easy_rcs",  "fallback": {    "text": "string"  },  "contactId": "string",  "campaignId": "string",  "metadata": {},  "trackLinks": true}

Responses

  • 201Default Response

    Response fields and example
    FieldTypeDescription
    idrequiredstring
    torequiredstring
    contentrequiredobject
    content.textoptionalstring
    content.cardoptionalobject
    content.card.titlerequiredstring
    content.card.descriptionrequiredstring
    content.card.fileUrloptionalstring · uri
    content.card.suggestionsoptionalobject[]
    routerequiredstringValues:easy_rcseasy_otp_rcs
    statusrequiredstringValues:queuedsentdeliveredreadfailed
    channeloptionalstringValues:rcssms
    envrequiredstringValues:livetest
    contactIdoptionalstring
    campaignIdoptionalstring
    metadataoptionalobjectMetadados 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.
    failureReasonoptionalstring
    sentAtoptionalstring · date-time
    deliveredAtoptionalstring · date-time
    readAtoptionalstring · date-time
    createdAtrequiredstring · date-time
    JSON
    {  "id": "string",  "to": "string",  "content": {    "text": "string"  },  "route": "easy_rcs",  "status": "queued",  "channel": "rcs",  "env": "live",  "contactId": "string",  "campaignId": "string",  "metadata": {},  "failureReason": "string",  "sentAt": "2026-10-16T12:00:00.000Z",  "deliveredAt": "2026-10-16T12:00:00.000Z",  "readAt": "2026-10-16T12:00:00.000Z",  "createdAt": "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).

  • 409RFC 7807 problem details for CONFLICT (409).

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

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

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

  • 503RFC 7807 problem details for SERVICE_UNAVAILABLE (503).

Error responses follow RFC 7807 (application/problem+json), with a stable code in the code field. See the error codes

curl example

cURL
curl -X POST 'https://api.messages.ccxcompany.co/v2/rcs/messages' \  -H "Authorization: Bearer $CCX_API_KEY" \  -H "Idempotency-Key: order-4821" \  -H "Content-Type: application/json" \  -d '{    "to": "string",    "content": {      "text": "string"    },    "route": "easy_rcs"  }'
Required fields only. Swap the sample values for your own.

Consulta uma mensagem RCS

GET/v2/rcs/messages/{id}

O estado atual de um envio, incluindo o channel por onde ele de fato saiu quando o provedor já informou.

Permissão: rcs:read.

Parameters

FieldInTypeDescription
idrequiredpathstring

Responses

  • 200Default Response

    Response fields and example
    FieldTypeDescription
    idrequiredstring
    torequiredstring
    contentrequiredobject
    content.textoptionalstring
    content.cardoptionalobject
    content.card.titlerequiredstring
    content.card.descriptionrequiredstring
    content.card.fileUrloptionalstring · uri
    content.card.suggestionsoptionalobject[]
    routerequiredstringValues:easy_rcseasy_otp_rcs
    statusrequiredstringValues:queuedsentdeliveredreadfailed
    channeloptionalstringValues:rcssms
    envrequiredstringValues:livetest
    contactIdoptionalstring
    campaignIdoptionalstring
    metadataoptionalobjectMetadados 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.
    failureReasonoptionalstring
    sentAtoptionalstring · date-time
    deliveredAtoptionalstring · date-time
    readAtoptionalstring · date-time
    createdAtrequiredstring · date-time
    JSON
    {  "id": "string",  "to": "string",  "content": {    "text": "string"  },  "route": "easy_rcs",  "status": "queued",  "channel": "rcs",  "env": "live",  "contactId": "string",  "campaignId": "string",  "metadata": {},  "failureReason": "string",  "sentAt": "2026-10-16T12:00:00.000Z",  "deliveredAt": "2026-10-16T12:00:00.000Z",  "readAt": "2026-10-16T12:00:00.000Z",  "createdAt": "2026-10-16T12:00:00.000Z"}
  • 401RFC 7807 problem details for UNAUTHORIZED (401).

  • 403RFC 7807 problem details for FORBIDDEN (403).

  • 404RFC 7807 problem details for NOT_FOUND (404).

Error responses follow RFC 7807 (application/problem+json), with a stable code in the code field. See the error codes

curl example

cURL
curl 'https://api.messages.ccxcompany.co/v2/rcs/messages/<id>' \  -H "Authorization: Bearer $CCX_API_KEY"
Required fields only. Swap the sample values for your own.

Stuck on a route? Talk to the people who run the API.

Sign up through the site and get a US$5 test credit.