Docs
Point your app at the sandbox instead of a real gateway.
Notify-Sim answers on the same paths your provider does, with the same response bodies, so switching to it is a base-URL change and nothing else. This reference is public - read it, copy from it, decide whether the product fits, then sign in when you want keys of your own.
The whole change
Every provider surface is reached by pointing its base URL at api.notify-sim.io. Your sending code, templates, retries and error handling stay exactly as they are.
# SMS through a SmartPing/SPARC-style gateway SMS_API_BASE=https://api.notify-sim.io SMS_USERNAME=np_xxxxxxxxxxxx SMS_PASSWORD=nss_xxxxxxxx… # WhatsApp Cloud API WA_API_URL=https://api.notify-sim.io/v25.0 WA_PHONE_ID=1099xxxxxxxxxxx WA_TOKEN=nss_xxxxxxxx… # Email over SMTP - any library, any language SMTP_HOST=smtp.notify-sim.io SMTP_PORT=2587 SMTP_USER=np_xxxxxxxxxxxx SMTP_PASSWORD=nss_xxxxxxxx… SMTP_USE_TLS=true
Credentials, and where they come from
A project has three identifiers. None of them is a secret you have to invent - the console issues all three when you create the project, and shows them under Settings with the snippets above already filled in.
| Looks like | What it is | Used as |
|---|---|---|
| np_… | Project key | Gateway username, SMTP username, FCM project id |
| nss_… | Sandbox secret | Gateway password, SMTP password, bearer token where a provider takes one |
| nsk_… | API key | Reading the inbox and asserting in tests, over X-Api-Key |
Send your first message
One dialect per channel below, each returning what the real provider returns. Twelve more surfaces work the same way - MSG91, Route Mobile, Kaleyra, Twilio, Infobip, Amazon SNS and SES, Gupshup - and their environment blocks are printed for your project under Settings, with every path listed in the conformance report.
curl "https://api.notify-sim.io/fe/api/v1/send?username=np_xxxxxxxxxxxx\ &password=nss_xxxxxxxx&from=NSDEMO&to=919848012345\ &text=Your+code+is+482913&dltContentId=1707178343191145417" {"state":"SUBMIT_ACCEPTED","description":"Message submitted","transactionId":"…"}
curl -X POST https://api.notify-sim.io/v25.0/1099xxxxxxxxxxx/messages \ -H "Authorization: Bearer nss_xxxxxxxx…" \ -H "Content-Type: application/json" \ -d '{"messaging_product":"whatsapp","to":"919848012345", "type":"template","template":{"name":"booking_confirmed", "language":{"code":"en"},"components":[{"type":"body", "parameters":[{"type":"text","text":"A-1204"}]}]}}' {"messaging_product":"whatsapp","contacts":[…],"messages":[{"id":"wamid.…"}]}
curl -X POST https://api.notify-sim.io/v3/mail/send \ -H "Authorization: Bearer nss_xxxxxxxx…" \ -H "Content-Type: application/json" \ -d '{"from":{"email":"noreply@yourapp.in"},"subject":"Receipt", "personalizations":[{"to":[{"email":"buyer@example.com"}]}], "content":[{"type":"text/plain","value":"Thanks!"}]}' 202 Accepted, X-Message-Id: …
curl -X POST https://api.notify-sim.io/--/api/v2/push/send \ -H "Authorization: Bearer nss_xxxxxxxx…" \ -H "Content-Type: application/json" \ -d '{"to":"ExponentPushToken[xxxxxxxx]","title":"Site visit", "body":"Tomorrow, 11:00"}' {"data":[{"status":"ok","id":"…"}]}
Read it back
Everything captured is visible two ways: in the console inbox, rendered as the recipient would see it, and over the assertion API with your nsk_ key.
curl -H "X-Api-Key: nsk_xxxxxxxx…" \ "https://api.notify-sim.io/v1/messages/latest?channel=sms&to=919848012345"
In tests you usually want to wait for the message rather than poll for it - that is the assertion API, which long-polls and fails your test with a readable message when nothing arrives.
Or run the whole thing on your laptop
The local edition is the same software with no account, no plan and no network dependency - useful in CI and on a plane. It listens on localhost:9925 with an SMTP gateway on 1025.
docker compose up -d
# inbox at http://localhost:9925, SMTP at localhost:1025
Reference
- Conformance report - every emulated surface, the exact paths and versions, the deterministic failure triggers, and an honest list of what is not emulated.
- Testing and CI - the assertion API, the Python SDK, a pytest example and a GitHub Actions job.
- Your project quickstart - the same instructions with your real keys, host and SMTP password filled in. Needs a sign-in, because it contains credentials.