Skip to content

List notifications for an app​

GET
/v1/apps/{app_id}/notifications

Lists notifications newest-first, optionally filtered by ?status=, paginated via ?limit=&cursor=.

Authorizations​

SessionAuth

Admin session cookie set by POST /v1/auth/login. Dashboard-only management.

Type
API Key (cookie: notti_session)
or
RESTKeyAuth

App REST key (rk_...). Server-to-server calls.

Type
HTTP (bearer)

Parameters​

Path Parameters

app_id*

App ID

Type
string
Required

Query Parameters

status

Filter by status: pending, scheduled, cancelled, sent, partial_failure, failed

Type
string
source

Filter by source: api, dashboard, mcp

Type
string
search

Case-insensitive substring search across campaign name, title, and body (max 200 characters)

Type
string
label

Filter by label; repeatable for AND (case-insensitive)

Type
string
limit

Page size (1-100, default 50)

Type
integer
cursor

Pagination cursor

Type
string

Responses​

{"items": [notificationResponse], "next_cursor": string|null}

application/json
JSON
{
}

Playground​

Authorization
Variables
Key
Value

Samples​


Send a notification​

POST
/v1/apps/{app_id}/notifications

Creates a Notification targeting devices, a segment, or an external user, and enqueues delivery (or schedules it for send_at). Either template_id, both ad_hoc_title/ad_hoc_body, or data_only with a non-empty data payload is required. Repeating the same Idempotency-Key header returns the original notification instead of creating a duplicate. target_value accepts at most 50,000 values and the request body at most 5 MiB.

Authorizations​

SessionAuth

Admin session cookie set by POST /v1/auth/login. Dashboard-only management.

Type
API Key (cookie: notti_session)
or
RESTKeyAuth

App REST key (rk_...). Server-to-server calls.

Type
HTTP (bearer)

Parameters​

Header Parameters

Idempotency-Key

Idempotency key; a repeated key returns the original notification

Type
string

Path Parameters

app_id*

App ID

Type
string
Required

Request Body​

application/json
JSON
{
  
"ad_hoc_body": "string",
  
"ad_hoc_title": "string",
  
"data": {
  
  
"additionalProperties": null
  
},
  
"data_only": true,
  
"image_url": "string",
  
"labels": [
  
  
"string"
  
],
  
"options": {
  
  
"android": {
  
  
  
"channel_id": "string",
  
  
  
"color": "string",
  
  
  
"icon": "string",
  
  
  
"led_color": "string",
  
  
  
"priority": "string",
  
  
  
"sound": "string",
  
  
  
"tag": "string",
  
  
  
"visibility": "string"
  
  
},
  
  
"collapse_id": "string",
  
  
"ios": {
  
  
  
"category": "string",
  
  
  
"content_available": true,
  
  
  
"interruption_level": "string",
  
  
  
"relevance_score": 0,
  
  
  
"sound": "string",
  
  
  
"target_content_id": "string",
  
  
  
"thread_id": "string"
  
  
},
  
  
"platforms": [
  
  
  
"string"
  
  
],
  
  
"priority": "string",
  
  
"ttl_seconds": 0
  
},
  
"send_at": "string",
  
"subtitle": "string",
  
"target_type": "string",
  
"target_value": [
  
  
"string"
  
],
  
"template_id": "string"
}

Responses​

Returned instead of 201 when the same Idempotency-Key was already used

application/json
JSON
{
  
"ad_hoc_body": "string",
  
"ad_hoc_title": "string",
  
"app_id": "string",
  
"created_at": "string",
  
"ctr": 0,
  
"data": {
  
  
"additionalProperties": null
  
},
  
"delivered_count": 0,
  
"id": "string",
  
"idempotency_key": "string",
  
"image_expired": true,
  
"image_url": "string",
  
"labels": [
  
  
"string"
  
],
  
"options": {
  
  
"android": {
  
  
  
"channel_id": "string",
  
  
  
"color": "string",
  
  
  
"icon": "string",
  
  
  
"led_color": "string",
  
  
  
"priority": "string",
  
  
  
"sound": "string",
  
  
  
"tag": "string",
  
  
  
"visibility": "string"
  
  
},
  
  
"collapse_id": "string",
  
  
"ios": {
  
  
  
"category": "string",
  
  
  
"content_available": true,
  
  
  
"interruption_level": "string",
  
  
  
"relevance_score": 0,
  
  
  
"sound": "string",
  
  
  
"target_content_id": "string",
  
  
  
"thread_id": "string"
  
  
},
  
  
"platforms": [
  
  
  
"string"
  
  
],
  
  
"priority": "string",
  
  
"ttl_seconds": 0
  
},
  
"received_count": 0,
  
"send_at": "string",
  
"skipped_plan_limit_count": 0,
  
"source": "string",
  
"started_sending_at": "string",
  
"status": "string",
  
"subtitle": "string",
  
"target_type": "string",
  
"target_value": [
  
  
"string"
  
],
  
"template_id": "string",
  
"version": 0
}

Playground​

Authorization
Headers
Variables
Key
Value
Body

Samples​


Summarize an app's notifications by status​

GET
/v1/apps/{app_id}/notifications/summary

Returns lifetime per-status notification counts for an App: all, sent, scheduled, failed.

Authorizations​

SessionAuth

Admin session cookie set by POST /v1/auth/login. Dashboard-only management.

Type
API Key (cookie: notti_session)
or
RESTKeyAuth

App REST key (rk_...). Server-to-server calls.

Type
HTTP (bearer)

Parameters​

Path Parameters

app_id*

App ID

Type
string
Required

Responses​

OK

application/json
JSON
{
  
"all": 0,
  
"failed": 0,
  
"scheduled": 0,
  
"sent": 0
}

Playground​

Authorization
Variables
Key
Value

Samples​


Get a notification​

GET
/v1/apps/{app_id}/notifications/{id}

Fetches a single Notification by ID, scoped to the App.

Authorizations​

SessionAuth

Admin session cookie set by POST /v1/auth/login. Dashboard-only management.

Type
API Key (cookie: notti_session)
or
RESTKeyAuth

App REST key (rk_...). Server-to-server calls.

Type
HTTP (bearer)

Parameters​

Path Parameters

app_id*

App ID

Type
string
Required
id*

Notification ID

Type
string
Required

Responses​

OK

application/json
JSON
{
  
"ad_hoc_body": "string",
  
"ad_hoc_title": "string",
  
"app_id": "string",
  
"created_at": "string",
  
"ctr": 0,
  
"data": {
  
  
"additionalProperties": null
  
},
  
"delivered_count": 0,
  
"id": "string",
  
"idempotency_key": "string",
  
"image_expired": true,
  
"image_url": "string",
  
"labels": [
  
  
"string"
  
],
  
"options": {
  
  
"android": {
  
  
  
"channel_id": "string",
  
  
  
"color": "string",
  
  
  
"icon": "string",
  
  
  
"led_color": "string",
  
  
  
"priority": "string",
  
  
  
"sound": "string",
  
  
  
"tag": "string",
  
  
  
"visibility": "string"
  
  
},
  
  
"collapse_id": "string",
  
  
"ios": {
  
  
  
"category": "string",
  
  
  
"content_available": true,
  
  
  
"interruption_level": "string",
  
  
  
"relevance_score": 0,
  
  
  
"sound": "string",
  
  
  
"target_content_id": "string",
  
  
  
"thread_id": "string"
  
  
},
  
  
"platforms": [
  
  
  
"string"
  
  
],
  
  
"priority": "string",
  
  
"ttl_seconds": 0
  
},
  
"received_count": 0,
  
"send_at": "string",
  
"skipped_plan_limit_count": 0,
  
"source": "string",
  
"started_sending_at": "string",
  
"status": "string",
  
"subtitle": "string",
  
"target_type": "string",
  
"target_value": [
  
  
"string"
  
],
  
"template_id": "string",
  
"version": 0
}

Playground​

Authorization
Variables
Key
Value

Samples​


Cancel a scheduled notification​

DELETE
/v1/apps/{app_id}/notifications/{id}

Cancels a Notification that is still in "scheduled" state. Fails if the notification is not in that state.

Authorizations​

SessionAuth

Admin session cookie set by POST /v1/auth/login. Dashboard-only management.

Type
API Key (cookie: notti_session)
or
RESTKeyAuth

App REST key (rk_...). Server-to-server calls.

Type
HTTP (bearer)

Parameters​

Path Parameters

app_id*

App ID

Type
string
Required
id*

Notification ID

Type
string
Required

Responses​

OK

application/json
JSON
{
  
"ad_hoc_body": "string",
  
"ad_hoc_title": "string",
  
"app_id": "string",
  
"created_at": "string",
  
"ctr": 0,
  
"data": {
  
  
"additionalProperties": null
  
},
  
"delivered_count": 0,
  
"id": "string",
  
"idempotency_key": "string",
  
"image_expired": true,
  
"image_url": "string",
  
"labels": [
  
  
"string"
  
],
  
"options": {
  
  
"android": {
  
  
  
"channel_id": "string",
  
  
  
"color": "string",
  
  
  
"icon": "string",
  
  
  
"led_color": "string",
  
  
  
"priority": "string",
  
  
  
"sound": "string",
  
  
  
"tag": "string",
  
  
  
"visibility": "string"
  
  
},
  
  
"collapse_id": "string",
  
  
"ios": {
  
  
  
"category": "string",
  
  
  
"content_available": true,
  
  
  
"interruption_level": "string",
  
  
  
"relevance_score": 0,
  
  
  
"sound": "string",
  
  
  
"target_content_id": "string",
  
  
  
"thread_id": "string"
  
  
},
  
  
"platforms": [
  
  
  
"string"
  
  
],
  
  
"priority": "string",
  
  
"ttl_seconds": 0
  
},
  
"received_count": 0,
  
"send_at": "string",
  
"skipped_plan_limit_count": 0,
  
"source": "string",
  
"started_sending_at": "string",
  
"status": "string",
  
"subtitle": "string",
  
"target_type": "string",
  
"target_value": [
  
  
"string"
  
],
  
"template_id": "string",
  
"version": 0
}

Playground​

Authorization
Variables
Key
Value

Samples​


Edit a scheduled notification​

PATCH
/v1/apps/{app_id}/notifications/{id}

Edits a Notification that is still in "scheduled" state, in place. Only the fields sent change; a field sent as null is cleared where that is valid (subtitle, image_url, data, labels, options, template_id, ad_hoc_title, ad_hoc_body). target_type may switch among device_ids, external_user_ids and segment_id, and is sent together with target_value. send_at must be in the future. The body accepts an optional version: when it differs from the stored version the call fails with 409 version_conflict and changes nothing; without it the last write wins: an edit that collides with another is retried, and only after repeated collisions does the call fail with 409 version_conflict. A body with no field to change is rejected with 422 invalid_body. Returns 422 not_scheduled once the notification was released or cancelled, or its send_at has passed. source cannot be edited. Same validation, target_value limit of 50,000 values and 5 MiB body limit as creating.

Authorizations​

SessionAuth

Admin session cookie set by POST /v1/auth/login. Dashboard-only management.

Type
API Key (cookie: notti_session)
or
RESTKeyAuth

App REST key (rk_...). Server-to-server calls.

Type
HTTP (bearer)

Parameters​

Path Parameters

app_id*

App ID

Type
string
Required
id*

Notification ID

Type
string
Required

Request Body​

application/json
JSON
{
  
"ad_hoc_body": "string",
  
"ad_hoc_title": "string",
  
"data": {
  
  
"additionalProperties": null
  
},
  
"image_url": "string",
  
"labels": [
  
  
"string"
  
],
  
"options": {
  
  
"android": {
  
  
  
"channel_id": "string",
  
  
  
"color": "string",
  
  
  
"icon": "string",
  
  
  
"led_color": "string",
  
  
  
"priority": "string",
  
  
  
"sound": "string",
  
  
  
"tag": "string",
  
  
  
"visibility": "string"
  
  
},
  
  
"collapse_id": "string",
  
  
"ios": {
  
  
  
"category": "string",
  
  
  
"content_available": true,
  
  
  
"interruption_level": "string",
  
  
  
"relevance_score": 0,
  
  
  
"sound": "string",
  
  
  
"target_content_id": "string",
  
  
  
"thread_id": "string"
  
  
},
  
  
"platforms": [
  
  
  
"string"
  
  
],
  
  
"priority": "string",
  
  
"ttl_seconds": 0
  
},
  
"send_at": "string",
  
"subtitle": "string",
  
"target_type": "string",
  
"target_value": [
  
  
"string"
  
],
  
"template_id": "string",
  
"version": 0
}

Responses​

OK

application/json
JSON
{
  
"ad_hoc_body": "string",
  
"ad_hoc_title": "string",
  
"app_id": "string",
  
"created_at": "string",
  
"ctr": 0,
  
"data": {
  
  
"additionalProperties": null
  
},
  
"delivered_count": 0,
  
"id": "string",
  
"idempotency_key": "string",
  
"image_expired": true,
  
"image_url": "string",
  
"labels": [
  
  
"string"
  
],
  
"options": {
  
  
"android": {
  
  
  
"channel_id": "string",
  
  
  
"color": "string",
  
  
  
"icon": "string",
  
  
  
"led_color": "string",
  
  
  
"priority": "string",
  
  
  
"sound": "string",
  
  
  
"tag": "string",
  
  
  
"visibility": "string"
  
  
},
  
  
"collapse_id": "string",
  
  
"ios": {
  
  
  
"category": "string",
  
  
  
"content_available": true,
  
  
  
"interruption_level": "string",
  
  
  
"relevance_score": 0,
  
  
  
"sound": "string",
  
  
  
"target_content_id": "string",
  
  
  
"thread_id": "string"
  
  
},
  
  
"platforms": [
  
  
  
"string"
  
  
],
  
  
"priority": "string",
  
  
"ttl_seconds": 0
  
},
  
"received_count": 0,
  
"send_at": "string",
  
"skipped_plan_limit_count": 0,
  
"source": "string",
  
"started_sending_at": "string",
  
"status": "string",
  
"subtitle": "string",
  
"target_type": "string",
  
"target_value": [
  
  
"string"
  
],
  
"template_id": "string",
  
"version": 0
}

Playground​

Authorization
Variables
Key
Value
Body

Samples​


List a notification's deliveries​

GET
/v1/apps/{app_id}/notifications/{id}/deliveries

Lists the per-device delivery attempts and their status for a Notification, paginated via ?limit=&cursor=.

Authorizations​

SessionAuth

Admin session cookie set by POST /v1/auth/login. Dashboard-only management.

Type
API Key (cookie: notti_session)
or
RESTKeyAuth

App REST key (rk_...). Server-to-server calls.

Type
HTTP (bearer)

Parameters​

Path Parameters

app_id*

App ID

Type
string
Required
id*

Notification ID

Type
string
Required

Query Parameters

limit

Max items per page (default 50)

Type
integer
cursor

Pagination cursor

Type
string

Responses​

{"items": [deliveryResponse], "next_cursor": string|null}

application/json
JSON
{
}

Playground​

Authorization
Variables
Key
Value

Samples​


Summarize a notification's deliveries​

GET
/v1/apps/{app_id}/notifications/{id}/deliveries/summary

Returns the per-status delivery counts and a per-error breakdown of failed deliveries for a Notification.

Authorizations​

SessionAuth

Admin session cookie set by POST /v1/auth/login. Dashboard-only management.

Type
API Key (cookie: notti_session)
or
RESTKeyAuth

App REST key (rk_...). Server-to-server calls.

Type
HTTP (bearer)

Parameters​

Path Parameters

app_id*

App ID

Type
string
Required
id*

Notification ID

Type
string
Required

Responses​

OK

application/json
JSON
{
  
"by_error": [
  
  
{
  
  
  
"count": 0,
  
  
  
"error": "string"
  
  
}
  
],
  
"by_status": {
  
  
"additionalProperties": 0
  
}
}

Playground​

Authorization
Variables
Key
Value

Samples​


Report a notification engagement event​

POST
/v1/apps/{app_id}/notifications/{id}/events

Reports a received, opened, or clicked event against a notification, authenticated by Client key with the device's token as ownership proof. Device-facing only. Overview analytics count a sent delivery as opened when it has an opened or clicked event.

Authorizations​

ClientKeyAuth

App Client key (ck_...). Device-facing calls only.

Type
HTTP (bearer)

Parameters​

Path Parameters

app_id*

App ID

Type
string
Required
id*

Notification ID

Type
string
Required

Request Body​

application/json
JSON
{
  
"delivery_id": "string",
  
"token": "string",
  
"type": "string"
}

Responses​

Created

application/json
JSON
{
  
"created_at": "string",
  
"delivery_id": "string",
  
"id": "string",
  
"notification_id": "string",
  
"type": "string"
}

Playground​

Authorization
Variables
Key
Value
Body

Samples​


Powered by VitePress OpenAPI