Complete SMS API Documentation & Integration Guide
Complete guide to integrate Send99 SMS Gateway API with your application. Learn how to send SMS, check balance, and get delivery reports. For a product overview, see the HTTP SMS API page.
1. Get Balance
Method: HTTP GET
Endpoint: http://smscp.send99.com:20003/getbalance?account=***&password=***
Necessary Parameters:
account(String) - Your account usernamepassword(String) - API password, can be found on DashboardOptional Parameters:
version(String, default: "1.0") - Protocol version numberseq(Int, default: 1) - Serial number, increments per requesttime(Int) - Timestamp from which the request was made
Response:
{
"status": 0,
"balance": "99.990000",
"gift": "50.00000"
}
2. Send SMS
Method: HTTP GET or POST
Endpoint (GET): http://smscp.send99.com:20003/sendsms?account=***&password=***&smstype=0&numbers=10010,1008611&content=***&mmstitle=mmstitle_text
Endpoint (POST): http://smscp.send99.com:20003/sendsms
Necessary Parameters:
account(String) - Your account usernamepassword(String) - API password, can be found on Dashboardnumbers(String) - SMS receiving number, separated by English comma between multiple numberscontent(String) - Send contentOptional Parameters:
version(String, default: "1.0") - Protocol version numberseq(Int, default: 1) - Serial number, increments per requesttime(Int) - Timestamp from which the request was madesmstype(Int, default: 0) - SMS type (0: SMS, 1: MMS)mmstitle(String) - MMS title (URL-encoded for GET mode)sender(String) - Sendersendtime(String) - Timed delivery time
Response:
{
"status": 0,
"success": 2,
"fail": 0,
"array": [
[10010, 1],
[1008611, 2]
]
}
3. Get Report
Method: HTTP GET
Endpoint: http://smscp.send99.com:20003/getreport?account=***&password=***&ids=1,2
Necessary Parameters:
account(String) - Your account usernamepassword(String) - API password, can be found on Dashboardids(String) - Specify the SMS id of the query sending resultOptional Parameters:
version(String, default: "1.0") - Protocol version numberseq(Int, default: 1) - Serial number, increments per requesttime(Int) - Timestamp from which the request was made
Response:
{
"status": 0,
"success": 1,
"fail": 1,
"unsent": 0,
"sending": 0,
"nofound": 0,
"array": [
[1, 10010, 20171001123015, 0],
[2, 1008611, 20171001123015, 3]
]
}
4. Get SMS
Method: HTTP GET
Endpoint: http://smscp.send99.com:20003/getsms?account=***&password=***
Necessary Parameters:
account(String) - Your account usernamepassword(String) - API password, can be found on DashboardOptional Parameters:
version(String, default: "1.0") - Protocol version numberseq(Int, default: 1) - Serial number, increments per requesttime(Int) - Timestamp from which the request was madeids(String) - Specify the SMS id of the query sending result
Response:
{
"status": 0,
"cnt": 2,
"array": [
[1, 10010, 20171001123015, "content"],
[2, 1008611, 20171001123015, "content"]
]
}
Authentication and request basics
Every documented request uses your account username and API password, which you can find in the dashboard. Optional parameters include a protocol version, a sequence number, and a timestamp. Keep the credentials server-side, use one account per environment where possible, and contact support for the HTTPS endpoint and IP allowlisting before production.
The examples on this page use placeholder credentials (***). Never place real credentials in documentation, client-side code, public repositories, or support tickets. If a credential may have been exposed, rotate it and review recent sends for unexpected traffic.
Response codes and error handling
Responses are JSON. A top-level status of 0 indicates that the request was processed; per-message arrays then show which recipients succeeded and which failed. Report responses also distinguish messages that are unsent, still sending, or not found. Build your integration around these values rather than assuming every accepted request means every message was delivered.
Classify failures before retrying. Invalid numbers and blocked content are usually permanent, while network or queue congestion may be transient. Apply a bounded retry policy with backoff, log the response, and suppress numbers that fail repeatedly. Ask support for the current error-code list if you need to map statuses to your own alerting.
Delivery reports and inbound messages
The report endpoint returns delivery state for the message IDs you specify. The inbound endpoint returns messages that recipients sent back to your number, which is the foundation for two-way SMS. Poll at a sensible interval for low-volume flows, or ask about webhook delivery for production systems that need near-real-time updates.
Persist message IDs and timestamps so you can reconcile reports with your own orders, appointments, or alerts. For support investigations, include the message ID, destination country, sender ID, and approximate send time — never the account password.
Production integration checklist
Before launch: confirm the sender type and registration for each destination, test with real handsets on the target networks, verify delivery-report handling, and define what happens when the API times out. Add monitoring for error rates and queue depth, and keep an owner for credential rotation and incident response.
For higher throughput, compare the HTTP API with SMPP. SMPP can be a better fit for large, sustained volumes and direct bind management, while HTTP is simpler for event-driven application messaging. The HTTP SMS API overview explains the trade-offs.
Frequently asked questions
How do I authenticate with the Send99 SMS API?
Use the account username and API password from your dashboard as request parameters. Keep them server-side, use separate credentials by environment where possible, and ask support for the HTTPS endpoint and IP allowlisting before production. Never put real credentials in client-side code or public repositories.
What does a successful send response contain?
A successful response includes a status value, counts of successful and failed submissions, and an array of per-recipient message IDs. Store those IDs: they are required for delivery-report queries and for reconciling sends with your own orders, alerts, or appointments.
How do I retrieve delivery reports?
Call the report endpoint with the message IDs returned by the send call. The response distinguishes success, failure, unsent, sending, and not-found messages. Use those values to drive retries, alerting, and suppression of persistently invalid numbers rather than retrying every non-success blindly.
Does the API support inbound messages?
Yes. The inbound-message endpoint returns replies sent to your number, which supports two-way SMS and keyword flows. Poll at an interval that matches your response-time needs, or ask about webhook delivery for production systems that need near-real-time updates.
Can I test the API before going live?
Yes. Test credits let you validate credentials, send to your own handsets, and inspect real delivery reports. Start with a small set of numbers on the target networks, confirm the response handling, then fund a production balance and complete any required sender registration.
What should I do if an API call times out?
Treat a timeout as an unknown outcome, not automatic failure. Record the request, check whether the message ID was created, and retry with a bounded policy to avoid duplicates. Use a queue and idempotency in your own layer, and monitor error rates so a downstream problem is visible before it affects a campaign.