Quickstart
This example uses the staging API and the built-in in_app channel, so no external provider is required.
1. Prepare an application and key
In Notify Console, select your tenant, create or open a staging application, and create an API key with:
accounts:managenotifications:sendnotifications:send_rawnotifications:read
The raw-content scope is required because this example sends subject and body directly. Template-based sending does not require it. See Scopes and permissions.
Copy the key when shown and store it in your backend secret store. Export it in a trusted shell for this test:
export NOTIFY_URL='https://beta.api.notify.callistech.co.id'
export NOTIFY_API_KEY='REPLACE_WITH_YOUR_APPLICATION_API_KEY'
2. Synchronize a customer account
curl --fail-with-body --request PUT "$NOTIFY_URL/v1/accounts/org-123" \
--header "Authorization: Bearer $NOTIFY_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"display_name": "Example Customer",
"metadata": {"source": "example-app"}
}'
Here org-123 is your own permanent organization ID. The operation creates or updates that account.
3. Send a notification
curl --fail-with-body --request POST "$NOTIFY_URL/v1/notifications" \
--header "Authorization: Bearer $NOTIFY_API_KEY" \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: invoice-paid-INV-10001-v1' \
--data '{
"account_key": "org-123",
"event_key": "billing.invoice.paid",
"recipient": {"external_user_id": "user-42"},
"channels": ["in_app"],
"locale": "en-US",
"subject": "Payment received",
"body": "Payment for invoice INV-10001 was successful."
}'
A successful request returns HTTP 202 and an id. Save that notification ID. Retrying the same key and payload returns the existing notification; changing the payload with the same key returns 409.
4. Inspect delivery status
curl --fail-with-body "$NOTIFY_URL/v1/notifications/NOTIFICATION_ID" \
--header "Authorization: Bearer $NOTIFY_API_KEY"
Replace NOTIFICATION_ID with the returned id. Delivery runs asynchronously, so inspect the response again if it is still queued.
5. Connect your UI
Follow User tokens and Inbox, realtime, and Web Push to show the message inside your application. Add users:token_issue to a dedicated backend credential when implementing that flow.
You can repeat these calls in Swagger API Reference. Paste the raw API key into Authorize → applicationApiKey, without typing Bearer.
Keep the application API key on your backend. Your frontend uses a short-lived user token.