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

# List content gaps

> Prompts where competitors are mentioned and this brand is not, plus Search Console queries with no tracked prompt. Each row carries the brief already written for it, when there is one.



## OpenAPI

````yaml https://api.usenotra.com/openapi.json get /v1/projects/{projectId}/geo/gaps
openapi: 3.1.1
info:
  title: Notra API
  version: 1.0.0
  description: >-
    OpenAPI schema for Notra content endpoints. Use GET /v1/status for public
    reachability. Error responses include recovery guidance.
servers:
  - url: https://api.usenotra.com
    description: Production
security:
  - BearerAuth: []
tags:
  - name: Discovery
    description: Public API status and authenticated workspace discovery.
  - name: Content
    description: >-
      Manage posts, brand identities, and GitHub or Linear integrations, and
      queue content generation. Organization is inferred from the API key
      (identity.externalId).
  - name: Schedules
    description: >-
      Manage scheduled content generation. Organization is inferred from the API
      key (identity.externalId).
  - name: Event Triggers
    description: >-
      Manage event-based content generation triggered by GitHub webhooks.
      Organization is inferred from the API key (identity.externalId).
  - name: Chats
    description: >-
      Manage chat sessions. Organization is inferred from the API key
      (identity.externalId).
  - name: Skills
    description: >-
      Manage reusable writing skills. Organization is inferred from the API key
      (identity.externalId).
  - name: Feedback
    description: >-
      Collect and triage feedback submitted by AI agents. Agents post to the
      organization's feedback URL without credentials; reading and triage
      require an API key with feedback.read or feedback.write.
  - name: GEO
    description: >-
      Manage generative engine optimization: projects, tracking settings,
      prompts, prompt sequences, competitors, scans, visibility reads, content
      gaps and briefs, agent readiness and AI traffic. Project-scoped endpoints
      require the GEO plan entitlement in addition to their scope;
      organization-level ingest endpoints require only the traffic scope.
paths:
  /v1/projects/{projectId}/geo/gaps:
    get:
      tags:
        - GEO
      summary: List content gaps
      description: >-
        Prompts where competitors are mentioned and this brand is not, plus
        Search Console queries with no tracked prompt. Each row carries the
        brief already written for it, when there is one.
      operationId: listGeoContentGaps
      parameters:
        - schema:
            type: string
            minLength: 1
            pattern: ^[A-Za-z0-9_-]{1,100}$
            example: b1f2c3d4-0000-4000-8000-000000000000
          required: true
          name: projectId
          in: path
      responses:
        '200':
          description: Gaps fetched successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GeoContentGapsResponse'
        '400':
          description: Invalid request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Missing or invalid API key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '402':
          description: GEO plan or available AI credits required
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Organization, project or resource not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '409':
          description: Conflict
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '503':
          description: Authentication or billing service unavailable
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
components:
  schemas:
    GeoContentGapsResponse:
      type: object
      properties:
        promptGaps:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
              prompt:
                type: string
              title:
                type:
                  - string
                  - 'null'
              engines:
                type: array
                items:
                  type: string
              mentionedEngines:
                type: array
                items:
                  type: string
              competitors:
                type: array
                items:
                  type: string
              discoveredCompetitors:
                type: array
                items:
                  type: string
              ownMentionRate:
                type: number
              engineCoverage:
                type: number
              opportunity:
                type: number
              won:
                type: boolean
              brief:
                type:
                  - object
                  - 'null'
                properties:
                  briefId:
                    type: string
                  status:
                    type: string
                    enum:
                      - draft
                      - approved
                      - writing
                      - completed
                      - failed
                  postId:
                    type:
                      - string
                      - 'null'
                  workingTitle:
                    type:
                      - string
                      - 'null'
                  publishedAt:
                    type:
                      - string
                      - 'null'
                  baseline:
                    type:
                      - object
                      - 'null'
                    properties:
                      mentionedEngines:
                        type: number
                      totalEngines:
                        type: number
                    required:
                      - mentionedEngines
                      - totalEngines
                  rescanned:
                    type: boolean
                required:
                  - briefId
                  - status
                  - postId
                  - workingTitle
                  - publishedAt
                  - baseline
                  - rescanned
            required:
              - id
              - prompt
              - title
              - engines
              - mentionedEngines
              - competitors
              - discoveredCompetitors
              - ownMentionRate
              - engineCoverage
              - opportunity
              - won
              - brief
        searchGaps:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
              prompt:
                type: string
              title:
                type:
                  - string
                  - 'null'
              impressions:
                type:
                  - number
                  - 'null'
              clicks:
                type:
                  - number
                  - 'null'
              position:
                type:
                  - number
                  - 'null'
              queries:
                type: array
                items:
                  type: object
                  properties:
                    query:
                      type: string
                    clicks:
                      type: number
                    impressions:
                      type: number
                    position:
                      type: number
                  required:
                    - query
                    - clicks
                    - impressions
                    - position
              brief:
                type:
                  - object
                  - 'null'
                properties:
                  briefId:
                    type: string
                  status:
                    type: string
                    enum:
                      - draft
                      - approved
                      - writing
                      - completed
                      - failed
                  postId:
                    type:
                      - string
                      - 'null'
                  workingTitle:
                    type:
                      - string
                      - 'null'
                  publishedAt:
                    type:
                      - string
                      - 'null'
                  baseline:
                    type:
                      - object
                      - 'null'
                    properties:
                      mentionedEngines:
                        type: number
                      totalEngines:
                        type: number
                    required:
                      - mentionedEngines
                      - totalEngines
                  rescanned:
                    type: boolean
                required:
                  - briefId
                  - status
                  - postId
                  - workingTitle
                  - publishedAt
                  - baseline
                  - rescanned
              recommendation:
                type: object
                properties:
                  action:
                    type: string
                    enum:
                      - create
                      - update
                      - merge
                      - ignore
                    description: >-
                      What to do with this query cluster: create a new page,
                      update the strongest existing page, merge overlapping
                      pages, or ignore thin demand.
                  reason:
                    type: string
                  targets:
                    type: array
                    items:
                      type: object
                      properties:
                        kind:
                          type: string
                          enum:
                            - page
                            - post
                        id:
                          type: string
                        url:
                          type:
                            - string
                            - 'null'
                        title:
                          type: string
                        score:
                          type: number
                      required:
                        - kind
                        - id
                        - url
                        - title
                        - score
                required:
                  - action
                  - reason
                  - targets
            required:
              - id
              - prompt
              - title
              - impressions
              - clicks
              - position
              - queries
              - brief
              - recommendation
        hasScanData:
          type: boolean
          description: False until the project has at least one scan result.
        organization:
          type: object
          properties:
            id:
              type: string
            slug:
              type: string
            name:
              type: string
            logo:
              type:
                - string
                - 'null'
          required:
            - id
            - slug
            - name
            - logo
      required:
        - promptGaps
        - searchGaps
        - hasScanData
        - organization
    ErrorResponse:
      type: object
      properties:
        error:
          type: string
        code:
          type: string
        recovery:
          type: string
      required:
        - error
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: API Key
      description: Send your API key in the Authorization header as Bearer API_KEY.

````