Skip to main content

Create column

Create a new column definition (manual or enrichment), including optional auto-run behavior.

POST/api/tables/{table_id}/columns
Scope columns:writeUpdated September 27, 2026

This page documents the canonical HTTP contract. Switch to the CLI example when you want the operator workflow.

Use GET /api/capabilities as the source of truth for provider-specific setup contracts under automation.providers.

Auto-run conditions: autoRun selects the trigger (never, onInsert, or onSourceUpdate). Add an optional recursive config.runCondition predicate to decide whether each candidate row is eligible; omit it to consider all candidate rows. Use the canonical RunCondition shape documented below. Legacy nested auto-run mode and filter keys are rejected.

Run scope vs. run condition: scope: "filtered" plus filters belongs to one /run or /estimate request and narrows the candidate rows. config.runCondition is saved on the column and classifies those candidates for auto-run and manual runs; both can be used together.

Column placement: set position for an explicit float sort order, or use afterColumnId / beforeColumnId to insert relative to neighboring columns. If position is provided, neighbor hints are ignored.

Favorite/starred context fields: set isImportant: true on the columns you want drafts and calling workflows to use as starred fallback context when explicit researchContext.fieldIds are not provided.

LLM enrichment: use the logical provider llm; concrete provider/model selection is server-managed. Generated authoring sends config.instructions; manual exact authoring sends config.advancedPrompt with config.promptSource="manual". Choose exact current table-schema inputs in config.selectedRowFields; optional config.selectedRowFieldRefs binds tokens to source column IDs and nested paths. The workspace selection catalog is a separate provider/workspace contract; it does not replace table column keys here. The API persists the runnable prompt only as config.advancedPrompt; removed config.prompt and config.advanced_prompt aliases are rejected.

sync_to_table: single-destination mode uses config.destinationTableId + config.columnMappings. Router mode uses config.routes[]. List fanout uses syncMode, syncBehavior, listSourceColumnId, optional listPath (default items), and sourceScope values of row or item. Item mappings use itemKey. Parent-row mappings use sourceKey and may include path for nested JSON such as buyer_research.primary_buyer.source_url. Explicit mapped destination columns are auto-created on first run. Saving a sync_to_table column does not backfill existing rows; use /run when you need an explicit backfill.

add_to_crm / Add to Leads: companyDomain is required, plus at least one usable LinkedIn URL, email, or phone value. Primitive source columns map directly. Structured/JSON source columns must identify the exact key via config.fieldMappings.*.path (for example emailAddresses[].path = response or phoneNumbers[].path = mobile_number). For rows that contain both one primary buyer object and a people array, use config.fieldMappings.leadSources[] with kind=row and kind=array; array templates map each item with column=__array_item plus path. If you prefer a flat scalar source column, create projection columns first with POST /api/tables/{table_id}/columns/projections.

add_to_sequence: easy path is config.assignedToUserId plus config.skipActiveSequenceConflicts=true. Omit config.senderAccountIds and config.assignmentPlan so tasks use the assignee's default connected email and LinkedIn sender accounts. Use explicit sender IDs or an assignment plan only for advanced team routing.

classify: Classify mapped row fields with Jev into one category, multiple categories, or yes/no. Uses kind=enrichment, dataType=json, and config.provider=classify; no web research. The result-projection backend release creates a filterable primary-result column plus the runnable JSON data column; the returned source publishes config.classificationResultColumnId. Model-backed rows cost 0.1 credit, with no extra charge for projection. See Classify configuration, preview, CLI, and result semantics. Deployment availability is described there.

http_request: calls an external HTTP endpoint per row and stores the parsed response body (JSON or text). Use {{column_key}} placeholders in URL, headers, and body to reference row values. Use {{secrets.name}} to resolve workspace secrets (Settings → Workspace Secrets) or active integration credentials. HTTP request columns do not consume research credits.

Path parameters

  • table_idrequired

    string

    Target table ID.

Body parameters

  • keyrequired

    string

    Stable machine key for the column.

  • labelrequired

    string

    Human-readable column label.

  • kind · optional

    string

    Column kind: manual, source, formatter, enrichment, json-explode, projection, external_id, or system.

  • dataType · optional

    string

    Data type: text, number, date, boolean, email, url, json, or message (default text).

  • textFormat · optional

    string

    Text rendering format: plain, markdown, long_text, or code.

  • origin · optional

    string

    Column origin: manual, csv, api, ai, email_finder, email_validator, phone_finder, outreach, onboarding, crm_export, list_builder, agent_run, agent_source, or system.

  • source · optional

    object

    Optional source metadata object.

  • sourceId · optional

    string

    Optional source identifier.

  • importVersion · optional

    number

    Optional import version metadata.

  • fieldSemantics · optional

    object

    Optional field semantics metadata.

  • valueSchema · optional

    object

    Optional value schema metadata.

  • version · optional

    number

    Optional column version metadata.

  • status · optional

    string

    Column status: idle, running, or error.

  • costEstimate · optional

    number

    Optional cost estimate metadata.

  • lastRunAt · optional

    string

    Optional last-run timestamp metadata.

  • errorMessage · optional

    string

    Optional last error message metadata.

  • isHidden · optional

    boolean

    Whether the column is hidden.

  • position · optional

    number

    Optional explicit float sort order. If provided, afterColumnId/beforeColumnId are ignored.

  • afterColumnId · optional

    string

    Optional insertion anchor. Place the new column after this column when position is omitted.

  • beforeColumnId · optional

    string

    Optional insertion anchor. Place the new column before this column when position is omitted.

  • suppressSaveAutoRun · optional

    boolean

    Save-hook control (default false on create). When true, suppresses save-time auto-run scheduling; ordinary clients should omit it.

  • isImportant · optional

    boolean

    Marks the column as a favorite/starred context field for draft and calling fallback.

  • config · optional

    object

    Kind-specific configuration payload.

  • config.provider · optional

    string

    Optional hint. Server policy decides final provider/model.

  • config.selectedRowFields · optional

    array<string>

    For LLM enrichment: exact source column keys (or key.path tokens) to include in each row input. Select keys available in the table schema; this is input selection, not a workspace catalog field ID.

  • config.selectedRowFieldRefs · optional

    array<object>

    Optional stable source bindings for selectedRowFields. Each reference has snake_case column_id, column_key, and path strings; column_id must identify the selected source column, and path may be empty for the whole value.

  • config.selectedRowFieldRefs[].column_id · optional

    string

    Stable source-column ID. References missing a complete binding are ignored.

  • config.selectedRowFieldRefs[].column_key · optional

    string

    Current source column key; together with path it must form a selectedRowFields token.

  • config.selectedRowFieldRefs[].path · optional

    string

    Optional nested JSON path; omitted or empty selects the whole column value.

  • config.destinationTableId · optional

    string

    For sync_to_table single-destination mode.

  • config.columnMappings · optional

    array<object>

    For sync_to_table single-destination mappings (sourceKey/destKey) or route-level mappings.

  • config.routes · optional

    array<object>

    For sync_to_table router mode (evaluated top-to-bottom); each route can define condition, syncMode, syncBehavior, listSourceColumnId, listPath, and columnMappings.

  • config.syncMode · optional

    string

    For sync_to_table mode: row or list.

  • config.syncBehavior · optional

    string

    For sync_to_table behavior: link or copy.

  • config.listSourceColumnId · optional

    string

    For sync_to_table list mode: source JSON column ID whose canonical items[] payload should be expanded.

  • config.listPath · optional

    string

    For sync_to_table list mode: optional item array path (default items).

  • config.columnMappings[].sourceScope · optional

    string

    For sync_to_table list mode: row or item.

  • config.columnMappings[].itemKey · optional

    string

    For sync_to_table list mode when sourceScope=item: item field name to map.

  • config.columnMappings[].sourceKey · optional

    string

    For sync_to_table when sourceScope=row: parent/source row column key to map.

  • config.columnMappings[].path · optional

    string

    For sync_to_table when sourceScope=row: optional nested JSON path inside sourceKey.

  • config.fieldMappings · optional

    object

    For add_to_crm / Add to Leads: field mapping contract from source columns into canonical lead fields.

  • config.fieldMappings.companyDomain · optional

    string

    For add_to_crm: source column key for the company domain. Required.

  • config.fieldMappings.linkedinUrl · optional

    string

    For add_to_crm: source column key for LinkedIn URL (optional but recommended).

  • config.fieldMappings.emailAddresses · optional

    array<object>

    For add_to_crm: email mappings. Each mapping can point to a primitive column or a structured source column plus explicit path.

  • config.fieldMappings.emailAddresses[].column · optional

    string

    For add_to_crm email mappings: source column key.

  • config.fieldMappings.emailAddresses[].path · optional

    string

    For add_to_crm email mappings: required when the source column stores JSON/object output (example: response).

  • config.fieldMappings.phoneNumbers · optional

    array<object>

    For add_to_crm: phone mappings. Each mapping can point to a primitive column or a structured source column plus explicit path.

  • config.fieldMappings.phoneNumbers[].column · optional

    string

    For add_to_crm phone mappings: source column key.

  • config.fieldMappings.phoneNumbers[].path · optional

    string

    For add_to_crm phone mappings: required when the source column stores JSON/object output (example: mobile_number).

  • config.fieldMappings.common · optional

    object

    For Add to Leads multi-source mode: parent-row mappings applied to every lead source, usually companyDomain and companyName.

  • config.fieldMappings.leadSources · optional

    array<object>

    For Add to Leads multi-source mode: row and array lead sources to materialize from one table row.

  • config.fieldMappings.leadSources[].kind · optional

    string

    For Add to Leads multi-source mode: row or array.

  • config.fieldMappings.leadSources[].sourceColumn · optional

    string

    For Add to Leads array source: source JSON column key.

  • config.fieldMappings.leadSources[].sourceArrayPath · optional

    string

    For Add to Leads array source: array path inside sourceColumn, commonly items.

  • config.fieldMappings.leadSources[].template · optional

    object

    For Add to Leads multi-source mode: canonical lead fields mapped from row columns or __array_item paths.

  • config.sourceColumns · optional

    array<string>

    For add_to_crm: optional explicit dependency/source column list.

  • config.sequenceId · optional

    string

    For add_to_sequence: target sequence id. The sequence must be ACTIVE and its sourceTableId must match the table this column belongs to.

  • config.sourceLeadColumn · optional

    string

    For add_to_sequence: the column key (not field name) of an add_to_crm or lead_finder column whose cell output contains lead IDs.

  • config.assignedToUserId · optional

    string

    For add_to_sequence: assignee for generated sequence tasks. Easy path: set this and omit senderAccountIds/assignmentPlan.

  • config.skipActiveSequenceConflicts · optional

    boolean

    For add_to_sequence: skip people already active in another sequence. Recommended for automated/table-driven handoffs.

  • config.senderAccountIds · optional

    object

    For add_to_sequence advanced routing: explicit sender account IDs keyed by email/linkedin.

  • config.assignmentPlan · optional

    array<object>

    For add_to_sequence advanced/team routing: routes with assigneeUserId, optional senderAccountIds, and optional weight.

  • config.routingMode · optional

    string

    For add_to_sequence advanced/team routing: single, round_robin, or weighted_round_robin.

  • config.url · optional

    string

    For http_request: URL template. Use {{column_key}} for row values and {{secrets.name}} for workspace secrets.

  • config.method · optional

    string

    For http_request: HTTP method (GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS).

  • config.headers · optional

    object

    For http_request: key-value header pairs. Values support {{secrets.name}} templates.

  • config.body · optional

    string | object

    For http_request: request body template. Can be null, a string template, or an object sent as JSON.

  • config.timeoutSeconds · optional

    number

    For http_request: request timeout in seconds (default 30).

  • autoRun · optional

    string

    Auto-run trigger: never, onInsert, or onSourceUpdate (default never).

  • config.runCondition · optional

    RunCondition

    Optional recursive column-owned predicate. Applied to candidate rows for auto-run, /run, and /estimate; omit to consider all candidate rows.

Definitions

RunCondition

Canonical recursive predicate saved at config.runCondition to decide whether each candidate row is eligible for a column run. Omit it to consider every candidate row.

Fields

  • typerequired

    string

    Node type: condition, all, any, or not.

  • children · optional

    array<RunCondition>

    Child predicates for all/any; not must contain exactly one child.

  • columnKey | columnId · optional

    string

    Source column identity for a condition leaf. Use the key or id that identifies the table column.

  • jsonPath · optional

    string

    Optional path inside a JSON column value for a condition leaf.

  • operator · optional

    string

    Condition operator, such as equals, isNotEmpty, contains, in, between, before, or dateBetween.

  • missingPolicyrequired

    string

    Behavior when a referenced value is missing: unknown, true, or false.

  • value | value2 · optional

    string | number | boolean | array

    Comparison values for a condition leaf. between and dateBetween require both value and value2; valueless operators omit them.

RunCondition example

json
{
  "type": "all",
  "children": [
    {
      "type": "condition",
      "columnKey": "linkedin_url",
      "operator": "isNotEmpty",
      "missingPolicy": "unknown"
    },
    {
      "type": "condition",
      "columnKey": "country",
      "operator": "equals",
      "missingPolicy": "unknown",
      "value": "United States"
    }
  ]
}

Errors

StatusMeaning
401Invalid API key or missing auth.
403Missing columns:write scope or table access denied.
409Column key conflict for this table.
422The column request body does not match the request model or provider contract.

Docs