# Connect 23 Telecom to Adobe Journey Optimizer

> Send SMS from Adobe Journey Optimizer with a self-service custom action calling 23 Telecom — header API-key auth, a stable event ID, a TPS preflight, and where carrier delivery is tracked.
> Source: https://docs.23telecom.co.uk/integrations/adobe-journey-optimizer/
> 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** | Custom action · technical admin |
| **Setup time** | About 20 minutes |
| **Sends SMS** | Yes |
| **Delivery status in AJO** | No — check 23 Telecom |
| **Who can configure** | Journey Administrator |

  23 Telecom supports Adobe Journey Optimizer through a custom action. 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 account throughput. On the current batch
  endpoint, confirm `results[0].status` is `"accepted"` with a non-empty
  `results[0].message_id`.

## What this connection does

A Journey Optimizer **custom action** calls the 23 Telecom API to send an SMS
from a journey. AJO records the action response; carrier delivery reports stay in
23 Telecom.

## Before you start

- The **Journey Administrator** permission and a public DNS hostname / HTTPS.
- 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 **Administration → Configurations → Actions → Manage → Create Action**.

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

3. Set authentication to **API key**, name `X-API-Key`, location **Header**.

4. Define the JSON request schema with `to`, `message` and a stable event ID, and
   keep `sender_id` as a protected constant.

5. Use **Send test request**, then add the action to a journey.

### Field mapping

| AJO action field | Value |
| --- | --- |
| Method | `POST` |
| URL | `https://restlink23telecom.com/api/v1/sms/send-individual` |
| Authentication | API key · header `X-API-Key` |
| `Idempotency-Key` header | a stable trigger event ID |
| `messages[0].to` | recipient phone variable (E.164) |
| `messages[0].message` | message variable |
| `messages[0].sender_id` | approved sender ID (protected constant) |

## Send a test

Use **Send test request** with your `sk_test_` key before wiring the action into a
journey. For the test, set the `Idempotency-Key` header to a fixed value such as
`ajo-sandbox-001`.

  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.

  Adobe expects a target endpoint that can accept at least **200 TPS**. Confirm
  (and if needed raise) your 23 Telecom account limit before a production rollout,
  or buffer through the integration adapter. Use a **stable trigger event ID** as
  the `Idempotency-Key` — do not assume a universal execution ID exists. The
  custom-action response is **acceptance**; a delivery report inside AJO needs a
  dedicated Adobe event.

## Production activation

Live traffic uses managed activation because the custom action routes 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, and aligns the TPS budget with Adobe.

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
activate the journey.

## 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` | Send the stable event ID as `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 per-second budget — raise the limit or slow the journey |

## Need help?

- **Custom action, schema or TPS guardrails** — Adobe 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

- [Configure a custom action](https://experienceleague.adobe.com/en/docs/journey-optimizer/using/configure-journeys/action-journeys/about-custom-action-configuration)
- [Test custom actions](https://experienceleague.adobe.com/en/docs/journey-optimizer/using/monitor/troubleshooting/troubleshoot-journey/troubleshoot-custom-action)
- [Guardrails](https://experienceleague.adobe.com/en/docs/journey-optimizer/using/get-started/essentials/guardrails)

*Last verified: 16 July 2026.*