> ## 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 SMS OTP, WhatsApp 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,
  "sender_id_min_funded_credits": 5000,
  "whatsapp": [
    { "country_code": "*", "country_name": "Default", "credits": 4, "price": 24 },
    { "country_code": "NG", "country_name": "Nigeria", "credits": 4, "price": 24 }
  ],
  "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`.

## WhatsApp OTP credits

`whatsapp` is a parallel array of `{ country_code, country_name, credits, price }` computed at request time from `whatsapp_otp_costs` plus FX:

```
credits = ceil(cost_ngn * 1.20 / credit_price),  minimum 1
```

Same formula as send. The wildcard row `*` is the platform default. Destinations without a cost row are not free — WhatsApp send is refused until priced. WhatsApp is OTP-only (Meta Authentication + copy-code), not general messaging.

## Custom Sender ID credit gate

`sender_id_min_funded_credits` is how many purchased credits a workspace must have funded before it may request a custom Sender ID. It is the same value admins set under **Configure**, and the Sender IDs docs and dashboard gate read it from this endpoint. Used credits count; signup and purchase bonuses and refunds do not. See [Sender IDs](/sms/sender-ids).

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


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