SMS, USSD, OTP and Voice APIs for Ghana
One REST API covers the channels people in Ghana actually read: SMS, USSD, OTP and voice. You authenticate with an api-key header, post JSON, and read the delivery report on the way back. There is no SDK to install. Test against the sandbox first, then swap in a live key when you are ready to go.

One endpoint, four channels
Every channel takes the same shape of request. A POST to https://sms.arkesel.com/api/v2/sms/send with an api-key header sends a message. Change the path to /api/otp/generate and you are issuing one-time codes instead. Responses come back as JSON in a consistent shape, so your error handling does not have to change from one channel to the next.
SMS
One POST sends to a single number or to a list. You pick the sender ID that shows on the handset, and delivery status arrives as a webhook instead of something you poll for. Bulk and single sends share the same endpoint, so there is only one code path to maintain.


Voice
Voice SMS plays a recorded message down the line to a number you supply. It earns its place where text will not land: an older handset, a customer who does not read English comfortably, or a message that carries better in a human voice.
OTP and phone verification
Verification takes two calls. POST /api/otp/generate sends the code, and POST /api/otp/verify checks what the user typed back. Codes run from six to fifteen digits and expire on a window you set between one and ten minutes. Arkesel generates and stores the code, so one-time secrets never sit in your database.


Email marketing
The email API is built for campaigns rather than one-off receipts. You can create and update contact lists, add or remove subscribers, launch a campaign and trigger automations, all over REST. Teams usually wire it to a CRM so a sign-up in one system becomes a subscriber in the other without anyone exporting a spreadsheet. Transactional send is not part of it.
Getting set up
The documentation covers each endpoint with a request and a response you can copy. If something does not behave the way the docs say, the support team can look at the actual request you sent rather than guessing from a description.







