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

# Replace the agent setup draft

> Replaces the draft whole. It validates as the post-claim API would: the Agent Picks setup and job as saveAgentPicksSetup and saveAgentPicksJob accept them, with ids in the published catalogue. A refused draft is 400 invalid_draft naming the first problem. Takes an agent access token, not an API key. Requires the `setup.draft` scope.



## OpenAPI

````yaml /openapi.json put /agent/setup-draft
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: []
tags:
  - name: Connection and usage
    description: >-
      The project a credential is bound to, its scopes and features, usage, and
      code-mode receipts.
  - name: Setup
    description: >-
      Brands, domains, brand terms, platforms, content sources and pausing a
      project.
  - name: Prompts and topics
    description: Tracked prompts, their topics, and prompt-set analysis.
  - name: Visibility
    description: >-
      Visibility metrics, AI answers, sentiment, competitive position and the
      project timeline.
  - name: Citations
    description: Citation statistics and the most-cited domains and pages.
  - name: Positioning
    description: How well AI answers match your positioning statements.
  - name: Accuracy
    description: Claims AI answers make about your brand, and contradictions.
  - name: Content gaps
    description: Topics, sources and brands where competitors are cited.
  - name: AI Traffic
    description: >-
      AI referrals, answer fetches, crawls, 404 Demand, Direct lift and Search
      Console totals.
  - name: Adoption
    description: npm downloads and GitHub stars for project domains.
  - name: Audit and pages
    description: Audit findings, Google eligibility, page metrics, and locked pages.
  - name: Actions
    description: Suggested and accepted work, briefs, drafts and pull requests.
  - name: Results
    description: Content changes, measured results and what works.
  - name: Agents
    description: Managed agents, their schedules and runs.
  - name: Dex
    description: Private Dex conversations, specialist handoffs and memory.
  - name: Agent Picks
    description: Agent Picks setup, tests, schedules and results.
  - name: Library and Knowledge
    description: Library items and the Knowledge Profile.
  - name: Webhooks
    description: Webhook subscriptions and signing secrets.
  - name: Agent registration
    description: Setup drafts for an unclaimed agent registration.
paths:
  /agent/setup-draft:
    put:
      tags:
        - Agent registration
      summary: Replace the agent setup draft
      description: >-
        Replaces the draft whole. It validates as the post-claim API would: the
        Agent Picks setup and job as saveAgentPicksSetup and saveAgentPicksJob
        accept them, with ids in the published catalogue. A refused draft is 400
        invalid_draft naming the first problem. Takes an agent access token, not
        an API key. Requires the `setup.draft` scope.
      operationId: saveAgentSetupDraft
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AgentSetupDraft'
      responses:
        '200':
          description: The saved draft
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: '#/components/schemas/AgentSetupDraftState'
                  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'
        '429':
          $ref: '#/components/responses/RateLimitExceededError'
      security:
        - agentBearer: []
components:
  schemas:
    AgentSetupDraft:
      type: object
      additionalProperties: false
      required:
        - product
      description: >-
        An unclaimed agent registration’s project setup, replaced whole.
        visibility is required for ai-search and both and refused otherwise;
        agent_picks is required for agent-picks and both and refused otherwise.
        Probed platforms are not part of a draft. Plan limits are applied when a
        person claims the registration.
      properties:
        product:
          description: 'What the project is set up for: ai-search, agent-picks or both.'
          type: string
          enum:
            - ai-search
            - agent-picks
            - both
        trial_plan:
          type:
            - string
            - 'null'
          description: >-
            The Agent Picks plan a new account’s trial starts on: plus, pro or a
            price id. Only for agent-picks and both. Null when none is chosen.
        visibility:
          description: The AI search setup. Null unless product is ai-search or both.
          nullable: true
          type: object
          additionalProperties: false
          required:
            - domain
          properties:
            domain:
              type: string
              minLength: 1
              maxLength: 2048
              description: The project's website domain.
            brand_context:
              description: A description of the company. Null when none is given.
              type:
                - string
                - 'null'
              minLength: 20
              maxLength: 10000
            competitors:
              type: array
              maxItems: 25
              description: Under both, the one competitor list both products share.
              items:
                type: object
                additionalProperties: false
                required:
                  - name
                  - urls
                properties:
                  name:
                    type: string
                    minLength: 1
                    maxLength: 100
                  urls:
                    description: The competitor's website URLs.
                    type: array
                    minItems: 1
                    maxItems: 10
                    items:
                      type: string
                      minLength: 1
                      maxLength: 2048
            prompts:
              description: Prompts to track, as written.
              type: array
              maxItems: 50
              items:
                type: string
                minLength: 10
                maxLength: 1000
        agent_picks:
          description: >-
            The Agent Picks setup: a public category's setup (use_category) or
            the project's own job (start_from_scratch). Null unless product is
            agent-picks or both.
          nullable: true
          oneOf:
            - type: object
              additionalProperties: false
              required:
                - starting_point
                - setup
              properties:
                starting_point:
                  type: string
                  const: use_category
                setup:
                  type: object
                  description: >-
                    The body saveAgentPicksSetup accepts, with ids from
                    getPublicAgentPicksCatalogue.
            - type: object
              additionalProperties: false
              required:
                - starting_point
                - job
              properties:
                starting_point:
                  type: string
                  const: start_from_scratch
                job:
                  type: object
                  description: >-
                    The body saveAgentPicksJob accepts, with ids from
                    getPublicAgentPicksCatalogue.
    AgentSetupDraftState:
      type: object
      additionalProperties: false
      required:
        - draft
        - updated_at
        - expires_at
      properties:
        draft:
          nullable: true
          allOf:
            - $ref: '#/components/schemas/AgentSetupDraft'
          description: null until a draft is saved.
        updated_at:
          type:
            - string
            - 'null'
          format: date-time
          description: When the draft was last saved. Null until one is.
        expires_at:
          type: string
          format: date-time
          description: >-
            When the unclaimed registration expires. The next hourly cleanup
            deletes it with its draft and claim attempts.
    Meta:
      type: object
      description: Sent beside data on every successful response that returns data.
      properties:
        timestamp:
          type: string
          format: date-time
          description: When the response was produced.
        projectId:
          type: string
          format: uuid
    Error:
      type: object
      properties:
        error:
          type: string
          description: >-
            Machine-readable error code, such as bad_request, unauthorized,
            forbidden, not_found, conflict, payment_required,
            rate_limit_exceeded or internal_error. Some endpoints return their
            own codes, listed in their descriptions.
        message:
          type: string
          description: >-
            What went wrong, for a person to read. Do not parse it; use error
            and reason.
        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
          description: The HTTP status code, repeated in the body.
      required:
        - error
        - message
        - status
  responses:
    BadRequestError:
      description: >-
        The request is invalid: a parameter or body field is missing, has the
        wrong type or is out of range, or a cursor doesn't match this list. The
        message says which; reason, where present, is listed in the endpoint's
        description. Fix the request before retrying, and restart a list without
        its cursor. See [Errors](/api-reference/errors).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    UnauthorizedError:
      description: >-
        The request has no valid credential: the Authorization header is missing
        or malformed, or the API key or OAuth token is invalid, expired or
        revoked. Send `Authorization: Bearer <API key>` with an active key, or
        sign in again to get a new OAuth token. See
        [Errors](/api-reference/errors).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    ForbiddenError:
      description: >-
        The credential is valid but can't make this request. The message says
        which cause applies: the key or sign-in lacks the scope this endpoint
        requires (named in the message), it belongs to another project, the plan
        doesn't include API access or this feature, the project is paused (a
        paused project keeps only read scopes and setup.write), or the member a
        write acts as no longer has the role it needs. Read `GET
        /projects/{projectId}/connection` for the credential's current scopes
        and features, then use a key that has the scope, sign in again and
        approve it, or upgrade the plan. See [Errors](/api-reference/errors).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    NotFoundError:
      description: >-
        The resource doesn't exist in this project, was deleted, or the
        credential can't see it. Check the IDs in the path, and that the
        projectId is the project the credential is bound to. See
        [Errors](/api-reference/errors).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    RateLimitExceededError:
      description: >-
        Too many requests from this credential in the current window. The
        request was refused before it took effect, so it is safe to retry: wait
        until the time in X-RateLimit-Reset, then send it again. Endpoints that
        start agent runs have a stricter limit. See [Rate
        limits](/api-reference/rate-limits).
      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.
    agentBearer:
      type: http
      scheme: bearer
      description: >-
        Access token from an unclaimed agent registration (dtk_agent_ prefix),
        holding only setup.draft. Register at /agent/identity and exchange the
        identity assertion at /oauth2/token, as /auth.md describes. Only
        operations listing agentBearer accept it. Once a person claims the
        registration, its tokens act as the claimed API key under bearerAuth
        instead.

````

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