Skip to main content
End-to-end workflow: parse company data → create/reuse Extruct table → upload rows → add columns → run enrichment.

Trigger Phrases

“create table”, “upload companies”, “add to extruct”, “new extruct table”, “import companies”, “upload list to extruct”

Environment

VariableService
EXTRUCT_API_TOKENExtruct API
Before making API calls, check that EXTRUCT_API_TOKEN is set by running test -n "$EXTRUCT_API_TOKEN" && echo "set" || echo "missing". If missing, ask the user to provide their Extruct API token and set it via export EXTRUCT_API_TOKEN=<value>. Do not proceed until confirmed.
Base URL: https://api.extruct.ai/v1

Official API Reference

Workflow

1

Verify API reference

  1. Read local reference: ../list-enrichment/references/api_reference.md
  2. Fetch live docs: https://www.extruct.ai/docs
  3. Compare endpoints, params, and response fields (especially POST /tables, POST /tables/{id}/rows, POST /tables/{id}/columns)
  4. If discrepancies found:
    • Update the local reference file
    • Flag changes to the user before proceeding
  5. Proceed with the skill workflow
2

Parse input data

Accept data in any of these formats:Pasted list (most common): User pastes company names, URLs, and metadata as freeform text. Parse into structured records. Extract domains by stripping protocol, www., and trailing slashes.CSV file: Read CSV, map columns to find the URL/domain column.Extruct table URL: Fetch data from existing table via API.Key rules:
  • Skip entries with no URL (e.g., “Stealth” companies)
  • Deduplicate by domain
  • Ask which metadata fields to preserve (country, stage, industry, etc.)
3

Decide: create new table or add to existing

Ask the user:
  • New table: Create via POST /tables
  • Existing table: User provides table ID or URL (https://app.extruct.ai/tables/{id})
To create a new company table, use POST /tables with kind: "company" and a single input column (kind: "input", key: "input"). The company kind auto-enriches each domain with Company Profile, Company Name, and Company Website columns.
4

Upload rows in batches

Upload domains via POST /tables/{table_id}/rows in batches of 50. Each row: { "data": { "input": "domain.com" } }. Add 0.5s delay between batches.Report progress: “Batch 1: uploaded 50 rows OK”
5

Add agent columns (optional)

If the user wants enrichment columns (industry, funding, etc.), add them after upload via POST /tables/{table_id}/columns.Column types by use case:
User saysAgent typeOutput formatNotes
”add industry”llmselect with labelsClassification from profile, no web research needed
”add funding”research_protextNeeds web research
”classify by vertical”llmselect with labelsClassification
”find their tech stack”research_protextNeeds web research
”score fit 1-5”llm or research_reasoninggradeAssessment
”tag multiple categories”llmmultiselect with labelsMultiple tags
See the list-enrichment skill for full column types and output formats.
6

Trigger enrichment

Run via POST /tables/{table_id}/run with { "mode": "new", "columns": [new_column_ids] }, scoped to only the newly added agent columns.If no agent columns were added, skip this step.
7

Report to user

Provide:
  • Table URL: https://app.extruct.ai/tables/{table_id}
  • Row count uploaded
  • Columns added
  • Cells queued for enrichment
  • Any rows skipped (stealth, duplicates, invalid URLs)

Input Parsing Patterns

Freeform pasted list (5-line groups)

Company Name
URL (or "Stealth")
Country
Industry
Funding Stage
Parse by splitting into 5-line chunks. Filter where URL == “Stealth”.

CSV

Map columns: look for “website”, “url”, “domain”, “Company Website”. Extract domain from whichever column contains URLs.

Single-column domain list

example.com
startup.io
company.ai
Direct upload - each line is a domain.

Common Pitfalls

  • Domain format: Strip protocol and trailing slash. https://www.example.com/example.com
  • Stealth companies: Skip - no domain to enrich
  • Duplicates: Deduplicate by domain before upload
  • Batch limits: Max 50 rows per API call
  • Column labels: For select/multiselect, collect unique values from user data to build the label list
  • Run timing: Trigger run AFTER all rows and columns are added

Example: Create Table and Upload

# 1. Create table
curl -X POST https://api.extruct.ai/v1/tables \
  -H "Authorization: Bearer $EXTRUCT_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "My Campaign List",
    "kind": "company",
    "columns": [
      {
        "kind": "input",
        "name": "Domain",
        "key": "input"
      }
    ]
  }'

# 2. Upload rows (batch of 50)
curl -X POST https://api.extruct.ai/v1/tables/{table_id}/rows \
  -H "Authorization: Bearer $EXTRUCT_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "rows": [
      {"data": {"input": "example.com"}},
      {"data": {"input": "startup.io"}}
    ]
  }'

Output

Always provide the user with:
  • Direct link to the table: https://app.extruct.ai/tables/{table_id}
  • Summary of what was uploaded
  • Next steps (e.g., “Run list-enrichment to add custom columns”)

Build docs developers (and LLMs) love