Skip to main content

Quickstart

Send one notification, verify it was accepted, and check its delivery status. Walkable by a stranger in under ten minutes.

1. Sign up and get an API key​

  1. Open app.nervly.io and sign up with your email or Google OAuth.
  2. An initial workspace is created automatically on signup.
  3. Go to Developers in the sidebar.
  4. Click Create API Key. Choose Test for sandbox evaluation or Live for real dispatch.
  5. Copy your key (nervly_sk_test_... or nervly_sk_live_...).
The key is shown once

API keys are hashed with SHA-256 before storage; the plaintext token is never recoverable from the dashboard. Store it in your secret manager.

2. Connect a provider (or use Test Mode)​

  • Test Mode: If you use a nervly_sk_test_... key, no external provider configuration is needed! Nervly automatically short-circuits provider dispatch, records normal message timelines, and returns synthetic success without incurring telco charges.
  • Live Mode: Go to Providers in the dashboard and add your credentials for Termii, Postmark, SendGrid, or any supported provider. Click Test Connection to verify your credentials.

3. Verify gateway reachability​

Confirm you can reach the edge gateway without authentication:

curl https://api.nervly.io/v1/health
{
"status": "OK",
"service": "nervly-gateway",
"version": "0.1.0",
"environment": "production",
"deployment": "primary",
"key_mode": "any",
"uptime_seconds": 86400,
"nats_connected": true
}

4. Send a notification​

Trigger an event using cURL, the TypeScript/Node.js SDK, or standard HTTP client code in Python, Go, PHP, Rust, Java, C#, Ruby, or Swift:

curl -X POST https://api.nervly.io/v1/events/trigger \
--connect-timeout 5 \
--max-time 10 \
-H "Authorization: Bearer $NERVLY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "order-confirmed",
"to": {
"subscriberId": "sub_4920a",
"phone": "+2348012345678",
"email": "customer@example.com"
},
"payload": {
"orderId": "ORD-94102",
"amount": "15,000 NGN"
}
}'

Response:

{
"eventId": "evt_9c4f1a2b3d5e6f708192a3b4c5d6e7f8",
"status": "QUEUED",
"channel": "email",
"priority": "NORMAL",
"idempotencyKey": null,
"timestamp": "2026-09-11T21:00:00.000Z"
}

5. Check delivery status​

Query the live delivery status of your event:

curl https://api.nervly.io/v1/events/evt_9c4f1a2b3d5e6f708192a3b4c5d6e7f8 \
--connect-timeout 5 \
--max-time 10 \
-H "Authorization: Bearer $NERVLY_API_KEY"
{
"event_id": "evt_9c4f1a2b3d5e6f708192a3b4c5d6e7f8",
"event_name": "order-confirmed",
"subscriber_id": "sub_4920a",
"status": "DELIVERED",
"channel": "email",
"provider": "resend",
"priority": 3,
"attempts": 1,
"cost_micro_usd": 400,
"test_mode": false,
"variables_keys": ["orderId", "amount"],
"created_at": "2026-09-11T21:00:00.123Z",
"updated_at": "2026-09-11T21:00:01.456Z"
}

Or view the event visually in app.nervly.io/messages to see the delivery timeline.

6. Make the call safe to retry​

Add an Idempotency-Key header with a unique business identifier (e.g. order-ORD-94102):

curl -X POST https://api.nervly.io/v1/events/trigger \
--connect-timeout 5 \
--max-time 10 \
-H "Authorization: Bearer $NERVLY_API_KEY" \
-H "Idempotency-Key: order-ORD-94102" \
-H "Content-Type: application/json" \
-d '{ ... }'

If a network timeout occurs and your application retries, Nervly returns the cached response with 200 OK and prevents duplicate customer notifications.

Next steps​