# Libraries & SDKs

> Use the 23 Telecom SMS API from Node.js, Python, PHP, Ruby, Java, Go and .NET — idiomatic examples on every endpoint today, official SDK packages on the roadmap.
> Source: https://docs.23telecom.co.uk/sdks/

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

The API is a clean REST + JSON interface, so it works from any language with
an HTTP client — no SDK required. Every endpoint page in these docs includes
ready-to-paste examples in **eight languages**:

| Language | HTTP client used in examples |
| --- | --- |
| cURL | — |
| Node.js | Built-in `fetch` (Node 18+) |
| Python | `requests` |
| PHP | `curl` extension |
| Ruby | `net/http` (stdlib) |
| Java | `java.net.http.HttpClient` (Java 11+) |
| Go | `net/http` (stdlib) |
| .NET | `HttpClient` (C#) |

Pick your language once in any code block — the choice follows you across the
entire site.

## The full loop in your language

Send a message:

```
POST https://restlink23telecom.com/api/v1/sms/send
Header: X-API-Key: <your key>
```
*(The web page shows this example in cURL, Node.js, Python, PHP, Ruby, Java, Go and .NET.)*

Check its status:

```
GET https://restlink23telecom.com/api/v1/sms/status/api_42_1743667200123456789_a3f8b2c1d9e45f67
Header: X-API-Key: <your key>
```
*(The web page shows this example in cURL, Node.js, Python, PHP, Ruby, Java, Go and .NET.)*

For webhook receivers in Python, Node.js and PHP, see the
[delivery webhook examples](/webhooks/delivery#receiver-examples).

## Official SDK packages

Official clients for the three most-requested languages, with automatic
429/5xx retries, stable `error_code` errors and webhook signature
verification built in:

| Language | Package | Install |
| --- | --- | --- |
| TypeScript / Node 18+ | `@23telecom/sms` | `npm install @23telecom/sms` |
| Python 3.9+ | `telecom23` | `pip install telecom23` |
| PHP 8.0+ | `23telecom/sms` | `composer require 23telecom/sms` |

```ts title="TypeScript"

const client = new TelecomClient({ apiKey: process.env.API_KEY! });
await client.sms.send({ to: ['+447911123456'], message: 'Hi!', sender_id: 'MyApp' });
```

```python title="Python"
from telecom23 import Client
client = Client(api_key=os.environ["API_KEY"])
client.sms.send(to=["+447911123456"], message="Hi!", sender_id="MyApp")
```

```php title="PHP"
$client = new \Telecom23\Client(getenv('API_KEY'));
$client->sendSms(['+447911123456'], 'Hi!', 'MyApp');
```

All three work with [sandbox keys](/sandbox) (`sk_test_…`) for free,
simulated testing. Ruby, Java, Go and .NET packages are next — until then
use the examples above or [generate a client](/tools/openapi) from the spec.

  There's also an [MCP server and a CLI](/tools/install-tools) built on the
  same API.

## Integration tips that save support tickets

- **Store the key in `API_KEY`** env var like the examples do — rotating keys
  then never touches code.
- **Treat `messages[].message_id` as your join key** between send responses,
  status polls and webhook events.
- **Handle `429` with backoff** ([rate limits](/reference/rate-limits)) and
  `402` with an alert ([balance](/account/balance)).
- **Make webhook handlers idempotent** — retries deliver duplicates by design.