> ## 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.

# Pricing

> GET /v1/pricing — what a credit costs and how many credits each destination charges. No key required.

Credits are prepaid and cover both OTP and transactional SMS. One credit has a fixed price; a message costs a number of credits that depends on where it lands, and on which network answers for the number.

`GET /v1/pricing` publishes the table that bills your messages. It needs no API key, and it is the same table the price page and the dashboard read.

```bash theme={null}
curl https://api.robase.dev/v1/pricing
```

```json theme={null}
{
  "currency": "NGN",
  "credit_price": 6,
  "countries": [
    {
      "country_code": "NG",
      "country_name": "Nigeria",
      "credits": 1,
      "price": 6,
      "min_credits": 1,
      "max_credits": 3,
      "listed": true,
      "networks": [
        { "key": "mtn", "name": "Mtn", "credits": 1, "price": 6 },
        { "key": "glo", "name": "Glo Mobile", "credits": 3, "price": 18 }
      ]
    }
  ]
}
```

## Reading a country

| Field                         | Meaning                                                    |
| ----------------------------- | ---------------------------------------------------------- |
| `credits`                     | Charged when no telco rate matches the number              |
| `price`                       | `credits` × `credit_price`, in `currency`                  |
| `min_credits` / `max_credits` | The cheapest and dearest rate to this destination          |
| `networks`                    | Per-telco rates, cheapest first. Absent where none are set |
| `listed`                      | Whether the published price table names this destination   |

Countries are ordered cheapest first.

`min_credits` and `max_credits` are equal where every number to a country costs the same. Where they differ, the rate depends on the recipient's network: a Nigerian number on Glo costs 3 credits, and one on any other network costs 1.

An unlisted destination is still sendable and still charged at the price shown. The +1 territories are routed so those numbers keep working, and they are not destinations Robase markets.

## What you are actually charged

Two things decide the charge on a send:

1. **The network.** Robase identifies the recipient's network from the number and applies that telco's rate. When it cannot, the country's `credits` applies.
2. **The parts.** A long message is split by the carrier and billed per part, so a two-part message to Nigeria costs two credits, not one. See [Segments and encoding](/sms/segments-encoding).

The response to `POST /v1/sms/send` carries the `credit_cost` that was actually charged, along with `segments`.

## Caching

Prices change rarely. The endpoint sets `Cache-Control: public, max-age=60`, and the server holds a built table for the same minute, so polling it more often than that returns the same answer.
