playtable_fields

Create playtable field

Add a column to a playtable: the tool that shapes a table. category is derived from the type prefix, never sent.

Patterns. Find people (a company grid): type action_find_people with payload.prompt saying who to find at each company (1 credit per company searched, a miss free); switch config.auto_run on (its default condition is a company with no people yet) so a company that lands later is searched by itself, and a playtable run searches the companies already there. Add as column: a scalar whose payload.template is one lone variable such as {{record.enrich.company.employees}}; existing rows backfill free, every future run re-derives it; never touch the action field for this. Composed text: a template with {{people.first_name}} or {{company.name}} (catalog attributes) and record.<slug> (a column of this tab), each refused unless it exists. action_waterfall: config.preset_sid (a gtm-api preset) or hand-built payload.steps, never both.

Formulas and templates form dependency edges; a cycle rolls the save back with 422 and context.cycle_path. Idempotent on (playtable_sid, slug): a duplicate answers already_exists true with the existing row (check item.type). Nothing paid runs on create (a playtable run, estimate first, or auto_run does); a scalar formula backfill is free. At most 100 live columns per object_type: the 101st is 422 (context.limit).

Contract:

  • MCP tool create_playtable_field, registry package mcp.playtables/playtable_fields, mount playtables.columns.
  • Operation create, response envelope create.
  • Flags: none.
post/api/playtable-fields

Request

  • Base URL
    https://beta.getsales.io/playtables/v1
  • Auth
    HTTP bearer and API key in header Team-SID

Request body

playtable_sidstring required

Owner playtable sid (pt_tb_…).

object_type'people' | 'company' required

Object grid this field belongs to: people or company rows. Fixed at create.

type'scalar_text' | 'scalar_number' | 'scalar_currency' | 'scalar_date' | 'scalar_url' | 'scalar_checkbox' | 'scalar_select' | 'scalar_multiselect' | 'scalar_image' | 'widget_data_source' | 'widget_tags' | 'widget_active_workflows' | 'widget_notes' | 'widget_company' | 'widget_linkedin_id' | 'widget_linkedin_channel' | 'widget_work_email' | 'widget_personal_email' | 'widget_email_channel' | 'widget_phones' | 'widget_phone_channel' | 'widget_last_touch' | 'widget_activity' | 'widget_deal_size' | 'widget_website' | 'widget_people_summary' | 'widget_ai_sdr' | 'action_ai_research' | 'action_waterfall' | 'action_gtm_tool' | 'action_find_people' required

The category derives from the prefix. Scalar and the generic action types fit both grids; action_find_people is company-only. Widgets: data_source, tags, last_touch, activity on both; deal_size, website, people_summary company-only; the rest people-only.

namestring required

Display label; slug is derived from it when slug is omitted.

slugstring

Template-variable name, immutable after create: formulas read record.<slug>, prompts {{record.<slug>}}. Default: the slugified name (a collision takes _2).

add_to_default_viewboolean

true also appends the column to its grid's default view, so people see it without an update_playtable_view call. Idempotent: a column already in the layout stays where it is. Default false: the column exists but no view shows it.

Response

create success envelope.

successtrue required
operation'create' required
already_existsboolean required

Changes

No recorded changes to this operation across all 1 revision of this API.