Predictable REST
JSON everywhere, consistent error codes and idempotent references.
Developers
Everything you need to add OTPs, notifications and campaigns to your product — with the safety rails production systems deserve.
JSON everywhere, consistent error codes and idempotent references.
Queue 100,000 personalised messages and poll progress by campaign.
jms_test_ keys exercise the whole flow without charges or deliveries.
Limit each key to the actions it needs, restrict IPs and set rate limits.
Delivery reports, inbound replies and payments pushed to your server.
Uncertain carrier outcomes are held and reconciled — never duplicated.
const res = await fetch("https://jmsurfsms.co.ke/api/v1/sms/send", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.JMSURF_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
to: "0712345678",
message: `Your verification code is ${code}`,
reference: crypto.randomUUID(),
}),
});app.post("/jmsurf/webhooks", express.raw({ type: "*/*" }), (req, res) => {
if (!verify(req.body, req.get("x-jmsurf-signature"), SECRET)) return res.sendStatus(401);
const event = JSON.parse(req.body);
if (event.event === "sms.delivered") markDelivered(event.data.reference);
res.sendStatus(200);
});Start with a free workspace. Add your audience, top up with M-Pesa and keep your customers in the conversation.
Create your workspace