---
title: "List knowledge gaps (workspace queue)"
method: GET
path: "/knowledge-gaps"
tags: ["knowledge-gaps", "knowledge-gaps"]
---

# List knowledge gaps (workspace queue)

`GET /knowledge-gaps`

List the workspace's knowledge-gap queue. Cursor-paginated. With a `state` filter, results are strictly newest-first by `created_at`; without `state` they are grouped by state first (then `created_at`), so pass `state` (e.g. `open` for the to-route queue, `resolved` for the re-answer queue) for a chronological view. `updated_since` enables cheap incremental polling.

## Query parameters

- `state` 'open' | 'routed' | 'ingested' | 'resolved' | 'expired' | 'dismissed' | 'duplicate' | 'reopened', nullable — Filter to one gap state.
- `updated_since` string, date-time, nullable — Only gaps updated at/after this ISO 8601 timestamp.
- `limit` integer
- `cursor` string, nullable — Opaque pagination cursor.

## Response `200`

Successful Response

- KnowledgeGapListResponse — Page of gaps plus an opaque cursor for the next page (null on last page).
  - `data` KnowledgeGap[], required
    - `gap_id` string, uuid — UUIDv7 — chronologically sortable.
    - `workspace_id` string, uuid, required — Owning workspace; multi-tenant isolation key.
    - `pot_id` string, uuid, required — POT the question was asked against.
    - `query_text` string, required
    - `requester_id` string, required
    - `domain` string, required
    - `trigger` 'low_confidence' | 'no_coverage' | 'manual'
    - `trigger_score` number, nullable
    - `state` 'open' | 'routed' | 'ingested' | 'resolved' | 'expired' | 'dismissed' | 'duplicate' | 'reopened'
    - `assigned_to` string, nullable — Opaque id of the expert/DRI the integrator routed to. Core stores, never decides, this value.
    - `resolved_cluster_id` string, uuid, nullable — Forward-compat hook: the Knowledge Cluster (nebula) a filled gap will seed in Phase 2. Always null in the pilot; the Cluster table is not built yet.
    - `capsule_id` string, uuid, nullable — Capsule whose coverage evaluation created this gap (Capsules PR1b). Null for gaps born on the /query path or created manually. Marks the ORIGIN only — the trigger vocabulary is unchanged (no GapTrigger extension), so existing integrator payloads keep validating.
    - `idempotency_key` string, nullable
    - `transitions` GapTransition[] — Append-only transition history (actor + timestamp per state change).
      - `from_state` 'open' | 'routed' | 'ingested' | 'resolved' | 'expired' | 'dismissed' | 'duplicate' | 'reopened', required
      - `to_state` 'open' | 'routed' | 'ingested' | 'resolved' | 'expired' | 'dismissed' | 'duplicate' | 'reopened', required
      - `actor` string, required — Who/what performed the transition (opaque integrator id).
      - `at` string, date-time
      - `note` string, nullable
      - `evidence_ref` string, nullable — Optional link to the ingestion job / contribution that drove this transition.
    - `timeout_at` string, date-time, nullable — Optional SLA deadline. When elapsed, the integrator transitions the gap to 'expired' (core does not auto-expire — no scheduler in scope).
    - `created_at` string, date-time
    - `updated_at` string, date-time
    - `resolved_at` string, date-time, nullable
  - `next_cursor` string, nullable

## Other responses

- `422` — Validation Error

---

[API](https://skmtc.dev/scipot/apis/scipot-core-api.md) · [All operations](https://skmtc.dev/scipot/apis/scipot-core-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/scipot/scipot-core-api/revisions/e8712e9ffeae/schema)
