---
title: "List my person verifications"
method: GET
path: "/verification/person"
tags: ["verification"]
---

# List my person verifications

`GET /verification/person`

## Request

- Base URL: `https://api.instruxi.dev/api/v1/enforcer`
- URL: `https://api.instruxi.dev/api/v1/enforcer/verification/person`
- Auth: one of:
  - API key in header `Authorization`
  - API key in header `X-API-Key`

The caller's person-level verifications (KYC packets, attestations), cross-tenant by construction because they hang off the person, not the account. Self-scoped: a filter narrows this set and can never reach another person's rows. With NO query string the response is the legacy `{success, data:[...], count}` shape, every row, submitted_at DESC — unchanged. With `limit` or `offset` the response is the ADR 0003 envelope `{success, data:{items, total, filtered, limit, offset}}`; `limit=0` returns counts alone. Filters or a sort WITHOUT `limit`/`offset` return the legacy shape over the filtered, sorted rows. `status`/`kind`/`issuer` are comma-separated ORs; an unrecognised member matches nothing. `q` is a case-insensitive substring over id, issuer and decision_reason — the row only; the person is not searched because the list is already one person's. `from`/`to` bound the column named by `date_field` (default submitted_at): `YYYY-MM-DD` is an inclusive whole UTC day, RFC3339 an exact instant (`to` exclusive); a row with no value in that column is excluded when a bound is set and included otherwise. `since`/`until` and `created_after`/`created_before` are aliases. Nullable sort columns (decided, expires) order NULLS LAST in both directions; every sort tiebreaks on id. An unknown query KEY is `400 unknown_param`.

## Query parameters

- `status` string
- `kind` string
- `issuer` string
- `q` string
- `date_field` 'submitted' | 'decided' | 'expires'
- `from` string
- `to` string
- `sort` 'submitted' | 'decided' | 'created' | 'status' | 'kind' | 'expires'
- `sort_dir` 'asc' | 'desc'
- `limit` integer
- `offset` integer
- `group_id` string, uuid
- `exclude_group_id` string, uuid

## Response `200`

paged envelope (legacy {success,data:[],count} when limit/offset absent)

- InternalDeliveryHttpHandlerPersonVerificationsPageResponse
  - `data` InternalDeliveryHttpHandlerPersonVerificationsPage
    - `filtered` integer
    - `items` EnforcerV3InternalDomainPersonverificationPersonVerification[]
      - `created_at` string
      - `decided_at` string: Decision fields populate together when an admin approves or rejects. DecidedBy FKs back to accounts.id — "which admin made the call" is an audit-trail concern, not an identity one.
      - `decided_by` string
      - `decision_reason` string
      - `expires_at` string: ExpiresAt lets the background expiry job age out stale approvals (e.g. a 1-year KYC). Nil = no expiry policy for this row.
      - `file_id` string: FileID is a cross-service reference into enforcer-files (files moved out of the enforcer in v3), so there is no local FK. Pointer because not every verification has an attached document (issuer-attested booleans, on-chain proofs, etc.).
      - `id` string
      - `issuer` string: Issuer is the third party that produced the attestation. "self" for user-submitted docs awaiting admin review.
      - `kind` string: Kind is intentionally a free-form varchar (not an enum) so adding a new verification type doesn't require a migration. Operator policy lives at the usecase layer.
      - `metadata` EnforcerV3InternalDomainPersonverificationJSONBMap
      - `person_id` string
      - `status` string
      - `submitted_at` string
      - `updated_at` string
    - `limit` integer
    - `offset` integer
    - `total` integer
  - `success` boolean

## Other responses

- `400`: unknown_param | invalid_limit | invalid_offset | invalid_from | invalid_to | invalid_window | invalid_group_id | invalid_exclude_group_id
- `401`: Unauthorized

---

[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)
