Skip to main content

Update column

Patch an existing column (label/config/position/auto-run). Use this to enable or adjust auto-run after creation.

PATCH/api/tables/{table_id}/columns/{column_id}
HTTP referenceScope columns:writeUpdated September 27, 2026

This page documents the canonical HTTP contract for this endpoint.

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 or replace the 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: send position to set an explicit float sort order. If you want to move a column relative to neighbors, use PATCH /api/tables/{table_id}/columns/{column_id}/position.

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: keep provider="llm" and let the server manage concrete provider/model selection. Generated updates use config.instructions and materialize config.advancedPrompt; manual exact updates use config.advancedPrompt with config.promptSource="manual". Select exact current table-schema inputs with config.selectedRowFields; optional config.selectedRowFieldRefs binds them to source column IDs and nested paths. The workspace selection catalog is separate and does not replace table column keys. Removed config.prompt and config.advanced_prompt aliases are rejected.

sync_to_table: updates can switch between single-destination, router, and list fanout behavior. Route conditions are evaluated against the parent/source row. List fanout uses canonical { "items": [...] } payloads, item-vs-row mapping scopes, optional nested row path mappings, skips blank placeholder items, and auto-creates explicit mapped destination columns on first run.

add_to_crm / Add to Leads: structured source fields still require explicit path mapping on update. Example: emailAddresses[].path = response, phoneNumbers[].path = mobile_number. Use fieldMappings.leadSources[] when one row can produce a primary buyer plus a people list. The backend does not guess arbitrary JSON shapes at run time.

add_to_sequence: update config.assignedToUserId when the column should assign generated tasks to a specific user. Keep config.skipActiveSequenceConflicts=true for automated handoffs. Leave sender routing blank for the assignee's defaults, or set config.senderAccountIds/config.assignmentPlan only for advanced team routing.

http_request: update URL, method, headers, body, or timeout. Template syntax ({{column_key}} and {{secrets.name}}) works in all templated fields.

Path parameters

  • table_idrequired

    string

    Target table ID.

  • column_idrequired

    string

    Target column ID.

Body parameters

  • label · optional

    string

    Updated display 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.

  • 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

    Updated explicit float sort order for the column.

  • isImportant · optional

    boolean

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

  • config · optional

    object

    Updated column config.

  • config.provider · optional

    string

    Provider key (for example add_to_crm, sync_to_table, add_to_sequence).

  • suppressSaveAutoRun · optional

    boolean

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

  • config.selectedRowFields · optional

    array<string>

    For LLM enrichment: exact source column keys (or key.path tokens) to include in each row input. Use keys available in the table schema.

  • config.selectedRowFieldRefs · optional

    array<object>

    Optional stable bindings for selectedRowFields. Each object uses snake_case column_id, column_key, and path; 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

    sync_to_table single destination id.

  • config.columnMappings · optional

    array<object>

    sync_to_table mapping entries (sourceKey/destKey) or route-level mappings.

  • config.routes · optional

    array<object>

    sync_to_table router routes (first matching route wins); routes can define condition, syncMode, syncBehavior, listSourceColumnId, listPath, and columnMappings.

  • config.syncMode · optional

    string

    sync_to_table mode: row or list.

  • config.syncBehavior · optional

    string

    sync_to_table behavior: link or copy.

  • config.listSourceColumnId · optional

    string

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

  • config.listPath · optional

    string

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

  • config.columnMappings[].sourceScope · optional

    string

    sync_to_table list mode mapping scope: row or item.

  • config.columnMappings[].itemKey · optional

    string

    sync_to_table list mode item field name when sourceScope=item.

  • config.columnMappings[].sourceKey · optional

    string

    sync_to_table row mapping source column key when sourceScope=row.

  • config.columnMappings[].path · optional

    string

    sync_to_table row mapping nested JSON path inside sourceKey.

  • config.fieldMappings · optional

    object

    add_to_crm mapping contract from source columns into canonical lead fields.

  • config.fieldMappings.companyDomain · optional

    string

    add_to_crm source domain column key.

  • config.fieldMappings.linkedinUrl · optional

    string

    add_to_crm source LinkedIn column key.

  • config.fieldMappings.emailAddresses · optional

    array<object>

    add_to_crm email mappings; structured sources require explicit path.

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

    string

    add_to_crm email source column key.

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

    string

    add_to_crm email JSON path/key (for example response).

  • config.fieldMappings.phoneNumbers · optional

    array<object>

    add_to_crm phone mappings; structured sources require explicit path.

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

    string

    add_to_crm phone source column key.

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

    string

    add_to_crm phone JSON path/key (for example mobile_number).

  • config.fieldMappings.common · optional

    object

    Add to Leads multi-source parent-row mappings applied to every lead source.

  • config.fieldMappings.leadSources · optional

    array<object>

    Add to Leads multi-source row/array sources.

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

    string

    Add to Leads source kind: row or array.

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

    string

    Add to Leads array source JSON column key.

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

    string

    Add to Leads array path inside sourceColumn, commonly items.

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

    object

    Add to Leads canonical lead field mappings from row columns or __array_item paths.

  • config.sourceColumns · optional

    array<string>

    add_to_crm dependency/source column list.

  • config.sequenceId · optional

    string

    add_to_sequence: target sequence id. Must be ACTIVE and linked to this table via sourceTableId.

  • config.sourceLeadColumn · optional

    string

    add_to_sequence: column key (not field name) of the add_to_crm or lead_finder column containing lead IDs.

  • config.assignedToUserId · optional

    string

    add_to_sequence: assignee for generated sequence tasks. Omit sender routing to use the assignee defaults.

  • config.skipActiveSequenceConflicts · optional

    boolean

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

  • config.senderAccountIds · optional

    object

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

  • config.assignmentPlan · optional

    array<object>

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

  • config.routingMode · optional

    string

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

  • config.url · optional

    string

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

  • config.method · optional

    string

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

  • config.headers · optional

    object

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

  • config.body · optional

    string | object

    http_request body template. Can be null, a string, or a JSON object.

  • config.timeoutSeconds · optional

    number

    http_request timeout in seconds (default 30).

  • autoRun · optional

    string

    Auto-run trigger: never, onInsert, or onSourceUpdate.

  • 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

FilterObject

Per-request filter expression used with scope="filtered" for column runs and estimates. This does not configure a column's saved auto-run condition.

Fields

  • moderequired

    string

    Logical operator for combining rules. Use AND or OR.

  • filtersrequired

    array<object>

    Filter rule list evaluated against row data.

  • filters[].columnKeyrequired

    string

    Column key used in the condition.

  • filters[].operatorrequired

    string

    Comparison operator (for example equals or isNotEmpty).

  • filters[].value · optional

    string | number | boolean

    Required for value-based operators such as equals.

FilterObject example

json
{
  "mode": "and",
  "filters": [
    { "columnKey": "linkedin_url", "operator": "isNotEmpty" },
    { "columnKey": "country", "operator": "equals", "value": "United States" }
  ]
}

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.
404Column or table not found.
422The column update body does not match the request model or provider contract.

Docs