Limits and usage

Every account has the same limits during the beta. Each send tells you how much of today's allowance is left.

Limits

  • 500 messages a day per account, counted per accepted send (a message to three phones counts once), reset at 00:00 UTC. Test notifications from the app and refused sends don't count.
  • 10 sends a second per app token.
  • 3 paired phones and 100 topics per account.
  • Messages are kept on our servers for 30 days (backups for 7). Phones keep their own copy until you delete it.

Your account's own limits are on the dashboard's Account page.

Usage headers

Every successful send returns the account's daily usage, so a script can slow down before it is refused.

The headers follow the IETF RateLimit header fields draft. In RateLimit-Policy, q is the daily quota and w the window in seconds. In RateLimit, r is how many sends are left today after this one and t the seconds until the count resets at 00:00 UTC.

HeaderDescription
RateLimit-Policy
string
The quota policy, for example "daily";q=500;w=86400: q messages per window of w seconds.
RateLimit
string
What is left of that policy, for example "daily";r=487;t=40213: r messages remaining (after this one) and t seconds until the count resets.
curl -i -H "Authorization: Bearer pba_…" -d "Nightly backup completed in 4 min" https://peskybird.app/api/push/topics/alerts

HTTP/2 201
ratelimit-policy: "daily";q=500;w=86400
ratelimit: "daily";r=487;t=7098
…

To check usage without sending, use Check your limits. It returns the same numbers, plus your topic and device counts.

At the limit

A send over the daily limit gets 429 rate_limited with the same headers and Retry-After, the seconds until the reset. Its error details carry limit, max and resetAt. Nothing is queued: sends fail until the reset.

Going over the per-second limit also gets 429 rate_limited, with Retry-After: 1 and no usage headers. Wait a second and try again.

Header on 429Description
RateLimit-Policy
string
The quota policy, for example "daily";q=500;w=86400: q messages per window of w seconds.
RateLimit
string
What is left of that policy, for example "daily";r=487;t=40213: r messages remaining (after this one) and t seconds until the count resets.
Retry-After
integer
Seconds to wait before sending again.