G-SMS.

Documentation

G-SMS API documentation

G-SMS sends transactional SMS to Cameroonian mobile numbers — Orange, MTN, Camtel and Nexttel — with one HTTP request. No SDK, no contract, no minimum volume. You are billed per segment, and a message that fails is refunded automatically.

Base URL and authentication

Every endpoint lives under a single base URL. Requests are authenticated with an API key sent as a Bearer token.

https://api.sms.gworldship.com
Authorization: Bearer gsk_your_api_key
  • A key always starts with gsk_ and is shown once, when you create it in the console. We store its hash, not the key itself: if you lose it, revoke it and create another one.
  • A key belongs to exactly one application. It identifies the account that pays and the application that owns the messages, so you never pass an account or application identifier in a request.
  • Keep keys on your server. A key in a mobile app or in browser JavaScript can be read by anyone and spends your balance.
  • Only GET /v1/pricing works without a key. Everything else returns 401 INVALID_API_KEY.

Your first SMS in two minutes

  1. Create an account and confirm your phone number with the code you receive by SMS. Verification credits the account with XAF 100 — about twenty messages to Orange or MTN.
  2. Create an application in the console. An application groups its own messages, keys and webhook endpoints; use one per project, or one per environment.
  3. Generate an API key inside that application and copy it into your server configuration.
  4. Run the request below.

Request

curl -X POST 'https://api.sms.gworldship.com/v1/sms' \
  -H 'Authorization: Bearer gsk_your_api_key' \
  -H 'Content-Type: application/json' \
  -d '{"to":"+237690000000","text":"Your verification code is 123456"}'

Response

HTTP/1.1 202 Accepted
Content-Type: application/json

{
  "messageId": "9f1c4b2e-5d3a-4c7e-8b21-6a0f7d9c1e45",
  "to": "+237690000000",
  "operator": "ORANGE",
  "segments": 1,
  "priceXaf": 5,
  "status": "QUEUED",
  "balanceAfterXaf": 95,
  "createdAt": "2026-09-12T08:41:03.512Z"
}

202 Accepted means the message was validated, priced, charged and queued — not yet delivered. Delivery is reported later, by webhook or by polling. Full reference for POST /v1/sms.

Endpoints

EndpointKey requiredDescription
POST /v1/smsYesQueue one message. Returns 202, or 409 if the client reference already exists.
GET /v1/sms/{messageId}YesRead one message. Returns 404 if it belongs to another application.
GET /v1/smsYes Paginated history, newest first. Filters: status, to, from, until, page, size (default 20, maximum 100).
GET /v1/balanceYesCurrent balance, in whole XAF.
GET /v1/pricingNoPrice per segment for each operator. Public, no authentication.

Response conventions

  • Every response is JSON, UTF-8 encoded.
  • Null fields are omitted. A message that has not failed carries no failureReason key at all — do not expect it to be present and null.
  • Timestamps are ISO-8601 in UTC, for example 2026-09-12T08:41:03.512Z.
  • Amounts are integers in XAF. There are no decimals in this currency.
  • Errors use a single shape, { code, message }. Branch on code; the message is prose meant for a human reader and it can change without notice.
HTTP/1.1 402 Payment Required
Content-Type: application/json

{ "code": "INSUFFICIENT_BALANCE", "message": "Solde insuffisant" }

One documented exception breaks that rule, and it is the one that catches integrations: a duplicate client reference returns 409 with a message object, not an error object. Read why, and how to handle it.

What this API does not do

  • No custom sender name. The recipient sees the number of the SIM that carries the message. G-SMS is designed for transactional traffic, where the content matters more than the label above it.
  • No bulk endpoint. One request sends one message. Loop on your side, stay under ten requests per second, and use a client reference per message so a retry never sends twice.
  • Cameroonian mobile numbers only. Accepted formats are +2376XXXXXXXX, 2376XXXXXXXX and 6XXXXXXXX; anything else is rejected with INVALID_NUMBER.
  • Outgoing only. The API does not expose inbound messages.

Questions

Do I need an SDK to use the API?

No. The API is plain HTTP and JSON. curl, fetch, Guzzle, requests or any HTTP client your language already ships with is enough. There is nothing to install.

How much does one SMS cost?

XAF 5 per segment to Orange and MTN, XAF 7 to Camtel and Nexttel, XAF 10 on the default route used for prefixes outside the ART numbering plan. You are charged when the API accepts the message, and refunded automatically if it ends up FAILED.

Can I show my brand name as the sender?

No. The recipient sees the number of the SIM that carries the message. G-SMS is built for transactional traffic — one-time passwords, alerts, order notifications — not for marketing campaigns, and sender identity is part of that design.

What happens when my balance runs out?

The request is rejected with HTTP 402 and the code INSUFFICIENT_BALANCE. Nothing is queued and nothing is charged. Top up in the console, then send again.

Ready to send your first SMS?

Create an account, get 100 FCFA of credit and an API key straight away.

Create account