Skip to content

API ​

1. Send Notifications ​

text
POST https://send.meowpush.com/
Content-Type: application/json

Common Request Fields ​

  • key: A single Device, Group, or Application Push Key
  • keys: 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 ​

FieldTypeDescription
titleString, 1–256 charactersNotification title
subtitleString, 1–256 charactersNotification subtitle; presentation varies by platform
bodyString, 1–4000 charactersNotification content
levelpassive, active, time-sensitive
Default: active
badgeInteger, 0–99Absolute badge value; 0 clears the badge
iconHTTPS URL, 1–2048 charactersSource avatar or icon; presentation varies by platform
imageHTTPS URL, 1–2048 charactersNotification media image; presentation varies by platform
urlURI, 1–2048 charactersLink attached to the notification and opened when it is tapped
groupString, 1–64 charactersPlaces related notifications in the same group
collapse_id[A-Za-z0-9_-]{1,32}Replaces previously displayed content with the same identifier
ttlInteger in seconds, 0–2419200
Default: 86400
Notification lifetime
dataJSON objectCustom 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:

json
{
  "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"
    }
  ]
}
FieldDescription
notification_idServer-side notification identifier for this Push Request
accepted / failedFinal counts of accepted and failed devices
results[].keyPrimary source Push Key for this result
results[].source_keysSource Push Keys that resolved to the same final device
results[].statusaccepted or failed
results[].transportapns, fcm, hms, wns, or unifiedpush; may be null when no device was resolved
results[].message_idOptional message identifier returned by the upstream service
results[].reasonStable reason code for a failed result
results[].retry_atEarliest 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 ​

text
POST https://accounts.meowpush.com/api/v1/application-authorization-requests
Content-Type: application/json

Request Fields ​

FieldTypeDescription
modecreate or reauthorizeAuthorization request mode. Required
application_idStringIdentifies an existing application authorization; required in reauthorize, omitted in create
metadataJSON objectBasic 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.

modeAuthorizationRequest body
createNot requiredmode and metadata; metadata.name is required
reauthorizeBearer <reauthorization_token>mode, application_id, and metadata; the application ID and credential come from an existing authorization

Example request for a new application authorization:

json
{
  "mode": "create",
  "metadata": { "name": "Daily Summary" }
}

Example reauthorization request:

json
{
  "mode": "reauthorize",
  "application_id": "019f1000-0000-7000-8000-000000000017",
  "metadata": {}
}

metadata fields:

FieldTypeDescription
nameString, 1–64 Unicode characters; required for creationApplication name
descriptionString, up to 1024 Unicode charactersApplication description
website_urlHTTP(S) URL, up to 2048 bytesApplication website link
icon_urlHTTPS URL, up to 2048 bytesApplication 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:

json
{
  "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
}
FieldDescription
request_idIdentifies this authorization request; used to query its result
authorization_urlPrivate authorization invitation link to give to the user
poll_secretResult-query credential intended only for temporary use by the requester
expires_atAuthorization request expiry time, in UTC
poll_interval_secondsMinimum 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.

text
GET https://accounts.meowpush.com/api/v1/application-authorization-requests/<request_id>/result
Authorization: Bearer <poll_secret>

Response ​

Success returns HTTP 200. Example:

json
{
  "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
}
FieldDescription
statusAuthorization request status; possible values are listed below
resultApplication credential object for a valid approved status; null for all other statuses
expires_atRequest or retrieval deadline, in UTC; see below for its meaning
poll_interval_secondsMinimum result-query interval, in seconds
result.application_idIdentifier of the created application; can be stored and used for reauthorization
result.push_keyApplication Push Key for Send Notifications
result.reauthorization_tokenOptional reauthorization credential; omitted from reauthorization results, so keep the original credential
result.key_version / result.connection_versionPush Key and connection credential versions
result.expires_atDeadline for retrieving this credential result

Possible status values:

statusresultRecommended handling
pendingnullContinue polling at the poll_interval_seconds interval
approvedApplication credential objectAuthorized. Save the credentials and stop polling
rejectednullThe user rejected the request. Stop polling
expirednullThe request or retrieval window expired. Stop polling
invalidatednullThe 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.

HTTPerror.codeRecommended handling
429rate_limitedWait the number of seconds specified by Retry-After
404application_authorization_request_not_foundThe request or retrieval credential is inaccessible. Stop querying