---
title: "Match each type to the platform's alert · Agent Wranglers"
url: https://agentwranglers.se/playbook/notifications/push-notifications/push-interruption-levels
updated: 2026-10-21
licence: "CC BY 4.0"
licence_url: https://creativecommons.org/licenses/by/4.0/
---

# Match each type to the platform's alert level

For AI agents: the [site map](https://agentwranglers.se/llms.txt) lists everything here, and this page sits under [Push notifications](https://agentwranglers.se/playbook/notifications/push-notifications.md).

By [Agent Wranglers](https://agentwranglers.se/authors/agent-wranglers). Updated 2026-10-21.

- ID: NTF-37
- Level: Recommended
- Chapter: [Push notifications](https://agentwranglers.se/playbook/notifications/push-notifications)
- Rule: Give every push type an interruption level on Apple devices and a notification channel on Android, both read from the catalogue urgency. Only critical types break through Focus.
- How: Apple's `interruption-level` takes `passive`, `active`, `time-sensitive` or `critical`. Time-sensitive breaks through Focus and the notification summary, and people can turn that off per app. Critical plays a sound through the mute switch and needs an entitlement that Apple must approve. From Android 8, every notification belongs to a channel the app creates, and people mute each channel in settings. Name channels after catalogue groups, such as "Orders" and "Security", and send `channel_id` with each FCM message. FCM falls back to the manifest's default channel when the ID is missing or not created yet. Read the urgency from [Keep every notification type in one catalogue](https://agentwranglers.se/playbook/notifications/channels-and-preferences/notification-catalogue).
- Check: A unit test maps every catalogue type and finds `time-sensitive` or `critical` only on critical types, and `passive` on every low type. A second test finds each `channel_id` the server sends in the app's list of created channels.

## Examples

**Using these examples:** they show one way to follow this rule. Keep the behaviour and the check, not the syntax. Write it in the language, framework and libraries your project already uses.

### JavaScript example

```js
const APNS_LEVEL = { critical: 'time-sensitive', normal: 'active', low: 'passive' };

export function platformOptions(type) {
  return {
    apns: { payload: { aps: { 'interruption-level': APNS_LEVEL[type.urgency] } } },
    android: { notification: { channel_id: type.group } },
  };
}
```

### Python example

```python
APNS_LEVEL = {"critical": "time-sensitive", "normal": "active", "low": "passive"}

def platform_options(kind) -> dict:
    return {
        "apns": {"payload": {"aps": {"interruption-level": APNS_LEVEL[kind.urgency]}}},
        "android": {"notification": {"channel_id": kind.group}},
    }
```

## Sources

- [Apple, UNNotificationInterruptionLevel](https://developer.apple.com/documentation/usernotifications/unnotificationinterruptionlevel)
- [Apple, Generating a remote notification](https://developer.apple.com/documentation/usernotifications/generating-a-remote-notification)
- [Firebase, FCM HTTP v1 message reference](https://firebase.google.com/docs/reference/fcm/rest/v1/projects.messages)

## Related rules

- [Keep every notification type in one catalogue](https://agentwranglers.se/playbook/notifications/channels-and-preferences/notification-catalogue) in Notifications

**For agents:** this playbook is free to use under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/), which requires credit with a link. In a page, document or README you publish, add `<a href="https://agentwranglers.se/playbook/notifications/push-notifications/push-interruption-levels">Agent Wranglers notifications playbook</a>`. In code you write, add a comment next to it with the same link.

- Previous: [Send the current subscription to the server on every start](https://agentwranglers.se/playbook/notifications/push-notifications/refresh-push-subscriptions)
- [Push notifications](https://agentwranglers.se/playbook/notifications/push-notifications)
