Skip to main content
Extruct provides APIs for discovering companies through AI-powered web research, enriching company data, and finding decision-makers at target accounts.

Base Configuration

Base URL
string
https://api.extruct.ai/v1
Authentication
header
Authorization: Bearer $EXTRUCT_API_TOKEN
Content-Type: application/json

Discovery API

Find companies via deep web research with AI evaluation.

Create Discovery Task

POST /v1/discovery_tasks
query
string
required
Natural-language description of target companiesExample: “B2B SaaS companies in healthcare that raised Series A in the last 18 months”
desired_num_results
integer
Number of results to discover (1-250)
  • API default: 100
  • Recommended: 50
criteria
array
Evaluation criteria for discovered companies (recommended: up to 5)Each criterion grades companies on a 1-5 scale:
{
  "key": "has_api",
  "name": "API Available",
  "criterion": "Company offers a public API for data integration"
}
Rules:
  • key: alphanumeric + underscore, starts with letter
  • name: 1-100 characters
  • criterion: 10-500 characters
auto_data_sources
boolean
default:true
Let system automatically select data sourcesIf set to false, you must provide data_sources
data_sources
array
Manual data source selection (required if auto_data_sources is false)Options: web_search, extruct_db, linkedin, maps
table
object
Auto-import results to an existing table
{
  "id": "uuid-of-existing-table",
  "run": true,
  "auto_import": true
}

Response

id
string
Task UUID for polling and fetching results
status
string
Task status: createdin_progressdone | failed
num_results_discovered
integer
Number of companies discovered
num_results_enriched
integer
Number of companies enriched with data
num_results_evaluated
integer
Number of companies evaluated against criteria
is_exhausted
boolean
Whether search has exhausted available sources
{
  "id": "task-uuid",
  "status": "created",
  "num_results_discovered": 0,
  "num_results_enriched": 0,
  "num_results_evaluated": 0,
  "num_results": 0,
  "is_exhausted": false
}

Poll Discovery Task

GET /v1/discovery_tasks/{task_id}
Returns the same response shape as task creation with updated counts. Recommended polling: Once per minute (60s) until status is done or failed

Fetch Discovery Results

GET /v1/discovery_tasks/{task_id}/results?limit=100&offset=0
company_name
string
Discovered company name
company_website
string
Company website domain
company_description
string
AI-generated company description
relevance
integer
Relevance score (0-100)
founding_year
integer
Year company was founded
source
string
Data source: web_search, extruct_db, linkedin, or maps
scores
object
Evaluation scores for each criterion
{
  "has_api": {
    "grade": 5,
    "explanation": "Company offers REST API with comprehensive docs",
    "sources": ["https://example.com/docs"]
  }
}
Example result:
{
  "company_name": "Matchory",
  "company_website": "matchory.com",
  "company_description": "Global supplier discovery platform...",
  "relevance": 100,
  "founding_year": 2019,
  "source": "web_search",
  "scores": {
    "has_api": {
      "grade": 5,
      "explanation": "Offers public REST API",
      "sources": ["https://matchory.com/docs"]
    }
  }
}

Company Search API

Search existing company database with filters.
GET /v1/companies/search?filters={json}

Filter Structure

{
  "include": {
    "country": ["United States", "Germany"],
    "city": ["San Francisco", "Berlin"],
    "size": ["11-50", "51-200"]
  },
  "exclude": {
    "city": ["San Francisco"]
  },
  "range": {
    "founded": {"min": 2015, "max": 2024}
  }
}
Size buckets: 1-10, 11-50, 51-200, 201-500, 501-1000, 1001-5000, 5001-10000, 10001+

Enrichment API

Add custom data columns to company tables.

Add Enrichment Column

POST /v1/tables/{table_id}/columns
column_configs
array
required
Array of column configuration objects
{
  "kind": "agent",
  "name": "Tech Stack",
  "key": "tech_stack",
  "value": {
    "agent_type": "research_pro",
    "prompt": "What technologies does {input} use?",
    "output_format": "text"
  }
}

Agent Types

agent_type
string
Type of research agent to use
  • research_pro: Deep web research with sources (recommended for factual data)
  • research: Lighter web research (faster, less depth)
  • research_reasoning: Research with chain-of-thought reasoning
  • llm: No web search, uses only company profile (for classification/inference)
  • linkedin: LinkedIn-specific research

Output Formats

FormatUse CaseExample
textFree-form descriptions”Cloud infrastructure, DevOps tooling”
numberNumeric values42
moneyMonetary amounts2500000
urlURLshttps://example.com
emailEmail addresses[email protected]
phonePhone numbers”+1-555-0100”
dateDates”2024-03-15”
gradeScore (1-5 scale)4
labelSingle tag from list”Series A”
selectSingle choice”SaaS”
multiselectMultiple choices["SaaS", "Fintech"]
jsonStructured data{"aum": 2500, "currency": "USD"}
Note: label, select, and multiselect require a labels array. json requires an output_schema object.

Trigger Enrichment Run

POST /v1/tables/{table_id}/run
mode
string
required
Run mode
  • new: Only enrich pending cells (recommended)
  • all: Re-run all cells including completed ones
columns
array
Column UUIDs to scope the run toRecommended when adding new columns to avoid re-running existing enrichments.
Example: Run specific columns only
{
  "mode": "new",
  "columns": ["column-uuid-1", "column-uuid-2"]
}

Read Table Data

GET /v1/tables/{table_id}/data
Returns full table with all rows and cell values.

People Finder API

Find decision-makers at target companies.

Add People Finder Column

POST /v1/tables/{table_id}/columns
kind
string
required
Must be company_people_finder
value.roles
array
required
List of role descriptions to search for (broad terms, not exact titles)Example: ["VP Sales", "Head of Sales", "Business Development"]
value.provider
string
required
Provider to use (recommended: research_pro)
value.max_results
integer
Maximum people per company (recommended: 3-5)
Example:
{
  "column_configs": [
    {
      "kind": "company_people_finder",
      "name": "Key Decision Makers",
      "key": "decision_makers",
      "value": {
        "roles": ["VP Sales", "Head of Sales"],
        "provider": "research_pro",
        "max_results": 5
      }
    }
  ]
}

Child Table Behavior

Adding a company_people_finder column automatically creates a linked child table with these columns:
ColumnKeyKindOutput
Person InputinputinputRaw person context
Full Namefull_nameagentParsed full name
RoleroleagentCurrent role/title
Profile URLprofile_urlagent (url)LinkedIn URL
The parent table’s response includes:
{
  "child_relationships": [
    {
      "table_id": "child-people-table-uuid",
      "relationship_type": "company_people"
    }
  ]
}

Fetch People Data

GET /v1/tables/{child_table_id}/data
Cell values are nested: row["data"]["full_name"]["value"]["answer"]

Optional: Enrich LinkedIn Profiles

Add to the people table for richer profile data:
{
  "kind": "agent",
  "key": "linkedin_data",
  "name": "LinkedIn Data",
  "value": {
    "agent_type": "linkedin",
    "prompt": "{profile_url}"
  }
}
Note: References the profile_url column key (not linkedin_url).

Build docs developers (and LLMs) love