1. Send an SMS
PressOne eSIM Developer Platform
  • OVERVIEW
    • Introduction
    • Attribute descriptions
    • FAQ
    • User journeys
      • Top-up Journey
      • Purchase Journey
    • Guides
      • eSIM installation methods for API Partners
      • How to generate the QR code for an eSIM
  • REST API
    • Data / Data + Voice + SMS eSIM
      • Introduction
      • Error handling
      • Endpoints
        • Authenticate
          • Get token information
          • Refresh access token
          • Request access token
        • Check balance
          • Get balance
        • Compatible devices
          • Get compatible device lite list
        • Browse packages
          • Get packages
        • Place order
          • Submit order
        • Manage orders
          • Get order list
          • Get order
        • Manage eSIMs
          • Get eSIM by ICCID
          • Get eSIMs list
          • Get eSIM package history
        • Install eSIM
          • Get installation instructions
        • Monitor usage
          • Get usage (data, text & voice)
        • Place top up order
          • Get top-up package list
          • Submit top-up order
    • Voice-only eSIM
      • Getting Started
      • Error handling
      • Endpoints
        • List Available Numbers
        • Claim Number
        • Renew Number
        • List User
    • SMS
      • Introduction
      • Authentication
      • Conventions
        • Response envelope
        • Errors
        • Rate limits
        • Idempotency
        • Date ranges & timezone
        • Pagination
      • Endpoints
        • Send an SMS
          • Send SMS /api/sms/send
            POST
        • List message logs
          • List message logs /api/sms/logs
        • Get statistics
          • Get statistics /api/sms/statistics
        • Export logs (CSV)
          • Export logs (CSV) /api/sms/export
        • Analytics
          • Overview
            • Overview /api/sms/analytics/overview
          • Message volume
            • Message volume /api/sms/analytics/message-volume
          • Delivery status distribution
            • Delivery status distribution /api/sms/analytics/delivery-status
          • Delivery report
            • Delivery report - /api/sms/analytics/delivery-report
        • Check wallet balance
          • Check wallet balance /api/sms/balance
        • Send an OTP
          • Send an OTP /api/sms/otp/send
        • Verify an OTP
          • Verify an OTP /api/sms/otp/verify
      • Delivery webhooks
        • Delivery webhooks
      • Message lifecycle & statuses
        • Message lifecycle & statuses
      • Appendix: message object
        • Appendix: message object
  1. Send an SMS

Send SMS /api/sms/send

Developing
POST
/api/sms/send
Sends a one-way SMS to a single recipient. The call is synchronous up to provider
acceptance
(not final delivery) — on success you get a message_id to correlate with
later logs and delivery webhooks.
Headers
HeaderRequiredNotes
x-api-keyyesYour API key.
Content-Type: application/jsonyes
Idempotency-KeynoSee Idempotency. Strongly recommended.
Body
FieldTypeRequiredRules
recipientstringyesPhone number. Max 20 chars. Normalised to E.164 in your org's country (defaults to Nigeria / NG); must be a deliverable number.
bodystringyesThe message text. Max 1600 chars. When template is set, this is the template's variable value(s) instead.
sender_idstring (UUID)noUUID of one of your approved sender IDs (or the platform default). Omit to auto-select your approved sender ID, then the platform default.
message_typestringnoOne of one_way, two_way, multimedia. Defaults to one_way. Only one_way is currently supported — others are rejected.
templatestringnoName of an approved template in your account. Max 100 chars. When set, the message content comes from the template.
Example request
Success — 200 OK
{
  "success": true,
  "message": "SMS accepted for delivery",
  "data": { "message_id": "a3d5f0c1-9e22-4b7a-8f1c-2d6e9b0a4c77", "status": "accepted" }
}
message_id is the message's UUID — use it to look it up in /sms/logs
and to match delivery webhooks. status: "accepted" means the
provider accepted it for delivery; poll the logs (or use a webhook) for the final state.
Billing. A provisional charge is held from your wallet at send time and trued-up to
the provider's exact cost
once the delivery report arrives (no markup). The balance
check is segment-aware (long / non-GSM messages cost more units). If the provider rejects
the send outright (502), the charge is automatically refunded.
Errors specific to this endpoint
HTTPWhenmessage (example)
422Body fails validationSMS body is required (+ errors map)
400Invalid recipient numberInvalid phone number. Please provide a valid recipient.
400sender_id not yours / not approvedInvalid or unauthorized sender_id
400No approved sender ID and no defaultNo approved sender ID found. Please request and get a sender ID approved before sending.
400Non–one-way message_typeOnly one-way messaging is currently supported
404template name not foundTemplate not found or invalid
402Wallet too lowInsufficient wallet balance… (+ code: insufficient_funds)
502Provider rejected the sendThe SMS could not be submitted to the provider. It was not charged — please retry shortly…

Request

Header Params

Body Params application/jsonRequired

Examples

Responses

🟢200Success
application/json
Bodyapplication/json

Request Request Example
Shell
JavaScript
Java
Swift
curl --location 'https://prod.your-api-server.com/api/sms/send' \
--header 'x-api-key: {{x-api-key}}' \
--header 'Idempotency-Key: {{indempotency-key}}' \
--header 'Content-Type: application/json' \
--data '{
    "recipient": "+2348120191228",
    "body": "Your OTP is 4821",
    "sender_id": "1f8c0a2e-6b4d-4f1a-9c3e-2a7b6d5e4c10"
  }'
Response Response Example
{
  "success": true,
  "message": "SMS accepted for delivery",
  "data": { "message_id": "a3d5f0c1-9e22-4b7a-8f1c-2d6e9b0a4c77", "status": "accepted" }
}
Modified at 2026-06-23 09:29:38
Previous
Pagination
Next
List message logs /api/sms/logs
Built with