Review queue
Everything ingestion parked for a person to decide on. A held row is a write a strict policy would not apply until its name is classified; a violation row is a name a permissive policy accepted and flagged. Both are keyed by kind and name and carry a first and a last sighting, so they list together under one cursor, ordered by last seen. The verbs differ by row: allow or deny a held name on the Catalog page, resolve or dismiss a violation on the Violations page.
GET /v1/review
Section titled “GET /v1/review”List the review queue
Auth: Clerk session token.
Query parameters
{ "cursor": "string", "limit": 50, "direction": "asc", "type": "all", "kind": "all", "status": "all"}| Field | Type | Required | Constraints |
|---|---|---|---|
cursor |
string | no | |
limit |
integer | no | default 50; 1 ≤ x ≤ 100 |
direction |
“asc” | “desc” | no | default "asc" |
type |
“held” | “violation” | “all” | no | default "all" |
kind |
“event” | “trait” | “all” | no | default "all" |
status |
“held” | “open” | “resolved” | “dismissed” | “all” | no | default "all" |
Response 200
{ "data": [ { "id": "string", "kind": "event", "name": "string", "firstSeenAt": "2026-01-15T09:30:00.000Z", "lastSeenAt": "2026-01-15T09:30:00.000Z", "type": "held", "status": "held", "payload": { "properties": { "key": {} }, "messageId": "string", "idempotencyKey": "string" }, "heldCount": 1 } ], "meta": { "requestId": "string", "nextCursor": "string", "hasMore": true }}| Field | Type | Required | Constraints |
|---|---|---|---|
data |
array of variants | yes | |
data[] |
one of | yes | |
data[]〈held〉 |
object | yes | |
data[]〈held〉.id |
string | yes | |
data[]〈held〉.kind |
“event” | “trait” | yes | |
data[]〈held〉.name |
string | yes | |
data[]〈held〉.firstSeenAt |
string (date-time) | yes | |
data[]〈held〉.lastSeenAt |
string (date-time) | yes | |
data[]〈held〉.type |
“held” | yes | |
data[]〈held〉.status |
“held” | yes | |
data[]〈held〉.payload |
object | object | yes | |
data[]〈held〉.heldCount |
integer | yes | 1 ≤ x ≤ ∞ |
data[]〈violation〉 |
object | yes | |
data[]〈violation〉.id |
string | yes | |
data[]〈violation〉.kind |
“event” | “trait” | yes | |
data[]〈violation〉.name |
string | yes | |
data[]〈violation〉.firstSeenAt |
string (date-time) | yes | |
data[]〈violation〉.lastSeenAt |
string (date-time) | yes | |
data[]〈violation〉.type |
“violation” | yes | |
data[]〈violation〉.status |
“open” | “resolved” | “dismissed” | yes | |
data[]〈violation〉.payload |
object | object | yes | |
meta |
object | no | |
meta.requestId |
string | no | |
meta.nextCursor |
string | null | no | |
meta.hasMore |
boolean | no |
Errors follow the shared envelope and code table.