Skip to main content

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:manage
  • notifications:send
  • notifications:send_raw
  • notifications: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.

Backend secret

Keep the application API key on your backend. Your frontend uses a short-lived user token.