No way to permanently remove a Hide My Email address. Apple caps the account, and deactivating doesn't reclaim quota — deletion is the only way to free a slot. Add hidemyemail delete EMAIL, bridged into the macOS app the same way deactivate is.
Endpoint
POST {base_url_v1}/delete {"anonymousId": "<anonymous-id>"}
-> {"success": true, "timestamp": …, "result": {"message": "success"}}
Same query params, body shape and envelope as deactivate/reactivate. The captured clientBuildNumber matches hidemyemail.py:27, so our client params are current.
Verified on a live account (2026-08-04)
- Deactivation is required first. Delete on an active address fails
-41000 Invalid request for private email and changes nothing. After deactivate, the identical call succeeds.
- It does free quota. At the cap,
generate fails -41012 "You have the maximum number of email addresses"; after one delete it succeeds. Deactivating does nothing for -41012.
- Reissue isn't observable.
generate returns a server-chosen local part with no way to request one, so treat deletion as permanently burning the address.
Notes
delete deactivates then deletes as one step, and reports which half succeeded if it fails partway.
- Local
state='trash' is the user's own filing — local and reversible. Keep it distinct from remote deletion; the redesign's bulk "Move to Trash" must not call this endpoint.
- Confirm before deleting,
--yes to skip for scripting.
- Keep deleted rows as tombstones — the inbox may still hold mail delivered to the address. Exclude them from address listings and counts, but keep them counting toward their batch's total so finished batches don't change retroactively.
- Hitting
-41012 should point the user at deletion, not deactivation.
No way to permanently remove a Hide My Email address. Apple caps the account, and deactivating doesn't reclaim quota — deletion is the only way to free a slot. Add
hidemyemail delete EMAIL, bridged into the macOS app the same waydeactivateis.Endpoint
Same query params, body shape and envelope as
deactivate/reactivate. The capturedclientBuildNumbermatcheshidemyemail.py:27, so our client params are current.Verified on a live account (2026-08-04)
-41000 Invalid request for private emailand changes nothing. Afterdeactivate, the identical call succeeds.generatefails-41012 "You have the maximum number of email addresses"; after one delete it succeeds. Deactivating does nothing for-41012.generatereturns a server-chosen local part with no way to request one, so treat deletion as permanently burning the address.Notes
deletedeactivates then deletes as one step, and reports which half succeeded if it fails partway.state='trash'is the user's own filing — local and reversible. Keep it distinct from remote deletion; the redesign's bulk "Move to Trash" must not call this endpoint.--yesto skip for scripting.-41012should point the user at deletion, not deactivation.