Push messagesBaseline · Widely available
The Push API subscribes to and receives server-initiated messages. Subscribers receive pushed messages in the background, even after periods inactive or offline.
Supported in all major browsers for at least 30 months — safe to use without fallbacks. Baseline since Mar 27, 2023. Widely available since Sep 27, 2025.
Browser support
DesktopChrome
1–49Not supported
50+Supportedsince Apr 13, 2016
Current: 155Edge
12–16Not supported
17+Supportedsince Apr 30, 2018
Current: 154Firefox
1–43Not supported
44+Supportedsince Jan 26, 2016
Current: 157Safari
1–15.6Not supported
16+Supportedsince Sep 12, 2022
Current: 27MobileChrome Android
18–49Not supported
50+Supportedsince Apr 13, 2016
Current: 155Firefox Android
4–47Not supported
48+Supportedsince Aug 2, 2016
Current: 157Safari iOS
1–16.3Not supported
16.4+Supportedsince Mar 27, 2023
Current: 27How to use
This feature is Baseline widely available — use it freely, no fallback needed.
Example
Full syntax and examples are on MDN: PushEvent.
Feature detection
JS · check before using
if ("PushEvent" in globalThis) {
// PushEvent is available
} else {
// load a polyfill or use a fallback
}Documentation (MDN)
Specification
Usage share
Sub-features
Support for each part of the feature (33). The overall table above shows when the whole feature works.
| Sub-feature | Chrome | Edge | Firefox | Safari | Chrome Android | Firefox Android | Safari iOS |
|---|---|---|---|---|---|---|---|
| Permissions.permission_push | 43 | 79 | 46 | 17 | 43 | 46 | 17 |
| PushEvent | 42 | 17 | 44 | 16 | 42 | 48 | 16.4 |
| PushEvent.PushEvent | 42 | 17 | 44 | 16 | 42 | 48 | 16.4 |
| PushEvent.data | 50 | 17 | 44 | 16 | 50 | 48 | 16.4 |
| PushManager | 42 | 17 | 44 | 16 | 42 | 48 | 16.4 |
| PushManager.getSubscription | 42 | 17 | 44 | 16 | 42 | 48 | 16.4 |
| PushManager.permissionState | 44 | 17 | 44 | 16 | 44 | 48 | 16.4 |
| PushManager.subscribe | 42 | 17 | 44 | 16 | 42 | 48 | 16.4 |
| PushManager.supportedContentEncodings_static | 60 | 17 | 134 | 16 | 60 | 134 | 16.4 |
| PushMessageData | 50 | 17 | 44 | 16 | 50 | 48 | 16.4 |
| PushMessageData.arrayBuffer | 50 | 17 | 44 | 16 | 50 | 48 | 16.4 |
| PushMessageData.blob | 50 | 17 | 44 | 16 | 50 | 48 | 16.4 |
| PushMessageData.bytes | 132 | 132 | 128 | 18 | 132 | 128 | 18 |
| PushMessageData.json | 50 | 17 | 44 | 16 | 50 | 48 | 16.4 |
| PushMessageData.text | 50 | 17 | 44 | 16 | 50 | 48 | 16.4 |
| PushSubscription | 42 | 17 | 44 | 16 | 42 | 48 | 16.4 |
| PushSubscription.endpoint | 42 | 17 | 44 | 16 | 42 | 48 | 16.4 |
| PushSubscription.expirationTime | 60 | 17 | 96 | 16 | 60 | 96 | 16.4 |
| PushSubscription.getKey | 42 | 17 | 44 | 16 | 42 | 48 | 16.4 |
| PushSubscription.options | 54 | 17 | 44 | 16 | 54 | 48 | 16.4 |
Show 13 more
| Sub-feature | Chrome | Edge | Firefox | Safari | Chrome Android | Firefox Android | Safari iOS |
|---|---|---|---|---|---|---|---|
| PushSubscription.toJSON | 42 | 17 | 44 | 16 | 50 | 48 | 16.4 |
| PushSubscription.unsubscribe | 42 | 17 | 44 | 16 | 50 | 48 | 16.4 |
| PushSubscriptionChangeEvent | 138 | ✕ | 137 | 16 | 138 | 137 | 16.4 |
| PushSubscriptionChangeEvent.PushSubscriptionChangeEvent | 138 | ✕ | 137 | 16.1 | 138 | 137 | 16.4 |
| PushSubscriptionChangeEvent.newSubscription | 138 | ✕ | 137 | 16 | 138 | 137 | 16.4 |
| PushSubscriptionChangeEvent.oldSubscription | 138 | ✕ | 137 | 16 | 138 | 137 | 16.4 |
| PushSubscriptionOptions | 54 | 17 | 44 | 16 | 54 | 48 | 16.4 |
| PushSubscriptionOptions.applicationServerKey | 54 | 17 | 44 | 16 | 54 | 48 | 16.4 |
| PushSubscriptionOptions.userVisibleOnly | 54 | 17 | ✕ | 16 | 54 | ✕ | 16.4 |
| ServiceWorkerGlobalScope.push_event | 40 | 17 | 44 | 16 | 40 | 48 | 16.4 |
| ServiceWorkerGlobalScope.pushsubscriptionchange_event | 138 | ✕ | ✕ | 16 | 138 | ✕ | ✕ |
| ServiceWorkerRegistration | 40 | 17 | 44 | 11.1 | 40 | 44 | 11.3 |
| ServiceWorkerRegistration.pushManager | 40 | 17 | 44 | 16 | 40 | 48 | 16.4 |