Nodium API · v1
Your backend, connected to WhatsApp.
Connect WhatsApp numbers, send and receive messages, follow every delivery by signed webhook — your code decides every reply.
curl https://nodium.io/api/v1/messages \ -H "Authorization: Bearer $NODIUM_KEY" \ -H "Content-Type: application/json" \ -d '{ "channelId": "9f4c…", "to": "+33612345678", "type": "template", "templateName": "order_ready", "templateLanguage": "fr", "variables": { "1": "Karim" }, "idempotencyKey": "order-1042" }'200 OK
{ "data": { "conversationId": "c81d…", "duplicate": false, "message": { "id": "5b2e…", "type": "template", "status": "sent", "textContent": "Bonjour Karim, votre commande est prête." } }}- Base URL
https://nodium.io/api/v1- Authentication
Bearer nod_…- Responses
{ data } · { error }- Limit per client
600 / min
Where to start
Get startedNodium connects your backend to WhatsApp. From nothing to a first message sent and answered, in three calls.Read TypeScript SDKTwo npm packages: the library to call the API and receive its webhooks, and the nodium command to develop locally.Read MCP serverOperate WhatsApp from an AI agent: Claude Code, Cursor or your own agent calls Nodium through the Model Context Protocol, with your API key.Read Your clientsOne client per end customer, one key to drive them all. Your customers never create a Nodium account.Read
The reference
All 101 endpointsAPI keys5
- GETList recent API calls
- GETList the API keys of your account
- POSTCreate an API key
- DELRevoke an API key
Billing1
- GETSee what this month will cost
Broadcasts10
- GETList broadcasts
- POSTSend a broadcast
- GETGet a broadcast
- POSTCancel a broadcast
Channels14
- GETList the channels
- POSTCreate a test channel
- DELDelete a channel
- GETGet a channel
Contacts6
- GETList contacts
- POSTCreate a contact
- GETGet one contact
- PATCHUpdate a contact
Conversations5
- GETList conversations
- GETGet one conversation
- GETList the messages of a conversation
- POSTSend a read receipt
Events1
- GETRead the event log
Flows22
- GETList Flow responses
- GETList WhatsApp Flows
- POSTCreate a WhatsApp Flow
- DELDelete a draft Flow
Media3
- GETList received and sent files
- POSTUpload a file to send
- DELRemove the file of a message
Messages4
- GETList messages
- POSTSend a message
- GETGet one message
- GETDownload the file attached to a message
Statistics1
- GETGet delivery statistics
Status1
- GETIs everything working
Templates10
- GETList message templates
- POSTDraft a template
- DELDelete a template
- GETGet one template
Tenants9
- GETList connect links
- DELRevoke a connect link
- GETList your tenants
- POSTCreate a tenant
Webhooks9
- GETList your webhook subscriptions
- POSTSubscribe to events
- DELUnsubscribe
- GETGet a subscription
What makes a first try fail
window_closedThe 24-hour windowOutside it, only an approved template goes out. The API refuses before WhatsApp does.idempotencyKeyOne idempotency key per sendRequired: two calls with the same key send once.error.codeTest the code, not the textEvery refusal carries a stable code and a request id.X-Nodium-SignatureVerify every webhookHMAC-SHA256 over the raw body; two signatures while a secret rotates.For your tools and your agents
The OpenAPI 3.1 description generates an SDK in one command and carries a curl, Node and SDK sample on every route; llms.txt hands the whole API to an agent. Both are drawn from the code, never written by hand. OpenAPI (Postman, Insomnia, Bruno)