Skip to main content
In Africa, the “From” on an SMS must be a registered sender ID — a short alphanumeric string like SHUTTLERS or PAYSTACK. Each country has its own regulator:
CountryRegulatorWhat’s required
NigeriaNCCRegistered business + approved use case
GhanaNCABusiness registration
KenyaCAShortcode registration (for premium)
Côte d’IvoireARTCIBusiness registration
We handle the regulator paperwork for you — but we need compliance metadata before submitting.

Register a sender ID

curl -X POST https://api.robase.dev/v1/sender-ids \
  -H "Authorization: Bearer rb_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "sender_id": "SHUTTLERS",
    "countries": ["NG", "GH"],
    "registered_entity": "Shuttlers Technology Limited",
    "registration_doc_url": "https://bucket.example/cac.pdf",
    "use_case": "Booking confirmations, ride status updates, receipts",
    "sample_message": "Your Shuttlers ride with Chidi arrives in 3 min. Reg: ABC 123 XY."
  }'

Lifecycle

1

pending

You submit the registration. The sender ID is usable in test mode immediately but blocked in live mode until approved.
2

approved / active

Our compliance team submits to the regulator. On approval the status flips; subsequent sends succeed.
3

rejected

Regulator rejected — you’ll see rejection_reason on the resource. Sends fail with sender_id_invalid. Fix the reason and submit a new registration.
Rejected sender IDs block both live and test mode. Test mode is designed to catch compliance failures the same way production does — silently allowing rejected senders in test would surprise you in prod.

List your sender IDs

const { data } = await pm.senderIds.list();
for (const sid of data) {
  console.log(sid.sender_id, sid.status, sid.countries);
}

Edit compliance metadata

While a sender ID is pending, you can update its metadata (e.g. fix a typo in the use case):
await pm.senderIds.update('sid_01H8...', {
  use_case: 'Updated: booking confirmations + ride receipts',
});
Approved or rejected sender IDs are read-only — the audit trail stays intact.

Best practices

Recipients block unknown senders. SHUTTLERS is clearly the brand. MSG-123 is not — that looks like spam.
If your marketing copy says “From: SHUTTLERS”, make sure every transactional message also uses SHUTTLERS. Consistency builds trust.
Regulators check whether your sample message matches the use case. Don’t submit “Hi!” — write a realistic message the recipient would actually receive.
Registration is country-specific. Register NG + GH now even if you only send to NG today — the lead time on GH approval catches you by surprise otherwise.

Expedited review

Need a sender ID approved same-day for a launch? Email support@robase.dev with your ticket ID. We can prioritize with the regulator on the Scale plan.