Skip to main content

Run column

Queue column work and receive a canonical operation ID or a pre-admission planning ID for progress recovery.

POST/api/tables/{table_id}/columns/{column_id}/run
Scope columns:runUpdated September 28, 2026

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

Recommended run pattern for credit control

Use filtered scope for production runs so only qualified rows consume credits.

  • scope: "filtered" + filters to target your ICP/buying criteria.
  • unprocessedOnly: true to skip rows that already have output.
  • firstN to roll out in controlled batches.

Safe staged rollout: start with firstN: 25 or 50, wait for completion, then increase firstN with the same filters.

If you force unprocessedOnly: false, repeating firstN can rerun the same top rows.

With unprocessedOnly: true, firstN means "first N currently eligible unprocessed rows." For exact row count control, use scope: "subset" with explicit rowIds.

Wait/poll behavior

/run is asynchronous. Its operationRunId is normally canonical; for bounded column planning it can be a pre-admission ID beginning arplan_. Poll that alias with Get column planning status (requires jobs:read), then use the nested operation_run.operation_run_id with GET /api/operation-runs/{operation_run_id} after status becomes resolved. A resolved planning lookup only provides the canonical receipt; inspect its status for the execution outcome. A linked jobId is native executor metadata for diagnostics, not the Research Table progress source.

  • Non-terminal: queued, running, waiting
  • Terminal: completed, partial, error, failed, cancelled, missing

If local output loses a canonical operationRunId, recover the active or recent run from GET /api/operation-runs?resource_type=research_table&resource_id={table_id}. That list does not replace polling a still-pending arplan_ planning alias. Use the bulk-job endpoints only when inspecting the linked native executor.

For predictable spend, call Estimate column run with the same payload before execution. The request also accepts maxAdmittedRows, skippedOnly, sort, budgetApproval, and executionHints.priorityRowIds; see the parameter list for their validation rules.

Admission defaults to at most 10,000 rows and 25,000 estimated provider calls. An explicit budgetApproval can raise these within hard caps of 100,000 rows and 1,000,000 calls; deployment settings may lower those values. The endpoint returns HTTP 201 on admission. Bounded planning may return queued: true with operationRunId and jobId set to an arplan_ alias before a canonical operation exists; in this deferred response totalRows is 0 and taskCount is 1. Empty already-terminal work may return queued: false with noopReason.

Path parameters

  • table_idrequired

    string

    Target table ID.

  • column_idrequired

    string

    Target column ID.

Body parameters

  • scoperequired

    string

    Run selection mode: all, subset, row, firstN, or filtered.

  • maxAdmittedRows · optional

    number

    Positive integer cap on rows admitted after eligibility and provider-readiness checks.

  • rowIds · optional

    array

    Required for subset (one or more distinct valid row ObjectIds) or row (exactly one valid row ObjectId); rejected for other scopes.

  • firstN · optional

    number

    Positive integer required for firstN; optional cap for filtered. Rejected for all, subset, and row.

  • filters · optional

    FilterObject

    Required for filtered and must contain a non-empty filters array; rejected for other scopes.

  • filters.mode · optional

    string

    Filter combination: and or or; defaults to and.

  • filters.filters[].columnKeyrequired

    string

    Source table column key tested by this rule.

  • filters.filters[].operatorrequired

    string

    One of equals, notEquals, contains, notContains, startsWith, endsWith, isEmpty, isNotEmpty, in, notIn, greaterThan, greaterThanOrEqual, lessThan, lessThanOrEqual, between, isTrue, isFalse, before, after, or dateBetween.

  • filters.filters[].value · optional

    any

    Value required by value-based operators. between and dateBetween require value and value2; isEmpty, isNotEmpty, isTrue, and isFalse omit both.

  • filters.filters[].value2 · optional

    any

    Second value required for between and dateBetween.

  • filters.filters[].columnId · optional

    string

    Optional stable source column ID.

  • filters.filters[].jsonPath · optional

    string

    Optional path within a JSON-valued column.

  • unprocessedOnly · optional

    boolean

    Only queue rows whose target cell is unprocessed. Defaults to true when omitted; cannot be true together with skippedOnly.

  • skippedOnly · optional

    boolean

    Select only rows currently marked skipped. When true, also send unprocessedOnly=false because that field defaults to true when omitted.

  • sort · optional

    object

    Optional ordering for all, firstN, or filtered scopes. Contains column and optional direction; not supported for subset or row.

  • sort.columnrequired

    string

    Non-empty source column key used to order candidate rows.

  • sort.direction · optional

    string

    asc or desc; defaults to asc.

  • budgetApproval · optional

    object

    Optional explicit admission budget with approved=true and positive integer maxRows and maxProviderCalls. schemaVersion defaults to research_table.run_budget_approval.v1; hard deployment caps still apply.

  • budgetApproval.schemaVersion · optional

    string

    Defaults to research_table.run_budget_approval.v1; if supplied, it must equal that value.

  • budgetApproval.approvedrequired

    boolean

    Must be true.

  • budgetApproval.maxRowsrequired

    number

    Positive integer. Ordinary admission defaults to 10,000 rows; absolute code cap is 100,000, and deployment configuration may lower it.

  • budgetApproval.maxProviderCallsrequired

    number

    Positive integer. Ordinary admission defaults to 25,000 calls; absolute code cap is 1,000,000, and deployment configuration may lower it.

  • executionHints · optional

    object

    Optional execution ordering hints; accepted only with all or filtered scope.

  • executionHints.priorityRowIds · optional

    array<string>

    At most 100 unique valid row ObjectIds prioritized within the selected all/filtered scope.

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" }
  ]
}

Errors

StatusMeaning
401Invalid API key or missing auth.
403Missing columns:run scope or table access denied.
409The requested runtime provider is unavailable for this column.
422Invalid run scope, filter combination, provider configuration, or run admission.
503Research Runtime v2 requires MongoDB transactions; use a replica-set connection.
404Column or table not found.

Docs