API
1. Send Notifications
POST https://send.meowpush.com/
Content-Type: application/jsonCommon Request Fields
key: A single Device, Group, or Application Push Keykeys: Device and Group Push Keys can be mixed for batch delivery, up to 50, without duplicates
key and keys cannot be used together in the same request.
Restriction: An Application Push Key must be used alone in a request. It cannot be combined with other application, device, or group keys for batch delivery.
Push Request Fields
| Field | Type | Description |
|---|---|---|
title | String, 1–256 characters | Notification title |
subtitle | String, 1–256 characters | Notification subtitle; presentation varies by platform |
body | String, 1–4000 characters | Notification content |
level | passive, active, time-sensitiveDefault: active | |
badge | Integer, 0–99 | Absolute badge value; 0 clears the badge |
icon | HTTPS URL, 1–2048 characters | Source avatar or icon; presentation varies by platform |
image | HTTPS URL, 1–2048 characters | Notification media image; presentation varies by platform |
url | URI, 1–2048 characters | Link attached to the notification and opened when it is tapped |
group | String, 1–64 characters | Places related notifications in the same group |
collapse_id | [A-Za-z0-9_-]{1,32} | Replaces previously displayed content with the same identifier |
ttl | Integer in seconds, 0–2419200 Default: 86400 | Notification lifetime |
data | JSON object | Custom data passed to the app |
All message fields except body are optional.
Response
A successfully processed request returns a summary of the final delivery results. Example response:
{
"notification_id": "019cf5f1-7f2d-7d18-8be1-6f27e1916b52",
"accepted": 1,
"failed": 0,
"results": [
{
"key": "mpdv0000000000000001",
"source_keys": ["mpdv0000000000000001"],
"status": "accepted",
"transport": "apns",
"message_id": "provider-message-id"
}
]
}| Field | Description |
|---|---|
notification_id | Server-side notification identifier for this Push Request |
accepted / failed | Final counts of accepted and failed devices |
results[].key | Primary source Push Key for this result |
results[].source_keys | Source Push Keys that resolved to the same final device |
results[].status | accepted or failed |
results[].transport | apns, fcm, hms, wns, or unifiedpush; may be null when no device was resolved |
results[].message_id | Optional message identifier returned by the upstream service |
results[].reason | Stable reason code for a failed result |
results[].retry_at | Earliest retry time that may be returned when quota is exhausted |
accepted only means that the corresponding upstream push service, such as APNs or FCM, accepted the message for delivery. Final delivery usually occurs shortly after the response and depends on the upstream service and device state.
Rate Limit
Rate limit per IP address: 100 requests per second.
2. Request Application Authorization
This API lets programs request authorization to create an application. AI agents, scripts, tasks, third-party applications, and platforms can use it to quickly request a dedicated Push Key for sending notifications to a user.
When creating an application, the requester should provide its application name, purpose, and other details. Give the user the returned authorization_url to request authorization, then query or poll the result to retrieve the Application Push Key.
Create an Authorization Request
POST https://accounts.meowpush.com/api/v1/application-authorization-requests
Content-Type: application/jsonRequest Fields
| Field | Type | Description |
|---|---|---|
mode | create or reauthorize | Authorization request mode. Required |
application_id | String | Identifies an existing application authorization; required in reauthorize, omitted in create |
metadata | JSON object | Basic application details; must include name for creation, and can be {} for reauthorization. Required |
There are two request modes (mode): create requests a new application authorization, and reauthorize requests authorization again for an existing authorized application.
mode | Authorization | Request body |
|---|---|---|
create | Not required | mode and metadata; metadata.name is required |
reauthorize | Bearer <reauthorization_token> | mode, application_id, and metadata; the application ID and credential come from an existing authorization |
Example request for a new application authorization:
{
"mode": "create",
"metadata": { "name": "Daily Summary" }
}Example reauthorization request:
{
"mode": "reauthorize",
"application_id": "019f1000-0000-7000-8000-000000000017",
"metadata": {}
}metadata fields:
| Field | Type | Description |
|---|---|---|
name | String, 1–64 Unicode characters; required for creation | Application name |
description | String, up to 1024 Unicode characters | Application description |
website_url | HTTP(S) URL, up to 2048 bytes | Application website link |
icon_url | HTTPS URL, up to 2048 bytes | Application icon |
In reauthorization, omitted fields keep their values and null clears optional fields. When the user approves reauthorization, the existing Push Key remains unchanged and no new reauthorization credential is returned.
Response
A successful authorization request returns HTTP 201. Example:
{
"request_id": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
"authorization_url": "https://accounts.meowpush.com/new-app?rid=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
"poll_secret": "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBA",
"expires_at": "2026-10-10T05:00:00.000Z",
"poll_interval_seconds": 2
}| Field | Description |
|---|---|
request_id | Identifies this authorization request; used to query its result |
authorization_url | Private authorization invitation link to give to the user |
poll_secret | Result-query credential intended only for temporary use by the requester |
expires_at | Authorization request expiry time, in UTC |
poll_interval_seconds | Minimum result-query interval, in seconds |
Query the Authorization Result
This endpoint queries the result of an authorization request. It is usually called when the user returns after opening the authorization link, or polled periodically by the requester.
GET https://accounts.meowpush.com/api/v1/application-authorization-requests/<request_id>/result
Authorization: Bearer <poll_secret>Response
Success returns HTTP 200. Example:
{
"status": "approved",
"result": {
"application_id": "019f1000-0000-7000-8000-000000000017",
"push_key": "mpap00000000000000000000000001",
"reauthorization_token": "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCA",
"key_version": 1,
"connection_version": 1,
"expires_at": "2026-10-10T04:15:00.000Z"
},
"expires_at": "2026-10-10T04:15:00.000Z",
"poll_interval_seconds": 2
}| Field | Description |
|---|---|
status | Authorization request status; possible values are listed below |
result | Application credential object for a valid approved status; null for all other statuses |
expires_at | Request or retrieval deadline, in UTC; see below for its meaning |
poll_interval_seconds | Minimum result-query interval, in seconds |
result.application_id | Identifier of the created application; can be stored and used for reauthorization |
result.push_key | Application Push Key for Send Notifications |
result.reauthorization_token | Optional reauthorization credential; omitted from reauthorization results, so keep the original credential |
result.key_version / result.connection_version | Push Key and connection credential versions |
result.expires_at | Deadline for retrieving this credential result |
Possible status values:
status | result | Recommended handling |
|---|---|---|
pending | null | Continue polling at the poll_interval_seconds interval |
approved | Application credential object | Authorized. Save the credentials and stop polling |
rejected | null | The user rejected the request. Stop polling |
expired | null | The request or retrieval window expired. Stop polling |
invalidated | null | The request is invalid. Stop polling |
The top-level expires_at is the request deadline in pending (1 hour by default) and the deadline for retrieving the result in approved (30 minutes after approval by default).
Error Responses
Non-2xx responses use {"error": {"code": "…", "message": "…"}}. Handle them according to error.code.
| HTTP | error.code | Recommended handling |
|---|---|---|
429 | rate_limited | Wait the number of seconds specified by Retry-After |
404 | application_authorization_request_not_found | The request or retrieval credential is inaccessible. Stop querying |
