> ## 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.

# Add prompts

> Adds up to 50 prompts to one topic. Send the same list twice and nothing doubles: a prompt that already exists in the project is returned under `skipped` with `reason: duplicate` and its existing id. Matching ignores letter case.

When the plan's prompt limit is reached part way, the prompts before it are still added and the rest come back with `reason: limit`. When nothing fits at all, the call is refused with `402 PROMPT_LIMIT_REACHED` and no credit is charged.

New prompts run on the project's next scheduled run. To see answers sooner, use Run a prompt now.

Cost: 1 API credit per call.

Limits: 50 prompts per call. 200 prompts per key per rolling day, REST and MCP together. Each prompt up to 255 characters.

Needs: Write. Your seat must be allowed to manage prompts.




## OpenAPI

````yaml /openapi.yaml post /projects/{project}/prompts
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}/prompts:
    post:
      tags:
        - Prompts
      summary: Add prompts
      description: >
        Adds up to 50 prompts to one topic. Send the same list twice and nothing
        doubles: a prompt that already exists in the project is returned under
        `skipped` with `reason: duplicate` and its existing id. Matching ignores
        letter case.


        When the plan's prompt limit is reached part way, the prompts before it
        are still added and the rest come back with `reason: limit`. When
        nothing fits at all, the call is refused with `402 PROMPT_LIMIT_REACHED`
        and no credit is charged.


        New prompts run on the project's next scheduled run. To see answers
        sooner, use Run a prompt now.


        Cost: 1 API credit per call.


        Limits: 50 prompts per call. 200 prompts per key per rolling day, REST
        and MCP together. Each prompt up to 255 characters.


        Needs: Write. Your seat must be allowed to manage prompts.
      operationId: addPrompts
      parameters:
        - $ref: '#/components/parameters/project'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - topic_id
                - prompts
              properties:
                topic_id:
                  type: integer
                  description: The topic the prompts go into. From List topics.
                prompts:
                  type: array
                  minItems: 1
                  maxItems: 50
                  items:
                    type: string
                    maxLength: 255
                  description: The prompt texts.
            example:
              topic_id: 17
              prompts:
                - how much does acme crm cost
                - acme crm pricing vs hubspot
                - is acme crm free for small teams
      responses:
        '201':
          description: What was added and what was skipped.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      added:
                        type: array
                        items:
                          $ref: '#/components/schemas/Prompt'
                      skipped:
                        type: array
                        items:
                          type: object
                          properties:
                            text:
                              type: string
                            reason:
                              type: string
                              enum:
                                - duplicate
                                - limit
                            prompt_id:
                              type:
                                - integer
                                - 'null'
                              description: >-
                                The existing prompt when the reason is
                                duplicate.
                  meta:
                    type: object
                    properties:
                      project:
                        type: string
                      topic_id:
                        type: integer
                      added:
                        type: integer
                      skipped:
                        type: integer
                      limit_reached:
                        type: boolean
                      prompts:
                        type: object
                        description: >-
                          Prompts in use and allowed across all of the owner's
                          projects.
                        properties:
                          used:
                            type: integer
                          limit:
                            type: integer
                  credits:
                    $ref: '#/components/schemas/Credits'
                  request_id:
                    $ref: '#/components/schemas/RequestId'
              example:
                data:
                  added:
                    - id: 2101
                      text: how much does acme crm cost
                      topic_id: 17
                      last_checked_at: null
                      created_at: '2026-09-03T10:21:05+00:00'
                    - id: 2102
                      text: is acme crm free for small teams
                      topic_id: 17
                      last_checked_at: null
                      created_at: '2026-09-03T10:21:05+00:00'
                  skipped:
                    - text: acme crm pricing vs hubspot
                      reason: duplicate
                      prompt_id: 2049
                meta:
                  project: 64f1a2b3c4d5e6f708192a3b
                  topic_id: 17
                  added: 2
                  skipped: 1
                  limit_reached: false
                  prompts:
                    used: 50
                    limit: 300
                credits:
                  charged: 1
                  remaining: 2943
                request_id: req_01j9x4z3v4w5x6y7z8a9b0c1d2
        '401':
          $ref: '#/components/responses/Unauthenticated'
        '402':
          description: >-
            `PROMPT_LIMIT_REACHED`: the plan's prompt limit is used up,
            `details` has `used` and `limit`. `INSUFFICIENT_CREDITS`: no API
            credits left. `PLAN_INACTIVE` or `OWNER_PLAN_INACTIVE`: a plan is
            not active.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: >-
            `SCOPE_MISSING`: the key has no Write permission.
            `PROJECT_FORBIDDEN`: the key cannot reach this project.
            `PERMISSION_DENIED`: your seat cannot manage prompts.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: >-
            `PROJECT_NOT_FOUND`: no project with that id. `TOPIC_NOT_FOUND`: no
            active topic with that id in this project.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '422':
          $ref: '#/components/responses/ValidationFailed'
        '429':
          description: >-
            `RATE_LIMITED`: too many calls. `PROMPTS_DAILY_CAP`: this key added
            its 200 prompts for the day. Both carry `Retry-After`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
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
  schemas:
    Prompt:
      type: object
      properties:
        id:
          type: integer
        text:
          type: string
        topic_id:
          type:
            - integer
            - 'null'
        last_checked_at:
          type:
            - string
            - 'null'
          format: date-time
        created_at:
          type:
            - string
            - 'null'
          format: date-time
        models:
          type: object
          description: >-
            Status per model: `pending`, `processing`, `completed` or `hold`.
            Only on List prompts.
          additionalProperties:
            type:
              - string
              - 'null'
    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:
    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
    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
  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`.

````