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

# List responses

> One row per AI answer: which prompt, which model, which day, whether your brand was mentioned, where, in what tone, whether the model searched the web, and how many competitors it named.

Add `include=content` to get the answer text as Markdown in `content_markdown`. It is the same rendering the prompt page shows: headings, lists, your brand in bold, citations as `[1]` and a numbered source list at the end. Never raw HTML.

Newest first. Send `next_cursor` back as `cursor` with the same filters to get the next page.

Cost: 1 API credit per page. 2 with `include=content`.

Limits: Up to 31 days in one call. Up to 100 rows per page. For a year of rows, create an export.

Needs: Read.




## OpenAPI

````yaml /openapi.yaml get /projects/{project}/responses
openapi: 3.1.0
info:
  title: Radarkit API
  version: 1.0.0
  summary: Your AI visibility data, outside the dashboard.
  description: >
    Radarkit tracks how AI assistants answer the questions your customers ask,
    and what each answer says about your brand. This API gives you that data as
    JSON.


    Every request needs an API key in the `Authorization` header. Every response
    has the same shape: `data`, `meta`, `credits` and `request_id`. Most calls
    cost 1 API credit. Heavier calls cost 2. Exports spend Export rows instead,
    one per row.
  contact:
    name: Radarkit support
    email: mail@radarkit.ai
    url: https://radarkit.ai
servers:
  - url: https://api.radarkit.ai/v1
    description: Production
security:
  - bearerAuth: []
tags:
  - name: Account
    description: Your key, your plan and both balances. Free.
  - name: Projects
    description: One project is one brand or website. Every other call needs a project id.
  - name: Topics
    description: Topics group prompts. Every prompt belongs to one topic.
  - name: Prompts
    description: The questions Radarkit asks every AI model on a schedule.
  - name: Visibility
    description: The daily visibility score per model, precomputed.
  - name: Responses
    description: One row per AI answer, with everything Radarkit found in it.
  - name: Sources
    description: The web pages AI answers cite or consult.
  - name: Competitors
    description: Who the answers recommend and how often.
  - name: Rankings
    description: Recommended domains with their position in the answer.
  - name: Query fanout
    description: The web searches a model ran before answering, one row per answer.
  - name: Web search
    description: How often the models searched and what they searched for, summarised.
  - name: Sentiment
    description: How the answers talk about your brand.
  - name: Exports
    description: >
      Thousands of rows as one gzip file. Four calls in order: estimate, create,
      poll, download.


      Estimate is free and returns the exact row count. Create charges that many
      Export rows and queues the job. Poll the export until its status is
      `ready`. Download follows a redirect to a signed link that works for 30
      minutes. Files are kept for 7 days.
  - name: Content
    description: Have the Content agent write an article for a prompt, then poll the run.
paths:
  /projects/{project}/responses:
    get:
      tags:
        - Responses
      summary: List responses
      description: >
        One row per AI answer: which prompt, which model, which day, whether
        your brand was mentioned, where, in what tone, whether the model
        searched the web, and how many competitors it named.


        Add `include=content` to get the answer text as Markdown in
        `content_markdown`. It is the same rendering the prompt page shows:
        headings, lists, your brand in bold, citations as `[1]` and a numbered
        source list at the end. Never raw HTML.


        Newest first. Send `next_cursor` back as `cursor` with the same filters
        to get the next page.


        Cost: 1 API credit per page. 2 with `include=content`.


        Limits: Up to 31 days in one call. Up to 100 rows per page. For a year
        of rows, create an export.


        Needs: Read.
      operationId: listResponses
      parameters:
        - $ref: '#/components/parameters/project'
        - $ref: '#/components/parameters/from'
        - $ref: '#/components/parameters/to'
        - $ref: '#/components/parameters/model'
        - $ref: '#/components/parameters/prompt_id'
        - name: brand_mentioned
          in: query
          description: >-
            `true` for answers that mention your brand, `false` for the ones
            that missed it.
          schema:
            type: boolean
        - name: include
          in: query
          description: '`content` adds the answer as Markdown. Costs 2 credits instead of 1.'
          schema:
            type: string
            enum:
              - content
        - $ref: '#/components/parameters/limit'
        - $ref: '#/components/parameters/cursor'
      responses:
        '200':
          description: One page of answers.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/Response'
                  meta:
                    $ref: '#/components/schemas/PageMeta'
                  credits:
                    $ref: '#/components/schemas/Credits'
                  request_id:
                    $ref: '#/components/schemas/RequestId'
              example:
                data:
                  - id: 918273
                    prompt:
                      id: 2048
                      text: best crm for a startup
                    model: chatgpt
                    date: '2026-08-31'
                    collected_at: '2026-08-31T03:12:40+00:00'
                    brand_mentioned: true
                    position: top
                    sentiment: positive
                    search_performed: true
                    search_queries:
                      - best crm startups 2026
                      - acme crm pricing
                    competitors_count: 3
                    realtime: false
                    content_markdown: >-
                      For a startup, the strongest picks right now are:


                      - **Acme CRM** for teams under 20 [1]

                      - HubSpot when you need marketing tools in the same place
                      [2]
                meta:
                  project: 64f1a2b3c4d5e6f708192a3b
                  timezone: America/New_York
                  from: '2026-08-01'
                  to: '2026-08-31'
                  models:
                    - chatgpt
                    - gemini
                    - perplexity
                  prompt_id: 2048
                  brand_mentioned: null
                  include:
                    - content
                  limit: 100
                  count: 93
                  has_more: false
                  next_cursor: null
                credits:
                  charged: 2
                  remaining: 2945
                request_id: req_01j9x4v9l0m1n2o3p4q5r6s7t8
        '400':
          $ref: '#/components/responses/BadWindow'
        '401':
          $ref: '#/components/responses/Unauthenticated'
        '402':
          $ref: '#/components/responses/PaymentRequired'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/ProjectNotFound'
        '422':
          $ref: '#/components/responses/ValidationFailed'
        '429':
          $ref: '#/components/responses/RateLimited'
        '504':
          $ref: '#/components/responses/QueryTimeout'
components:
  parameters:
    project:
      name: project
      in: path
      required: true
      description: The project id. 24 characters. From List projects.
      schema:
        type: string
        pattern: ^[0-9a-f]{24}$
      example: 64f1a2b3c4d5e6f708192a3b
    from:
      name: from
      in: query
      description: >-
        First day, `YYYY-MM-DD`, in the project's timezone. Default: the window
        your dashboard shows, 7 or 30 days back.
      schema:
        type: string
        format: date
      example: '2026-08-01'
    to:
      name: to
      in: query
      description: 'Last day, `YYYY-MM-DD`, included. Default: today.'
      schema:
        type: string
        format: date
      example: '2026-08-31'
    model:
      name: model
      in: query
      description: >-
        One model name, or several separated by commas: `chatgpt`, `gemini`,
        `perplexity`, `copilot`, `aimode`, `aioverview`. Default: every model
        the project tracks. Names the plan does not include are ignored.
      schema:
        type: string
        maxLength: 120
      example: chatgpt,gemini
    prompt_id:
      name: prompt_id
      in: query
      description: Only rows for this prompt.
      schema:
        type: integer
        minimum: 1
    limit:
      name: limit
      in: query
      description: Rows per page, 1 to 100. Default 50.
      schema:
        type: integer
        minimum: 1
        maximum: 100
        default: 50
    cursor:
      name: cursor
      in: query
      description: '`next_cursor` from the previous page. Keep the other filters the same.'
      schema:
        type: string
        maxLength: 200
  schemas:
    Response:
      type: object
      properties:
        id:
          type: integer
        prompt:
          type: object
          properties:
            id:
              type: integer
            text:
              type:
                - string
                - 'null'
        model:
          type: string
        date:
          type: string
          format: date
          description: The day the answer was collected, as the dashboard groups it.
        collected_at:
          type: string
          format: date-time
          description: The exact moment, in UTC.
        brand_mentioned:
          type:
            - boolean
            - 'null'
        position:
          type:
            - string
            - 'null'
          enum:
            - top
            - middle
            - bottom
            - null
          description: Where the brand appeared.
        sentiment:
          type:
            - string
            - 'null'
          enum:
            - positive
            - mixed
            - negative
            - null
        search_performed:
          type:
            - boolean
            - 'null'
          description: True when the model searched the web before answering.
        search_queries:
          type: array
          items:
            type: string
        competitors_count:
          type: integer
        realtime:
          type:
            - boolean
            - 'null'
          description: True when the answer came from Run a prompt now, not the schedule.
        content_markdown:
          type: string
          description: The answer as Markdown. Only with `include=content`.
    PageMeta:
      type: object
      description: Facts about the request and how to get the next page.
      properties:
        project:
          type: string
        from:
          type: string
          format: date
        to:
          type: string
          format: date
        models:
          type: array
          items:
            type: string
        limit:
          type: integer
        count:
          type: integer
          description: Rows on this page.
        has_more:
          type: boolean
        next_cursor:
          type:
            - string
            - 'null'
          description: Send back as `cursor` to get the next page.
    Credits:
      type: object
      description: >-
        What this call cost and what is left. Also in the
        `X-RadarKit-Credits-Charged` and `X-RadarKit-Credits-Remaining` headers.
      properties:
        charged:
          type: integer
          description: API credits spent on this call.
        remaining:
          type:
            - integer
            - 'null'
          description: API credits left on the billed account. Null on free calls.
    RequestId:
      type: string
      description: >-
        A unique id for this call. Also in the `X-Request-Id` header. Quote it
        when you contact support.
      example: req_01j9x4m2p7q8r9s0t1u2v3w4x5
    Error:
      type: object
      description: Every failed call has this shape and no `data`.
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              description: Stable. Build on this, not on the message.
            message:
              type: string
              description: For people. May change.
            details:
              description: >-
                More when there is more to say. Which field failed, how long to
                wait, which id already exists.
              oneOf:
                - type: object
                - type: array
                  items:
                    type: object
        request_id:
          $ref: '#/components/schemas/RequestId'
  responses:
    BadWindow:
      description: >-
        `DATE_RANGE_TOO_LARGE`: more than 31 days, use an export.
        `INVALID_CURSOR`: the cursor does not match these filters, start from
        the first page.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error:
              code: DATE_RANGE_TOO_LARGE
              message: The date range can span at most 31 days. Use exports for more.
              details:
                max_days: 31
            request_id: req_01j9x4s6b7c8d9e0f1g2h3i4j6
    Unauthenticated:
      description: >-
        `UNAUTHENTICATED`: no key, a wrong key, or a revoked or expired key.
        `KEY_IN_QUERY` (400) if the key was in the URL.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error:
              code: UNAUTHENTICATED
              message: >-
                Missing or invalid API key. Send it as: Authorization: Bearer
                rk_live_YOUR_KEY
            request_id: req_01j9x4q7z8y9x0w1v2u3t4s5r6
    PaymentRequired:
      description: >-
        `INSUFFICIENT_CREDITS`: no API credits left, nothing ran.
        `PLAN_INACTIVE`: the key owner's plan is not active.
        `OWNER_PLAN_INACTIVE`: the project owner's plan is not active.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error:
              code: INSUFFICIENT_CREDITS
              message: Not enough API credits.
            request_id: req_01j9x4q7z8y9x0w1v2u3t4s5r7
    Forbidden:
      description: >-
        `SCOPE_MISSING`: the key lacks the permission this call needs.
        `PROJECT_FORBIDDEN`: the key cannot reach this project. `API_FROZEN`:
        API access for the account is paused.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error:
              code: PROJECT_FORBIDDEN
              message: This key cannot access that project.
            request_id: req_01j9x4q7z8y9x0w1v2u3t4s5r9
    ProjectNotFound:
      description: '`PROJECT_NOT_FOUND`: no project with that id.'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error:
              code: PROJECT_NOT_FOUND
              message: No project with that id.
            request_id: req_01j9x4q7z8y9x0w1v2u3t4s5s0
    ValidationFailed:
      description: >-
        `VALIDATION_FAILED`: a parameter is missing or wrong. `details` lists
        each field.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error:
              code: VALIDATION_FAILED
              message: One or more parameters are invalid.
              details:
                - path: from
                  message: The from field must match the format Y-m-d.
            request_id: req_01j9x4s6b7c8d9e0f1g2h3i4j5
    RateLimited:
      description: >-
        `RATE_LIMITED`: too many calls. Wait the seconds in `Retry-After` and
        send the same request again. Nothing was charged.
      headers:
        Retry-After:
          description: Seconds to wait.
          schema:
            type: integer
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error:
              code: RATE_LIMITED
              message: Too many requests. Slow down and retry.
              details:
                retry_after: 21
            request_id: req_01j9x4r2s3t4u5v6w7x8y9z0a1
    QueryTimeout:
      description: >-
        `QUERY_TIMEOUT`: the query took too long. Nothing was charged. Narrow
        the range or create an export.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error:
              code: QUERY_TIMEOUT
              message: The query took too long. Narrow the date range or use exports.
            request_id: req_01j9x4r2s3t4u5v6w7x8y9z0a2
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >-
        Your API key. Create one in Settings, API keys. Send it as
        `Authorization: Bearer rk_live_YOUR_KEY`.

````