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

# Estimate playtable field AI cost

> What a Use AI column costs a row of this grid before the save, in credits: the draft's prompt rendered on the grid's first rows, read as tokens, priced per token for every model of the catalog, a range per model (the smallest row to the largest with a typical answer) and a ceiling (the largest row with the model's output cap). No writes, no charges. Use it to quote a column or to pick a model; the run charges each row its real price.

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



## OpenAPI

````yaml /api-reference/playtables/openapi.yaml post /api/playtable-fields/estimate-ai-cost
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/estimate-ai-cost:
    post:
      tags:
        - playtable_fields
      summary: Estimate playtable field AI cost
      description: >-
        What a Use AI column costs a row of this grid before the save, in
        credits: the draft's prompt rendered on the grid's first rows, read as
        tokens, priced per token for every model of the catalog, a range per
        model (the smallest row to the largest with a typical answer) and a
        ceiling (the largest row with the model's output cap). No writes, no
        charges. Use it to quote a column or to pick a model; the run charges
        each row its real price.


        Contract:

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

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

        - Flags: read only.
      operationId: estimate_playtable_field_ai_cost
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/EstimatePlaytableFieldAiCostRequest'
      responses:
        '200':
          description: '`action` success envelope.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EstimatePlaytableFieldAiCostResponse'
        4XX:
          $ref: '#/components/responses/McpClientError'
        5XX:
          $ref: '#/components/responses/McpServerError'
components:
  schemas:
    EstimatePlaytableFieldAiCostRequest:
      type: object
      description: Request body of `estimate_playtable_field_ai_cost`.
      properties:
        playtable_sid:
          type: string
          minLength: 18
          maxLength: 18
          pattern: ^pt_tb_
          description: Owner playtable sid (pt_tb_…).
        object_type:
          type: string
          enum:
            - people
            - company
          description: 'The grid the column sits on: people or company.'
        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,
            web_search), validated exactly like create_playtable_field's. The
            prompt is rendered on the rows, so a {{record.<slug>}} that pulls a
            whole enrichment cell is priced at its size.
      required:
        - playtable_sid
        - object_type
        - payload
    EstimatePlaytableFieldAiCostResponse:
      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:
            rows_sampled:
              type: integer
              minimum: 0
              description: >-
                Rows the prompt was rendered on (the grid's first rows, up to
                20); 0 when the grid has none and the prompt's own words were
                read.
            rows_skipped:
              type: integer
              minimum: 0
              description: >-
                Rows of the sample the run would skip for an empty context
                (every variable resolved to nothing): free.
            rows_total:
              type: integer
              minimum: 0
              description: Rows of the grid the sample stands for.
            tokens_in:
              type: object
              properties:
                min:
                  type: integer
                  minimum: 0
                avg:
                  type: integer
                  minimum: 0
                max:
                  type: integer
                  minimum: 0
              required:
                - min
                - avg
                - max
              description: >-
                The rendered prompt with the answer instruction, in tokens by
                the platform's estimate (2.6 bytes a token).
            tokens_out_expected:
              type: integer
              minimum: 0
              description: >-
                The answer a typical row gets: the response, its reasoning and a
                confidence word.
            prices:
              type: array
              items:
                type: object
                properties:
                  provider:
                    type: string
                  model:
                    type: string
                  name:
                    type: string
                  default:
                    type: boolean
                    description: The model payload.model auto resolves to.
                  web_search:
                    type: boolean
                    description: The model can run web research.
                  price_min:
                    type: number
                    minimum: 0
                    description: 'Credits: the smallest sampled row with a typical answer.'
                  price_expected:
                    type: number
                    minimum: 0
                    description: >-
                      Credits: the average row with a typical answer, what one
                      row is expected to cost.
                  price_max:
                    type: number
                    minimum: 0
                    description: >-
                      Credits: the largest sampled row with a typical answer;
                      min to max is the range a drawer shows.
                  price_cap:
                    type: number
                    minimum: 0
                    description: >-
                      Credits: the largest row with the model's whole output
                      cap, what a run's max_budget is set from.
                  price_with_web_search_min:
                    type: number
                    nullable: true
                    description: >-
                      The same four with web research on (the search tool's
                      overhead on every prompt, then none, one, one and the cap
                      of searches); null when the model cannot search.
                  price_with_web_search_expected:
                    type: number
                    nullable: true
                  price_with_web_search_max:
                    type: number
                    nullable: true
                  price_with_web_search_cap:
                    type: number
                    nullable: true
                required:
                  - provider
                  - model
                  - name
                  - default
                  - web_search
                  - price_min
                  - price_expected
                  - price_max
                  - price_cap
                  - price_with_web_search_min
                  - price_with_web_search_expected
                  - price_with_web_search_max
                  - price_with_web_search_cap
              description: >-
                One price per model of the catalog; pick payload.model's (or the
                default for auto).
          required:
            - rows_sampled
            - rows_skipped
            - rows_total
            - tokens_in
            - tokens_out_expected
            - prices
        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.