A shop owner says what they want.
A compliant campaign goes out.
NGAIGE is mobile engagement for small businesses — consent, campaigns, delivery and the receipts that prove it. This is the door your application knocks on.
Eleven routes carry a business from “here we are” to “the campaign went out, here’s what it cost”. There is nothing else to learn.
What the platform actually does
Consent is the product
People opt in, and the proof travels with them. Every import carries exactly one carrier of consent — an attestation or a saved evidence record, never both, never neither. STOP is permanent and beats everything, everywhere.
A human always says go
A campaign moves draft → plan → submit → approve → send, and the approval names a person. That name is written into the record. Automation can draft and dispatch; it can never approve. The gate is the point.
Every number is evidence
Delivery, spend and stop counts all fold from the same events, hash-chained and verifiable. What your dashboard shows is what an auditor would find.
Your first campaign, in five minutes
You need one thing: an API key from your NGAIGE operator. It looks like
nk_<id>_<secret> and it decides which business you are — there is no
tenant to pass anywhere.
- Register the business. A name, and the sender ID that shows on the handset.
- Bring your consented list. A CSV of
msisdn,consent,consented_at, plus one carrier of proof. - Draft the message, then ask for a plan — who it reaches and what it should cost.
- Submit, then have a person approve it by name.
- Dispatch. Stopped numbers are skipped and named back to you.
Copy-paste versions in Go and TypeScript below — both are exercised against the live service, not written from the spec.
The eleven routes
Bearer auth on every call. Idempotency-Key on every mutating POST,
so a retry can never send twice. Refusals arrive as
application/problem+json with a machine-readable type — branch on
that, never on the English.
SDKs
Go
import "github.com/con5ult/ngaige-go/ngaige"
c := ngaige.New(baseURL, key)
biz, _ := c.CreateBusiness(ctx, "Ta Karm Bakery", "TaKarm", "")
camp, _ := c.CreateDraft(ctx, "tuesday-offer", goal, audience,
"Free coffee with any book. Reply STOP to opt out.",
time.Now().Add(30*time.Minute), "")
c.GeneratePlan(ctx, camp.ID, "")
c.Submit(ctx, camp.ID, "")
c.Approve(ctx, camp.ID, "owner:glen", "") // a person, by name
c.Dispatch(ctx, camp.ID, targets, "")
TypeScript
import { Ngaige } from "@con5ult/ngaige";
const ng = new Ngaige(key);
const biz = await ng.createBusiness("Ta Karm Bakery", "TaKarm");
const camp = await ng.createDraft({
name: "tuesday-offer", goal, audience,
message: "Free coffee with any book. Reply STOP to opt out.",
schedule: new Date(Date.now() + 30*60_000),
});
await ng.generatePlan(camp.id);
await ng.submit(camp.id);
await ng.approve(camp.id, "owner:glen"); // a person, by name
await ng.dispatch(camp.id, targets);
Both SDKs carry the sharp edges for you. Schedules are truncated to whole seconds (fractional seconds create a campaign the service will never plan). Idempotency keys are generated and reused correctly on retry. Rate limits are honoured once, automatically. Refusals come back as typed values you can switch on.
Try it, right here
Paste a key and make a real call against the live service. Your key stays in this browser tab — it is never stored, logged or sent anywhere but the API.
Reads are safe to poke at. POST calls do real things — they create
real records against whatever tenant your key belongs to.
Two applications, built on exactly these routes
TownCrier
An independent third-party app: a shop owner pastes a key and runs campaigns from their phone. Live segment and cost meter, the consent rules surfaced kindly, and the whole approval pipeline as a visible stepper.
Luzzu Mobile
An operator embedding NGAIGE inside its own subscriber app — including a staff console that mints subscriber keys live. The operator keeps its own world; the key is the only bridge.
The long-form guides
- Channel API — the full route reference, every example executed against a live boot
- Reference client guide — the conventions any language must implement
- Executive overview — the one-pager for decision makers
- openapi.json — machine-readable, generate a client in any language