api.ccxmessages.com/v1 · live

One API for six channels. No SDK required.

REST with JSON, Bearer authentication, per-key idempotency and signed webhooks. Switching channels means changing one field — the rest of the contract stays the same.

Open the playgroundFull reference
curl -X POST https://api.ccxmessages.com/v1/messages \
-H "Authorization: Bearer $CCX_KEY" \
-H "Idempotency-Key: pedido-9921" \
-H "Content-Type: application/json" \
-d '{
"channel": "whatsapp",
"to": "+5541998124410",
"template": "pedido_enviado_v3",
"variables": { "nome": "Marina", "pedido": "9921" },
"fallback": ["sms", "push"]
}'
202 Accepted{ "id": "msg_9f21ac", "status": "queued" }118 ms
64
documented REST endpoints
600/min
default limit per API key
118 ms
p95 send latency
99.9%
contractual API SLA
API principles

Stable contracts, predictable behavior.

No magic per-channel field, no endpoint that changes shape without notice. Breaking changes only in a new major version, with 12 months of overlap and a public changelog.

Changelog and versioningTest in the playground
One contract, six channels

The same payload sends WhatsApp, email, SMS, RCS, push and Instagram. Switching channels means changing one field.

Native idempotency

The Idempotency-Key header removes duplicate sends on retry, returning an identical response for 24 hours.

Signed webhooks

HMAC SHA-256, a 5-minute tolerance and exponential redelivery for up to 24 hours.

Cost in the response

Every send returns the price applied, the volume band and the wallet balance — no reconciliation afterwards.

Reference

The endpoints you use on day one.

There are 64 routes in total. These six cover sending, lookup, bulk, templates, wallet and webhooks — enough to put your first operation into production.

See all 64 endpoints
POST/v1/messages

Sends a message on any channel. The channel field decides the route; the rest of the contract is identical.

Parameters
channelstringrequiredwhatsapp · sms · email · push · instagram
tostringrequiredE.164 phone, email or user id, depending on the channel.
templatestringconditionalRequired outside the 24h window on WhatsApp.
variablesobjectoptionalNamed template variables, validated before sending.
fallbackarrayoptionalAlternate channels if the primary one does not deliver.
Try it now
01Webhooks

Every event arrives signed and retried.

HMAC SHA-256 signature in the header, a 5-minute tolerance on the timestamp and exponential redelivery for up to 24 hours. The dashboard keeps the body of every attempt for 30 days.

01Ping before activatingThe URL has to answer 200 during validation — nothing is activated blind.
02Exponential redelivery30s, 2min, 10min, 1h and 6h until 24 hours of attempts are complete.
03Auditable bodyHeaders and payload of every attempt stored and replayable from the dashboard.
Set up a webhook
Signed eventsHMAC SHA-256
message.queuedmessage.sentmessage.deliveredmessage.readmessage.failedmessage.receivedtemplate.approvedtemplate.rejectedwallet.low_balanceai.interaction
30 sFirst retry after a failure or timeout
2 – 10 minSecond and third attempts, with backoff
1 h – 6 hFinal attempts until 24 hours are complete
02Resend with traceability

A failure is not the end of the line.

A queued or failed message can be corrected and reprocessed. The original is archived and a new one is created referencing it — the whole chain stays auditable, with no orphan message and no duplicate send.

01Explicit referenceThe new message carries replaces with the id of the original.
02Fair billingRejected by the provider or cancelled before sending is not charged.
03Bulk resendPOST /v1/messages/bulk-resend with batch correction and partial acceptance.
See it in the messages dashboard
Reprocessing chain
msg_9f21acFailedRejected by the provider: template variable outside the expected format.error: invalid_template_variable
msg_9f21acArchivedThe original is preserved as is — nothing is overwritten or deleted.archived_at: 14:07:22Z
msg_a4d70eNewYou fix the content and the platform creates a new message, already referencing the previous one.replaces: msg_9f21ac
msg_a4d70eDeliveredThe contact history shows both, linked — no orphan or duplicate message.

A message rejected by the provider is not charged. The resend is a new message and is billed normally.

03Channel fallback

Channel orchestration without code of your own.

Declare the chain at send time and the platform tries the next channel when the previous one does not deliver within the deadline you set. You get a webhook for every attempt and pay only for what was actually sent.

01Configurable deadlinefallback_after accepts minutes or hours per message.
02No state on your sideThe platform controls the queue, the deadline and the order of attempts.
03Cost per actual attemptEach channel triggered is billed at its own rate card.
See the price table by channel
Chain declared at send timefallback_after: 4h
01WhatsAppprimary channel
02SMSnot read within 4 hours
03Pushfinal attempt
"fallback": ["sms", "push"]
Operations

Limits, authentication and errors — published.

No limits discovered in production. Every error carries a stable code plus a readable message and the recommended action in the docs.

Authentication and limits
AuthenticationAuthorization: Bearer header with the organization keyBearer
Test keysccx_test_ prefix · sandbox wallet, no real balance debitedunlimited
Single sendPer API key, with a burst of 100 requests600/min
Bulk sendEach batch accepts up to 5,000 messages30/min
Predictable errors
400invalid_phoneNumber outside the E.164 standard or non-existent
402insufficient_fundsWallet balance insufficient for the send
409window_closedOutside the 24h window: use an approved template
429rate_limitedPer-minute limit exceeded · see Retry-After
Tools

What ships ready to integrate.

Technical questions

What engineering teams ask.

Need more detail? The reference has an example in five languages for every route.

Send the Idempotency-Key header with an identifier of your own (the order number, for example). Repeats of the same key within 24 hours return the original response, with the same message id, without duplicating the send or the charge. It is the recommended mechanism for automatic retries.

Start today with R$ 50 in test credit.

Sandbox wallet released when you create the account, a WhatsApp test number and guided onboarding. No card, no contract.

Book a demoCreate free accountSales reply within 2 business hours
CCX
Brazilian CPaaS platform. WhatsApp, email, SMS, RCS, push and Instagram in a single integration.
All systems operational
© 2026 CCX Digital Solutions LTDA · CNPJ 24.329.191/0001-06 · BrazilTerms of usePrivacySecurityChangelog