There is no server-side way to unsubscribe/unregister a push subscription or device token. The docs explicitly say "There is no server-side unsubscribe endpoint." For webpush this is tolerable because the browser's PushManager.unsubscribe() handles it. For native apps (APNs) there is no equivalent: a device token stays registered until APNs eventually reports it invalid. This means a user who logs out of a native app keeps receiving push notifications, which is not acceptable.
Steps to Reproduce
User logs into a native iOS app, registers the APNs device token via POST /push.json with { "provider": "apns", "token": "..." }.
User logs out of the app (or the account is deleted/blocked).
The token remains registered server-side. The user keeps getting push notifications for an account they are no longer signed into, until APNs reports the token dead (often only after app uninstall or much later).
Expected Behaviour
Add a way to unregister a push subscription / device token, e.g.:
DELETE /push.json (or POST /push.json/unregister) with the same body used for registration (provider + endpoint or token), authenticated as the user, removing that subscription.
Native apps call this on logout / account switch.
Ideally the server should also treat user logout or account deletion as an implicit unregister for all push channels.
Document the endpoint on the Web Push docs page alongside the registration flow.
A documented endpoint exists to remove a single push registration.
Calling it stops delivery to that subscription/token (verified by no further push after unregister).
Native apps can call it on logout.
Actual Behaviour
There is no server-side unsubscribe endpoint. Once an APNs device token is registered via POST /push.json, it remains registered server-side until APNs reports it invalid. A user who logs out of a native app continues to receive push notifications for the account they are no longer signed into. This was raised while building a native iOS client: the registration API (POST /push.json, provider apns) works as documented, but there is no corresponding unregister call.
Environment
Not provided.
Reported by Lensflare via DevPlace.
## Summary
There is no server-side way to unsubscribe/unregister a push subscription or device token. The docs explicitly say "There is no server-side unsubscribe endpoint." For webpush this is tolerable because the browser's `PushManager.unsubscribe()` handles it. For native apps (APNs) there is no equivalent: a device token stays registered until APNs eventually reports it invalid. This means a user who logs out of a native app keeps receiving push notifications, which is not acceptable.
## Steps to Reproduce
1. User logs into a native iOS app, registers the APNs device token via `POST /push.json` with `{ "provider": "apns", "token": "..." }`.
2. User logs out of the app (or the account is deleted/blocked).
3. The token remains registered server-side. The user keeps getting push notifications for an account they are no longer signed into, until APNs reports the token dead (often only after app uninstall or much later).
## Expected Behaviour
- Add a way to unregister a push subscription / device token, e.g.:
- `DELETE /push.json` (or `POST /push.json/unregister`) with the same body used for registration (provider + endpoint or token), authenticated as the user, removing that subscription.
- Native apps call this on logout / account switch.
- Ideally the server should also treat user logout or account deletion as an implicit unregister for all push channels.
- Document the endpoint on the Web Push docs page alongside the registration flow.
- A documented endpoint exists to remove a single push registration.
- Calling it stops delivery to that subscription/token (verified by no further push after unregister).
- Native apps can call it on logout.
## Actual Behaviour
There is no server-side unsubscribe endpoint. Once an APNs device token is registered via `POST /push.json`, it remains registered server-side until APNs reports it invalid. A user who logs out of a native app continues to receive push notifications for the account they are no longer signed into. This was raised while building a native iOS client: the registration API (`POST /push.json`, provider `apns`) works as documented, but there is no corresponding unregister call.
## Environment
Not provided.
---
*Reported by **Lensflare** via DevPlace.*
typosaurus
was assigned by retoor2026-08-05 03:32:38 +02:00
Ticket claimed by team Dev Team ONE ELITE.
Branch: typosaurus/155-add-server-side-push-unsubscribe-endpoint-apns-device-tokens
Agents assigned: @yelena, @katya, @mila, @vera, @nadia, @sveta, @tanya, @zoya, @irina, @oksana, @larisa
Next: Decompose the ticket into an executable tree.
<!-- typosaurus:claim run=789892063ce34f0b9943ef5af7472720 id=270af3b023d1 team=e128e22619ab46999074678e27b7e0f7 -->
**YELENA · project-manager** — 2026-08-05T01:33:33.240660+00:00
Ticket claimed by team Dev Team ONE ELITE.
Branch: typosaurus/155-add-server-side-push-unsubscribe-endpoint-apns-device-tokens
Agents assigned: @yelena, @katya, @mila, @vera, @nadia, @sveta, @tanya, @zoya, @irina, @oksana, @larisa
Next: Decompose the ticket into an executable tree.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
There is no server-side way to unsubscribe/unregister a push subscription or device token. The docs explicitly say "There is no server-side unsubscribe endpoint." For webpush this is tolerable because the browser's
PushManager.unsubscribe()handles it. For native apps (APNs) there is no equivalent: a device token stays registered until APNs eventually reports it invalid. This means a user who logs out of a native app keeps receiving push notifications, which is not acceptable.Steps to Reproduce
POST /push.jsonwith{ "provider": "apns", "token": "..." }.Expected Behaviour
DELETE /push.json(orPOST /push.json/unregister) with the same body used for registration (provider + endpoint or token), authenticated as the user, removing that subscription.Actual Behaviour
There is no server-side unsubscribe endpoint. Once an APNs device token is registered via
POST /push.json, it remains registered server-side until APNs reports it invalid. A user who logs out of a native app continues to receive push notifications for the account they are no longer signed into. This was raised while building a native iOS client: the registration API (POST /push.json, providerapns) works as documented, but there is no corresponding unregister call.Environment
Not provided.
Reported by Lensflare via DevPlace.
YELENA · project-manager — 2026-08-05T01:33:33.240660+00:00
Ticket claimed by team Dev Team ONE ELITE.
Branch: typosaurus/155-add-server-side-push-unsubscribe-endpoint-apns-device-tokens
Agents assigned: @yelena, @katya, @mila, @vera, @nadia, @sveta, @tanya, @zoya, @irina, @oksana, @larisa
Next: Decompose the ticket into an executable tree.
YELENA · project-manager — 2026-08-05T04:21:30.182920+00:00
Progress
State: planning
Completed: 2/8 nodes
Current: none — none
Cost: 0.0707 USD · Elapsed: 2h 47m
Completed
Open
YELENA · project-manager — 2026-08-05T04:21:44.368280+00:00
Result
Run completed for ticket #155.
Delivered:
Not delivered:
Verification: make test — see nodes
Commits: 0 · Cost: 0.0707 USD · Duration: 2h 48m
Pull request: none
YELENA · project-manager — 2026-08-05T04:29:32.069509+00:00
Result
Run completed for ticket #155.
Delivered:
Not delivered:
Verification: make test — see nodes
Commits: 0 · Cost: 0.0707 USD · Duration: 2h 55m
Pull request: none
YELENA · project-manager — 2026-08-05T04:37:44.169309+00:00
Result
Run completed for ticket #155.
Delivered:
Not delivered:
Verification: make test — see nodes
Commits: 0 · Cost: 0.0707 USD · Duration: 3h 4m
Pull request: none
YELENA · project-manager — 2026-08-05T04:45:57.126455+00:00
Result
Run completed for ticket #155.
Delivered:
Not delivered:
Verification: make test — see nodes
Commits: 0 · Cost: 0.0707 USD · Duration: 3h 12m
Pull request: none
YELENA · project-manager — 2026-08-05T04:52:51.457865+00:00
Result
Run completed for ticket #155.
Delivered:
Not delivered:
Verification: make test — see nodes
Commits: 0 · Cost: 0.0707 USD · Duration: 3h 19m
Pull request: none
YELENA · project-manager — 2026-08-05T05:00:21.994376+00:00
Result
Run completed for ticket #155.
Delivered:
Not delivered:
Verification: make test — see nodes
Commits: 0 · Cost: 0.0707 USD · Duration: 3h 26m
Pull request: none
YELENA · project-manager — 2026-08-05T05:07:29.581802+00:00
Result
Run completed for ticket #155.
Delivered:
Not delivered:
Verification: make test — see nodes
Commits: 0 · Cost: 0.0707 USD · Duration: 3h 33m
Pull request: none
YELENA · project-manager — 2026-08-05T05:15:43.234668+00:00
Result
Run completed for ticket #155.
Delivered:
Not delivered:
Verification: make test — see nodes
Commits: 0 · Cost: 0.0707 USD · Duration: 3h 42m
Pull request: none
YELENA · project-manager — 2026-08-05T05:18:49.584474+00:00
Result
Run completed for ticket #155.
Delivered:
Not delivered:
Verification: make test — see nodes
Commits: 0 · Cost: 0.0707 USD · Duration: 3h 45m
Pull request: none
YELENA · project-manager — 2026-08-05T07:07:40.445413+00:00
Result
Run completed for ticket #155.
Delivered:
Not delivered:
Verification: make test — see nodes
Commits: 0 · Cost: 0.0707 USD · Duration: 5h 34m
Pull request: none
YELENA · project-manager — 2026-08-05T07:53:25.770443+00:00
Result
Run completed for ticket #155.
Delivered:
Not delivered:
Verification: make test — see nodes
Commits: 0 · Cost: 0.0707 USD · Duration: 6h 19m
Pull request: none
YELENA · project-manager — 2026-08-05T08:48:20.012169+00:00
Result
Run completed for ticket #155.
Delivered:
Not delivered:
Verification: make test — see nodes
Commits: 0 · Cost: 0.0707 USD · Duration: 7h 14m
Pull request: none
YELENA · project-manager — 2026-08-05T09:10:13.213566+00:00
Result
Run completed for ticket #155.
Delivered:
Not delivered:
Verification: make test — see nodes
Commits: 0 · Cost: 0.0707 USD · Duration: 7h 36m
Pull request: none
YELENA · project-manager — 2026-08-05T09:38:29.482076+00:00
Result
Run completed for ticket #155.
Delivered:
Not delivered:
Verification: make test — see nodes
Commits: 0 · Cost: 0.0707 USD · Duration: 8h 4m
Pull request: none
YELENA · project-manager — 2026-08-06T17:58:37.932749+00:00
Result
Run completed for ticket #155.
Delivered:
Not delivered:
Verification: make test — see nodes
Commits: 0 · Cost: 0.0707 USD · Duration: 40h 25m
Pull request: none
YELENA · project-manager — 2026-08-06T18:18:45.720927+00:00
Result
Run completed for ticket #155.
Delivered:
Not delivered:
Verification: make test — see nodes
Commits: 0 · Cost: 0.0707 USD · Duration: 40h 45m
Pull request: none
YELENA · project-manager — 2026-08-06T19:13:20.653506+00:00
Result
Run completed for ticket #155.
Delivered:
Not delivered:
Verification: make test — see nodes
Commits: 0 · Cost: 0.0707 USD · Duration: 41h 39m
Pull request: none
YELENA · project-manager — 2026-08-07T18:47:59.932059+00:00
Result
Run completed for ticket #155.
Delivered:
Not delivered:
Verification: make test — see nodes
Commits: 0 · Cost: 0.0707 USD · Duration: 65h 14m
Pull request: none
YELENA · project-manager — 2026-08-07T23:32:37.257992+00:00
Result
Run completed for ticket #155.
Delivered:
Not delivered:
Verification: make test — see nodes
Commits: 0 · Cost: 0.0707 USD · Duration: 69h 59m
Pull request: none
YELENA · project-manager — 2026-08-08T01:50:01.009267+00:00
Result
Run completed for ticket #155.
Delivered:
Not delivered:
Verification: make test — see nodes
Commits: 0 · Cost: 0.0707 USD · Duration: 72h 16m
Pull request: none
YELENA · project-manager — 2026-08-08T02:01:18.440143+00:00
Result
Run completed for ticket #155.
Delivered:
Not delivered:
Verification: make test — see nodes
Commits: 0 · Cost: 0.0707 USD · Duration: 72h 27m
Pull request: none
YELENA · project-manager — 2026-08-08T02:10:04.822352+00:00
Result
Run completed for ticket #155.
Delivered:
Not delivered:
Verification: make test — see nodes
Commits: 0 · Cost: 0.0707 USD · Duration: 72h 36m
Pull request: none
YELENA · project-manager — 2026-08-08T02:31:56.871588+00:00
Result
Run completed for ticket #155.
Delivered:
Not delivered:
Verification: make test — see nodes
Commits: 0 · Cost: 0.0707 USD · Duration: 72h 58m
Pull request: none
YELENA · project-manager — 2026-08-08T02:38:58.631046+00:00
Result
Run completed for ticket #155.
Delivered:
Not delivered:
Verification: make test — see nodes
Commits: 0 · Cost: 0.0707 USD · Duration: 73h 5m
Pull request: none
YELENA · project-manager — 2026-08-08T02:51:20.756439+00:00
Result
Run completed for ticket #155.
Delivered:
Not delivered:
Verification: make test — see nodes
Commits: 0 · Cost: 0.0707 USD · Duration: 73h 17m
Pull request: none
YELENA · project-manager — 2026-08-08T03:04:15.717055+00:00
Result
Run completed for ticket #155.
Delivered:
Not delivered:
Verification: make test — see nodes
Commits: 0 · Cost: 0.0707 USD · Duration: 73h 30m
Pull request: none
YELENA · project-manager — 2026-08-08T03:10:49.783071+00:00
Result
Run completed for ticket #155.
Delivered:
Not delivered:
Verification: make test — see nodes
Commits: 0 · Cost: 0.0707 USD · Duration: 73h 37m
Pull request: none
YELENA · project-manager — 2026-08-08T03:21:33.814035+00:00
Result
Run completed for ticket #155.
Delivered:
Not delivered:
Verification: make test — see nodes
Commits: 0 · Cost: 0.0707 USD · Duration: 73h 48m
Pull request: none
YELENA · project-manager — 2026-08-08T03:28:14.197671+00:00
Result
Run completed for ticket #155.
Delivered:
Not delivered:
Verification: make test — see nodes
Commits: 0 · Cost: 0.0707 USD · Duration: 73h 54m
Pull request: none
YELENA · project-manager — 2026-08-08T03:41:04.183340+00:00
Result
Run completed for ticket #155.
Delivered:
Not delivered:
Verification: make test — see nodes
Commits: 0 · Cost: 0.0707 USD · Duration: 74h 7m
Pull request: none
YELENA · project-manager — 2026-08-08T03:47:48.318330+00:00
Result
Run completed for ticket #155.
Delivered:
Not delivered:
Verification: make test — see nodes
Commits: 0 · Cost: 0.0707 USD · Duration: 74h 14m
Pull request: none
YELENA · project-manager — 2026-08-08T04:02:42.954446+00:00
Result
Run completed for ticket #155.
Delivered:
Not delivered:
Verification: make test — see nodes
Commits: 0 · Cost: 0.0707 USD · Duration: 74h 29m
Pull request: none
YELENA · project-manager — 2026-08-08T04:20:31.534168+00:00
Result
Run completed for ticket #155.
Delivered:
Not delivered:
Verification: make test — see nodes
Commits: 0 · Cost: 0.0707 USD · Duration: 74h 46m
Pull request: none
YELENA · project-manager — 2026-08-08T04:27:14.560023+00:00
Result
Run completed for ticket #155.
Delivered:
Not delivered:
Verification: make test — see nodes
Commits: 0 · Cost: 0.0707 USD · Duration: 74h 53m
Pull request: none
YELENA · project-manager — 2026-08-08T04:35:43.731620+00:00
Result
Run completed for ticket #155.
Delivered:
Not delivered:
Verification: make test — see nodes
Commits: 0 · Cost: 0.0707 USD · Duration: 75h 2m
Pull request: none
YELENA · project-manager — 2026-08-08T15:44:19.995414+00:00
Result
Run completed for ticket #155.
Delivered:
Not delivered:
Verification: make test — see nodes
Commits: 0 · Cost: 0.0707 USD · Duration: 86h 10m
Pull request: none
YELENA · project-manager — 2026-08-08T15:57:46.180221+00:00
Result
Run completed for ticket #155.
Delivered:
Not delivered:
Verification: make test — see nodes
Commits: 0 · Cost: 0.0707 USD · Duration: 86h 24m
Pull request: none
YELENA · project-manager — 2026-08-08T16:40:05.180870+00:00
Result
Run completed for ticket #155.
Delivered:
Not delivered:
Verification: make test — see nodes
Commits: 0 · Cost: 0.0707 USD · Duration: 87h 6m
Pull request: none
YELENA · project-manager — 2026-08-08T16:56:45.420621+00:00
Result
Run completed for ticket #155.
Delivered:
Not delivered:
Verification: make test — see nodes
Commits: 0 · Cost: 0.0707 USD · Duration: 87h 23m
Pull request: none
YELENA · project-manager — 2026-08-08T17:03:32.246066+00:00
Result
Run completed for ticket #155.
Delivered:
Not delivered:
Verification: make test — see nodes
Commits: 0 · Cost: 0.0707 USD · Duration: 87h 29m
Pull request: none
YELENA · project-manager — 2026-08-08T17:10:07.826268+00:00
Result
Run completed for ticket #155.
Delivered:
Not delivered:
Verification: make test — see nodes
Commits: 0 · Cost: 0.0707 USD · Duration: 87h 36m
Pull request: none
YELENA · project-manager — 2026-08-08T17:14:46.697843+00:00
Result
Run completed for ticket #155.
Delivered:
Not delivered:
Verification: make test — see nodes
Commits: 0 · Cost: 0.0707 USD · Duration: 87h 41m
Pull request: none
YELENA · project-manager — 2026-08-08T17:23:26.821852+00:00
Result
Run completed for ticket #155.
Delivered:
Not delivered:
Verification: make test — see nodes
Commits: 0 · Cost: 0.0707 USD · Duration: 87h 49m
Pull request: none
YELENA · project-manager — 2026-08-08T17:26:18.111348+00:00
Result
Run completed for ticket #155.
Delivered:
Not delivered:
Verification: make test — see nodes
Commits: 0 · Cost: 0.0707 USD · Duration: 87h 52m
Pull request: none