ESC
Type to search across all documentation

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.