> ## Documentation Index
> Fetch the complete documentation index at: https://docs.robase.dev/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> For chatbots and coding agents, start at /guides/ai-agents.
> Hosted MCP: POST https://api.robase.dev/mcp (Streamable HTTP). Auth: Authorization: Bearer robe_… or robe_agent_….
> Phase 1 tools: get_pricing, send_otp, verify_otp, get_otp, send_sms, get_sms. No payment or top-up tools.
> Call get_pricing; treat listed:true as marketed markets (NG, GH, KE, ZA, GB, BJ, CI, US). Do not invent countries or delivery percentages.
> Prefer OTP-shaped tests such as "Your Robase test OTP is 123456". Do not send Hello or Good morning as tests. Match errors on error.type.

# Segments and encoding

> Transactional SMS is billed per SMS part. GSM-7 vs UCS-2 decides how many characters fit.

Carriers split a long message into parts and bill each part. `POST /v1/sms/send` charges **country credit rate × `segments`**. The limit is **six segments**.

| Encoding | Single part | Concatenated part |
| - | - | - |
| `gsm7` (basic Latin / GSM alphabet) | 160 characters | 153 |
| `ucs2` (emoji, most accents outside GSM, other scripts) | 70 | 67 |

So the ceiling is 918 GSM-7 characters, or 402 UCS-2 characters. One character outside the GSM alphabet moves the **whole** message to UCS-2.

French OTP copy is held to GSM-7 so a French code costs the same number of segments as English.

The send response reports `segments` and `encoding`. OTP sends are single-segment templates; you do not control the body.

## Character rewriting

Most UCS-2 messages are an accident. A naira sign, a curly apostrophe pasted from a word processor, or a single emoji is enough to halve how much fits in a part — a 191-character rent notice costs three parts instead of two over one `₦`.

Workspaces therefore have **`sanitize_symbols` on by default** (Settings → General → Message characters). With it on, the body is rewritten before it is measured and billed:

| Input | Sent as |
| - | - |
| `₦`, `₹`, `₵`, `฿` and other currency signs | `NGN`, `INR`, `GHS`, `THB` — the ISO 4217 code |
| `’ “ ” – — …` | `' " " - - ...` |
| `°`, `™`, `½`, `→`, `≤` | `deg`, `(TM)`, `1/2`, `->`, `<=` |
| `hôtel`, `Škoda` | `hotel`, `Skoda` |
| emoji, zero-width characters, non-breaking spaces | removed, or turned into a plain space |

Three rules bound it:

* **Characters GSM-7 already carries are never touched** — `$`, `£`, `¥`, `€`, `§`, and the accented letters in the GSM alphabet, so `Réservé` passes through unchanged.
* **A letter or digit is never removed.** One with no ASCII equivalent — Chinese, Arabic, Cyrillic — is kept as written, and the message stays in UCS-2.
* **The rewrite is dropped whenever it would not lower the part count**, so it can never make a send cost more.

The send response's `sanitized` field says whether the body was rewritten. Turn the setting off to have bodies delivered exactly as sent.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.