Scrapers

Business research

Deep 11-dimension business research. Given a domain or company name, produce a structured dossier covering identity, market, product, traction, capital, team, sentiment, technology, distribution, risk, and outlook. Output feeds sales intelligence and the discovery aggregator's brain ingest.

Updated today

Overview

At a glance
Worker
ultron-research
Pattern
Composite + LLM summarisation per layer
Input
One company target per run; many targets per task
Layers
11
Latency
Roughly 60 to 180 seconds per target
Trigger
Cortex persona, leadgen enrichment, manual chat invocation

Most upstream scrapers return a single slice of a company. Maps gives places, similarweb gives traffic, research the actor gives a single composite dossier where every section is normalised. The shape is stable across targets so downstream consumers can rely on per-layer schemas.

The 11 layers

#LayerWhat it covers
1IdentityLegal name, domain, founded year, HQ, legal form, LEI when available.
2MarketIndustry tags, sub-industry, geo footprint, TAM hints, category position.
3ProductPrimary product, key features, pricing model, tiers, target buyer.
4TractionCustomers, ARR or revenue band when public, growth rate hints.
5CapitalFunding stage, total raised, last round details, lead investors.
6TeamHeadcount band, leadership (CEO, founders), key recent hires.
7SentimentPublic reviews (G2 + Capterra summary), customer NPS hints when surfaced.
8TechnologyTech stack hints, hiring signals, security posture clues.
9DistributionMarketing channels in use, social presence depth, content cadence.
10RiskRecent press incidents, regulatory exposure, named litigation if public.
11OutlookSynthesis: positioning, momentum, opening for outreach.

Input schema

actor inputjson
1{
2 "target": {
3 "domain": "linear.app", // preferred
4 "name": "Linear", // fallback when no domain
5 "countryHint": "US"
6 },
7 "layers": ["identity", "market", "product", "capital", "team", "outlook"], // optional; default all 11
8 "depth": "standard" // light | standard | deep (controls LLM token budget)
9}

Pipeline flow

pipelinetxt
1# Per target:
2# 1. Resolve target. If only name + country given, try to discover a
3# canonical domain via web search.
4# 2. Fan out per layer:
5# - identity, market, product -> web search + wellfound + pitchbook
6# - traction -> web search + customer-logo mining
7# - capital -> pitchbook + dealroom + crunchbase web
8# - team -> linkedin (auth) + wellfound
9# - sentiment -> g2-reviews + capterra-reviews
10# - technology -> similarweb + jobs (tech in postings)
11# - distribution -> similarweb + social profile scans
12# - risk -> web search (incidents, lawsuits)
13# 3. For each layer, the gathered raw rows feed a layer-specific
14# summariser prompt running on a lightweight model. Outputs a
15# structured per-layer object.
16# 4. The outlook layer is a synthesiser pass over the other 10.
17# 5. Push one composite kind="dossier" row to the dataset.

Output shape

dataset-row.jsonjson
1{
2 "kind": "dossier",
3 "source": "research",
4 "target": { "domain": "linear.app", "name": "Linear" },
5 "identity": {
6 "legalName": "Linear Orbit, Inc.",
7 "domain": "linear.app",
8 "founded": "2019",
9 "hq": "San Francisco, CA",
10 "legalForm": "Corporation"
11 },
12 "market": {
13 "industry": "B2B SaaS",
14 "subIndustry": "Project Management",
15 "geos": ["US", "EU"],
16 "categoryPos": "Challenger"
17 },
18 "product": {
19 "primary": "Issue tracking for software teams",
20 "pricingModel": "Per-seat",
21 "tiers": ["Free", "Standard", "Plus", "Enterprise"]
22 },
23 "traction": {
24 "customerHints": ["OpenAI", "Superhuman", "Ramp"],
25 "growthHint": "Reported 3x YoY headcount through 2024-2025"
26 },
27 "capital": {
28 "stage": "Series C",
29 "totalRaisedUsd": 130000000,
30 "lastRound": { "stage": "Series C", "year": 2024, "leadInvestor": "Accel" }
31 },
32 "team": { "headcountBand": "51-200", "leadership": [{ "title": "CEO", "name": "Karri Saarinen" }] },
33 "sentiment": { "g2Rating": 4.7, "capterraRating": 4.6, "summary": "Strong UX praise; reporting limitations called out." },
34 "technology": { "stackHints": ["TypeScript", "Postgres"], "hiringSignals": ["backend", "infra"] },
35 "distribution": { "channels": ["product-led", "community", "content"], "socialDepth": "Heavy on X and LinkedIn" },
36 "risk": { "incidents": [] },
37 "outlook": { "summary": "Established challenger with strong product loop and category momentum. Best opening: integrations or pricing-tier expansion.", "momentum": "high" },
38 "scrapedAt": "2026-05-19T12:00:00Z"
39}

Webhook contract

webhookjson
1{
2 "eventTypes": ["ACTOR.RUN.SUCCEEDED", "ACTOR.RUN.FAILED", "ACTOR.RUN.TIMED_OUT", "ACTOR.RUN.ABORTED"],
3 "requestUrl": "https://scraper-webhook.51ultron.com/apify",
4 "payload": { "actorName": "research", "source": "research", "datasetId": "<id>" }
5}

File map

actors/research
.actor
actor.json
INPUT_SCHEMA.json
src
__main__.pytarget resolver, layer fan-out, synthesiser
layers
identity.py
market.py
product.py
traction.py
capital.py
team.py
sentiment.py
technology.py
distribution.py
risk.py
outlook.py
Dockerfile
requirements.txt
README.md