Messaging inside your product, behind one API.
WhatsApp, SMS, email and push through the same REST API, with signed webhooks for statuses and replies, idempotent sends and test keys that never touch your balance. Your team ships features, not carrier integrations.
Sign up through the site and get a US$5 test credit.
curl -X POST https://api.messages.ccxcompany.co/messages \ -H "Authorization: Bearer $CCX_API_KEY" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: order-4821" \ -d '{ "numberId": "num_…", "to": "+14155550123", "type": "template", "templateId": "tpl_…", "templateVars": ["Marina", "4821"], "metadata": { "order": "4821" } }' → 201 Created{ "id": "msg_…", "status": "queued" }
What changes for the product team.
Four pieces of the public contract. The reference and the quickstart have the details.
One contract for every channel
The same key, the same Problem Details errors and the same webhooks for WhatsApp, SMS, email and push. The body changes by channel; nothing else does.
Explore the APIWebhooks you can trust
Each delivery is signed with HMAC-SHA256. Your endpoint has 10 seconds to answer, and a 5xx, 408, 429 or timeout is retried after 5 s, 30 s, 2 min, 10 min and 1 h.
Read about webhooksTest without spending
A ccx_test_ key behaves like a production key, but sends go through a simulated transport and a test wallet you top up for free.
See test keysJourneys from your events
Post an event from your product and a journey takes it from there: waits, conditions, A/B tests and a signed webhook back to you.
Explore journeysFrom the first key to production.
The path most teams take, in the order the docs walk through it.
- Key
Create a test key
Scoped to what it can do, and sent as a Bearer token.
- Send
Send the first message
POST /messages answers 201 with the message queued.
- Webhook
Subscribe a URL
CCX checks the address and sends a signed ping before it goes live.
- Retry
Make it safe to repeat
On WhatsApp, SMS and push, an Idempotency-Key returns the original message instead of sending twice.
- Live
Switch to a live key
The key stored on our side decides the environment, not the request body.
Teams that build on the API.
Core.IA embeds messaging in its own product through the API. Rumo.tv sends its subscribers' access codes by SMS over SMPP.
We wanted to stop maintaining integrations and get back to writing product. The API delivered that: one contract, one webhook, and Meta stopped being our problem.
Engineering team, Core.IAAPI calls are free. You pay for messages.
Each message goes out at its channel's published price. Test keys and the sandbox cost nothing, and the plan covers your whole team.
International price list in US dollars. WhatsApp prices are for messages to the United Kingdom; each destination country has its own price.
What engineers ask before they integrate
Still unsure? Talk to the team that runs the platform.
Is there an SDK?
Yes: a TypeScript SDK and a CLI on npm, @ccx-messages/sdk and @ccx-messages/cli. The OpenAPI document is public, so you can generate a client in any language.
How do I test without sending real messages?
Use a ccx_test_ key. Sends go through a simulated transport and a test wallet you top up for free, and nothing reaches a customer.
What happens if my webhook is down?
A 5xx, 408, 429 or no answer within 10 seconds is retried after 5 s, 30 s, 2 min, 10 min and 1 h. Any other 4xx is final, and a 410 cancels the subscription.
Can I retry a send safely?
Yes, on WhatsApp, SMS and push: the same Idempotency-Key within 24 hours returns the original message, and the same key with a different body returns 409.
Do you support SMPP?
Yes, SMPP over TLS for teams that already run an SMPP client. SMS goes to Brazilian numbers; international routes are on request.
How much does it cost?
API calls are free. You pay the monthly plan, from US$39, plus each message at its channel's published price.
Get a test key and send your first message.
Sign up through the site and get a US$5 test credit.