---
title: "List an account's verification sessions (admin)"
method: GET
path: "/admin/users/{account_id}/verifications"
tags: ["verification"]
---

# List an account's verification sessions (admin)

`GET /admin/users/{account_id}/verifications`

## Request

- Base URL: `https://api.instruxi.dev/api/v1/enforcer`
- URL: `https://api.instruxi.dev/api/v1/enforcer/admin/users/{account_id}/verifications`
- Auth: one of:
  - API key in header `Authorization`
  - API key in header `X-API-Key`

Admin-read of ONE account's verification sessions (one row per provider and type), carrying the same server-computed `can_retry`, `blocked_reason` and `remedy` the account owner sees. `can_retry` is the gate a client should branch on — never re-derive it from `status`, which gets `expired` and `failed` wrong (both are retryable; only a customer-level rejection is terminal) and reports a verified account as blocked. `blocked_reason` is `customer_rejected` (only the provider's compliance team can lift it), `already_verified` (a SUCCESS, not a block), or absent. Tenant-scoped: naming an account in another tenant is 403 `account_not_in_tenant`, not 404, so the id space cannot be probed — a system admin with cross_tenant reads any tenant.

## Path parameters

- `account_id` string, required

## Query parameters

- `group_id` string
- `exclude_group_id` string

## Response `200`

OK

- InternalDeliveryHttpHandlerSessionsResponse
  - `count` integer
  - `data` EnforcerV3InternalDomainVerificationSession[]
    - `account_id` string
    - `attempt_count` integer
    - `blocked_reason` string
    - `can_retry` boolean: Computed on read by Decorate, never stored. The server owns this policy: a client that re-derives it from Status will get `expired` wrong (it is retryable) and will conflate `verified` with being blocked.
    - `challenge_data` EnforcerV3InternalDomainVerificationJSONBMap
    - `created_at` string
    - `expires_at` string
    - `external_customer_id` string
    - `id` string
    - `idempotency_key` string
    - `last_error` string
    - `last_refreshed_at` string
    - `last_used_at` string
    - `metadata` EnforcerV3InternalDomainVerificationJSONBMap
    - `provider` string
    - `provider_id` string
    - `rejection_scope` string: RejectionScope names WHICH terminal state this is — ScopeVerification (this inquiry failed, re-sendable) or ScopeCustomer (the provider rejected the customer outright, nothing on our side lifts it). NULL/"" means the provider never told us, which is every row written before migration 000093.
    - `remedy` string
    - `response_data` EnforcerV3InternalDomainVerificationJSONBMap
    - `session_id` string
    - `session_type` string
    - `status` string
    - `status_history` EnforcerV3InternalDomainVerificationStatusTransition[]
      - `from` string
      - `reason` string
      - `timestamp` integer: unix seconds
      - `to` string
    - `tenant_id` string
    - `type` string
    - `updated_at` string
    - `verification_guid` string
    - `verified_at` string
  - `success` boolean

## Other responses

- `400`: invalid_account_id | unknown_param | invalid_group_id | invalid_exclude_group_id
- `401`: Unauthorized
- `403`: account_not_in_tenant
- `404`: group_not_found | account_not_found

---

[API](https://skmtc.dev/instruxi/apis/enforcer-api.md) · [All operations](https://skmtc.dev/instruxi/apis/enforcer-api/llms.txt) · [OpenAPI document](https://skmtc.dev/instruxi/apis/enforcer-api/revisions/fa82bc1becc0?raw)
