Logistics companies
Send shipment status, pickup and arrival alerts to your customers and your drivers from your tracking system.
Home / Developers
For companies: integrate QuickPing SMS directly into your software. Your system sends the message the moment something happens, with no one logging in to press send.
If your software already knows when something has happened, our API can tell your customer. Here is how different industries use it.
Send shipment status, pickup and arrival alerts to your customers and your drivers from your tracking system.
Tell customers when a rider is on the way, and send delivery codes that confirm the parcel reached the right person.
Send fee reminders, results notices and attendance alerts to parents straight from your school system.
Send appointment reminders, test-result-ready notices and follow-up messages to patients, and check that each one was delivered.
Send order confirmations, checkout OTP codes and dispatch notices as soon as each order changes.
Send login and transaction OTPs, payment confirmations and account alerts in real time, and confirm that each one reached the phone.
Send service times, event notices and giving reminders to every member from your membership system.
Send premium reminders, renewal notices and claim status updates to policyholders.
Send booking confirmations, trip changes and check-in reminders to travellers.
Send public notices, citizen alerts and verification codes from the systems you deliver.
Send viewing reminders, rent due notices and follow-ups to tenants and buyers.
Do not see your industry? If your software can make a web request, it can send an SMS with QuickPing. Tell us what you are building.
The base URL for every request is https://api.quickpingsms.com. To get your API key and secret, email support@quickpingsms.com with your company name and what you plan to build. We will set up your account, agree your price per SMS and send you your credentials. Your secret is shown only once, so store it safely.
Send your key and secret in these headers on every request. Keep them on your server and never put them in a mobile app or in front-end code.
X-API-Key: qp_xxxxxxxxxxxxxxxx
X-API-Secret: xxxxxxxxxxxxxxxx
Content-Type: application/json
POST /v1/sms/send
| Field | Required | Description |
|---|---|---|
to | Yes | Recipient number in international format, for example +233244000000. |
message | Yes | The text of the message. |
sender | No | Approved Sender ID (up to 11 characters). Your default is used if you leave it out. |
# cURL
curl -X POST https://api.quickpingsms.com/v1/sms/send \
-H "X-API-Key: qp_your_key" \
-H "X-API-Secret: your_secret" \
-H "Content-Type: application/json" \
-d '{"to":"+233244000000","message":"Your order has shipped"}'
// Node.js
const res = await fetch("https://api.quickpingsms.com/v1/sms/send", {
method: "POST",
headers: {
"X-API-Key": process.env.QP_KEY,
"X-API-Secret": process.env.QP_SECRET,
"Content-Type": "application/json"
},
body: JSON.stringify({ to: "+233244000000", message: "Your order has shipped" })
});
console.log(await res.json());
# Python
import os, requests
r = requests.post(
"https://api.quickpingsms.com/v1/sms/send",
headers={"X-API-Key": os.environ["QP_KEY"], "X-API-Secret": os.environ["QP_SECRET"]},
json={"to": "+233244000000", "message": "Your order has shipped"},
)
print(r.json())
Successful response:
{
"status": "success",
"data": {
"id": "7c1e9a52-3b0d-4f6e-9a1c-2d8b5e47f013",
"to": "+233244000000",
"status": "queued",
"cost": 0.05,
"currency": "GHS"
}
}
Keep the id. You use it to check delivery status.
POST /v1/sms/bulk sends the same message to many numbers in one request.
{
"recipients": ["+233244000000", "+233201234567"],
"message": "Weekend sale starts now!",
"sender": "YourBrand"
}
Successful response:
{
"status": "success",
"data": {
"recipients_count": 2,
"cost": 0.10,
"currency": "GHS",
"messages": [
{ "id": "a3f1c6d0-...", "to": "+233244000000", "status": "queued" },
{ "id": "9b2e4d71-...", "to": "+233201234567", "status": "queued" }
]
}
}
Every recipient gets its own id. A bulk request can include up to 10,000 numbers.
GET /v1/sms/status/{id} tells you what happened to a message. Use the id from the send or bulk response. You can only look up your own messages.
# cURL
curl https://api.quickpingsms.com/v1/sms/status/7c1e9a52-3b0d-4f6e-9a1c-2d8b5e47f013 -H "X-API-Key: qp_your_key" -H "X-API-Secret: your_secret"
Response:
{
"status": "success",
"data": {
"id": "7c1e9a52-3b0d-4f6e-9a1c-2d8b5e47f013",
"to": "+233244000000",
"status": "delivered",
"sent_at": "2026-10-05T09:41:00Z",
"delivered_at": "2026-10-05T09:41:06Z"
}
}
| Status | Meaning |
|---|---|
queued | We accepted the message and it is waiting to go to the network. |
sent | The message has gone to the network. No delivery report yet. |
delivered | The phone received the message. |
failed | The message was not delivered, or it expired. For example, the phone was off for too long. |
rejected | The message was blocked, for example because of prohibited content. |
Delivery reports from the networks can take a few seconds to a few minutes. A message that is still queued or sent may not be final yet, so check again after a short wait. Once a message is delivered, failed or rejected, its status does not change.
Errors return a JSON body with "status": "error" and a plain message.
| Code | Meaning |
|---|---|
| 400 | A required field is missing or invalid. |
| 401 | API key or secret is missing or wrong. |
| 402 | Your credit balance is too low. Top up and try again. |
| 403 | This API key has been deactivated. |
| 404 | No message with that id was found on your account. |
| 429 | Too many requests. Slow down and retry. |
| 502 | The message could not be handed to the network. Safe to retry after a short wait. |
+233) and remove duplicates before you send.Questions? Email support@quickpingsms.com.