Search ctscout by company name
ctscout_search_companySearch Certificate Transparency logs by organization name to discover attributed apex domains, with options for normalized matching and strict filtering.
Instructions
Search ctscout.dev's domain-attribution warehouse by organization name. Returns apex domains attributed to that organization based on Certificate Transparency log analysis (OV/EV cert subjects matched to entity names).
Args:
company_name (string, required): organization name. Partial matches work — 'Goldman' matches 'Goldman Sachs'. Min 2 chars, max 200.
strict_match_org_only (boolean, optional): suppress semantic candidates and return only authoritative warehouse org matches.
org_match_field ('verbatim' | 'normalized', optional): raw cert-subject substring matching, or the research normalizer's key of the query against the normalized column (legal forms stripped at the edges, '&'/'and' and hyphen/space unified, a leading 'The' dropped, a generic tail like 'Holdings' kept). Leave unset for automatic verbatim-then-normalized fallback.
org_match_mode ('substring' | 'word', optional): use word-boundary matching to reduce noise from short/common names.
purpose ('underwriting' | 'corporate_family', optional): choose tight operational-attribution defaults or broader corporate-family defaults. Explicit matching controls override the preset.
response_format ('markdown' | 'json', default 'markdown'): output format.
Returns (on success, structuredContent follows the declared outputSchema; an error result — 401, 429, timeout — is isError with no structuredContent, so never dereference snapshot on a failed call):
"Attributed" means the organization is what the evidence names for that domain, not an ownership claim. On /scan that evidence is the OV/EV certificate subject on both tiers; multi-signal attribution (DNS, RDAP, IP/ASN, homepage, favicon) exists only in a deep-dive job result (ctscout_submit_deep_dive, Pro). "Candidate" means a semantic name-similarity guess that is NOT an attribution.
In markdown: a snapshot line, then a table of (domain, attributed to, cert count, subdomain count). When nothing is attributed but match_type is 'semantic', a table of candidate organizations is rendered instead, labelled as candidates.
In JSON, structured as: { "domains": [ // attributed pairs; empty when nothing is attributed { "org": string, // attributed organization: the OV/EV certificate subject (both tiers) "apex_domain": string, // e.g. "gs.com" "cert_count": number, // # of distinct certs observed for this pair "subdomain_count": number, // # of distinct subdomains "first_seen": string | null, // warehouse observation time — NOT the CT log SCT / issuance time "last_seen": string | null // warehouse observation time — NOT the CT log SCT / issuance time } ], "total": number, // total matching rows in warehouse "truncated": boolean, // true if response is capped "upgrade_hint": string, // present when truncated "source": "warehouse", // both tiers read the daily warehouse snapshot "match_type": "exact" | "semantic" | "none", // 'semantic' = domains empty, candidates offered "org_match_strategy": string, // which matching pass produced the answer "empty_reason": string, // present on empty results: why nothing was attributed "candidates": [ // only when match_type is 'semantic'; NOT attributions { "org": string, "similarity": number, "top_apex_domain": string | null } ], "snapshot": string | null, // warehouse/D1 sync date (YYYY-MM-DD) the answer was read from (API version 2026-09-05+); null only when the API could not determine it "snapshot_source": "scan" | "unavailable" // 'scan' = API carried the date; 'unavailable' = it did not (snapshot is null). null means unknown freshness, never "current" }
Examples:
Use when: "Find all domains attributed to Cloudflare" -> { company_name: "Cloudflare" }
Use when: "Which domains are attributed to Goldman?" -> { company_name: "Goldman Sachs" }
Don't use when: You have a specific domain and want to find the organization it's attributed to — use ctscout_lookup_domain instead.
Auth & limits:
Requires an API key in CTSCOUT_API_KEY. Get a free key (no email) at https://ctscout.dev.
Free tier: 10 successful lookups/day, top 5 results from a daily snapshot. The response's "snapshot" field carries that snapshot's sync date (the API reports it since X-API-Version 2026-09-05); when it is null the API could not determine it — treat freshness as unknown, never as current.
Pro tier: 3,000 successful lookups/month included, up to 25 rows, a 12-month window; deep-dive jobs (20/day) for multi-signal attribution. $49/month, subscribed from https://ctscout.dev/#tiers.
Error handling:
HTTP 401: API key missing or invalid.
HTTP 429: a quota on this key is exhausted, on either tier; the error quotes the API's own detail, which names the cap and when it resets. Tier allowances: https://ctscout.dev/#tiers.
"No domains found": try a shorter or different company name (see legal-vs-brand caveat below).
Legal-vs-brand caveat (important):
The cert subject (O field) uses LEGAL entity names, not brand names.
"Travelers Insurance" → 0 results because the legal name is "The Travelers Companies, Inc."
"Hartford Financial" → 0 results; legal names are "Hartford Fire Insurance Company" or "The Hartford Financial Services Group".
If a brand-name search returns nothing, retry with variants like "X Companies", "X Group", "X Inc", "X Corporation", or "The X". The empty-result markdown output includes these suggestions automatically when the input looks brand-shaped.
Coverage caveat:
Best for established US/EU tech companies with OV/EV certs.
Limited coverage on small private companies, cyber MGAs, and entities using only DV (Let's Encrypt) certs.
Warehouse size (organizations, org-domain pairs, last sync) is not stated here because it changes daily; read the live figures at https://ctscout.dev/stats before treating a miss as meaningful.
Corrections:
Wrong attribution? Open an issue at https://github.com/minghsuy/ctscout-mcp/issues. Missing entity? Email pro@ctscout.dev. Include the name queried, the result returned and why it is wrong.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| purpose | No | Optional persona preset. 'underwriting' defaults to a tight operational attack-surface set; 'corporate_family' defaults to a broad brand, regional, and family set. Explicitly supplied matching controls always win. | |
| company_name | Yes | Company / organization name to search for. Partial matches work (e.g. 'Goldman' matches 'Goldman Sachs'). Case-insensitive. | |
| org_match_mode | No | Optional, default 'substring'. Use 'word' for short or common-token names to avoid unrelated substring matches. Applies only to verbatim matching. | |
| org_match_field | No | Optional, default 'verbatim'. 'verbatim' substring-matches the raw cert subject. 'normalized' compares the research normalizer's key of the query against the normalized column: GLEIF legal forms stripped at the edges, spelled out or abbreviated ('Aktiengesellschaft' and 'AG', 'Incorporated' and 'Inc.'), diacritics folded, lowercased; '&' and 'and' unify; a hyphen and a space no longer split ('Coca-Cola' and 'Coca Cola'), nor does a leading 'The'; a generic tail like 'Holdings' or 'Group' is part of the name and stays. A query that normalizes to nothing (a bare legal form) matches nothing. Leave unset to try verbatim first and retry normalized after an empty result; set 'normalized' only to skip the verbatim attempt. | |
| response_format | No | Output format: 'markdown' for human-readable summary, 'json' for the raw API response (useful for programmatic processing). | markdown |
| strict_match_org_only | No | Optional, default false. When true, suppress the semantic-name fallback and return only authoritative warehouse organization matches. |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| total | No | Matching pairs in the warehouse before any cap. | |
| source | No | 'warehouse' on /scan (both tiers); 'live-enriched' / 'cache-only' on a deep-dive result. | |
| domains | Yes | Attributed (domain, organization) pairs. Empty when nothing is attributed. | |
| snapshot | Yes | Warehouse/D1 sync date (YYYY-MM-DD) the answer was read from; the warehouse syncs daily. null when the API could not determine it. | |
| truncated | No | ||
| candidates | No | Present only when match_type is 'semantic'. Candidates are not attributions. | |
| match_type | No | 'exact' = domains are warehouse attributions; 'semantic' = domains is empty and candidates holds name-similarity guesses; 'none' = nothing matched. | |
| empty_reason | No | ||
| upgrade_hint | No | ||
| snapshot_source | Yes | 'scan' = the API response carried the date; 'unavailable' = it did not, snapshot is null and must be treated as unknown, never as current. | |
| org_match_strategy | No |