Notify-Sim sandbox

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.

.env.test
# 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 likeWhat it isUsed 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

The sandbox secret is a sending credential, not an account password - it can only write into one project's inbox. Rotate it from Settings at any time.

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.

SMS - SmartPing / SPARC dialect
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":"…"}
WhatsApp - Meta Cloud API dialect
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.…"}]}
Email - SendGrid v3 dialect
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: …
Push - Expo dialect
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.

shell
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.

shell
docker compose up -d
# inbox at http://localhost:9925, SMTP at localhost:1025

Reference