Limits and regions
Regions and hosts
Section titled “Regions and hosts”An app lives in the region you pick when you create it, and your pages, service worker and server all talk to that region’s host. It can’t be moved later; create a new app in another region instead.
| Region | Host |
|---|---|
| Global (Frankfurt) | push-global-1.dockhive.io |
| United States | push-us.dockhive.io |
| Germany | push-de.dockhive.io |
| Portugal | push-pt.dockhive.io |
| Singapore | push-singapore.dockhive.io |
| Japan (Tokyo) | push-tokyo.dockhive.io |
| Hong Kong | push-hongkong.dockhive.io |
Use the host shown on the app’s page. A public key only works on its own region’s host; on another one the SDK gets 401 invalid_key.
Plan allowances
Section titled “Plan allowances”Allowances apply per account, in each region.
| Plan | Apps | Devices | Sends a day |
|---|---|---|---|
| Free | 2 | 10,000 | 50,000 |
| Developer | 10 | 100,000 | 500,000 |
| Pro | 50 | 1,000,000 | 5,000,000 |
| Scale | 200 | 10,000,000 | 50,000,000 |
Devices are the browsers that have turned notifications on and are still active, across all your apps in the region. When you reach the limit, new browsers are refused with 403 device_limit; browsers already registered keep working.
How sends are counted
Section titled “How sends are counted”A send is one browser delivery or one inbox item: a notification to 3 browsers of one user, with the inbox on, counts 4. The daily count resets at 00:00 UTC.
A send that would go over the daily limit is refused with 403 quota_exceeded. Scheduled notifications count on the day they go out, and are canceled with quota_exceeded if the limit has been reached by then. Upgrade your plan in Billing for more.
Other limits
Section titled “Other limits”| Limit | |
|---|---|
| Server API requests | 50 a second per app |
| Browser SDK requests | 120 a minute per IP address |
| Live inbox connections | 5 per user per app |
| Notification size | 4096 bytes encrypted (about 3.9 KB of content) |
| Title / body | 120 / 1000 characters |
| Targets per notification | 1000 user ids or device ids |
| Buttons | 2 per notification |
| Tags | 20 per device |
| Scheduling | Up to 30 days ahead |
ttl |
Up to 28 days |
| User tokens | Up to 30 days; user ids up to 200 characters |
| Inbox | 200 items per user, kept 90 days |
| Notification history | 30 days |
Error codes
Section titled “Error codes”Errors are JSON with a stable code and a readable error. The browser SDK throws them as HivePushError with the same code.
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_json |
The body is not a JSON object |
| 400 | invalid_target |
to must have exactly one of users, devices, tags, all; or ids or tags are malformed |
| 400 | invalid_title, invalid_body, invalid_url, invalid_icon, invalid_image, invalid_badge, invalid_tag, invalid_data, invalid_actions |
A content field is missing, too long or malformed |
| 400 | invalid_ttl, invalid_urgency, invalid_topic, invalid_send_at |
A delivery option is out of range |
| 400 | invalid_subscription |
The browser’s subscription is malformed or not from a supported browser |
| 400 | unsupported_platform |
Only web browsers can be registered from the browser SDK |
| 400 | invalid_tags, invalid_user_id, invalid_cursor, invalid_before, invalid_type, invalid_ids |
A parameter is malformed |
| 401 | unauthorized |
No secret key sent |
| 401 | invalid_api_key |
Wrong secret key for this app |
| 401 | invalid_key |
Unknown public key (check the key and the region host) |
| 401 | invalid_user_token |
Missing, malformed, expired or wrongly signed user token |
| 403 | origin_not_allowed |
The page’s website is not in the app’s allowed origins |
| 403 | quota_exceeded |
The send would go over your daily send limit |
| 403 | device_limit |
Your account has reached its device limit |
| 403 | app_disabled |
The account that owns the app is suspended |
| 404 | not_found |
Unknown app, notification, device or path |
| 409 | not_cancelable |
The notification is already sending or finished |
| 413 | payload_too_large |
The notification doesn’t fit the 4096-byte web push limit |
| 413 | too_large |
The request body is too large |
| 429 | rate_limited |
Too many requests; wait for Retry-After seconds |
| 429 | too_many_streams |
The user already has 5 live inbox connections |
| 503 | over_capacity, unavailable |
Temporarily unavailable; retry shortly |
| 500 | internal |
Something went wrong on our side; retry later |
The browser SDK adds unsupported, permission_denied, invalid_options and network (with status 0).