# Connect 23 Telecom to Braze

> Send SMS from Braze Campaigns and Canvas with a webhook to 23 Telecom — raw JSON body, per-user idempotency, the message-credit and retry caveats, and where carrier delivery is tracked.
> Source: https://docs.23telecom.co.uk/integrations/braze/
> 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** | Webhook · self-service |
| **Setup time** | About 15 minutes |
| **Sends SMS** | Yes |
| **Delivery status in Braze** | No — check 23 Telecom |
| **Who can configure** | Braze user with webhook campaign permissions |

  23 Telecom supports Braze through Campaign and Canvas webhooks. 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,
  per-user idempotency and Braze retries. On the current batch endpoint, confirm
  `results[0].status` is `"accepted"` with a non-empty
  `results[0].message_id`.

## What this connection does

A Braze **Webhook** campaign (or a Webhook step in Canvas) calls the 23 Telecom
API to send an SMS. Braze shows the HTTP response; carrier delivery reports stay
in 23 Telecom.

## Before you start

- Braze with **Webhooks** enabled (an add-on that consumes message credits — see
  the caveat below).
- 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. Open **Messaging → Campaigns → Create Campaign → Webhook** (or add a
   **Webhook** step in a Canvas).

2. Set the **URL** to
   `https://restlink23telecom.com/api/v1/sms/send-individual`, method `POST`.

3. Add headers `Content-Type: application/json`, your secret `X-API-Key`, and an
   `Idempotency-Key` (the endpoint requires it). For the sandbox test use a fixed
   one-off value such as `braze-sandbox-001`.

4. Paste the raw JSON body and map the recipient with a phone Liquid tag.

5. Use the **Test** tab to send to a test user, then review the response.

### Request body

```json title="Request body"
{
  "messages": [
    { "to": "{{phone_liquid_tag}}", "message": "Your message", "sender_id": "YourBrand" }
  ]
}
```

Replace the `to` value with your phone Liquid tag and `message` with your
content.

### Field mapping

| Braze field | Value |
| --- | --- |
| Method | `POST` |
| URL | `https://restlink23telecom.com/api/v1/sms/send-individual` |
| `Content-Type` | `application/json` |
| `X-API-Key` | your restricted 23 Telecom key (sandbox first) |
| `Idempotency-Key` | dispatch **and** user identity, unique per user (see below) |
| `messages[0].to` | phone Liquid tag (E.164) |
| `messages[0].message` | your message content |
| `messages[0].sender_id` | your approved sender ID |

## Send a test

Use the **Test** tab with a Random, Specific or Customized user and your
`sk_test_` key. Confirm the exact Liquid you use for the idempotency value renders
a stable, per-user string.

  Braze shows the HTTP status, but 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. Do not
  auto-retry a non-accepted body until the 23 Telecom message log confirms no
  acceptance.

  A single `dispatch_id` can be shared across the whole audience, so your
  `Idempotency-Key` must combine **dispatch and user identity** to be unique per
  recipient. Braze retries `408/429/5xx` up to **5 attempts over ~30 minutes**
  (longer during an outage), so a non-unique key would risk duplicate SMS. Braze
  webhook success is **not** a delivery report. For production, 23 Telecom
  activates the retry-safe integration path and confirms the per-recipient
  idempotency mapping during the launch check.

## Production activation

Live traffic uses managed activation because Braze branches on the HTTP status
and a single `dispatch_id` is shared across the audience. 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 and
enforces per-recipient idempotency.

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 Canvas or 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). If you need delivery status inside Braze,
ask us to scope a managed custom-event bridge.

## Troubleshooting

| Response | Cause & fix |
| --- | --- |
| `400 IDEMPOTENCY_KEY_REQUIRED` | Add the `Idempotency-Key` header |
| `401 INVALID_API_KEY` | Wrong or disabled key in the secret header |
| `403 NO_SMS_ACCESS` | SMS not enabled — contact 23 Telecom |
| `429 RATE_LIMIT_EXCEEDED` | Sending faster than your budget — slow the audience |

## Need help?

- **Webhook, Canvas, Liquid or credits** — Braze support.
- **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

- [Create a webhook](https://www.braze.com/docs/user_guide/channels/webhooks/create_a_webhook)

*Last verified: 16 July 2026.*