---
title: "All Categories"
method: GET
path: "/v1/user/{distinct_id}/preference/category/"
---

# All Categories

`GET /v1/user/{distinct_id}/preference/category/`

API to fetch user preferences across all categories.

## Path parameters

- `distinct_id` string, required

## Query parameters

- `tenant_id` string
- `show_opt_out_channels` boolean
- `tags` string
- `locale` string

## Response `200`

200

- object
  - `meta` object
    - `count` integer
    - `limit` integer
    - `offset` integer
  - `results` object[]
    - `name` string — Display name of the notification category.
    - `category` string — Slug of the notification category.
    - `description` string — Description of the notification category.
    - `original_preference` string, nullable — default preference of the category
    - `preference` 'opt_in' | 'opt_out' — updated user preference of the category
    - `is_editable` boolean — false when category default preference is set to `can't unsubscribe`
    - `channels` object[] — channel level preference in the category
      - `channel` string — channel name
      - `preference` string — user preference for this channel (opt_in, opt_out)
      - `is_editable` boolean — whether the user can edit this channel preference
    - `digest_schedule_options` object, nullable — All digest schedule options configured on the category, with the recipient's current selection. `null` if digest schedule is not enabled on the category.
      - `options` object[]
        - `id` string — Unique identifier of the digest schedule option.
        - `label` string — Display label shown to the recipient for this option.
        - `frequency` 'instantly' | 'minutely' | 'hourly' | 'daily' | 'weekly' | 'weekly_mo2fr' | 'monthly' — Frequency of the digest schedule.
        - `interval` integer — Recurrence multiplier for the frequency (for example, every 2 weeks).
        - `time` object — Time of day to send the digest, with its edit policy and the recipient's override.
          - `edit_policy` 'locked' | 'editable' — `editable` means the recipient can change this value; `locked` means it is fixed.
          - `default_value` string — Default time in HH:MM (24-hour) format.
          - `value` string, nullable — Recipient's overridden value, if any.
        - `weekdays` object — Days of the week to send on (for `weekly` frequency), with edit policy and recipient override.
          - `edit_policy` 'locked' | 'editable' — `editable` means the value can be overridden; `locked` means it is fixed.
          - `default_value` string[] — Default value applied when not overridden.
          - `value` string[], nullable
        - `monthdays` object — Days of the month to send on (for `monthly` frequency), with edit policy and recipient override.
          - `edit_policy` 'locked' | 'editable' — `editable` means the value can be overridden; `locked` means it is fixed.
          - `default_value` object[] — Default value applied when not overridden.
            - `pos` integer — Position in the month (1-31; use a negative value to count from the end).
            - `day` string — Optional day of the week (su, mo, tu, we, th, fr, sa).
          - `value` object[], nullable
        - `dtstart` object — Start datetime from which the recurring schedule is calculated, with edit policy and recipient override.
          - `edit_policy` 'locked' | 'editable' — `editable` means the value can be overridden; `locked` means it is fixed.
          - `default_value` string, date-time — Default value applied when not overridden.
          - `value` string, nullable
        - `is_default` boolean — Whether this option is the category default.
        - `is_user_selected` boolean — Whether the recipient has selected this option.
    - `digest_schedule` object, nullable — The recipient's currently active digest schedule, resolved in order recipient selection -> tenant default -> category default. `null` if digest schedule is not enabled on the category.
      - `id` string — Unique identifier of the digest schedule option.
      - `label` string — Display label shown to the recipient.
      - `frequency` 'instantly' | 'minutely' | 'hourly' | 'daily' | 'weekly' | 'weekly_mo2fr' | 'monthly' — Frequency of the digest schedule (instantly, hourly, daily, weekly, weekly_mo2fr, monthly).
      - `interval` integer — Recurrence multiplier for the frequency (for example, every 2 weeks).
      - `time` string — Resolved time in HH:MM (24-hour) format.
      - `weekdays` string[] — Days of the week to send on (for weekly frequency), with edit policy and value.
      - `monthdays` object[] — Days of the month to send on (for monthly frequency), with edit policy and value.
        - `pos` integer — Position in the month (1-31; use a negative value to count from the end).
        - `day` string — Optional day of the week (su, mo, tu, we, th, fr, sa).
      - `is_default` boolean — Whether this option is the default selection.
      - `is_user_selected` boolean
    - `properties` object[], nullable — Category condition properties with the recipient's overrides. Referenced in workflows as `$category.properties.<key>`.
      - `key` string — Property key identifier, referenced in workflows as `$category.properties.<key>`.
      - `label` string — Display label for the property.
      - `value_type` 'integer' | 'string' | 'string_choice' | 'list_choice' | 'string_dynamic' | 'list_dynamic' — Data type of the property value.
      - `default_value` unknown
      - `is_optional` boolean — Whether this property is optional.
      - `edit_policy` 'locked' | 'editable' — `editable` means the recipient can override the value; `locked` means it is fixed.
      - `is_overridden` boolean — Whether the recipient has overridden the default value.
      - `value` unknown

## Other responses

- `404` — 404 - Not Found

---

[API](https://skmtc.dev/suprsend/apis/suprsend-api.md) · [All operations](https://skmtc.dev/suprsend/apis/suprsend-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/suprsend/suprsend-api/revisions/ea7b2f7c41a9/schema)
