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

# Create a follow-up

> Wait for something to arrive somewhere, or check back later.

`where` is the place, `match` what counts as arrived, `within` how long to wait, all explained in [Follow-ups](/concepts/follow-ups). Durations are strings such as `15m`, `2h`, `1h30m`, `10 minutes`, or a number of seconds.

The answer is the follow-up as `waiting`, with its `id`. Nothing calls you back: poll [Get a follow-up](/api-reference/followups/get) until `status` is `done`. For `kind: time`, leave `match` and `check_every` out.

Creating twice makes two waits, so send an `Idempotency-Key` to make a retry safe. See [Idempotency](/api-reference/pagination-and-idempotency#idempotency).

| Status | Why |
| - | - |
| `403` | The key lacks `followups:write`, or `apps:read` for a place in a connected app. |
| `404` | The app has no such tool. `detail` points to its tool list. |
| `409` `app_not_connected` | The app is not connected, or its connection expired. `detail.connect_url` connects it. |
| `422` | A field is wrong (`param` names it): a tool that writes, a `within` over 72 hours, a field that does not go with that `kind`, or you have no Valendata address yet. |

You can have 25 follow-ups waiting at once; one more is refused with a sentence that says so. Cancel one to make room.

MCP tool: `create_followup`.


## OpenAPI

````yaml POST /v1/followups
openapi: 3.1.0
info:
  title: Valendata REST API
  version: 1.0.0
  description: >-
    Create, run, schedule, and improve skills and workflows over JSON and HTTPS.
    Every route is under `/v1`; changes inside v1 are additive only (new routes,
    new optional parameters, new response fields). A route that will go away is
    marked `deprecated` here and answers with `Deprecation`, `Sunset` and a
    `Link` to its replacement for at least six months before it is removed.
    Errors, limits, pagination and idempotency:
    https://docs.valendata.com/api-reference/errors.
  license:
    name: Proprietary
    url: https://www.valendata.com/terms-and-conditions
servers:
  - url: https://api.valendata.com
    description: Production
security:
  - ApiKeyAuth: []
  - ApiKeyHeader: []
tags:
  - name: Skills
    description: List, create, read, update, and delete skills.
  - name: Marketplace
    description: Find a skill by the task, with its price per run and track record.
  - name: Runs
    description: Run skills and workflows, read any run, and cancel one.
  - name: Skill versions
    description: List, compare, restore, and pin a skill's versions.
  - name: Improvements
    description: >-
      Fix a skill, add fields, or re-learn its detail steps, and read its change
      history.
  - name: Schedules
    description: Run a skill or workflow on a fixed cadence.
  - name: Workflows
    description: List, create, read, update, and delete workflows.
  - name: Logins
    description: Saved website logins a skill can sign in with.
  - name: Connected apps
    description: >-
      Your own accounts (Gmail, Calendar, Slack …): connect them, list their
      tools, and run one.
  - name: Follow-ups
    description: >-
      Wait for something to arrive (a code, a link, a file, a message) or check
      back later, and read what came.
  - name: Jobs
    description: >-
      What your agents started to run in the background (skill runs, workflow
      runs, research), what came back, and stopping it.
  - name: Notes
    description: >-
      The notes on your Notes page: list and search them, read one, write,
      change, and delete them.
  - name: Account and usage
    description: Your plan, credit balance, and usage.
  - name: Webhooks
    description: The secret that signs webhook deliveries.
paths:
  /v1/followups:
    post:
      tags:
        - Follow-ups
      summary: Create a follow-up
      description: >-
        Wait for something to arrive, or check back later. `where.kind` says
        where it will land: `inbox` (your Valendata address), `email_app` (a
        connected mail app, by its `address`), `app_tool` (a read tool of a
        connected app, run with `arguments` on each check), `webpage` (a page
        that will change, by `url`), `run` (a workflow run reaching its end, by
        `run_id`), or `time` (nothing to look in: a check-back when `within` is
        up). `match` says what counts as arrived: its `kind` (`code`, `link`,
        `file`, `message`, `any`) and the sender's domain, address, recipient,
        or words it must contain. Only things that arrive after now count.
        `within` (at most 72 hours) is how long to wait, `check_every` how often
        to look. Answers `201` with the follow-up as `waiting`; poll `GET
        /v1/followups/{followup_id}` for its outcome (nothing calls you back).
        Up to 25 waiting at once. Needs `followups:write`, plus `apps:read` for
        `email_app` and `app_tool` (each check reads the app and costs the
        app-call price). `409` with code `app_not_connected` when the app is not
        connected: `detail.connect_url` connects it.
      operationId: create_followup
      parameters:
        - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateFollowupRequest'
            example:
              what: the sign-in code from greenhouse.io
              where:
                kind: inbox
              match:
                kind: code
                from_domain: greenhouse.io
              within: 15m
      responses:
        '201':
          description: >-
            The follow-up, waiting. Poll `GET /v1/followups/{followup_id}` for
            its outcome.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Followup'
              example:
                id: 7f1c2e4a-9b3d-4c5e-8a6f-0d1e2f3a4b5c
                agent: api
                conversation_id: ''
                what: the sign-in code from greenhouse.io
                where:
                  kind: inbox
                  app: ''
                  address: ada.lovelace@mail.valendata.com
                  tool: ''
                  url: ''
                  run_id: ''
                match:
                  kind: code
                  from_domain: greenhouse.io
                  sender: ''
                  recipient: ''
                  subject_has: ''
                  text_has: ''
                status: waiting
                outcome: null
                found: null
                note: null
                since: '2026-10-10T09:00:00Z'
                next_check_at: '2026-10-10T09:00:30Z'
                deadline: '2026-10-10T09:15:00Z'
                checks: 0
                created_at: '2026-10-10T09:00:00Z'
                ended_at: null
          headers:
            X-Request-ID:
              $ref: '#/components/headers/X-Request-ID'
            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'
            Idempotent-Replayed:
              $ref: '#/components/headers/Idempotent-Replayed'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '422':
          $ref: '#/components/responses/Unprocessable'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '502':
          $ref: '#/components/responses/BadGateway'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
      security:
        - ApiKeyAuth: []
        - ApiKeyHeader: []
components:
  parameters:
    IdempotencyKey:
      name: Idempotency-Key
      in: header
      required: false
      schema:
        type: string
        minLength: 1
        maxLength: 255
      description: >-
        Any unique string (such as your order id). Resending the same request
        with the same key within 24 hours returns the first answer (with
        `Idempotent-Replayed: true`) and does nothing twice; the same key with a
        different request is a 422 `idempotency_key_reused`.
      example: order-1234
  schemas:
    CreateFollowupRequest:
      properties:
        what:
          type: string
          maxLength: 500
          minLength: 1
          title: What
          description: >-
            What you are waiting for, in plain words: shown to the user and read
            back with the outcome, e.g. 'the sign-in code from greenhouse.io'.
        where:
          $ref: '#/components/schemas/WhereRequest'
        match:
          anyOf:
            - $ref: '#/components/schemas/MatchRequest'
            - type: 'null'
          description: Not with kind `time`.
        within:
          anyOf:
            - type: string
            - type: integer
          title: Within
          description: >-
            How long to wait (or when to check back): '90s', '15m', '2h', '1d',
            '1h30m', '10 minutes', or a number of seconds. At most 72 hours.
          examples:
            - 15m
            - 900
        check_every:
          anyOf:
            - type: string
            - type: integer
          title: Check Every
          description: >-
            How often to look, '90s', '15m', '2h', '1d', '1h30m', '10 minutes',
            or a number of seconds; at least 30 seconds. Default: what suits the
            place (an inbox is told on arrival; a web page is read every few
            minutes). Not for `time`.
          examples:
            - 15m
            - 900
      type: object
      required:
        - what
        - where
        - within
      title: CreateFollowupRequest
    Followup:
      properties:
        id:
          type: string
          title: Id
        agent:
          type: string
          enum:
            - igris
            - session
            - brain
            - api
          title: Agent
          description: >-
            Who is waiting: `api` for one made here; `igris`, `session` or
            `brain` for one an in-app agent made.
        conversation_id:
          type: string
          title: Conversation Id
          description: The session or workflow of an in-app agent; empty here.
          default: ''
        what:
          type: string
          title: What
        where:
          $ref: '#/components/schemas/FollowupWhere'
        match:
          $ref: '#/components/schemas/FollowupMatch'
        status:
          type: string
          enum:
            - waiting
            - done
            - cancelled
            - failed
          title: Status
          description: >-
            `waiting`: timed and checked. `done`: ended (`outcome` says how).
            `cancelled`. `failed`: could not be checked (`note` says why).
        outcome:
          anyOf:
            - type: string
              enum:
                - found
                - time_up
                - expired
            - type: 'null'
          title: Outcome
          description: >-
            `found`: it arrived (`found` holds it). `time_up`: a check-back's
            time came. `expired`: nothing came in time.
        found:
          anyOf:
            - $ref: '#/components/schemas/FollowupFound'
            - type: 'null'
        note:
          anyOf:
            - type: string
            - type: 'null'
          title: Note
          description: One plain line on how it ended.
        since:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Since
          description: Only things that arrived after this count.
        next_check_at:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Next Check At
        deadline:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Deadline
        checks:
          type: integer
          title: Checks
          description: How many times the place was looked in.
          default: 0
        created_at:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Created At
        ended_at:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Ended At
      type: object
      required:
        - id
        - agent
        - what
        - where
        - status
      title: Followup
    WhereRequest:
      properties:
        kind:
          type: string
          enum:
            - inbox
            - email_app
            - app_tool
            - webpage
            - run
            - time
          title: Kind
          description: >-
            Where it will land. `inbox`: your Valendata address. `email_app`: a
            connected mail app (Gmail, Outlook …) by its account `address`.
            `app_tool`: a read tool of a connected app, run with `arguments` on
            each check. `webpage`: a page that will change, by `url`. `run`: a
            workflow run reaching its end, by `run_id`. `time`: nothing to look
            in — a check-back when `within` is up.
        address:
          anyOf:
            - type: string
              maxLength: 320
            - type: 'null'
          title: Address
          description: >-
            `inbox` / `email_app`: the mailbox address. For `inbox` it may be
            left out (your Valendata address).
        app:
          anyOf:
            - type: string
              maxLength: 80
            - type: 'null'
          title: App
          description: '`app_tool`: the app''s id, e.g. `slack`.'
        tool:
          anyOf:
            - type: string
              maxLength: 128
            - type: 'null'
          title: Tool
          description: '`app_tool`: the read tool''s slug from GET /v1/apps/{app}/tools.'
        arguments:
          additionalProperties: true
          type: object
          title: Arguments
          description: '`app_tool`: the tool''s inputs, by name.'
        url:
          anyOf:
            - type: string
              maxLength: 2048
            - type: 'null'
          title: Url
          description: '`webpage`: the page, http(s).'
        run_id:
          anyOf:
            - type: string
              maxLength: 255
            - type: 'null'
          title: Run Id
          description: '`run`: the workflow run''s id.'
      type: object
      required:
        - kind
      title: WhereRequest
    MatchRequest:
      properties:
        kind:
          type: string
          enum:
            - code
            - link
            - file
            - message
            - any
          title: Kind
          description: >-
            `code`: a one-time code. `link`: a link to click (verify, reset,
            sign in). `file`: an attachment. `message`: a message itself (a
            reply, an offer). `any`: whatever comes.
          default: any
        from_domain:
          type: string
          maxLength: 255
          title: From Domain
          description: The sender's domain, e.g. `greenhouse.io` — it or a sub-domain.
          default: ''
        sender:
          type: string
          maxLength: 320
          title: Sender
          description: The exact sender address.
          default: ''
        recipient:
          type: string
          maxLength: 320
          title: Recipient
          description: The address it was sent to.
          default: ''
        subject_has:
          type: string
          maxLength: 200
          title: Subject Has
          description: Words the subject must contain (any case).
          default: ''
        text_has:
          type: string
          maxLength: 200
          title: Text Has
          description: Words the subject or body must contain (any case).
          default: ''
      type: object
      title: MatchRequest
      description: >-
        What counts as "it arrived". Every field given must hold; empty ones are
        not checked.
    FollowupWhere:
      properties:
        kind:
          type: string
          enum:
            - inbox
            - email_app
            - app_tool
            - webpage
            - run
            - time
          title: Kind
        app:
          type: string
          title: App
          description: '`email_app` / `app_tool`: the app''s id.'
          default: ''
        address:
          type: string
          title: Address
          description: '`inbox` / `email_app`: the mailbox address.'
          default: ''
        tool:
          type: string
          title: Tool
          description: '`app_tool`: the tool''s slug.'
          default: ''
        url:
          type: string
          title: Url
          description: '`webpage`: the page.'
          default: ''
        run_id:
          type: string
          title: Run Id
          description: '`run`: the run.'
          default: ''
      type: object
      required:
        - kind
      title: FollowupWhere
    FollowupMatch:
      properties:
        kind:
          type: string
          enum:
            - code
            - link
            - file
            - message
            - any
          title: Kind
          default: any
        from_domain:
          type: string
          title: From Domain
          default: ''
        sender:
          type: string
          title: Sender
          default: ''
        recipient:
          type: string
          title: Recipient
          default: ''
        subject_has:
          type: string
          title: Subject Has
          default: ''
        text_has:
          type: string
          title: Text Has
          default: ''
      type: object
      title: FollowupMatch
    FollowupFound:
      properties:
        kind:
          type: string
          enum:
            - code
            - link
            - file
            - message
            - any
          title: Kind
        summary:
          type: string
          title: Summary
          description: One plain line, e.g. 'a 6-digit code from greenhouse.io'.
        code:
          type: string
          title: Code
          default: ''
        link:
          type: string
          title: Link
          default: ''
        file_url:
          type: string
          title: File Url
          default: ''
        file_name:
          type: string
          title: File Name
          default: ''
        text:
          type: string
          title: Text
          description: A short excerpt, never a whole mailbox.
          default: ''
        sender:
          type: string
          title: Sender
          default: ''
        subject:
          type: string
          title: Subject
          default: ''
        received_at:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Received At
        ref:
          type: string
          title: Ref
          description: The source's own id for it (a message id, a run id).
          default: ''
      type: object
      required:
        - kind
        - summary
      title: FollowupFound
      description: The thing that arrived — only it, never the rest of the mailbox.
    Error:
      type: object
      required:
        - detail
        - code
        - type
        - request_id
      properties:
        detail:
          description: What went wrong. A string, or an object for errors with more to say.
          oneOf:
            - type: string
            - additionalProperties: true
              type: object
        code:
          type: string
          description: >-
            Stable machine-readable code. Known values: `bad_request`,
            `invalid_json`, `invalid_cursor`, `invalid_idempotency_key`,
            `unauthorized`, `payment_required`, `permission_denied`,
            `not_found`, `method_not_allowed`, `conflict`, `app_not_connected`,
            `idempotency_key_in_use`, `idempotent_replay_unavailable`,
            `payload_too_large`, `unsupported_media_type`, `validation_error`,
            `idempotency_key_reused`, `rate_limited`, `internal_error`,
            `upstream_error`, `service_unavailable`.
          example: not_found
        type:
          type: string
          enum:
            - invalid_request_error
            - authentication_error
            - billing_error
            - permission_error
            - conflict_error
            - idempotency_error
            - rate_limit_error
            - api_error
          description: The broad category of the error.
        request_id:
          type: string
          description: Also in the `X-Request-ID` header.
          example: 3f9a1c2b7d4e
        param:
          type: string
          description: >-
            The field at fault, on validation errors (dotted path, e.g.
            `inputs.city`).
        errors:
          type: array
          items:
            additionalProperties: true
            type: object
          description: Every validation problem, on a 422 from request validation.
  headers:
    X-Request-ID:
      description: >-
        This request's id (yours, if you sent a valid `X-Request-ID`). Quote it
        to support.
      schema:
        type: string
    X-RateLimit-Limit:
      description: Requests a minute this API key may make.
      schema:
        type: integer
    X-RateLimit-Remaining:
      description: Requests left in the current minute.
      schema:
        type: integer
    X-RateLimit-Reset:
      description: Unix time (seconds) the current window ends.
      schema:
        type: integer
    Idempotent-Replayed:
      description: >-
        `true` when this is the stored answer to an earlier request with the
        same Idempotency-Key.
      schema:
        type: string
    Retry-After:
      description: Seconds to wait before retrying.
      schema:
        type: integer
  responses:
    BadRequest:
      description: >-
        The request is malformed: the body is not JSON, the cursor or
        Idempotency-Key is not valid.
      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'
        X-Request-ID:
          $ref: '#/components/headers/X-Request-ID'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            detail: >-
              The request is malformed: the body is not JSON, the cursor or
              Idempotency-Key is not valid.
            code: invalid_json
            type: invalid_request_error
            request_id: 3f9a1c2b7d4e
    Unauthorized:
      description: The API key is missing, malformed, revoked, or expired.
      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'
        X-Request-ID:
          $ref: '#/components/headers/X-Request-ID'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            detail: The API key is missing, malformed, revoked, or expired.
            code: unauthorized
            type: authentication_error
            request_id: 3f9a1c2b7d4e
    Forbidden:
      description: >-
        The key lacks a scope, is limited to other skills or workflows, or you
        may not do this.
      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'
        X-Request-ID:
          $ref: '#/components/headers/X-Request-ID'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            detail: >-
              The key lacks a scope, is limited to other skills or workflows, or
              you may not do this.
            code: permission_denied
            type: permission_error
            request_id: 3f9a1c2b7d4e
    NotFound:
      description: It does not exist, or it is not yours to see.
      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'
        X-Request-ID:
          $ref: '#/components/headers/X-Request-ID'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            detail: It does not exist, or it is not yours to see.
            code: not_found
            type: invalid_request_error
            request_id: 3f9a1c2b7d4e
    Conflict:
      description: >-
        A conflict with the current state, or a request with this
        Idempotency-Key is still running.
      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'
        X-Request-ID:
          $ref: '#/components/headers/X-Request-ID'
        Retry-After:
          $ref: '#/components/headers/Retry-After'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            detail: >-
              A conflict with the current state, or a request with this
              Idempotency-Key is still running.
            code: conflict
            type: conflict_error
            request_id: 3f9a1c2b7d4e
    Unprocessable:
      description: >-
        A field is invalid (`param` names it), or the Idempotency-Key was used
        with a different request.
      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'
        X-Request-ID:
          $ref: '#/components/headers/X-Request-ID'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            detail: 'Invalid request — name: Field required'
            code: validation_error
            type: invalid_request_error
            request_id: 3f9a1c2b7d4e
            param: name
            errors:
              - type: missing
                loc:
                  - body
                  - name
                msg: Field required
    RateLimited:
      description: >-
        Too many requests for this key, or too many runs in progress. Wait
        `Retry-After` seconds.
      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'
        X-Request-ID:
          $ref: '#/components/headers/X-Request-ID'
        Retry-After:
          $ref: '#/components/headers/Retry-After'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            detail: >-
              Too many requests for this key, or too many runs in progress. Wait
              `Retry-After` seconds.
            code: rate_limited
            type: rate_limit_error
            request_id: 3f9a1c2b7d4e
    InternalError:
      description: >-
        Something broke on our side. Retry; runs that fail on our side are
        refunded.
      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'
        X-Request-ID:
          $ref: '#/components/headers/X-Request-ID'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            detail: >-
              Something broke on our side. Retry; runs that fail on our side are
              refunded.
            code: internal_error
            type: api_error
            request_id: 3f9a1c2b7d4e
    BadGateway:
      description: >-
        A connected app, or the service that connects it, answered with an error
        or could not be reached.
      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'
        X-Request-ID:
          $ref: '#/components/headers/X-Request-ID'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            detail: >-
              A connected app, or the service that connects it, answered with an
              error or could not be reached.
            code: upstream_error
            type: api_error
            request_id: 3f9a1c2b7d4e
    ServiceUnavailable:
      description: >-
        This part of the API is not available on the server right now. Retry
        later.
      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'
        X-Request-ID:
          $ref: '#/components/headers/X-Request-ID'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            detail: >-
              This part of the API is not available on the server right now.
              Retry later.
            code: service_unavailable
            type: api_error
            request_id: 3f9a1c2b7d4e
  securitySchemes:
    ApiKeyAuth:
      type: http
      scheme: bearer
      bearerFormat: vd_sk_...
      description: >-
        API key with the `vd_sk_` prefix, as `Authorization: Bearer vd_sk_...`.
        Create keys in Settings → API Keys.
    ApiKeyHeader:
      type: apiKey
      in: header
      name: x-api-key
      description: The same API key in the `x-api-key` header.

````

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