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

# Preview playtable field run

> Run an unsaved action_ai_research column against ONE row and answer what its cell would hold: before the column exists, or with the edited prompt of one that does (the drawer's per-row Preview). The same gate, model resolution and output coercion as the paid run, so a preview never promises what the run refuses. PRICED AS ONE ROW: the platform's charge comes back in credits_charged; a row the gate skips (will_run false, skip_reason run_condition_not_met or empty_context) costs nothing. Writes nothing: no cell, no run, no ledger receipt. Every call asks the model again with a fresh key, so a repeat may answer differently and is charged again. Read value, reasoning and confidence; error_code names a refusal before any charge (model_not_in_catalog, web_search_not_supported), a failed call, or an answer that could not be coerced to payload.output (the model ran and was paid). Show the user the sample and its cost; the whole column is create_playtable_run after estimate_playtable_run.

Contract:
- MCP tool `preview_playtable_field_run`, registry package `mcp.playtables/playtable_fields`, mount `playtables.columns`.
- Operation `action`, response envelope `action`.
- Flags: none.



## OpenAPI

````yaml /api-reference/playtables/openapi.yaml post /api/playtable-fields/preview-run
openapi: 3.0.3
info:
  title: 'GetSales public contract: gs.service.playtables'
  description: >-
    The data platform and the outreach engine: tables of people and companies,
    their enrichment columns, cells and runs, the data sources that feed them,
    sender profiles, the stoplist, the activity feed, the credit ledger, and the
    multichannel workflows with their per-person journeys and tasks.


    GENERATED. This document is projected from the Zod MCP tool registry in
    `product/mcp/gs.mcp` (one tool per public endpoint, 1:1). Do not edit it by
    hand; edit the tool definition and regenerate with `pnpm openapi:public`.


    Surface: the public `/api` contract of `gs.service.playtables`, 142
    operations. This is the only OpenAPI document the platform publishes.
    Internal (`/internal`) and health endpoints are deliberately absent: they
    are not part of any contract, they can change without notice, and the
    service source is their only description.


    Conventions:

    - Auth is a bearer JWT, optionally narrowed by the `Team-SID` header.

    - Every success body is an MCP envelope: `success: true` plus one typed
    `operation` shape (`search`, `get`, `create`, `update`, `delete`, `metrics`,
    `group_by`, `action`), and a `meta` block with `trace_id` for support.

    - Every failure is the same `McpError` envelope with a code from a fixed
    16-code taxonomy, so a client maps errors once.

    - Lists page with `page_size` (0 to 500, default 50) plus an opaque forward
    `cursor`; `page_size: 0` returns counts only.

    - On `GET` and `DELETE`, object-valued query parameters (`filter`, `sort`)
    travel as JSON text and array-valued ones repeat as `name[]=value`.

    - The MCP-only `_meta` field (usage analytics) never reaches the backend and
    is not part of this contract.
  version: '1.0'
  contact:
    name: GetSales
    url: https://getsales.io
    email: support@getsales.io
  license:
    name: Proprietary
    url: https://getsales.io/terms
servers:
  - url: https://beta.getsales.io/playtables/v1
    description: >-
      Production (the gateway path on the beta ring; the origin is provisioned
      per DEPLOY_MAP.md)
security:
  - BearerJwt: []
    TeamSid: []
tags:
  - name: activities
    description: >-
      Registry package `mcp.playtables/activities`, served on MCP mount
      `playtables.journeys`.
  - name: activity_objects
    description: >-
      Registry package `mcp.playtables/activity_objects`, served on MCP mount
      `playtables.people`.
  - name: companies
    description: >-
      Registry package `mcp.playtables/companies`, served on MCP mount
      `playtables.people`.
  - name: credit_ledger_entries
    description: >-
      Registry package `mcp.playtables/credit_ledger_entries`, served on MCP
      mount `id.billing`.
  - name: data_source_items
    description: >-
      Registry package `mcp.playtables/data_source_items`, served on MCP mount
      `playtables.sources`.
  - name: data_sources
    description: >-
      Registry package `mcp.playtables/data_sources`, served on MCP mount
      `playtables.sources`.
  - name: notes
    description: >-
      Registry package `mcp.playtables/notes`, served on MCP mount
      `playtables.pipeline`.
  - name: people
    description: >-
      Registry package `mcp.playtables/people`, served on MCP mount
      `playtables.people`.
  - name: pipeline_stages
    description: >-
      Registry package `mcp.playtables/pipeline_stages`, served on MCP mount
      `playtables.pipeline`.
  - name: plays
    description: >-
      Registry package `mcp.playtables/plays`, served on MCP mount
      `playtables.pipeline`.
  - name: playtable_field_values
    description: >-
      Registry package `mcp.playtables/playtable_field_values`, served on MCP
      mount `playtables.columns`.
  - name: playtable_fields
    description: >-
      Registry package `mcp.playtables/playtable_fields`, served on MCP mount
      `playtables.columns`.
  - name: playtable_runs
    description: >-
      Registry package `mcp.playtables/playtable_runs`, served on MCP mount
      `playtables.columns`.
  - name: playtable_views
    description: >-
      Registry package `mcp.playtables/playtable_views`, served on MCP mount
      `playtables.tables`.
  - name: playtables
    description: >-
      Registry package `mcp.playtables/playtables`, served on MCP mount
      `playtables.tables`.
  - name: result_pages
    description: >-
      Registry package `mcp.playtables/result_pages`, served on MCP mount
      `playtables.tables`.
  - name: sender_profiles
    description: >-
      Registry package `mcp.playtables/sender_profiles`, served on MCP mount
      `playtables.sources`.
  - name: stoplist_entries
    description: >-
      Registry package `mcp.playtables/stoplist_entries`, served on MCP mount
      `playtables.stoplist`.
  - name: tags
    description: >-
      Registry package `mcp.playtables/tags`, served on MCP mount
      `playtables.pipeline`.
  - name: workflow_attachments
    description: >-
      Registry package `mcp.playtables/workflow_attachments`, served on MCP
      mount `playtables.workflows`.
  - name: workflow_records
    description: >-
      Registry package `mcp.playtables/workflow_records`, served on MCP mount
      `playtables.journeys`.
  - name: workflow_sources
    description: >-
      Registry package `mcp.playtables/workflow_sources`, served on MCP mount
      `playtables.workflows`.
  - name: workflow_tasks
    description: >-
      Registry package `mcp.playtables/workflow_tasks`, served on MCP mount
      `playtables.journeys`.
  - name: workflow_versions
    description: >-
      Registry package `mcp.playtables/workflow_versions`, served on MCP mount
      `playtables.workflows`.
  - name: workflows
    description: >-
      Registry package `mcp.playtables/workflows`, served on MCP mount
      `playtables.workflows`.
paths:
  /api/playtable-fields/preview-run:
    post:
      tags:
        - playtable_fields
      summary: Preview playtable field run
      description: >-
        Run an unsaved action_ai_research column against ONE row and answer what
        its cell would hold: before the column exists, or with the edited prompt
        of one that does (the drawer's per-row Preview). The same gate, model
        resolution and output coercion as the paid run, so a preview never
        promises what the run refuses. PRICED AS ONE ROW: the platform's charge
        comes back in credits_charged; a row the gate skips (will_run false,
        skip_reason run_condition_not_met or empty_context) costs nothing.
        Writes nothing: no cell, no run, no ledger receipt. Every call asks the
        model again with a fresh key, so a repeat may answer differently and is
        charged again. Read value, reasoning and confidence; error_code names a
        refusal before any charge (model_not_in_catalog,
        web_search_not_supported), a failed call, or an answer that could not be
        coerced to payload.output (the model ran and was paid). Show the user
        the sample and its cost; the whole column is create_playtable_run after
        estimate_playtable_run.


        Contract:

        - MCP tool `preview_playtable_field_run`, registry package
        `mcp.playtables/playtable_fields`, mount `playtables.columns`.

        - Operation `action`, response envelope `action`.

        - Flags: none.
      operationId: preview_playtable_field_run
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PreviewPlaytableFieldRunRequest'
      responses:
        '200':
          description: '`action` success envelope.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PreviewPlaytableFieldRunResponse'
        4XX:
          $ref: '#/components/responses/McpClientError'
        5XX:
          $ref: '#/components/responses/McpServerError'
components:
  schemas:
    PreviewPlaytableFieldRunRequest:
      type: object
      description: Request body of `preview_playtable_field_run`.
      properties:
        playtable_sid:
          type: string
          minLength: 18
          maxLength: 18
          pattern: ^pt_tb_
          description: Owner playtable sid (pt_tb_…).
        object_sid:
          type: string
          minLength: 18
          maxLength: 18
          description: >-
            The one row to try the draft on (cr_pp_… or cr_co_…), of this table
            and this team.
        type:
          type: string
          enum:
            - action_ai_research
          description: >-
            What the draft column is. Only action_ai_research runs inline today:
            waterfall and tool columns run through the queued executor and have
            no preview.
        payload:
          type: object
          properties:
            prompt:
              type: string
              minLength: 1
              maxLength: 8192
              description: >-
                Twig-templated research instruction; the template's variables,
                an unknown one 422. What the source found on a person (the role,
                the location) is in the Data source cell: {{record.data_source}}
                (its slug on a new table) reads it whole.
            model:
              type: string
              minLength: 1
              maxLength: 128
              description: >-
                'auto' (gtm-api routes the call) or a concrete gtm-api model id;
                validated against the gtm-api registry at save.
            output:
              type: string
              enum:
                - text
                - number
                - select
                - json
              description: >-
                Cell shape: text | number (non-numeric model answer → cell
                error) | select (one of payload.options) | json (extract values
                into columns via extraction formulas record.<slug>.<path>; push
                onto people/company attributes via output_mapping).
            options:
              type: array
              nullable: true
              items:
                type: string
              minItems: 1
              description: Required (min 1) when output=select; null otherwise.
            output_mapping:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  path:
                    type: string
                    minLength: 1
                    maxLength: 512
                    description: >-
                      JSON path into the tool/model result, e.g. $.email or
                      $.techs[0].name.
                  target:
                    type: string
                    minLength: 1
                    maxLength: 128
                    description: >-
                      Entity-attribute target ONLY: people.<attr> or
                      company.<attr> (writable-attribute registries;
                      fill-if-empty at projection); validated at save. No
                      record.<slug> targets: columns pull via extraction
                      formulas (record.<slug>.<path>), never via push mapping.
                required:
                  - path
                  - target
              maxItems: 20
              description: >-
                Project a 'json' result onto people/company attributes,
                fill-if-empty (max 20); null = no attribute writes. Columns pull
                via extraction formulas instead.
            web_search:
              type: boolean
              description: >-
                Default false: the model answers with the vendor's server-side
                web search on. A per-model capability: 422 relation_not_found at
                save, and web_search_not_supported on a preview, for a model
                without it.
          required:
            - prompt
            - model
            - output
            - options
            - output_mapping
          description: >-
            The drawer's live draft (prompt, model, output, options,
            output_mapping, web_search), validated exactly like
            create_playtable_field's: a payload that previews is a payload that
            saves.
        run_condition:
          anyOf:
            - type: object
              properties:
                and:
                  type: array
                  items:
                    type: object
                    additionalProperties: {}
                    description: >-
                      Recursive node: the same object shape repeats here. A
                      static OpenAPI document cannot express the cycle, so this
                      level is documented as an open object.
                  minItems: 1
                  maxItems: 20
              required:
                - and
              additionalProperties: false
            - type: object
              properties:
                or:
                  type: array
                  items:
                    type: object
                    additionalProperties: {}
                    description: >-
                      Recursive node: the same object shape repeats here. A
                      static OpenAPI document cannot express the cycle, so this
                      level is documented as an open object.
                  minItems: 1
                  maxItems: 20
              required:
                - or
              additionalProperties: false
            - type: object
              properties:
                not:
                  type: object
                  additionalProperties: {}
                  description: >-
                    Recursive node: the same object shape repeats here. A static
                    OpenAPI document cannot express the cycle, so this level is
                    documented as an open object.
              required:
                - not
              additionalProperties: false
            - type: object
              properties:
                any:
                  type: object
                  properties:
                    path:
                      type: string
                      minLength: 1
                      description: >-
                        Array-valued path - the only way to reach inside an
                        array.
                    where:
                      type: object
                      additionalProperties: {}
                      description: >-
                        Recursive node: the same object shape repeats here. A
                        static OpenAPI document cannot express the cycle, so
                        this level is documented as an open object.
                  required:
                    - path
                    - where
                  additionalProperties: false
              required:
                - any
              additionalProperties: false
            - type: object
              properties:
                field:
                  type: string
                  minLength: 1
                  description: >-
                    Namespaced path: record.<slug> or a built-in object
                    attribute; element-relative inside any.where.
                op:
                  type: object
                  properties:
                    eq:
                      anyOf:
                        - type: string
                        - type: number
                        - type: boolean
                    ne:
                      anyOf:
                        - type: string
                        - type: number
                        - type: boolean
                    in:
                      type: array
                      items:
                        anyOf:
                          - type: string
                          - type: number
                          - type: boolean
                      minItems: 1
                      maxItems: 100
                    nin:
                      type: array
                      items:
                        anyOf:
                          - type: string
                          - type: number
                          - type: boolean
                      minItems: 1
                      maxItems: 100
                    gt:
                      anyOf:
                        - type: number
                        - type: string
                    gte:
                      anyOf:
                        - type: number
                        - type: string
                    lt:
                      anyOf:
                        - type: number
                        - type: string
                    lte:
                      anyOf:
                        - type: number
                        - type: string
                    is_null:
                      type: boolean
                    contains:
                      type: string
                      minLength: 1
                    not_contains:
                      type: string
                      minLength: 1
                    contains_any:
                      type: array
                      items:
                        type: string
                        minLength: 1
                      minItems: 1
                      maxItems: 50
                    not_contains_any:
                      type: array
                      items:
                        type: string
                        minLength: 1
                      minItems: 1
                      maxItems: 50
                    starts_with:
                      type: string
                      minLength: 1
                  additionalProperties: false
              required:
                - field
                - op
              additionalProperties: false
            - {}
          description: >-
            The draft gate; a row it skips costs nothing and answers will_run
            false. null or absent = no gate.
      required:
        - playtable_sid
        - object_sid
        - type
        - payload
    PreviewPlaytableFieldRunResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - action
        action:
          type: string
          description: kebab-case verb; matches the route segment.
        item: {}
        result:
          type: object
          properties:
            object_sid:
              type: string
            will_run:
              type: boolean
              description: >-
                false = the gate or the empty-context rule skipped the row: no
                call, no charge, skip_reason says which.
            skip_reason:
              type: string
              nullable: true
              description: >-
                run_condition_not_met (the gate) or empty_context (every row
                reference of the prompt resolved to nothing); null when the row
                ran.
            value:
              type: string
              nullable: true
              description: >-
                What the cell would hold; null when the row was skipped, the
                call failed or the answer could not be coerced to
                payload.output.
            error_code:
              type: string
              nullable: true
              description: >-
                model_not_in_catalog or web_search_not_supported (refused before
                any charge), a lane code (the call failed), or the coercion
                failure of an answer the model gave and the team paid for; null
                on success.
            error_message:
              type: string
              nullable: true
            reasoning:
              type: string
              nullable: true
              description: The model's reasoning when it gave one.
            confidence:
              type: string
              nullable: true
            model:
              type: string
              nullable: true
              description: >-
                The model that answered (the resolved one when payload.model is
                auto); null when nothing was called.
            credits_charged:
              type: number
              minimum: 0
              description: >-
                The platform's own charge for this one row, in credits; 0 on a
                skip or a refusal before the call.
            duration_ms:
              type: integer
              minimum: 0
          required:
            - object_sid
            - will_run
            - skip_reason
            - value
            - error_code
            - error_message
            - reasoning
            - confidence
            - model
            - credits_charged
            - duration_ms
        meta:
          type: object
          properties:
            trace_id:
              type: string
              description: UUID v7; same 128-bit value as the X-Trace-Id header.
            span_id:
              type: string
              pattern: ^[0-9a-f]{16}$
              description: 16 hex chars, root span of this request.
            timestamp:
              type: string
              description: ISO 8601 UTC (Y-m-dTH:i:sZ), response time.
            duration_ms:
              type: integer
              minimum: 0
              description: Server-side wall clock.
            team_sid:
              type: string
              nullable: true
              description: >-
                The team this call ran in (the token team, or the team_sid
                override). Null when unauthenticated; absent from pre-2026-08-20
                backends.
            actor_type:
              type: string
              nullable: true
              description: >-
                user | agent | api_key | system. Null when unauthenticated;
                absent from pre-2026-08-20 backends.
          required:
            - trace_id
            - span_id
            - timestamp
            - duration_ms
      required:
        - success
        - operation
        - action
        - item
        - result
        - meta
    McpError:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - false
        error:
          type: object
          properties:
            code:
              type: string
              enum:
                - validation_failed
                - nothing_to_update
                - not_found
                - relation_not_found
                - invalid_transition
                - limit_exceeded
                - payment_required
                - duplicate_rejected
                - conflict
                - delete_blocked
                - unauthorized
                - forbidden
                - rate_limited
                - internal_error
                - service_unavailable
                - not_implemented
            message:
              type: string
            recoverable:
              type: boolean
            suggestion:
              type: string
            field_errors:
              type: object
              additionalProperties:
                type: array
                items:
                  type: object
                  properties:
                    rule:
                      type: string
                    message:
                      type: string
                  required:
                    - rule
                    - message
            blockers:
              type: array
              items:
                type: object
                properties:
                  type:
                    type: string
                    description: >-
                      Machine-readable blocker type (active_flow, pending_tasks,
                      …).
                  severity:
                    type: string
                    enum:
                      - hard
                      - soft
                    description: >-
                      hard = external action required; soft = acknowledge is
                      enough.
                  description:
                    type: string
                  entity_sid:
                    type: string
                    nullable: true
                  count:
                    type: integer
                  resolution:
                    type: string
                    description: 'Hard: tool name to call. Soft: code for acknowledge[].'
                  resolution_hint:
                    type: string
                required:
                  - type
                  - severity
                  - description
                  - entity_sid
                  - resolution
                  - resolution_hint
            context:
              type: object
              additionalProperties: {}
          required:
            - code
            - message
            - recoverable
        meta:
          type: object
          properties:
            trace_id:
              type: string
              description: UUID v7; same 128-bit value as the X-Trace-Id header.
            span_id:
              type: string
              pattern: ^[0-9a-f]{16}$
              description: 16 hex chars, root span of this request.
            timestamp:
              type: string
              description: ISO 8601 UTC (Y-m-dTH:i:sZ), response time.
            duration_ms:
              type: integer
              minimum: 0
              description: Server-side wall clock.
            team_sid:
              type: string
              nullable: true
              description: >-
                The team this call ran in (the token team, or the team_sid
                override). Null when unauthenticated; absent from pre-2026-08-20
                backends.
            actor_type:
              type: string
              nullable: true
              description: >-
                user | agent | api_key | system. Null when unauthenticated;
                absent from pre-2026-08-20 backends.
          required:
            - trace_id
            - span_id
            - timestamp
            - duration_ms
      required:
        - success
        - error
  responses:
    McpClientError:
      description: >-
        MCP error envelope. `error.code` is one of validation_failed,
        nothing_to_update, not_found, relation_not_found, invalid_transition,
        limit_exceeded, payment_required, duplicate_rejected, conflict,
        delete_blocked, unauthorized, forbidden, rate_limited, not_implemented.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/McpError'
    McpServerError:
      description: >-
        MCP error envelope with `error.code` internal_error or
        service_unavailable.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/McpError'
  securitySchemes:
    BearerJwt:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: >-
        Access token issued by gs.service.id. Its `access_identity` claim
        carries `team_sid`, `actor_sid` and `actor_type`, and that team scope is
        authoritative.
    TeamSid:
      type: apiKey
      in: header
      name: Team-SID
      description: >-
        Team scope for tokens that do not carry one. Ignored when the token
        already names a team.

````

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