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

# Quote an Agent Picks test

> Quote a paid test, an Action re-test or one run of a schedule in credits, without spending anything. Pass test options (preset quick or cell, runs_per_cell, scope) for a test; action_id alone for a re-test of a completed or live Action (only those; at most 40 runs); or schedule alone (daily, weekly or monthly) for a schedule. Returns the estimate in credits, the agents the plan leaves out, a quote_token signed for this API key and project, and expires_at, 15 minutes later. A test quote also returns test_id, the id the start reserves under. A quote token works once: start another test by quoting again. Refused with 409 test_in_progress while another test is queued or running, and with 400 for a setup that cannot quote, with reason no_settings, job_incomplete, runner_disabled, customer_requests_off, action_not_shipped, baseline_unavailable, baseline_changed, invalid_test_options, scope_not_enabled, invalid_quick_shape, empty_test_scope, invalid_cell_shape or unpriced_model; 403 agent_not_in_plan when the plan includes none of the saved agents. Requires Agent Picks. A body that is not valid JSON, or an empty body, is refused with 400 bad_request and no reason.



## OpenAPI

````yaml /openapi.json post /projects/{projectId}/agent-picks/tests/quote
openapi: 3.1.0
info:
  title: DevTune API
  version: 2.0.0
  description: >-
    API for programmatic access to your AI visibility data, webhook
    subscriptions, and automation workflows. Use this API to integrate DevTune
    data into CI/CD pipelines, BI tools, AI agents, and operational systems.
servers:
  - url: https://devtune.ai/api/v2
    description: Production
security:
  - bearerAuth: []
paths:
  /projects/{projectId}/agent-picks/tests/quote:
    post:
      summary: Quote an Agent Picks test
      description: >-
        Quote a paid test, an Action re-test or one run of a schedule in
        credits, without spending anything. Pass test options (preset quick or
        cell, runs_per_cell, scope) for a test; action_id alone for a re-test of
        a completed or live Action (only those; at most 40 runs); or schedule
        alone (daily, weekly or monthly) for a schedule. Returns the estimate in
        credits, the agents the plan leaves out, a quote_token signed for this
        API key and project, and expires_at, 15 minutes later. A test quote also
        returns test_id, the id the start reserves under. A quote token works
        once: start another test by quoting again. Refused with 409
        test_in_progress while another test is queued or running, and with 400
        for a setup that cannot quote, with reason no_settings, job_incomplete,
        runner_disabled, customer_requests_off, action_not_shipped,
        baseline_unavailable, baseline_changed, invalid_test_options,
        scope_not_enabled, invalid_quick_shape, empty_test_scope,
        invalid_cell_shape or unpriced_model; 403 agent_not_in_plan when the
        plan includes none of the saved agents. Requires Agent Picks. A body
        that is not valid JSON, or an empty body, is refused with 400
        bad_request and no reason.
      operationId: quoteAgentPicksTest
      parameters:
        - name: projectId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              additionalProperties: false
              properties:
                action_id:
                  type: string
                  format: uuid
                schedule:
                  type: string
                  enum:
                    - daily
                    - weekly
                    - monthly
                preset:
                  type: string
                  enum:
                    - quick
                    - cell
                runs_per_cell:
                  type: integer
                  enum:
                    - 1
                    - 3
                    - 8
                scope:
                  type: object
                  additionalProperties: false
                  properties:
                    environment_ids:
                      type: array
                      items:
                        type: string
                    request_ids:
                      type: array
                      items:
                        type: string
                    intents:
                      type: array
                      items:
                        type: string
                        enum:
                          - add
                          - recommend
                          - hosted
                    agent_models:
                      type: array
                      minItems: 1
                      maxItems: 7
                      items:
                        $ref: '#/components/schemas/AgentPicksAgentModel'
              required: []
      responses:
        '200':
          description: Agent Picks quote
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: '#/components/schemas/AgentPicksQuoteData'
                  meta:
                    $ref: '#/components/schemas/Meta'
                required:
                  - data
                  - meta
        '400':
          $ref: '#/components/responses/BadRequestError'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '403':
          $ref: '#/components/responses/ForbiddenError'
        '404':
          $ref: '#/components/responses/NotFoundError'
        '409':
          $ref: '#/components/responses/ConflictError'
        '429':
          $ref: '#/components/responses/RateLimitExceededError'
components:
  schemas:
    AgentPicksAgentModel:
      type: object
      additionalProperties: false
      properties:
        agent:
          type: string
          enum:
            - claude_code
            - codex
            - opencode
            - pi
          description: Pi and OpenCode need an Agent Picks Pro or Enterprise plan.
        model:
          type: string
          description: >-
            A priced model offered for the selected agent. Claude Code:
            claude-sonnet-5-5, claude-opus-5-5, claude-fable-5-1,
            claude-haiku-5-5. Codex: gpt-6.1-sol, gpt-6-astra, gpt-6-luna. Pi
            and OpenCode: any of those seven.
      required:
        - agent
        - model
    AgentPicksQuoteData:
      type: object
      required:
        - purpose
        - estimate
        - excluded_agents
        - quote_token
        - expires_at
      properties:
        purpose:
          type: string
          enum:
            - paid_test
            - schedule
          description: >-
            paid_test for a test or re-test quote, schedule for one run of a
            schedule.
        test_id:
          type: string
          format: uuid
          description: >-
            The id the start reserves under, for a test quote. Follow it with
            the test read.
        action_id:
          type:
            - string
            - 'null'
          format: uuid
          description: The Action a re-test quote measures.
        cadence:
          type: string
          enum:
            - daily
            - weekly
            - monthly
          description: The cadence a schedule quote enables.
        estimate:
          type: object
          required:
            - expected
            - high
            - runs
          properties:
            expected:
              type: number
              description: Credits.
            high:
              type: number
              description: Credits the start reserves; settlement never charges more.
            runs:
              type: integer
        excluded_agents:
          type: array
          items:
            type: string
          description: >-
            Saved agents the account’s Agent Picks plan does not include, which
            the test leaves out.
        quote_token:
          type: string
          description: Signed for this API key or OAuth connection and project. Works once.
        expires_at:
          type: string
          format: date-time
    Meta:
      type: object
      properties:
        timestamp:
          type: string
          format: date-time
        projectId:
          type: string
          format: uuid
    Error:
      type: object
      properties:
        error:
          type: string
        message:
          type: string
        reason:
          type: string
          description: >-
            Why the request was refused, for an error with more than one cause,
            such as a refused content-draft start.
        details:
          type: object
          additionalProperties: true
          description: >-
            Machine-readable facts about the refusal, such as shortfall_credits
            when an Agent Picks start is refused for insufficient_credits.
        status:
          type: integer
      required:
        - error
        - message
        - status
  responses:
    BadRequestError:
      description: Bad request
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    UnauthorizedError:
      description: Unauthorized
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    ForbiddenError:
      description: Forbidden
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    NotFoundError:
      description: Not found
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    ConflictError:
      description: Request conflicts with current resource state
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    RateLimitExceededError:
      description: Rate limit exceeded
      headers:
        X-RateLimit-Limit:
          $ref: '#/components/headers/X-RateLimit-Limit'
        X-RateLimit-Remaining:
          $ref: '#/components/headers/X-RateLimit-Remaining'
        X-RateLimit-Reset:
          $ref: '#/components/headers/X-RateLimit-Reset'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  headers:
    X-RateLimit-Limit:
      description: Maximum requests per window
      schema:
        type: integer
    X-RateLimit-Remaining:
      description: Requests remaining in current window
      schema:
        type: integer
    X-RateLimit-Reset:
      description: Unix timestamp when the window resets
      schema:
        type: integer
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >-
        API key with dtk_live_ prefix. Obtain it from API Keys in the account
        sidebar. New keys start with all supported scopes selected for the
        chosen project, and you can narrow them to specific read/write scopes as
        needed.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.