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_idrequiredstring
Target table ID.
| Name | Type | Description |
|---|---|---|
| table_idrequired | string | Target table ID. |
Body parameters
keyrequiredstring
Stable machine key for the column.
labelrequiredstring
Human-readable column label.
kind· optionalstring
Column kind: manual, source, formatter, enrichment, json-explode, projection, external_id, or system.
dataType· optionalstring
Data type: text, number, date, boolean, email, url, json, or message (default text).
textFormat· optionalstring
Text rendering format: plain, markdown, long_text, or code.
origin· optionalstring
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· optionalobject
Optional source metadata object.
sourceId· optionalstring
Optional source identifier.
importVersion· optionalnumber
Optional import version metadata.
fieldSemantics· optionalobject
Optional field semantics metadata.
valueSchema· optionalobject
Optional value schema metadata.
version· optionalnumber
Optional column version metadata.
status· optionalstring
Column status: idle, running, or error.
costEstimate· optionalnumber
Optional cost estimate metadata.
lastRunAt· optionalstring
Optional last-run timestamp metadata.
errorMessage· optionalstring
Optional last error message metadata.
isHidden· optionalboolean
Whether the column is hidden.
position· optionalnumber
Optional explicit float sort order. If provided, afterColumnId/beforeColumnId are ignored.
afterColumnId· optionalstring
Optional insertion anchor. Place the new column after this column when position is omitted.
beforeColumnId· optionalstring
Optional insertion anchor. Place the new column before this column when position is omitted.
suppressSaveAutoRun· optionalboolean
Save-hook control (default false on create). When true, suppresses save-time auto-run scheduling; ordinary clients should omit it.
isImportant· optionalboolean
Marks the column as a favorite/starred context field for draft and calling fallback.
config· optionalobject
Kind-specific configuration payload.
config.provider· optionalstring
Optional hint. Server policy decides final provider/model.
config.selectedRowFields· optionalarray<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· optionalarray<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· optionalstring
Stable source-column ID. References missing a complete binding are ignored.
config.selectedRowFieldRefs[].column_key· optionalstring
Current source column key; together with path it must form a selectedRowFields token.
config.selectedRowFieldRefs[].path· optionalstring
Optional nested JSON path; omitted or empty selects the whole column value.
config.destinationTableId· optionalstring
For sync_to_table single-destination mode.
config.columnMappings· optionalarray<object>
For sync_to_table single-destination mappings (sourceKey/destKey) or route-level mappings.
config.routes· optionalarray<object>
For sync_to_table router mode (evaluated top-to-bottom); each route can define condition, syncMode, syncBehavior, listSourceColumnId, listPath, and columnMappings.
config.syncMode· optionalstring
For sync_to_table mode: row or list.
config.syncBehavior· optionalstring
For sync_to_table behavior: link or copy.
config.listSourceColumnId· optionalstring
For sync_to_table list mode: source JSON column ID whose canonical items[] payload should be expanded.
config.listPath· optionalstring
For sync_to_table list mode: optional item array path (default items).
config.columnMappings[].sourceScope· optionalstring
For sync_to_table list mode: row or item.
config.columnMappings[].itemKey· optionalstring
For sync_to_table list mode when sourceScope=item: item field name to map.
config.columnMappings[].sourceKey· optionalstring
For sync_to_table when sourceScope=row: parent/source row column key to map.
config.columnMappings[].path· optionalstring
For sync_to_table when sourceScope=row: optional nested JSON path inside sourceKey.
config.fieldMappings· optionalobject
For add_to_crm / Add to Leads: field mapping contract from source columns into canonical lead fields.
config.fieldMappings.companyDomain· optionalstring
For add_to_crm: source column key for the company domain. Required.
config.fieldMappings.linkedinUrl· optionalstring
For add_to_crm: source column key for LinkedIn URL (optional but recommended).
config.fieldMappings.emailAddresses· optionalarray<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· optionalstring
For add_to_crm email mappings: source column key.
config.fieldMappings.emailAddresses[].path· optionalstring
For add_to_crm email mappings: required when the source column stores JSON/object output (example: response).
config.fieldMappings.phoneNumbers· optionalarray<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· optionalstring
For add_to_crm phone mappings: source column key.
config.fieldMappings.phoneNumbers[].path· optionalstring
For add_to_crm phone mappings: required when the source column stores JSON/object output (example: mobile_number).
config.fieldMappings.common· optionalobject
For Add to Leads multi-source mode: parent-row mappings applied to every lead source, usually companyDomain and companyName.
config.fieldMappings.leadSources· optionalarray<object>
For Add to Leads multi-source mode: row and array lead sources to materialize from one table row.
config.fieldMappings.leadSources[].kind· optionalstring
For Add to Leads multi-source mode: row or array.
config.fieldMappings.leadSources[].sourceColumn· optionalstring
For Add to Leads array source: source JSON column key.
config.fieldMappings.leadSources[].sourceArrayPath· optionalstring
For Add to Leads array source: array path inside sourceColumn, commonly items.
config.fieldMappings.leadSources[].template· optionalobject
For Add to Leads multi-source mode: canonical lead fields mapped from row columns or __array_item paths.
config.sourceColumns· optionalarray<string>
For add_to_crm: optional explicit dependency/source column list.
config.sequenceId· optionalstring
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· optionalstring
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· optionalstring
For add_to_sequence: assignee for generated sequence tasks. Easy path: set this and omit senderAccountIds/assignmentPlan.
config.skipActiveSequenceConflicts· optionalboolean
For add_to_sequence: skip people already active in another sequence. Recommended for automated/table-driven handoffs.
config.senderAccountIds· optionalobject
For add_to_sequence advanced routing: explicit sender account IDs keyed by email/linkedin.
config.assignmentPlan· optionalarray<object>
For add_to_sequence advanced/team routing: routes with assigneeUserId, optional senderAccountIds, and optional weight.
config.routingMode· optionalstring
For add_to_sequence advanced/team routing: single, round_robin, or weighted_round_robin.
config.url· optionalstring
For http_request: URL template. Use {{column_key}} for row values and {{secrets.name}} for workspace secrets.
config.method· optionalstring
For http_request: HTTP method (GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS).
config.headers· optionalobject
For http_request: key-value header pairs. Values support {{secrets.name}} templates.
config.body· optionalstring | object
For http_request: request body template. Can be null, a string template, or an object sent as JSON.
config.timeoutSeconds· optionalnumber
For http_request: request timeout in seconds (default 30).
autoRun· optionalstring
Auto-run trigger: never, onInsert, or onSourceUpdate (default never).
config.runCondition· optionalOptional recursive column-owned predicate. Applied to candidate rows for auto-run, /run, and /estimate; omit to consider all candidate rows.
| Name | Type | Description |
|---|---|---|
| keyrequired | string | Stable machine key for the column. |
| labelrequired | string | Human-readable column label. |
| kind | string | Column kind: manual, source, formatter, enrichment, json-explode, projection, external_id, or system. |
| dataType | string | Data type: text, number, date, boolean, email, url, json, or message (default text). |
| textFormat | string | Text rendering format: plain, markdown, long_text, or code. |
| origin | 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 | object | Optional source metadata object. |
| sourceId | string | Optional source identifier. |
| importVersion | number | Optional import version metadata. |
| fieldSemantics | object | Optional field semantics metadata. |
| valueSchema | object | Optional value schema metadata. |
| version | number | Optional column version metadata. |
| status | string | Column status: idle, running, or error. |
| costEstimate | number | Optional cost estimate metadata. |
| lastRunAt | string | Optional last-run timestamp metadata. |
| errorMessage | string | Optional last error message metadata. |
| isHidden | boolean | Whether the column is hidden. |
| position | number | Optional explicit float sort order. If provided, afterColumnId/beforeColumnId are ignored. |
| afterColumnId | string | Optional insertion anchor. Place the new column after this column when position is omitted. |
| beforeColumnId | string | Optional insertion anchor. Place the new column before this column when position is omitted. |
| suppressSaveAutoRun | boolean | Save-hook control (default false on create). When true, suppresses save-time auto-run scheduling; ordinary clients should omit it. |
| isImportant | boolean | Marks the column as a favorite/starred context field for draft and calling fallback. |
| config | object | Kind-specific configuration payload. |
| config.provider | string | Optional hint. Server policy decides final provider/model. |
| config.selectedRowFields | 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 | 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 | string | Stable source-column ID. References missing a complete binding are ignored. |
| config.selectedRowFieldRefs[].column_key | string | Current source column key; together with path it must form a selectedRowFields token. |
| config.selectedRowFieldRefs[].path | string | Optional nested JSON path; omitted or empty selects the whole column value. |
| config.destinationTableId | string | For sync_to_table single-destination mode. |
| config.columnMappings | array<object> | For sync_to_table single-destination mappings (sourceKey/destKey) or route-level mappings. |
| config.routes | 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 | string | For sync_to_table mode: row or list. |
| config.syncBehavior | string | For sync_to_table behavior: link or copy. |
| config.listSourceColumnId | string | For sync_to_table list mode: source JSON column ID whose canonical items[] payload should be expanded. |
| config.listPath | string | For sync_to_table list mode: optional item array path (default items). |
| config.columnMappings[].sourceScope | string | For sync_to_table list mode: row or item. |
| config.columnMappings[].itemKey | string | For sync_to_table list mode when sourceScope=item: item field name to map. |
| config.columnMappings[].sourceKey | string | For sync_to_table when sourceScope=row: parent/source row column key to map. |
| config.columnMappings[].path | string | For sync_to_table when sourceScope=row: optional nested JSON path inside sourceKey. |
| config.fieldMappings | object | For add_to_crm / Add to Leads: field mapping contract from source columns into canonical lead fields. |
| config.fieldMappings.companyDomain | string | For add_to_crm: source column key for the company domain. Required. |
| config.fieldMappings.linkedinUrl | string | For add_to_crm: source column key for LinkedIn URL (optional but recommended). |
| config.fieldMappings.emailAddresses | 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 | string | For add_to_crm email mappings: source column key. |
| config.fieldMappings.emailAddresses[].path | string | For add_to_crm email mappings: required when the source column stores JSON/object output (example: response). |
| config.fieldMappings.phoneNumbers | 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 | string | For add_to_crm phone mappings: source column key. |
| config.fieldMappings.phoneNumbers[].path | string | For add_to_crm phone mappings: required when the source column stores JSON/object output (example: mobile_number). |
| config.fieldMappings.common | object | For Add to Leads multi-source mode: parent-row mappings applied to every lead source, usually companyDomain and companyName. |
| config.fieldMappings.leadSources | array<object> | For Add to Leads multi-source mode: row and array lead sources to materialize from one table row. |
| config.fieldMappings.leadSources[].kind | string | For Add to Leads multi-source mode: row or array. |
| config.fieldMappings.leadSources[].sourceColumn | string | For Add to Leads array source: source JSON column key. |
| config.fieldMappings.leadSources[].sourceArrayPath | string | For Add to Leads array source: array path inside sourceColumn, commonly items. |
| config.fieldMappings.leadSources[].template | object | For Add to Leads multi-source mode: canonical lead fields mapped from row columns or __array_item paths. |
| config.sourceColumns | array<string> | For add_to_crm: optional explicit dependency/source column list. |
| config.sequenceId | 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 | 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 | string | For add_to_sequence: assignee for generated sequence tasks. Easy path: set this and omit senderAccountIds/assignmentPlan. |
| config.skipActiveSequenceConflicts | boolean | For add_to_sequence: skip people already active in another sequence. Recommended for automated/table-driven handoffs. |
| config.senderAccountIds | object | For add_to_sequence advanced routing: explicit sender account IDs keyed by email/linkedin. |
| config.assignmentPlan | array<object> | For add_to_sequence advanced/team routing: routes with assigneeUserId, optional senderAccountIds, and optional weight. |
| config.routingMode | string | For add_to_sequence advanced/team routing: single, round_robin, or weighted_round_robin. |
| config.url | string | For http_request: URL template. Use {{column_key}} for row values and {{secrets.name}} for workspace secrets. |
| config.method | string | For http_request: HTTP method (GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS). |
| config.headers | object | For http_request: key-value header pairs. Values support {{secrets.name}} templates. |
| config.body | string | object | For http_request: request body template. Can be null, a string template, or an object sent as JSON. |
| config.timeoutSeconds | number | For http_request: request timeout in seconds (default 30). |
| autoRun | string | Auto-run trigger: never, onInsert, or onSourceUpdate (default never). |
| config.runCondition | 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
typerequiredstring
Node type: condition, all, any, or not.
children· optionalarray<RunCondition>
Child predicates for all/any; not must contain exactly one child.
columnKey | columnId· optionalstring
Source column identity for a condition leaf. Use the key or id that identifies the table column.
jsonPath· optionalstring
Optional path inside a JSON column value for a condition leaf.
operator· optionalstring
Condition operator, such as equals, isNotEmpty, contains, in, between, before, or dateBetween.
missingPolicyrequiredstring
Behavior when a referenced value is missing: unknown, true, or false.
value | value2· optionalstring | number | boolean | array
Comparison values for a condition leaf. between and dateBetween require both value and value2; valueless operators omit them.
| Name | Type | Description |
|---|---|---|
| typerequired | string | Node type: condition, all, any, or not. |
| children | array<RunCondition> | Child predicates for all/any; not must contain exactly one child. |
| columnKey | columnId | string | Source column identity for a condition leaf. Use the key or id that identifies the table column. |
| jsonPath | string | Optional path inside a JSON column value for a condition leaf. |
| operator | 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 | string | number | boolean | array | Comparison values for a condition leaf. between and dateBetween require both value and value2; valueless operators omit them. |
{
"type": "all",
"children": [
{
"type": "condition",
"columnKey": "linkedin_url",
"operator": "isNotEmpty",
"missingPolicy": "unknown"
},
{
"type": "condition",
"columnKey": "country",
"operator": "equals",
"missingPolicy": "unknown",
"value": "United States"
}
]
}Errors
| Status | Meaning |
|---|---|
| 401 | Invalid API key or missing auth. |
| 403 | Missing columns:write scope or table access denied. |
| 409 | Column key conflict for this table. |
| 422 | The column request body does not match the request model or provider contract. |
