Quickstart
From zero to your first message in under 10 minutes. Sandbox sends are free and don't need a funded wallet.
Create an account
Sign up in the dashboard (or via the API). You immediately get a Test project, a Live project and a ZAR wallet.
# Or just use the dashboard: /signup
curl -X POST http://localhost:5160/dashboard/signup \
-H "Content-Type: application/json" \
-d '{
"email": "you@company.co.za",
"password": "a-strong-password",
"organizationName": "My Company"
}'Create a test API key
Go to API keys → New key, pick the Test project and copy the lap_test_… key - it is shown exactly once.
Send a sandbox message
curl -X POST http://localhost:5160/v1/messages \
-H "Authorization: Bearer lap_test_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"to": "+27821234567",
"body": "Hello from LapSMS!"
}'The response comes back immediately:
{
"id": "msg_01j9v7...",
"status": "delivered",
"to": "+27821234567",
"segments": 1,
"encoding": "gsm7",
"sandbox": true,
"charge": { "amount": 0.00, "currency": "ZAR" }
}Sandbox messages are marked "sandbox": true, cost R0.00 and go straight to delivered without touching a real phone.
Check a message's status
curl http://localhost:5160/v1/messages/msg_01j9v7... \ -H "Authorization: Bearer lap_test_YOUR_KEY"
Go live
Create a key on the Live project, fund your wallet, and use the same request. Real messages move queued → submitted → delivered; you can watch each one in the dashboard's message log, and get pushed updates via webhooks.
Client libraries
Any HTTP client works. Here's the same call in C# and TypeScript:
using var http = new HttpClient();
http.DefaultRequestHeaders.Authorization =
new("Bearer", "lap_test_YOUR_KEY");
var response = await http.PostAsJsonAsync(
"http://localhost:5160/v1/messages",
new { to = "+27821234567", body = "Hello from LapSMS!" });
var message = await response.Content.ReadFromJsonAsync<JsonElement>();
Console.WriteLine(message.GetProperty("id"));const res = await fetch("http://localhost:5160/v1/messages", {
method: "POST",
headers: {
Authorization: "Bearer lap_test_YOUR_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
to: "+27821234567",
body: "Hello from LapSMS!",
}),
});
const message = await res.json();
console.log(message.id, message.status);