One API for 14M+ online businesses
ListSignal does two things. It keeps a record of every online business: what it is, what it runs, what it sells, what it earns. And it tracks what changes: a technology added or removed, hiring started, a revenue band moved, a website down. Both are one key away, by REST or from any MCP-capable AI agent. Free tier, no card, no sales call.
Quickstart
- Create a free account and generate an API key in Settings. 1,000 lookups/month included.
- Call the API with your key:
curl https://listsignal.com/api/v1/company/gymshark.com \
-H "Authorization: Bearer ls_YOUR_KEY"
{
"data": {
"domain": "gymshark.com",
"http_title": "Gymshark Official Store",
"estimated_business_model": "Ecommerce",
"estimated_industry": "Fashion",
"estimated_revenue": "$100M-$1B",
"estimated_revenue_confidence": 0.91,
"estimated_employees": "501-5000",
"estimated_country": "GB",
"http_tech": ["Shopify", "Klaviyo", "Gorgias", "Cloudflare"],
"dns_email_provider": "Google Workspace",
"shop_product_count": 1840,
"shop_price_avg": 38.5,
"hr_job_count": 42,
"hr_departments": ["Engineering", "Marketing"],
"http_emails": ["[email protected]"],
"http_last_seen_at": "2026-10-01 06:12:40",
"changes": [
{"field": "http_tech", "change": "added", "value": "Gorgias",
"changed_at": "2026-09-28 11:02:17", "summary": "Gorgias added"},
{"field": "hr_job_count", "change": "started", "value": "42",
"changed_at": "2026-09-20 08:40:03", "summary": "started hiring (42 roles)"}
]
}
}
curl "https://listsignal.com/api/v1/search?tech=Shopify&country=FR&hiring=true&limit=25" \
-H "Authorization: Bearer ls_YOUR_KEY"
curl "https://listsignal.com/api/v1/changes?field=http_tech&change=added&value=Klaviyo&period=7d" \
-H "Authorization: Bearer ls_YOUR_KEY"
Endpoints
GET /api/v1/company/:domain
One company's full record: every field in the dictionary below under its own name, plus changes, its last 20 recorded changes. Contact emails and phone on paid plans.
GET /api/v1/search
Filter companies by tech (one name: a platform, a vendor, a WordPress plugin or a Shopify app), dns_tech, email_provider, country, business_model, industry, revenue, employees, hiring, shopify. Ranked by traffic, up to 100 per page.
GET /api/v1/changes
The change feed, newest first. Filter by field, change (added, removed, changed, started, stopped, down, back), value, domain, country, business_model, period (24h, 7d, 30d, 90d). Every row carries a one-line summary.
GET /api/v1/technologies
Every tracked technology, plugin and app with live company counts, its category and its ecosystem.
GET /api/v1/stats
Live dataset statistics and the list of tracked fields, refreshed every 60 seconds. Citable.
Full machine-readable contract: /openapi.json (OpenAPI 3.1). Errors are RFC 9457 application/problem+json with actionable detail, so agents self-correct in one retry.
Signals: what changed
Every business is re-checked on a weekly to monthly cadence. When a tracked field moves between two checks, one change row is recorded and never rewritten. You read them in the dashboard's Signals tab, export them as CSV, or page through /api/v1/changes. A change is one of:
| Change | On | Reads as |
|---|---|---|
| added, removed | http_tech, dns_tech, hr_departments, http_emails, http_social_links, ctl_subdomains | Klaviyo added |
| changed | estimated_business_model, estimated_industry, estimated_revenue, estimated_employees, estimated_country, verified_revenue, verified_employees, http_title, http_meta_description, dns_email_provider, shop_theme, shop_plus, shop_product_count (20% or more), news_last_funding_usd | from $1M-$10M to $10M-$100M |
| started, stopped | hr_job_count | started hiring (12 roles) |
| down, back | http_status | website down (502) |
Every field, by name
The same names everywhere: the API, the dashboard, the CSV. The prefix tells you where a value comes from. http_ the website, http_deep_ the deep pass over the site, dns_ DNS, ctl_ certificate logs, rdap_ the registry, bgp_ the hosting network, shop_ the store catalog, hr_ the job board, news_ news. estimated_ means a rule or a model produced it, and it comes with _confidence and _evidence. verified_ means a public registry said it. A signal mark means a change on that field is recorded.
| Field | Type | Meaning | Signal |
|---|---|---|---|
| domain | text | The registrable domain, lowercase, no scheme. | |
| ctl_first_seen_at | date | When the domain first appeared in a certificate log. | |
| ctl_last_seen_at | date | Last crawl that carried certificate data. | |
| http_first_seen_at | date | First successful fetch of the website. | |
| http_last_seen_at | date | Last successful fetch of the website (HTTP 2xx or 3xx). | |
| http_last_checked_at | date | Last fetch attempt, whatever the outcome. | |
| estimated_business_model | text | What the business is: Ecommerce, SaaS, Agency, Marketplace, Tool, Media, Consulting, LocalBusiness and more. Rules plus a text classifier. | changed |
| estimated_business_model_confidence | number | 0 to 1. | |
| estimated_business_model_evidence | text | Which tier decided it: heuristic rules, the ML head, or a government TLD rule. | |
| estimated_industry | text | Industry label from the same classifier. | changed |
| estimated_industry_confidence | number | 0 to 1. One classifier emits model and industry together today, so it equals the model confidence. | |
| estimated_revenue | text | Annual revenue band: <$1M, $1M-$10M, $10M-$100M, $100M-$1B, $1B+. | changed |
| estimated_revenue_confidence | number | 0 to 1, grows with the number of independent signals. | |
| estimated_revenue_evidence | text | The signals the estimate rests on, pipe-separated, strongest first. | |
| estimated_employees | text | Headcount band: 1-10, 11-50, 51-500, 501-5000, 5001+. | changed |
| estimated_employees_confidence | number | 0 to 1. Same estimator run as revenue. | |
| estimated_employees_evidence | text | Same evidence trail as revenue. | |
| estimated_country | text | ISO-2 country, from a VAT or registration number on the page, else the registrant country, else TLD, language and hosting. | changed |
| estimated_country_evidence | text | Which inputs decided the country. | |
| estimated_country_confidence | number | 0.95 from a registration number on the page, 0.85 from the registrant, 0.6 from TLD, language and hosting. | |
| estimated_hq_location | text | City or address of the head office. | |
| estimated_hq_location_evidence | text | registry or about page. | |
| estimated_summary | text | One-line description of what the business does. | |
| estimated_summary_evidence | text | registry or about page. | |
| estimated_junk | text | Empty when the site looks like a real business; parked or placeholder otherwise. Follows the newest successful fetch. | changed |
| estimated_realness | text | How much evidence says this is an operating business, 0 to 1. 0.5 and up: mail, a contact and 90 days of certificates; 0.7 and up adds traffic, a catalogue or jobs, a registry match or a company number. 0 when junk. | |
| estimated_realness_evidence | text | The facts behind estimated_realness, '|' separated (mx, dmarc, contact, address, company_id, schema_org, age_90d, activity, traffic, social, registry). | |
| estimated_at | date | When the estimates were last produced. | |
| http_tech | list | Every technology, platform, plugin and app detected on the website, canonical names from the tech catalog. | added, removed |
| http_script_domains | list | Third-party hosts the homepage loads scripts from. | |
| dns_tech | list | Vendors found in DNS: email senders from SPF and DKIM, verification records, CNAME targets. | added, removed |
| dns_email_provider | text | Who hosts the mailboxes: Google Workspace, Microsoft 365, Zoho, Proton, self-hosted. | changed |
| http_emails | list | Email addresses published on the site. Paid plans only in the API. | added |
| http_emails_evidence | text | Which pages the addresses came from. | |
| http_phone | text | Phone number from the footer or JSON-LD. | |
| http_address | text | Postal address from the footer or JSON-LD. | |
| http_social_links | list | Social profile URLs linked from the site. | added |
| http_company_id | text | Company registration or VAT number printed on the site, the key into public registries. | |
| http_nav_links | list | Main navigation link texts. | |
| http_title | text | Homepage title. | changed |
| http_meta_description | text | Homepage meta description, usually the tagline. | changed |
| http_h1 | text | Homepage H1. | |
| http_language | text | Page language, BCP-47. | |
| http_schema_type | text | Main schema.org type declared in JSON-LD. | |
| http_pages_found | list | Paths discovered on the homepage: /pricing, /about, /careers, /contact. | |
| http_status | number | HTTP status of the last attempt. | down, back |
| http_error | text | Fetch error of the last attempt, empty when it succeeded. | |
| http_blocked | text | The WAF or bot wall in the way, empty when none is outstanding. | |
| http_response_ms | number | Homepage response time. | |
| http_deep_seo_score | number | 0 to 100, see /scoring/seo-score. | |
| http_deep_seo_issues | list | What the score lost points on. | |
| http_deep_word_count | number | Visible words on the homepage. | |
| http_deep_alt_ratio | number | Share of images with alt text. | |
| http_deep_lcp_ms | number | Largest Contentful Paint, measured in a browser when one was used. | |
| http_deep_cls | number | Cumulative Layout Shift. | |
| http_deep_ttfb_ms | number | Time to first byte. | |
| http_deep_pricing_points | number | Count of prices printed on the pricing page. | |
| http_deep_sitemap_urls | number | URLs in the sitemap. | |
| http_deep_sitemap_products | number | Product URLs in the sitemap. | |
| http_deep_sitemap_blog | number | Blog URLs in the sitemap. | |
| http_deep_sitemap_children | number | Child sitemaps. | |
| http_deep_sitemap_lastmod | date | Newest lastmod in the sitemap. | |
| http_deep_last_seen_at | date | Last successful deep pass. | |
| hr_job_count | number | Open roles on the public job board. | started, stopped |
| hr_ats | text | Applicant tracking system: Greenhouse, Lever, Ashby, Workable and more. | changed |
| hr_departments | list | Departments with open roles. | added |
| hr_locations | list | Locations of open roles, most frequent first. | |
| hr_last_seen_at | date | Last successful read of the job board. | |
| ctl_has_hiring_subdomain | flag | A careers or jobs host exists in the certificate logs. | |
| shop_product_count | number | Products in the public catalog. | changed by 20% or more |
| shop_new_products_30d | number | Products added in the last 30 days. | |
| shop_last_product_at | date | Newest product's publication date. | |
| shop_price_min | number | Lowest product price. | |
| shop_price_avg | number | Average product price. | |
| shop_price_max | number | Highest product price. | |
| shop_oos_ratio | number | Share of products out of stock. | |
| shop_discount_depth | number | Mean markdown against compare-at price. | |
| shop_vendor_count | number | Distinct vendors: 1 is a brand, many is a retailer. | |
| shop_catalog_age_days | number | Age of the oldest product. | |
| shop_product_types | list | Product types in the catalog. | |
| shop_theme | text | Shopify theme name. | changed |
| shop_theme_store_id | number | Theme store id, 0 for a custom theme. | |
| shop_currency | text | Shop currency. | changed |
| shop_locales | number | Storefront locales. | changed |
| shop_plus | number | 1 on Shopify Plus. | changed |
| shop_last_seen_at | date | Last successful catalog read. | |
| verified_revenue | text | Revenue band from a public registry (SEC EDGAR, Companies House, Wikidata). | changed |
| verified_revenue_evidence | text | The registry it came from. | |
| verified_employees | text | Headcount band from a public registry (Companies House, SIRENE, Wikidata, YC). | changed |
| verified_employees_evidence | text | The registry it came from. | |
| verified_industry | text | Industry as recorded by the registry (NAF, SIC, Wikidata). | |
| verified_founded_year | number | Year of incorporation. | |
| verified_at | date | Last registry lookup that returned a fact. | |
| dns_a | list | IPv4 addresses. | |
| dns_mx | list | Mail exchangers. | |
| dns_dmarc | text | DMARC policy: none, quarantine, reject. | |
| dns_bimi | text | BIMI logo record. | |
| dns_dkim | text | DKIM selectors found. | |
| dns_last_seen_at | date | Last crawl where the domain resolved. | |
| ctl_tld | text | Top-level domain. | |
| ctl_issuer | text | Certificate authority of the newest certificate. | |
| ctl_subdomain_count | number | Distinct hosts seen in certificates. | |
| ctl_subdomains | list | Hosts seen in certificates: app, api, shop, careers and the like. | added |
| rdap_created_at | date | Domain registration date. | |
| rdap_expires_at | date | Domain expiry date. | |
| rdap_updated_at | date | Last registration update. | |
| rdap_registrar | text | Registrar. | |
| rdap_nameservers | list | Nameservers. | |
| rdap_status | list | EPP status codes. | |
| rdap_registrant_country | text | Registrant country when the registry publishes it. | |
| rdap_last_seen_at | date | Last registry read. | |
| bgp_asn | text | Autonomous system number of the hosting network. | |
| bgp_asn_org | text | Hosting network operator: Cloudflare, Amazon, Hetzner and the like. | |
| bgp_country | text | Country of the hosting network. | |
| bgp_last_seen_at | date | Last crawl with a network lookup. | |
| tranco_rank | number | Tranco traffic rank, lower is bigger. | |
| majestic_rank | number | Majestic Million rank. | |
| majestic_ref_subnets | number | Referring subnets, a backlink breadth measure. | |
| news_count | number | News items collected. | |
| news_last_funding_usd | number | Largest funding amount reported. | changed |
| news_last_seen_at | date | Newest news item. |
MCP server, for AI agents
ListSignal speaks the Model Context Protocol natively. Point Claude, Cursor, or any MCP client at the endpoint and it gets three tools: listsignal_get_company (the full record with its recent changes), listsignal_search_companies, and listsignal_dataset_stats.
{
"mcpServers": {
"listsignal": {
"type": "http",
"url": "https://listsignal.com/mcp",
"headers": { "Authorization": "Bearer ls_YOUR_KEY" }
}
}
}
Streamable HTTP transport, stateless, JSON-RPC 2.0. The same key and quota as the REST API.
Plans and limits
| Plan | Calls / month | Rate | Contact emails and phone |
|---|---|---|---|
| Free | 1,000 | 30 / min | Contactability only |
| Starter | 5,000 | 60 / min | Included |
| Pro | 25,000 | 120 / min | Included |
Only successful calls count against the quota. You never pay for a miss. Need more volume, webhooks, or bulk delivery? Email us.