SimCoal SMS API
SMS gateway API for sending messages via carrier email gateways. SimCoal routes outbound SMS through carrier-specific email-to-SMS bridges, enabling reliable message delivery without traditional SMS aggregator overhead.
Base URL
https://coals.ai/api/v1/simcoal
All endpoints require an Authorization: Bearer <token> header. Obtain a token from your dashboard API settings.
Endpoints
| Method | Endpoint | Description | Scope Required |
|---|---|---|---|
| POST | /send | Send a single SMS message | simcoal:send |
| POST | /send-bulk | Send SMS to multiple recipients | simcoal:bulk |
| GET | /logs | List message logs with filters | simcoal:read |
| GET | /logs/{id} | Retrieve a single log entry | simcoal:read |
| GET | /stats | Usage statistics and send totals | simcoal:read |
| GET | /account | Account details, plan, and quota | simcoal:read |
| GET | /account/balance | Credit balance only | simcoal:read |
Required Scopes
simcoal:send
Send individual SMS messages via /send.
simcoal:bulk
Send bulk campaigns via /send-bulk. Requires a paid plan.
simcoal:read
Read logs, stats, and account information.
Quick Start — Send an SMS
curl -X POST https://coals.ai/api/v1/simcoal/send \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "to": "5551234567", "carrier": "verizon", "message": "Hello from SimCoal!" }'
// Using Guzzle $response = $client->post('https://coals.ai/api/v1/simcoal/send', [ 'headers' => ['Authorization' => 'Bearer YOUR_API_KEY'], 'json' => [ "to" => "5551234567", "carrier" => "verizon", "message" => "Hello from SimCoal!" ] ]); $data = json_decode($response->getBody(), true);
# Using requests import requests response = requests.post( "https://coals.ai/api/v1/simcoal/send", headers={"Authorization": "Bearer YOUR_API_KEY"}, json={ "to": "5551234567", "carrier": "verizon", "message": "Hello from SimCoal!" } ) data = response.json()
# Using net/http require "net/http" require "json" uri = URI("https://coals.ai/api/v1/simcoal/send") req = Net::HTTP::Post.new(uri) req["Authorization"] = "Bearer YOUR_API_KEY" req["Content-Type"] = "application/json" req.body = '{ "to": "5551234567", "carrier": "verizon", "message": "Hello from SimCoal!" }' res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) } data = JSON.parse(res.body)
// Using fetch (Node 18+) const response = await fetch("https://coals.ai/api/v1/simcoal/send", { method: "POST", headers: { "Authorization": "Bearer YOUR_API_KEY", "Content-Type": "application/json" }, body: JSON.stringify({ "to": "5551234567", "carrier": "verizon", "message": "Hello from SimCoal!" }) }); const data = await response.json();
The carrier parameter is required on the free tier. Paid plans auto-detect or route through premium providers.