> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.teekrr.com/llms.txt.
> For full documentation content, see https://docs.teekrr.com/llms-full.txt.

# 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.

| Scope           | Endpoints                                                                     |
| --------------- | ----------------------------------------------------------------------------- |
| `send_sms`      | `POST /sms`                                                                   |
| `send_whatsapp` | `POST /whatsapp`, `POST /whatsapp/test`, `POST /whatsapp/upload-header-image` |
| `send_email`    | `POST /email`                                                                 |

<Warning>
  The plaintext key value is shown **only once** at creation. Teekrr stores only the SHA-256 hash. Lost keys cannot be recovered — revoke and reissue.
</Warning>

## 2. Send your first SMS

```bash
curl -X POST https://api.teekrr.com/sms \
  -H "Authorization: Bearer $TEEKRR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "templateContent": "Hi from Teekrr!",
    "campaignName": "My first broadcast",
    "type": "quick broadcast",
    "recipients": ["60123456789"]
  }'
```

Expected response (`202 Accepted`):

```json
{
  "data": {
    "broadcastUuid": "00000000-0000-0000-0000-000000000001",
    "queued": 1,
    "totalSmsUnits": 1,
    "sqsMessageIds": ["11111111-2222-3333-4444-555555555555"]
  }
}
```

The broadcast is **accepted** asynchronously — final delivery status reaches your registered webhook URL.

## 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`, `billed`, `bounced`

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](/webhooks-guide) for verification snippets in Node and Python.

## 4. Try WhatsApp (test mode)

WhatsApp messages are template-only. Before sending real broadcasts, verify your template + variable shape:

```bash
curl -X POST https://api.teekrr.com/whatsapp/test \
  -H "Authorization: Bearer $TEEKRR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "templateName": "hello_world",
    "to": "60123456789"
  }'
```

`POST /whatsapp/test` does **not** consume credit. Once you confirm the template works, switch to `POST /whatsapp` with a real recipient list.

## 5. Send to many recipients (dynamic mode)

To personalize content per recipient, use `recipientVariables`:

```bash
curl -X POST https://api.teekrr.com/sms \
  -H "Authorization: Bearer $TEEKRR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "templateName": "otp_login",
    "campaignName": "Login OTPs 2026-05-06",
    "type": "quick broadcast",
    "recipientVariables": [
      { "msisdn": "60123456789", "variables": { "code": "318204", "name": "Ali" } },
      { "msisdn": "60198765432", "variables": { "code": "771943", "name": "Fatimah" } }
    ]
  }'
```

The template content `Hi {name}, your OTP is {code}` is resolved per-recipient before sending. Maximum **10,000 recipients** per request.

## What's next

<CardGroup cols={2}>
  <Card title="Authentication" icon="key" href="/authentication">
    Permission scopes, IP whitelist, key rotation.
  </Card>

  <Card title="API Reference" icon="code" href="/api-reference">
    Every endpoint with full schemas + examples.
  </Card>

  <Card title="Webhooks" icon="webhook" href="/webhooks-guide">
    Receive delivery events with HMAC verification.
  </Card>

  <Card title="Error codes" icon="circle-exclamation" href="/errors">
    Full HTTP status reference and validation shape.
  </Card>
</CardGroup>