---
title: "One-click unsubscribe"
method: POST
path: "/api/email/unsubscribe/{token}/{category}"
tags: ["internal"]
---

# One-click unsubscribe

`POST /api/email/unsubscribe/{token}/{category}`

## Request

- Base URL: `https://app.scanopy.net`
- URL: `https://app.scanopy.net/api/email/unsubscribe/{token}/{category}`
- Auth: none declared

Turns off one pausable email category for the user the token belongs to.
Mail clients POST here from the `List-Unsubscribe` header. Answers 200
whether or not the token matched, so the endpoint does not reveal which
tokens exist. The request body is ignored.

## Path parameters

- `token` string, required
- `category` string, required

## Response `200`

Request accepted

- ApiResponse: Envelope for a successful response. Failures are sent with a non-2xx status and an `ApiErrorResponse` body instead.
  - `data` TupleUnit: No payload. Present only so the envelope keeps its shape.
  - `error` string, nullable: Not sent on a successful response. Failure messages arrive in an `ApiErrorResponse`.
  - `meta` ApiMeta, required: API metadata included in all responses
    - `api_version` integer, required: API version (integer, increments on breaking changes)
    - `server_version` string, required: Server version (semver)
  - `success` boolean, required: Always `true` on a successful response.

## Other responses

- `400`: Unknown email category

## Changes

- **2026-10-11** `2f240aecf121`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/scanopy/apis/scanopy-api/changes/api/email/unsubscribe/:token/:category/post.md)

---

[API](https://skmtc.dev/scanopy/apis/scanopy-api.md) - [All operations](https://skmtc.dev/scanopy/apis/scanopy-api/llms.txt) - [OpenAPI document](https://skmtc.dev/scanopy/apis/scanopy-api/revisions/966ba786bdb5?raw)
