---
title: "Get a gap"
method: GET
path: "/org/gaps/{gapId}"
tags: ["Gaps"]
---

# Get a gap

`GET /org/gaps/{gapId}`

## Request

- Base URL: `https://apiv2.senso.ai/api/v1`
- URL: `https://apiv2.senso.ai/api/v1/org/gaps/{gapId}`
- Auth: API key in header `X-API-Key`

Returns one gap with up to its 20 most recent sightings, every resolution recorded against it (newest first), and the evidence behind it. For an API search gap, `lead_evidence` carries the question and the retrieval counts from the most recent search that found nothing. The embedded `gap` never carries `latest_resolution` and always reports `awaiting_update: false`; read `resolutions` instead.

## Path parameters

- `gapId` string, uuid, required

## Response `200`

The gap, its sightings, its resolutions and its evidence.

- GapDetailResponse
  - `gap` Gap, required: One row of the gap queue.
    - `gap_id` string, uuid, required
    - `kind` 'missing' | 'conflict' | 'kb_conflict' | 'flagged', required: `missing`, `conflict` (claim against the knowledge base), `kb_conflict` (two knowledge-base documents disagree) or `flagged`.
    - `problem` 'conflict' | 'not_found' | 'no_source' | 'flagged', required: The state the queue badges and counts by: `conflict` (the knowledge base disagrees), `not_found` (nothing was found for the question), `no_source` (nothing backs a claim), `flagged` (a person marked an answer wrong).
    - `status` 'weak' | 'open' | 'reopened' | 'addressed' | 'resolved' | 'dismissed' | 'dormant', required: Where a gap is in its lifecycle. `weak` is a gap with too little evidence to act on yet (an API search gap seen once). `open` and `reopened` are work to do. `addressed` means something was written that later evidence has not yet confirmed. `resolved` and `dismissed` are closed. `dormant` has not been seen for a while.
    - `claim_text` string, required: The gap in words — the claim that could not be backed up, or the question that went unanswered.
    - `occurrence_count` integer, required: How many times the gap was seen.
    - `asker_count` integer, required: Distinct signed-in people behind those sightings. Calls made with API keys are not counted here.
    - `api_occurrence_count` integer, required: Sightings that came from API-key calls. Never added into `asker_count`.
    - `surfaces` GapSurface[], required: Every surface the gap was seen on.
    - `first_seen_at` string, date-time, required
    - `last_seen_at` string, date-time, required
    - `contradicting_content_id` string, uuid: The knowledge-base content a claim contradicts. Grounding-checked.
    - `contradicting_content_title` string
    - `suggested_content_id` string, uuid: Content that may be relevant. An unverified hint, not a finding.
    - `suggested_content_title` string
    - `assigned_user_id` string, uuid
    - `assigned_user_name` string
    - `assigned_user_email` string
    - `status_changed_at` string, date-time, required
    - `awaiting_update` boolean, required: True when the latest resolution ruled which side is correct but the losing document has not been updated yet, so the gap is still `open` or `reopened`.
    - `tags` GapTag[], required
      - `tag_id` string, uuid, required
      - `name` string, required
      - `curated` boolean, required: True = part of the organization's working vocabulary; false = machine-minted, awaiting adoption.
    - `latest_resolution` GapResolution: One decision recorded against a gap.
      - `resolution_id` string, uuid, required
      - `resolution_type` 'answered' | 'content_added' | 'content_updated' | 'ruled_kb_correct' | 'ruled_claim_correct' | 'ruled_document' | 'dismissed' | 'not_relevant' | 'we_dont_do_this' | 'source_irrelevant', required: What was decided about a gap. See `POST /org/gaps/{gapId}/resolutions` for the effect of each.
      - `ruling_side` 'kb' | 'claim' | 'document'
      - `authority_content_id` string, uuid
      - `authority_content_version_id` string, uuid
      - `produced_content_id` string, uuid
      - `produced_content_version_id` string, uuid
      - `notes` string
      - `resolved_by_name` string: The person who recorded it. Absent when it was recorded with an API key.
      - `resolved_by_email` string: Absent when it was recorded with an API key.
      - `created_at` string, date-time, required
    - `origin` GapOrigin: Where a gap came from, derived from its most recent sighting.
      - `kind` 'claim' | 'unanswered_question' | 'flagged_answer' | 'documents_didnt_answer' | 'api_unanswered_question', required: What produced a gap: `claim` (a statement that could not be verified), `unanswered_question` (a Quick Search that found nothing), `flagged_answer` (an answer a person marked wrong), `documents_didnt_answer` (documents were found but the answer still declined), or `api_unanswered_question` (a search through the org API, the MCP server or the CLI that found nothing).
      - `surface` 'search_turn' | 'content' | 'question_run' | 'api_search', required: Where a gap was seen: `search_turn` (Quick Search in the Senso app), `content` (something being written), `question_run` (a tracked prompt's AI answer), or `api_search` (a search through the org API, the MCP server or the CLI).
      - `subject_id` string, uuid: The search turn, content item or question run behind the most recent sighting. For an API search gap, the most recent search that found nothing.
      - `title` string: A name for the subject — a document title, a tracked prompt, or the question asked.
      - `model_label` string: The engine that produced the answer. Absent for content, which a person wrote.
      - `eval_mode` string: How thoroughly the subject was checked. Absent for search signals, which are not judged.
      - `surface_counts` GapSurfaceCounts, required: How many times the gap was seen on each surface.
        - `search_turn` integer, required
        - `content` integer, required
        - `question_run` integer, required
        - `api_search` integer, required
      - `session_id` string, uuid: The Quick Search conversation the sighting happened in. Absent for API search gaps.
      - `geo_question_id` string, uuid: The tracked prompt behind an AI answer.
      - `kb_node_id` string, uuid: The knowledge-base document behind a content sighting. Absent when that document was deleted.
  - `occurrences` GapOccurrence[], required: Up to the 20 most recent sightings, newest first.
    - `eval_claim_id` string, uuid: The judged claim behind the sighting. Absent for search signals, which are not judged.
    - `eval_run_id` string, uuid: The evaluation run behind the sighting. Absent for search signals.
    - `subject_type` string, required: What was seen. `search_turn` for every search sighting, API searches included.
    - `subject_id` string, uuid
    - `question` string: The question that was asked, when there was one.
    - `source_text` string: The sentence that carried the claim, for a judged claim.
    - `asked_by_name` string: The signed-in person who asked. Absent for calls made with an API key.
    - `occurred_at` string, date-time, required
  - `resolutions` GapResolution[], required: Every resolution still in effect, newest first.
    - `resolution_id` string, uuid, required
    - `resolution_type` 'answered' | 'content_added' | 'content_updated' | 'ruled_kb_correct' | 'ruled_claim_correct' | 'ruled_document' | 'dismissed' | 'not_relevant' | 'we_dont_do_this' | 'source_irrelevant', required: What was decided about a gap. See `POST /org/gaps/{gapId}/resolutions` for the effect of each.
    - `ruling_side` 'kb' | 'claim' | 'document'
    - `authority_content_id` string, uuid
    - `authority_content_version_id` string, uuid
    - `produced_content_id` string, uuid
    - `produced_content_version_id` string, uuid
    - `notes` string
    - `resolved_by_name` string: The person who recorded it. Absent when it was recorded with an API key.
    - `resolved_by_email` string: Absent when it was recorded with an API key.
    - `created_at` string, date-time, required
  - `lead_evidence` GapLeadEvidence: The evidence behind a gap, from its most recent sighting. Every field is optional because each origin carries different evidence. For an API search gap it is `prompt` and, when recorded, `retrieval`.
    - `source_text` string: The sentence that carried the claim.
    - `prompt` string: The question that produced the answer, or the question that went unanswered.
    - `answer_text` string: The whole answer, so `source_text` can be read in context.
    - `quote` string: A verbatim knowledge-base quote behind the verdict.
    - `reasoning` string
    - `suggested_fix` string
    - `confidence` string
    - `grounding_failed` boolean: True when a verdict was demoted because its quote failed the grounding check.
    - `evidence` GapEvidenceItem[]
      - `content_id` string, uuid, required
      - `content_version_id` string, uuid
      - `title` string
      - `version_num` integer
      - `updated_at` string, date-time
      - `relation` string, required: `entails` or `contradicts` (both grounding-checked), or `related` (context).
      - `was_cited` boolean: Whether the answer actually cited this document.
    - `searches` GapEvidenceSearch[]
      - `query` string, required
      - `result_count` integer
    - `sources` GapAnswerSource[]
      - `content_id` string, uuid, required
      - `kb_node_id` string, uuid
      - `title` string, required
      - `source_type` string, required
      - `content_type` string, required
      - `rank` integer, required
      - `available` boolean, required: False when the cited document has since been deleted.
    - `feedback` GapFeedbackNote[]
      - `user_name` string
      - `rating` string, required
      - `comment` string
      - `created_at` string, date-time, required
    - `retrieval` GapRetrievalContext: What retrieval recorded on a search that found nothing.
      - `raw_result_count` integer: How many candidates retrieval considered.
      - `filtered_result_count` integer: How many candidates survived relevance filtering.
      - `top_score` number: The best candidate's score, when there was one.

## Other responses

- `400`: The request was malformed — a bad path/query parameter or an invalid value.
- `401`: Missing or invalid credentials — supply a valid org API key in the `X-API-Key` header.
- `403`: The API key is authenticated but not permitted to access this resource.
- `404`: The requested resource does not exist or is not visible to this key.

---

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