Quickstart
1. Get an API key
Sign in to the Teekrr dashboard, go to API Management → API Keys, and create a key with the scopes you need.
The plaintext key value is shown only once at creation. Teekrr stores only a hash of it. Lost keys cannot be recovered - revoke and reissue.
2. Send your first SMS
Every SMS broadcast needs a registered keyword (your sender-ID prefix) - pass it as keyword, or as keywordUid if you have the UUID. Your keywords are listed in the dashboard.
Expected response (202 Accepted):
The broadcast is accepted asynchronously - final delivery status reaches your registered webhook URL.
Passing templateContent without templateName creates a one-off template named after your campaignName. To reuse an existing template instead, pass templateName or templateUid.
3. Register a webhook
In the dashboard, go to API Management → Webhooks → New Webhook and provide:
- A URL on your server (publicly reachable, HTTPS)
- The events you want to receive:
delivered,failed,sent,read,inbound - Optionally, the channels to narrow to (
sms,whatsapp,email) - leave it unset to receive every channel
You’ll receive a plaintext signing secret once. Store it server-side and use it to verify the X-Teekrr-Signature header on every incoming webhook - see the Webhooks guide for verification snippets in Node, Python, and Go.
sent, read, and inbound are WhatsApp-only, and the email channel emits no webhooks at all - the sent / failed / total counts in the POST /email response are the complete result.
Status events fire only for broadcasts sent through the API. A broadcast composed in the dashboard emits nothing, which is the usual reason a freshly registered webhook stays quiet.
4. Send a WhatsApp broadcast
WhatsApp is template-only - templateName must reference a template your client owns that has already been approved. Templates are created and submitted for approval in the dashboard.
Template values go in a single named map, variables.templateParams, keyed by the {{name}} placeholders the template declares:
variables accepts templateParams and nothing else. Sending header, body, button, headerImage, or bodyParams is rejected with 400, not ignored.
Media headers and dynamic URL buttons are ordinary named variables: upload the asset via POST /whatsapp/upload-header-image and pass the returned url as the value of whichever variable the template named.
5. Send to many recipients (dynamic mode)
To personalize content per recipient, use recipientVariables:
The template content Hi {name}, your OTP is {code} is resolved per-recipient before sending. Maximum 10,000 recipients per request, and duplicates are rejected, not silently dropped.
6. Pre-flight a large list
Before committing a big recipient list, dry-run it. POST /broadcasts/validate runs the same validator the send endpoints use - no credit reserved, no messages created, nothing enqueued:
Malaysian numbers in local 01X… form are normalised to +60…, which is why row 2 collides with row 1.