Smart Columns

Smart columns process data per record. HTTP columns call APIs, formula columns compute values, integration columns push data, lookup columns join across tables, waterfall columns try sources in order, and extract columns pull JSON fields from upstream columns at zero cost. The table IS the workflow.

Template Variables

Use {{column_name}} in URLs, request bodies, and run conditions to reference other columns in the same record. When the smart column runs, each {{...}} placeholder is replaced with the actual value from that record.

SyntaxDescriptionExample
{{column_name}}Value of a column in the current record{{country}} -> "France"
{{column.nested_field}}Nested field from a JSON column{{company_data.industry}} -> "SaaS"
{{column.arr[0]}}Array index from a JSON column{{metadata.tags[0]}} -> "enterprise"
In a request URL
https://api.example.com/companies/{{company}}
In a request body
{
  "company": "{{company}}",
  "website": "{{website}}"
}
i
Where templates are used
Template variables work in HTTP URLs, HTTP request bodies, integration body templates, and run condition expressions.

Column Kinds

Every smart column has a kind that determines what it does when processing a record. There are 6 smart-column kinds:

KindWhat It DoesConfig KeysRate Limited
httpMakes an HTTP request per record, extracts response dataurl, method, headers, body, extractYes
formulaComputes a value from other columns in the same recordexpressionNo
integrationPushes record data to an external service (webhook, Slack, etc.)target, url, method, headers, bodyYes
lookupCross-table VLOOKUP -- joins data from another tablesource_table, match_column, return_columnNo
waterfallTries sources in order, uses the first successful match (configured via config)steps (ordered source list)Yes
extractPulls a JSON field from an upstream smart column at zero API cost (add via hypertab_add_extract_column)source_column, field_pathNo
*
Rate limiting applies to external calls
Only kinds that make external requests (http, integration, waterfall) are rate limited. Formula, lookup, and extract columns run locally and have no rate limiting.
i
Formula syntax: bare column names
A formula's config.expression references other columns by bare name — e.g. employees + lead_score * 1000 or score > 80 ? "gold" : "silver". {{column}} template wrappers are also accepted (normalized to the bare name), but field paths like {{col.field}} are not supported in formulas — pull the field into its own extract column and reference that by name. Built-ins: CONCAT, UPPER, LOWER, TRIM, LEN, ROUND, ABS, NOW, IF.

hypertab_add_smart_column

POST/v1/tables/:tableId/columnshypertab_add_smart_column

Add a smart column that processes data per record. HTTP columns call APIs, formula columns compute values, integration columns push data, and lookup columns join across tables.

ParameterTypeDescription
tablerequiredstringTable name or ID
namerequiredstringColumn name (lowercase, underscores, must start with a letter). Max 64 chars.
typerequiredstringOutput data type: text, number, boolean, email, url, phone, datetime, json, select, multi_select, relation, currency, image_url
kindrequiredstringSmart column kind: http, formula, integration, lookup, or waterfall. (Use hypertab_add_extract_column for extract columns.)
configrequiredobjectKind-specific configuration. See each kind section below for required fields.
rate_limitstring | objectPreset name ("aggressive", "moderate", "conservative", "gentle") or custom object with requests_per_second, max_concurrent, retry_strategy, max_retries, retry_delay_ms, cool_down_on_429.
auto_runbooleandefault: falseAutomatically process new records when inserted.
Rate limit presets:
PresetReq/sConcurrent
aggressive5006
moderate506
conservative105
gentle21
{
  "tool": "hypertab_add_smart_column",
  "arguments": {
    "table": "leads",
    "name": "industry",
    "type": "text",
    "kind": "formula",
    "config": {
      "expression": "company"
    },
    "rate_limit": "moderate",
    "auto_run": true
  }
}

Formula Column

Formula columns compute a value from other columns in the same record. No external API calls, no rate limiting. The expression is evaluated locally for each record.

Function / OperatorDescriptionExample
+, -, *, /Arithmetic operatorsprice * quantity
CONCAT(a, b, ...)Concatenate stringsCONCAT(first_name, " ", last_name)
UPPER(text)Convert to uppercaseUPPER(country)
LOWER(text)Convert to lowercaseLOWER(email)
TRIM(text)Remove leading/trailing whitespaceTRIM(name)
LEFT(text, n)First n charactersLEFT(phone, 3)
RIGHT(text, n)Last n charactersRIGHT(zip_code, 4)
LEN(text)Character countLEN(description)
IF(cond, then, else)Conditional expressionIF(score > 80, "hot", "cold")
ROUND(num, decimals)Round to n decimal placesROUND(price * 1.1, 2)
NOW()Current ISO 8601 timestampNOW()

Expressions reference column names directly (no {{...}} syntax needed). Column names are resolved against the table schema at evaluation time.

i
Formula columns have no rate limiting and no config beyond the expression. They re-evaluate whenever the referenced columns change.
{
  "tool": "hypertab_add_smart_column",
  "arguments": {
    "table": "orders",
    "name": "total",
    "type": "number",
    "kind": "formula",
    "config": {
      "expression": "price * quantity"
    }
  }
}

Integration Column

Integration columns push record data to a configured public HTTP(S) destination. Each record triggers one outbound request when the final destination passes Hypertab safety checks. Private, local, metadata, redirecting, Hypertab-owned, and token-bearing webhook URLs are blocked.

Config KeyTypeRequiredDescription
targetstringYesIntegration target: "webhook" or a custom target name
urlstringYesCredential-free public destination URL
methodstringNoHTTP method. Default: "POST"
headersobjectNoContent negotiation only: Content-Type or Accept
account_idstringFor authenticated targetsEncrypted saved API account ID
bodyobject | stringNoBody template with {{column}} variables. If omitted, sends the full record as JSON.

Integration columns write the response status back to the cell (e.g. "200 OK" or "error: timeout"). The body template supports all template variable syntax.

!
Rate limiting required
Integration columns make external HTTP requests and must have a rate_limit configured. Default: conservative (10 req/s).
{
	  "tool": "hypertab_save_api_account",
	  "arguments": {
	    "name": "CRM",
	    "service": "crm",
	    "auth_type": "bearer",
	    "token": "<crm-api-token>",
	    "base_url": "https://api.crm.example.com"
	  }
	}

Lookup Column

Lookup columns perform a cross-table VLOOKUP. For each record, they find a matching record in another table and return a value from it. No external API calls, no rate limiting.

Config KeyTypeRequiredDescription
source_tablestringYesThe table to look up data from
match_columnstringYesColumn in the source table to match against the current record value
return_columnstringYesColumn in the source table whose value to return

The lookup matches the current record's column value (same name as match_column) against the source table. If a match is found, the value from return_column is written to the cell. If no match is found, the cell is left empty.

i
Cross-table join
This is equivalent to a SQL LEFT JOIN. Example: your orders table has a customer_id column and you want to pull company_name from the customers table.
{
  "tool": "hypertab_add_smart_column",
  "arguments": {
    "table": "orders",
    "name": "customer_company",
    "type": "text",
    "kind": "lookup",
    "config": {
      "source_table": "customers",
      "match_column": "customer_id",
      "return_column": "company_name"
    }
  }
}

Run Conditions

Run conditions let you skip records that don't have the required data. Add a run_condition to any smart column's config. Records that don't match the condition are marked as "skipped" instead of "error".

OperatorSyntaxDescription
IS EMPTY{{col}} IS EMPTYTrue if the column value is null or empty string
IS NOT EMPTY{{col}} IS NOT EMPTYTrue if the column has a value
EQUALS{{col}} EQUALS "value"True if the column equals the given string
NOT EQUALS{{col}} NOT EQUALS "value"True if the column does not equal the string
CONTAINS{{col}} CONTAINS "text"True if the column contains the substring
GREATER THAN{{col}} GREATER THAN 100True if the numeric value exceeds the threshold
LESS THAN{{col}} LESS THAN 50True if the numeric value is below the threshold
ANDexpr AND exprBoth conditions must be true
ORexpr OR exprAt least one condition must be true
Examples:
ConditionMeaning
{{website}} IS NOT EMPTYOnly process records that have a website
{{size}} GREATER THAN 100Only companies with 100+ employees
{{status}} EQUALS "active"Only active records
{{email}} IS NOT EMPTY AND {{company}} IS NOT EMPTYRecords with both email and company
{{score}} GREATER THAN 50 OR {{priority}} EQUALS "high"High-scoring or high-priority records
{{company_data.industry}} IS NOT EMPTY AND {{size}} GREATER THAN 50JSON field access with numeric comparison
*
Best practice
Always add a run_condition for HTTP and integration columns to avoid wasting API calls on records with missing data. Skipped records don't count toward your rate limit.

hypertab_update_column_config

PATCH/v1/tables/:tableId/columns/:columnIdhypertab_update_column_config

Update the configuration of a smart column after creation. Change the HTTP URL or body, formula expression, rate limit preset, or auto-run setting. Only provided fields are updated; omitted fields are left unchanged.

ParameterTypeDescription
tablerequiredstringTable name or ID
columnrequiredstringSmart column name or ID
configobjectUpdated kind-specific config (merged with existing config). Only include fields you want to change.
rate_limitstring | objectUpdated rate limit preset or custom config
auto_runbooleanUpdated auto-run setting

Config updates are merged with the existing config. For example, updating an HTTP URL preserves the method, headers, account reference, and extraction path.

!
Existing results not reprocessed
Updating a column's config does not automatically reprocess existing records. Use hypertab_run_column to trigger reprocessing after a config change.
{
  "tool": "hypertab_update_column_config",
  "arguments": {
    "table": "leads",
    "column": "summary",
    "rate_limit": "aggressive"
  }
}

hypertab_run_column

POST/v1/tables/:tableId/columns/:columnId/runhypertab_run_column

Trigger smart column processing for all records or specific record IDs. Creates a column run and enqueues cells for batch processing. Rate limits are enforced per column config.

ParameterTypeDescription
tablerequiredstringTable name or ID
columnrequiredstringSmart column name or ID
record_idsstring[]Specific record IDs (_ht_id values) to process over REST. Omit to process all records.

When triggered, the engine creates a column run record, evaluates run conditions for each record, and enqueues matching cells for batch processing. Progress can be tracked using the returned run_id.

i
Records that don't pass the run condition are marked "skipped" immediately. The run completes when all non-skipped cells are processed.
{
  "tool": "hypertab_run_column",
  "arguments": {
    "table": "countries",
    "column": "capital"
  }
}

hypertab_get_column_run_status

GET/v1/column-runs/:runIdhypertab_get_column_run_status

Check the progress of a smart column run. Shows total records, processed count, error count, and completion status. Use the run_id returned by hypertab_run_column.

ParameterTypeDescription
run_idrequiredstringColumn run ID returned by hypertab_run_column

Poll this endpoint to track progress. The run transitions through states:

  • running -- cells are being processed
  • complete -- all cells finished (some may have errors)
  • failed -- circuit breaker tripped, run halted
{
  "tool": "hypertab_get_column_run_status",
  "arguments": {
    "run_id": "run_abc123"
  }
}

hypertab_get_cell_states

GET/v1/tables/:tableId/columns/:columnId/cellshypertab_get_cell_states

Get per-cell execution states for a smart column. Each cell in a smart column has its own execution state tracking. Filter by status to find failures or pending cells.

ParameterTypeDescription
tablerequiredstringTable name or ID
columnrequiredstringSmart column name or ID
statusstringFilter by cell status: idle, pending, running, complete, error, skipped
limitnumberdefault: 100Max cells to return.
offsetnumberdefault: 0Number of cells to skip for pagination.
Cell states:
StatusMeaning
idleNot yet queued for processing
pendingQueued and waiting to be processed
runningCurrently being processed
completeSuccessfully processed
errorProcessing failed (see error message)
skippedRun condition not met for this record
{
  "tool": "hypertab_get_cell_states",
  "arguments": {
    "table": "countries",
    "column": "capital",
    "status": "error"
  }
}

hypertab_retry_failed_cells

POST/v1/tables/:tableId/columns/:columnId/retryhypertab_retry_failed_cells

Retry all failed cells in a smart column. Creates a new column run for just the cells with "error" status, re-enqueuing them for processing.

ParameterTypeDescription
tablerequiredstringTable name or ID
columnrequiredstringSmart column name or ID

Only cells in "error" state are retried. Cells that completed successfully or were skipped are not affected. The retry creates a new run_id that you can track with hypertab_get_column_run_status.

*
Check errors first
Before retrying, use hypertab_get_cell_states with status: "error" to understand why cells failed. If the issue is a bad config (wrong URL, invalid API key), fix it with hypertab_update_column_config before retrying.
{
  "tool": "hypertab_retry_failed_cells",
  "arguments": {
    "table": "countries",
    "column": "capital"
  }
}

Cell Details (Structured JSON Response)

Every HTTP smart column stores a structured response with metadata alongside the extracted value. Click any completed cell in the UI to open the Cell Details Panel showing all response fields with the ability to add any field as a new column.

GET/v1/tables/:tableId/records/:recordId/cells/:columnName

Get the full response metadata for a specific cell.

ParameterTypeDescription
tableIdrequiredstringTable name or ID
recordIdrequiredstringRecord _ht_id
columnNamerequiredstringSmart column name
curl https://api.hypertab.ai/v1/tables/tbl_countries001/records/d54e84ca-1a2b-4c3d-8e9f-1234567890ab/cells/capital \
  -H "Authorization: Bearer ht_sk_..." \
  -H "X-Hypertab-Workspace: growth-ops"
i
Response Metadata Fields
HTTP columns include: result or output (for multi-extract), http_status, time_taken_seconds, attempts.

HTTP Column — Advanced Features

HTTP columns support advanced configuration: query parameters, retries, timeouts, multi-extract, saved API accounts, and more.

ParameterTypeDescription
query_paramsobjectKey-value pairs appended as ?k=v. Supports {{variables}}.
extractsobjectMultiple named extractions: {"email": "data.email", "name": "data.name"}. Creates structured JSON.
timeout_msnumberResponse timeout in ms (default 30000, max 120000).
retry_on_failurebooleanAuto-retry failed requests.
max_retriesnumberNumber of retry attempts (default 3).
retry_status_codesarrayWhich HTTP codes trigger retry (default: [429, 500, 502, 503, 504]).
retry_delay_msnumberDelay between retries in ms (default 1000). Linear backoff.
remove_empty_valuesbooleanStrip null/empty fields from request body.
return_metadatabooleanInclude bounded response metadata in cell details. Redirects are always blocked.
account_idstringSaved API account ID — auto-injects auth headers. See hypertab_list_api_accounts.
{
  "config": {
    "url": "https://api.github.com/orgs/{{company}}",
    "method": "GET",
    "account_id": "acct_...",
    "extracts": {
      "repos": "public_repos",
      "followers": "followers",
      "blog": "blog",
      "location": "location"
    },
    "timeout_ms": 10000,
    "retry_on_failure": true,
    "max_retries": 2,
    "retry_status_codes": [429, 500, 502, 503]
  }
}

API Accounts (Saved Auth Headers)

Save named API accounts with auth headers. Use account_id in HTTP column config to auto-inject headers. Inline credentials and credential-bearing URLs are rejected from stored column configs.

{
  "tool": "hypertab_save_api_account",
  "arguments": {
    "name": "My GitHub API",
    "service": "github",
    "auth_type": "bearer",
    "token": "ghp_your_token_here",
    "base_url": "https://api.github.com",
    "description": "GitHub production API key"
  }
}
i
Auth Types
bearerAuthorization: Bearer <token>
api_keyX-API-Key: <token> (custom header name supported)
basicAuthorization: Basic base64(user:pass)
custom_headers — Any JSON headers object

Manage accounts: hypertab_list_api_accounts, hypertab_update_api_account, hypertab_delete_api_account. Or use Settings → API Accounts in the UI.

Pipeline Tabs (Connected Stages)

A table can contain multiple tabs (pipeline stages). Each tab has its own columns and records. Linked tabs auto-sync data from a parent tab based on filter conditions. JSON fields from smart columns are expanded into real columns on the linked tab.

{
  "tool": "hypertab_create_tab",
  "arguments": {
    "table": "my_leads",
    "name": "qualified_leads",
    "source_column": "research",
    "filter": {
      "research.employee_count": { "gte": 500 }
    },
    "description": "Leads with 500+ employees"
  }
}

// Creates a new tab that:
// 1. Inherits parent columns (company, website)
// 2. Expands JSON fields from 'research' column (industry, employee_count, hq_city, revenue)
// 3. Only syncs records where employee_count >= 500
*
Pipeline Flow
Raw Data → HTTP Enrichment → Filter → Linked Tab → API Lookup → Next Stage
Each tab is a stage. Data flows forward and gets richer at each step.

Auto-Run on New Records

Set auto_run: true in a smart column's config to automatically process new records when they're inserted. The column run triggers immediately afterhypertab_insert_rows completes.

{
  "tool": "hypertab_update_column_config",
  "arguments": {
    "table": "my_leads",
    "column": "research",
    "config": { "auto_run": true }
  }
}

// Now when you insert records:
// hypertab_insert_rows({ table: "my_leads", rows: [...] })
// → 'research' column automatically starts processing the new records