> ## Documentation Index
> Fetch the complete documentation index at: https://docs.mentionlab.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Content-gap detail for one topic (its sources)

> Lists every source (cited page snapshot) grouped in the topic, each with whether it’s the project’s own content (“is my brand present”), its relationship + controllability + source-type category, the queries it was cited from, and its citation count — sorted most-cited first.



## OpenAPI

````yaml https://api.mentionlab.io/api/docs-json get /api/v1/source-topics/runs/{runId}/content-gap/topics/{topicId}
openapi: 3.0.0
info:
  title: MentionLab Public API v0.3.4-rc
  description: ''
  version: 0.3.4-rc
  contact: {}
servers:
  - url: https://api.mentionlab.io
security: []
tags: []
paths:
  /api/v1/source-topics/runs/{runId}/content-gap/topics/{topicId}:
    get:
      tags:
        - Source Topics
      summary: Content-gap detail for one topic (its sources)
      description: >-
        Lists every source (cited page snapshot) grouped in the topic, each with
        whether it’s the project’s own content (“is my brand present”), its
        relationship + controllability + source-type category, the queries it
        was cited from, and its citation count — sorted most-cited first.
      operationId: SourceTopicsV1Controller_getContentGapTopicDetail_v1
      parameters:
        - name: runId
          required: true
          in: path
          description: UUID of the run the topic belongs to.
          schema:
            type: string
            format: uuid
        - name: topicId
          required: true
          in: path
          description: UUID of the topic (cluster) to detail.
          schema:
            type: string
            format: uuid
        - name: x-project-id
          in: header
          description: Project ID to specify the project context
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ContentGapTopicDetailResponse'
        '400':
          description: >-
            The request failed validation — the body, query or path parameters
            are malformed or out of range.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiErrorResponse'
        '401':
          description: The request is missing valid authentication credentials.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiErrorResponse'
        '403':
          description: >-
            The authenticated principal lacks the required permission, or access
            to the requested organisation/project.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiErrorResponse'
components:
  schemas:
    ContentGapTopicDetailResponse:
      type: object
      properties:
        id:
          type: string
          description: Topic (cluster) UUID.
          example: 019dd32e-b19e-7956-88f6-4b9a877f3697
        label:
          type: string
          description: LLM-assigned topic label.
          example: Electric vehicle charging
        keywords:
          description: Keywords summarizing the topic.
          example:
            - ev charging
            - charging network
          type: array
          items:
            type: string
        size:
          type: number
          description: Number of source snapshots grouped in this topic.
          example: 14
        ownedPresent:
          type: boolean
          description: Whether the project’s owned entity has content on this topic.
          example: false
        competitorPresent:
          type: boolean
          description: Whether a competitor has content on this topic.
          example: true
        isContentGap:
          type: boolean
          description: Content-gap flag (owned entity absent).
          example: true
        citationCount:
          type: number
          description: Total citations across the topic’s sources within the run’s scope.
          example: 128
        sources:
          description: The topic’s sources, most-cited first.
          type: array
          items:
            $ref: '#/components/schemas/ContentGapSourceResponse'
      required:
        - id
        - label
        - keywords
        - size
        - ownedPresent
        - competitorPresent
        - isContentGap
        - citationCount
        - sources
    ApiErrorResponse:
      type: object
      properties:
        statusCode:
          type: number
          description: HTTP status code of the error.
          example: 400
        message:
          type: string
          description: >-
            Human-readable description of the error. Validation failures return
            an array of per-field validation errors instead of a single string.
          example: Validation failed
        error:
          type: string
          description: Short name of the HTTP error.
          example: Bad Request
      required:
        - statusCode
    ContentGapSourceResponse:
      type: object
      properties:
        url:
          type: string
          description: Cited page URL.
          example: https://example.com/ev/charging-guide
        domain:
          type: string
          description: Root domain of the source.
          example: example.com
        sourceDomainId:
          type: string
          description: Source domain UUID.
          example: 019dd32e-b19e-7956-88f6-4b9a877f3697
        month:
          type: string
          description: Month bucket (YYYY-MM) of the source snapshot.
          example: 2026-06
        relationship:
          type: string
          description: >-
            Relationship of the source’s domain to the project: owned |
            competitor | partner_affiliate | independent.
          example: independent
        ownedPresent:
          type: boolean
          description: >-
            Whether this source is the project’s own content (relationship =
            owned) — "is my brand present on this source".
          example: false
        controllability:
          type: string
          description: >-
            Controllability of the source: owned | earnable | hard | unknown
            (how realistically we can produce/earn content there).
          example: earnable
        categorySlug:
          type: string
          description: >-
            Resolved source-type category slug (project override → global →
            other).
          example: news_media
        categoryLabel:
          type: string
          description: Human-readable label for categorySlug.
          example: News & Press
        citationCount:
          type: number
          description: >-
            Citations (distinct AI responses) of this source within the run’s
            scope.
          example: 23
        queries:
          description: Queries this source was cited from.
          type: array
          items:
            $ref: '#/components/schemas/ContentGapSourceQuery'
      required:
        - url
        - domain
        - sourceDomainId
        - month
        - relationship
        - ownedPresent
        - controllability
        - categorySlug
        - categoryLabel
        - citationCount
        - queries
    ContentGapSourceQuery:
      type: object
      properties:
        queryId:
          type: string
          description: Query UUID.
          example: 019dd32e-b19e-7956-88f6-4b9a877f3697
        query:
          type: string
          description: Query text.
          example: best ev charging networks 2026
      required:
        - queryId
        - query

````