Introduction

Send SMS, WhatsApp, and Email broadcasts to your customers with one API.
View as Markdown

Teekrr is a multi-tenant omnichannel messaging platform for Malaysian businesses. With a single API key you can:

  • Send SMS broadcasts
  • Send WhatsApp template messages over the WhatsApp Business Platform
  • Send Email broadcasts
  • Receive HMAC-signed webhooks at your own URL as messages are sent, delivered, read, or fail - and when a customer replies on WhatsApp

Every endpoint is REST over JSON, returns standard HTTP status codes, and uses Bearer API-key auth.

Base URL

All endpoints are served from https://api.teekrr.com.

Response envelope

Successful responses are wrapped in a data object. Errors are not wrapped, and come in three shapes:

OutcomeShape
Success{ "data": <payload> }
Business-rule error{ "message": "..." }
Schema validation failed{ "message": "Validation failed", "errors": [{ "field", "code", "message" }] }
Recipient validation failed{ "message": "Recipient validation failed", "summary": {...}, "errors": [{ "row", "line", "field", "value", "code", "message" }] }

Both validation shapes return 400 - handle both. See Error codes for the full reference.

Billing model

  • Prepaid clients: every broadcast atomically reserves credit on creation. Credit is settled when the provider accepts the message and released if delivery permanently fails.
  • Postpaid clients: a per-cycle spending cap is enforced; broadcasts that would exceed the cap return 402 Payment Required. Accounts with overdue invoices are suspended and also return 402.

All amounts are integer cents, and the platform currency is MYR. Per-channel rates (SMS / WhatsApp / Email) are visible on your in-app /api-management dashboard.

Status lifecycle

ChannelLifecycle
SMSpending → enqueued → sent → [delivered | failed]
WhatsApppending → enqueued → accepted → sent → [delivered | read | failed]
Emailpending → [sent | failed]

accepted is an internal acknowledgement from the WhatsApp provider and does not emit a webhook.

SMS and WhatsApp are delivered asynchronously, and their status reaches your registered webhook URL - see the Webhooks guide. Email is dispatched synchronously: the sent / failed / total counts in the POST /email response are the complete result, and the email channel emits no webhooks.

Rate limits

ScopeLimit
POST /sms1,000 requests / 15 min / client
POST /whatsapp10 requests / 15 min / client
POST /email10 requests / 15 min / client
POST /broadcasts/validate10 requests / 15 min / client
Every endpoint (global)200 requests / 15 min / source IP

Per-endpoint limits key on the client account that owns the API key, not on the individual key - several keys belonging to one client share a single bucket.

The global per-IP limit applies on top and is usually the binding constraint for an integration calling from a single egress IP: you cannot reach the POST /sms allowance from one address.

Exceeding any limit returns 429 Too Many Requests with a Retry-After header.

Request size

Request bodies are capped at 10 MB. A larger body returns 413 - split the recipient list into smaller batches.

Need help?