---
title: "List unblock requests"
method: GET
path: "/v2/unblock_requests"
tags: ["Unblock Requests"]
---

# List unblock requests

`GET /v2/unblock_requests`

## Request

- Base URL: `https://api.dnsfilter.com`
- URL: `https://api.dnsfilter.com/v2/unblock_requests`
- Auth: API key in header `Authorization`

Returns a page of unblock requests for the selected tab, scoped to the organizations the caller can
see the queue for (policy managers and read-only members alike). Active Requests default to Time of
Attempt ascending; Request History defaults to Resolved Date descending. Each row carries
`can_action`, which is false when the caller may view the request but not decide it (read-only).

Column filters (TEAL-1701). Each filter is a top-level param carrying either a bare value (uses the
column's default operator) or an object: `field[value]=…&field[operator]=…`. All filters AND together,
and combine with `search`/`tab`. An unsupported operator for a field returns 422.

## Query parameters

- `actioned_by` object
  - `value` string
  - `operator` string
- `category` object
  - `value` string
  - `operator` string
- `deployment` object
  - `value` string
  - `operator` string
- `deployment_type` object
  - `value` string
  - `operator` string
- `domain` object
  - `value` string
  - `operator` string
- `email` object
  - `value` string
  - `operator` string
- `logged_in_user` object
  - `value` string
  - `operator` string
- `msp_id` integer
- `organization` object
  - `value` string
  - `operator` string
- `organization_id` integer
- `organization_ids` integer[]
- `page` object
  - `number` integer
  - `size` integer
- `policy` object
  - `value` string
  - `operator` string
- `request_reason` object
  - `value` string
  - `operator` string
- `resolved_date` object
  - `value` object
  - `operator` string
- `search` string
- `site` object
  - `value` string
  - `operator` string
- `sort` string
- `status` object
  - `value` string
  - `operator` string
- `tab` string
- `time_of_attempt` object
  - `value` object
  - `operator` string

## Response `200`

Unblock requests page

- object
  - `data` UnblockRequestIndexSpec[]
    - `id` string: Unblock request UUID.
    - `attributes` UnblockRequestAttributesSpec: Unblock request grid columns, plus the per-row `can_action` capability flag. The last five (actioned_by, resolved_date, action, response_message, internal_notes) are present only on the Request History tab (tab=history).
      - `domain` string: Requested domain.
      - `organization` UnblockRequestLinkedResourceSpec: A linkable {id, name} reference (organization, site, or policy).
        - `id` integer: Resource ID (may be null if the reference has decayed).
        - `name` string: Resource display name (may be null).
      - `site` UnblockRequestLinkedResourceSpec: A linkable {id, name} reference (organization, site, or policy).
        - `id` integer: Resource ID (may be null if the reference has decayed).
        - `name` string: Resource display name (may be null).
      - `deployment` string: Name of the deployment the request came from, as a snapshot of the value at request time — the roaming client / relay / clientless device's name, or the site's name for network-attributed traffic. Unlike the organization/site/policy names, this is a stored column, not a live read: it keeps reporting the deployment the request actually originated on even after that device is renamed, reassigned to another site, or deleted. Null when the request attributed to neither a device nor a network, and for requests recorded before this column existed (not backfilled).
      - `deployment_type` 'site' | 'roaming_client' | 'relay' | 'clientless': Kind of deployment the request came from, snapshotted at request time alongside `deployment`. Raw enum key, not a display label. Null under the same conditions as `deployment`.
      - `policy` UnblockRequestPolicyResourceSpec: A linkable policy reference. Adds is_global_policy to the plain {id, name} shape, because the two kinds are edited on different pages: a global policy is owned by the MSP and edited on its Global Policies page, an ordinary policy on the owning organization's.
        - `id` integer: Policy ID (may be null if the reference has decayed).
        - `name` string: Policy display name (may be null if the policy no longer exists).
        - `is_global_policy` boolean: True if the policy is an MSP global policy. False for an ordinary policy, and for a decayed reference.
      - `category` UnblockRequestCategorySpec: Category payload for a request. `names` is positionally aligned with `ids` (an entry may be null where a category has since been deleted). `is_threat` lets the grid apply threat styling without a second lookup.
        - `ids` integer[]: Category IDs the domain was blocked under.
        - `names` string[]: Category display names, aligned by index with ids.
        - `is_threat` boolean: True if any category is a DNSFilter threat category.
      - `blocked_by` 'blocklist' | 'appaware' | 'category' | 'security' | 'unknown': Why the domain was blocked — the grids' "Blocked By", the unblock-request analogue of the DNS Query Log's Method column. `blocklist` = the domain is on the policy's, organization's or MSP's block list; `appaware` = it falls in an application bucket the policy or MSP blocks; `category` = it matched a category in the policy's blocked categories; `security` = the same, where at least one matched category is a DNSFilter threat category (so `security` implies `category.is_threat`); `unknown` = it is uncategorized and the policy does not allow unknown domains. Raw enum key, not a display label. Precedence follows the resolver: a block-list hit outranks an application bucket, and both outrank any category. `blocklist` and `appaware` rows carry no categories, because no category caused the block. Derived when the request was submitted and never re-derived, so it reports the reason at request time rather than against today's policy. Null when the block mechanism could not be identified (most commonly a request whose attribution resolved no policy), and for requests recorded before this was populated (not backfilled). Filterable via `blocked_by` (is / isnot) and sortable.
      - `time_of_attempt` string: ISO 8601 timestamp of when the domain was blocked (the block page's own render time). Falls back to the submission timestamp when the block time was not captured.
      - `user_agent_id` string: Roaming client / relay the request came from (may be null). Used to scope a DNS Query Log lookup to that device.
      - `agent_local_user_id` integer: Local device user the request came from (may be null). Used to scope a DNS Query Log lookup to that user.
      - `logged_in_user` string: Name of the logged-in device user, if known (may be null).
      - `email` string: Requester email address.
      - `request_reason` string: Free-text reason supplied by the requester.
      - `can_action` boolean: Whether the caller's role permits actioning this request (Allow / Deny / Deny & Ignore / Resolve-already-allowed) in its organization. False for a read-only member, who sees the row but must get the Actions menu disabled rather than hidden. Evaluated per row, since a caller can hold different roles across organizations. Role-based only: an already-resolved row still reports true for a policy manager (the decision endpoint answers 409 for those).
      - `actioned_by` UnblockRequestActionerSpec: The admin who actioned a request (Request History "Actioned by").
        - `id` integer: User ID.
        - `name` string: User display name.
        - `email` string: User email address.
      - `resolved_date` string: History only: ISO 8601 timestamp of when the request was decided (may be null for a not-yet-swept expired row).
      - `action` 'allowed' | 'denied' | 'ignored' | 'resolved_already_allowed' | 'expired': History only: the decision. A pending row past its expiry window reports "expired".
      - `response_message` string: History only: the "Message to Requester" the admin recorded when denying (null for every other decision, and for a Deny left blank).
      - `internal_notes` string: History only: the admin-only Internal Notes as recorded at the time of the Allow/Deny decision. Null when none was entered. On the Allow variants the same text is also written to the allow list as that domain's note, but this column is the decision-time record and does not change if that list note is edited afterwards.
  - `meta` UnblockRequestsMetaSpec: Pagination metadata for the unblock requests list.
    - `total_count` integer: Total number of matching requests.
    - `total_pages` integer: Total number of pages.
    - `current_page` integer: Current page number.

## Other responses

- `400`: Bad Request
- `401`: Unauthorized
- `404`: Not Found

## Changes

- **2026-09-23** `99e62f0954ac`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/dnsfilter/apis/dnsfilter-api/changes/v2/unblock_requests/get.md)

---

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