# Connect 23 Telecom to CleverTap

> Send SMS from CleverTap with a Generic SMS provider pointing at 23 Telecom — a direct-send field mapping, MessageID idempotency, and a managed adapter for delivery status inside CleverTap.
> Source: https://docs.23telecom.co.uk/integrations/clevertap/
> Activation: Managed activation

Instructions for LLMs: This is one page of the 23 Telecom messaging API docs
(SMS today; more channels planned). Base URL: https://restlink23telecom.com/api/v1,
auth via the X-API-Key header. Match errors on the error_code field, never on
description text. Full docs: https://docs.23telecom.co.uk/llms-full.txt · Schemas: https://docs.23telecom.co.uk/openapi.yaml

| | |
| --- | --- |
| **Setup type** | Generic SMS · self-service |
| **Setup time** | About 15 minutes |
| **Sends SMS** | Yes |
| **Delivery status in CleverTap** | In 23 Telecom; in-platform option scoped during activation |
| **Who can configure** | CleverTap admin with channel settings access |

  23 Telecom supports CleverTap through its Generic SMS provider. Start with the
  sandbox recipe below; when you're ready to launch, your account manager enables
  live sending and completes a short configuration check for response handling,
  idempotency and delivery reporting. On the current batch endpoint, confirm
  `results[0].status` is `"accepted"` with a non-empty
  `results[0].message_id`.

## What this connection does

You add 23 Telecom as a **Generic SMS provider** in CleverTap (not a generic
Webhook). CleverTap sends the message directly to the 23 Telecom API; carrier
delivery reports stay in 23 Telecom until the CleverTap DLR adapter is enabled.

## Before you start

- An [active workspace](https://docs.23telecom.co.uk/account/workspaces), an
  [approved sender ID](https://docs.23telecom.co.uk/sms/sender-id) and an E.164 test number, e.g.
  `+447911123456`.
- A restricted 23 Telecom [API key](https://docs.23telecom.co.uk/api-keys) with only `sms.send` — start with
  a sandbox `sk_test_` key ([Sandbox & test mode](https://docs.23telecom.co.uk/sandbox)).

`POST /api/v1/sms/send-individual` (permission: `sms.send`)

## Connect 23 Telecom

1. Go to **Settings → Engage → Channels → SMS → Add Provider → Other (Generic)**.

2. Set method `POST` and the URL
   `https://restlink23telecom.com/api/v1/sms/send-individual`, and add the header
   `X-API-Key`.

3. Map CleverTap's send variables into the body and idempotency header using the
   table below. Use **non-batch** mode.

4. Save, then send a test to your E.164 number.

### Direct-send field mapping

| CleverTap | 23 Telecom |
| --- | --- |
| `$$To` | `messages[0].to` (E.164) |
| `$$Body` | `messages[0].message` |
| `$$MessageID` | `Idempotency-Key` header |
| custom sender variable | `messages[0].sender_id` (approved sender ID) |
| Header | `X-API-Key` (your restricted key) |

The **exact Save / Test UI labels** are confirmed against your tenant before you
rely on this page.

## Send a test

Send a test with your `sk_test_` key to your E.164 number. For the test, set
`Idempotency-Key` to a fixed value such as `clevertap-sandbox-001` (production maps
it to `$$MessageID`).

  A `200` only means the request was received. Treat the message as queued **only**
  when `results[0].status` is `"accepted"` **and** `results[0].message_id` is
  present. `blocked_country` is not queued. Missing local pricing is different:
  valid live API traffic is accepted fail-open, and the delivery report supplies
  the final status and cost. If the body is not an acceptance, do not auto-retry
  until the 23 Telecom message log confirms that no message was accepted.

  Map `$$MessageID` — which is unique per message — to the `Idempotency-Key`
  header so a retry never sends a second SMS. Full delivery reporting **inside** CleverTap needs CleverTap's
  callback contract (returning `$$MessageID` as `meta` plus a
  `delivered/failed/replied/clicked` event), which the 23 Telecom team enables as
  a managed adapter. Until then, **direct sending works** and delivery status is
  read in 23 Telecom.

## Production activation

Live traffic uses managed activation because CleverTap branches on the HTTP
response. Your 23 Telecom team confirms a retry-safe path using the strict
integration endpoint, where a `2xx` guarantees acceptance, or an adapter that
validates the response body. Delivery tracking remains available in 23 Telecom;
an in-platform DLR option can be scoped during activation.

The activation package includes the approved production URL or adapter mapping,
the restricted key and a one-message launch check. Apply that configuration —
rather than changing only the API key on the sandbox batch template — and then
publish the campaign.

## Verify the result

**Accepted** means queued. Read carrier delivery in [Message status](https://docs.23telecom.co.uk/sms/status)
or [Statistics](https://docs.23telecom.co.uk/sms/statistics), or add a live
[delivery webhook](https://docs.23telecom.co.uk/webhooks/delivery).

## Troubleshooting

| Response | Cause & fix |
| --- | --- |
| `400 IDEMPOTENCY_KEY_REQUIRED` | Map `$$MessageID` to `Idempotency-Key` |
| `401 INVALID_API_KEY` | Wrong or disabled key in the header |
| `403 NO_SMS_ACCESS` | SMS not enabled — contact 23 Telecom |
| `429 RATE_LIMIT_EXCEEDED` | Above your budget — slow the campaign |

## Need help?

- **Provider setup, variables or DLR callback** — CleverTap support and, for the
  DLR adapter, your 23 Telecom team.
- **API key, sender ID, accepted-but-not-delivered** — your 23 Telecom account
  manager, or the [contact form](https://23telecom.co.uk/contact).

## Official platform documentation

- [CleverTap Generic SMS](https://docs.clevertap.com/docs/generic-sms)

*Last verified: 16 July 2026.*