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

# Save Custom Query

> Create or replace a stored query. Validates in the same call.

A query that fails validation is still saved, as a draft with a reason —
but it cannot be enabled, and re-saving a previously-working one that now
fails turns it off.



## OpenAPI

````yaml /openapi.json put /core/custom-data/tables/{name}/queries/{query_name}
openapi: 3.1.0
info:
  title: Anyreach API
  version: 1.0.0
  description: >-
    REST API for the Anyreach platform.


    Every endpoint is scoped to one organization. Authenticate with a bearer
    token and, if your token can reach more than one organization, name the one
    you mean with the `X-Anyreach-Org` header. See
    [Authentication](https://docs.anyreach.ai/api-reference/authentication).


    This reference is generated from the running service, so the request and
    response shapes here are the ones the API actually enforces.
servers:
  - url: https://api.anyreach.ai
    description: Production
security:
  - bearerAuth: []
tags:
  - name: Agents
    description: >-
      Create and configure the agent that handles a conversation, and manage its
      versions. An agent's behaviour lives in a version; publishing a version is
      what puts it on the air.
  - name: Conversations
    description: >-
      Create, list, retrieve, and message conversations between your users and
      Anyreach agents.
  - name: Conversation attachments
    description: >-
      Upload files into a conversation and read them back. Uploads are two-step:
      presign, PUT to the returned URL, then mark the attachment complete.
  - name: Conversation events
    description: >-
      The ordered event stream behind a conversation — turns, tool calls,
      transfers, and status changes.
  - name: Knowledge bases
    description: >-
      A knowledge base (a `dataset` in the API) is a collection of embedded
      content an agent can retrieve from.
  - name: Knowledge base sources
    description: Attach and detach sources to a knowledge base.
  - name: Sources
    description: >-
      A source is a file or URL whose content is ingested, chunked, and
      embedded.
  - name: Phone numbers
    description: >-
      Buy, list, and release phone numbers, and point each one at the agent that
      should answer it.
  - name: Trunks
    description: >-
      SIP trunks for bringing your own carrier. A trunk carries calls between
      your carrier and Anyreach.
  - name: Inbound routing
    description: >-
      Rules that decide which agent answers an inbound call, evaluated before
      the call connects.
  - name: Agent assist
    description: >-
      Look up the live-assist context for a number so a human agent can see what
      the AI agent knows.
  - name: Human handoff
    description: >-
      Connections to the help desk a conversation escalates into, and the test
      endpoint that proves one works.
  - name: Email domains
    description: >-
      Register a sending domain and verify its DNS before an agent can send from
      it.
  - name: Email addresses
    description: >-
      The addresses on a verified domain, and the agent that handles mail
      arriving at each one.
  - name: Unsubscribes
    description: >-
      The suppression list. An address on this list is never emailed again until
      it is removed.
  - name: Web widgets
    description: >-
      The embeddable chat and voice widget: its appearance, its allowed domains,
      and the agent behind it.
  - name: Campaigns
    description: >-
      An outbound campaign dials a contact list with a given agent on a given
      schedule. Start, pause, and close control its lifecycle.
  - name: Campaign contacts
    description: >-
      The people a campaign dials. Contacts can be added while the campaign is
      running.
  - name: Campaign configurations
    description: >-
      Reusable dialing settings — calling windows, retry policy, timezone
      handling — that campaigns reference.
  - name: Campaign stats
    description: >-
      Per-campaign outcome counters, and the organization-wide cap on how many
      calls run at once.
  - name: Custom data
    description: >-
      Your own tables, queryable by an agent mid-conversation. Define a table,
      load rows, and expose read-only stored queries as agent tools.
  - name: Metrics
    description: >-
      The definitions an LLM judge scores a conversation against. Lint and
      preview a metric before you run it at scale.
  - name: Evaluations
    description: A scorecard binding a set of metrics to a population of conversations.
  - name: Evaluation runs
    description: >-
      One execution of an evaluation over a conversation set, and the results it
      produced.
  - name: Workflows
    description: >-
      Automations built from steps. A workflow is edited as a version and goes
      live when a version is published and set live.
  - name: Workflow triggers
    description: >-
      What starts a workflow — a schedule, a webhook, or a point in an agent
      conversation. Triggers are versioned alongside the workflow.
  - name: Workflow executions
    description: >-
      Run a workflow and read back what happened. Executions are synchronous by
      default; use the async endpoint for long-running work.
  - name: Workflow credentials
    description: >-
      Secrets a workflow step authenticates with. Values are write-only — they
      can be set and rotated, never read back.
paths:
  /core/custom-data/tables/{name}/queries/{query_name}:
    put:
      tags:
        - Custom data
      summary: Save Custom Query
      description: >-
        Create or replace a stored query. Validates in the same call.


        A query that fails validation is still saved, as a draft with a reason —

        but it cannot be enabled, and re-saving a previously-working one that
        now

        fails turns it off.
      operationId: saveCustomQuery
      parameters:
        - name: name
          in: path
          required: true
          schema:
            type: string
            title: Name
        - name: query_name
          in: path
          required: true
          schema:
            type: string
            title: Query Name
        - name: x-anyreach-org
          in: header
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            description: Organization ID for user PATs (pat_ prefix tokens)
            title: X-Anyreach-Org
          description: Organization ID for user PATs (pat_ prefix tokens)
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SavedQueryCreateRequest'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SavedQuerySchema'
              example:
                id: 1
                organization_id: 3fa85f64-5717-4562-b3fc-2c963f66afa6
                table_id: 1
                name: Example
                sql_source: string
                params:
                  - name: Example
                    type: string
                referenced_columns:
                  - string
                row_limit: 1
                status: draft
                validation_error: string
                enabled: false
                is_stale: false
                created_at: '2026-01-15T09:30:00Z'
                updated_at: '2026-01-15T09:30:00Z'
                created_by: user:3fa85f64-5717-4562-b3fc-2c963f66afa6
                modified_by: user:3fa85f64-5717-4562-b3fc-2c963f66afa6
        '404':
          description: Not found
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security:
        - HTTPBearer: []
components:
  schemas:
    SavedQueryCreateRequest:
      properties:
        sql:
          type: string
          title: SQL
        params:
          items:
            $ref: '#/components/schemas/QueryParamSpec'
          type: array
          title: Parameters
        row_limit:
          type: integer
          maximum: 500
          minimum: 1
          title: Row Limit
          default: 50
      type: object
      required:
        - sql
      title: SavedQueryCreateRequest
    SavedQuerySchema:
      properties:
        id:
          type: integer
          title: Id
        organization_id:
          type: string
          title: Organization Id
        table_id:
          type: integer
          title: Table Id
        name:
          type: string
          title: Name
        sql_source:
          type: string
          title: Sql Source
        params:
          items:
            $ref: '#/components/schemas/QueryParamSpec'
          type: array
          title: Params
        referenced_columns:
          anyOf:
            - items:
                type: string
              type: array
            - type: 'null'
          title: Referenced Columns
        row_limit:
          type: integer
          title: Row Limit
        status:
          type: string
          enum:
            - draft
            - validated
            - stale
            - broken
          title: Status
        validation_error:
          anyOf:
            - type: string
            - type: 'null'
          title: Validation Error
        enabled:
          type: boolean
          title: Enabled
        is_stale:
          anyOf:
            - type: boolean
            - type: 'null'
          title: Is Stale
        created_at:
          anyOf:
            - type: string
            - type: 'null'
          title: Created At
        updated_at:
          anyOf:
            - type: string
            - type: 'null'
          title: Updated At
        created_by:
          anyOf:
            - type: string
            - type: 'null'
          title: Created By
        modified_by:
          anyOf:
            - type: string
            - type: 'null'
          title: Modified By
      type: object
      required:
        - id
        - organization_id
        - table_id
        - name
        - sql_source
        - row_limit
        - status
        - enabled
      title: SavedQuerySchema
    HTTPValidationError:
      properties:
        detail:
          items:
            $ref: '#/components/schemas/ValidationError'
          type: array
          title: Detail
      type: object
      title: HTTPValidationError
    QueryParamSpec:
      properties:
        name:
          type: string
          title: Name
        type:
          type: string
          enum:
            - string
            - number
            - integer
            - boolean
            - date
            - date-time
          title: Type
          default: string
      type: object
      required:
        - name
      title: QueryParamSpec
    ValidationError:
      properties:
        loc:
          items:
            anyOf:
              - type: string
              - type: integer
          type: array
          title: Location
        msg:
          type: string
          title: Message
        type:
          type: string
          title: Error Type
      type: object
      required:
        - loc
        - msg
        - type
      title: ValidationError
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: Personal access token or organization API key. See Authentication.

````