---
title: "List suppressions"
method: GET
path: "/email_blocks"
tags: ["Email Suppressions"]
---

# List suppressions

`GET /email_blocks`

Account-scoped list. Two mutually exclusive pagination modes:

  - **Offset**: `page[number]` (default 1) + `page[size]`
    (default 25, max 100). `meta` contains `total_pages`.
  - **Cursor**: `page[after]` and/or `page[before]` (opaque
    `Base.url_encode64` of `{"created_at","id"}`). Cannot combine
    with `page[number]`; `after`+`before` together is an error.
    `meta` contains `next_cursor` / `previous_cursor` (omitted when
    their flag is false).

Sort defaults to `-created_at` (desc); only `created_at` is sortable.
A `--` prefix is an error. `nil`/empty filter values are silently dropped.

## Query parameters

- `page[number]` integer
- `page[size]` integer
- `page[after]` string
- `page[before]` string
- `sort` 'created_at' | '-created_at'
- `filter[reason]` 'hard_bounce' | 'spam_complaint' | 'unsubscribe' | 'invalid' | 'manual_block'
- `filter[domain_id]` string, uuid
- `filter[created_after]` string, date-time
- `filter[created_before]` string, date-time

## Response `200`

List of suppressions.

- union
  - EmailBlockListOffsetResponse
    - `data` EmailBlock[], required
      - `id` string, uuid, required
      - `record_type` 'email_block', required — View-only discriminator.
      - `domain_id` string, uuid, nullable — `null` ⇒ account scope. Stored on the row; exposed here.
      - `group_id` string, uuid, nullable — `null` ⇒ global; set ⇒ group-scoped opt-out.
      - `from` string, nullable — `null` ⇒ not address-scope. (schema: from_address)
      - `to` string, required — Normalized recipient. (schema: to_address)
      - `reason` 'hard_bounce' | 'spam_complaint' | 'unsubscribe' | 'invalid' | 'manual_block', required
      - `source` 'feedback' | 'manual' | 'import' | 'system', required
      - `scope` 'account' | 'domain' | 'address', required — Derived server-side from `domain_id`/`from`; never trusted from the caller.
      - `status` 'active' | 'expired' | 'removed', required
      - `created_at` string, date-time, required
      - `updated_at` string, date-time, required
      - `expires_at` string, date-time, nullable
    - `meta` OffsetMeta, required
      - `page_number` integer, required
      - `page_size` integer, required
      - `total_pages` integer, required
      - `total_results` integer, required
  - EmailBlockListCursorResponse
    - `data` EmailBlock[], required
      - `id` string, uuid, required
      - `record_type` 'email_block', required — View-only discriminator.
      - `domain_id` string, uuid, nullable — `null` ⇒ account scope. Stored on the row; exposed here.
      - `group_id` string, uuid, nullable — `null` ⇒ global; set ⇒ group-scoped opt-out.
      - `from` string, nullable — `null` ⇒ not address-scope. (schema: from_address)
      - `to` string, required — Normalized recipient. (schema: to_address)
      - `reason` 'hard_bounce' | 'spam_complaint' | 'unsubscribe' | 'invalid' | 'manual_block', required
      - `source` 'feedback' | 'manual' | 'import' | 'system', required
      - `scope` 'account' | 'domain' | 'address', required — Derived server-side from `domain_id`/`from`; never trusted from the caller.
      - `status` 'active' | 'expired' | 'removed', required
      - `created_at` string, date-time, required
      - `updated_at` string, date-time, required
      - `expires_at` string, date-time, nullable
    - `meta` CursorMeta, required
      - `page_size` integer, required
      - `next_cursor` string — Omitted when `has_next` is false.
      - `previous_cursor` string — Omitted when `has_previous` is false.
      - `has_next` boolean, required
      - `has_previous` boolean, required

## Other responses

- `400` — Query-param validation error (`source.pointer /<field>`).
- `401` — Missing or invalid gateway auth.
- `406` — Framework-rendered error (e.g. 406 Not Acceptable, 405 Method Not Allowed, 415 Unsupported Media Type). HTTP status matches the error and the body `code` carries that same status (e.g. `"406"`, not a hardcoded `"500"`). The explicit `500.json` clause still emits `code: "500"` for genuine 500s.

---

[API](https://skmtc.net/team-telnyx/apis/telnyx-api-2.md) · [All operations](https://skmtc.net/team-telnyx/apis/telnyx-api-2/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/team-telnyx/telnyx-api-2/versions/8f5f4e537994/schema)
