A vendor's customer counts, and — with a key — the customer enumeration
ctscout_vendor_customersGet a vendor's customer summary or detailed per-customer list from CT logs. Choose the free summary for counts, or enumerate confirmed and candidate customers with an API key.
Instructions
Read the ctscout research product's vendor objects: the free summary for a vendor slug (GET /vendors/{slug}), or the per-customer enumeration (GET /vendors/{slug}/customers, which needs an API key). Debits no quota either way — both are precomputed objects published by the ctscout-research refresh.
Args:
slug (string, required): the vendor slug, one lowercase segment, e.g. 'cloudflare'. The values in a LEI record's vendors_confirmed are exactly these slugs.
enumerate (boolean, optional, default false): false = the free summary; true = the per-customer enumeration, which requires an active ctscout.dev API key (any tier) in CTSCOUT_API_KEY. Free returns up to 100 rows from each list; Pro returns the full published lists (which may still be export-capped or shortened for MCP). A missing, invalid or revoked key gets HTTP 401 and this tool explains that the summary is still available with enumerate: false.
response_format ('markdown' | 'json', default 'markdown'): output format.
Candidates and confirmed are two different claims and are NEVER summed:
Candidate = an apex domain this vendor certified a hostname for. Fan-out alone is not a vendor relationship: an organization certifying hundreds of its own product sites looks identical.
Confirmed = the DNS-confirmed subset of the candidates. The definition: a vendor is confirmed when a hostname it certified resolves onto a domain it certifies and the customer's own www does not, or another organization certifies the apex.
Confirmed is a SUBSET of candidates, so adding the two double-counts. The markdown keeps them in separate tables and the JSON in separate fields; report them apart.
Returns (on success, structuredContent follows the declared outputSchema; a failed call — 400, 401, 404, 503, timeout — is isError with no structuredContent):
enumerate: false (the summary): { "slug": string, "vendor_name": string, "vendor_apex": string | null, // null when the vendor's brand token matches no label it certifies "customers": { "candidates": number, "confirmed": number }, "countries_top": [ { "country": string, "confirmed": number } ], // CONFIRMED customers only "co_use": [ { "slug": string, "confirmed": number } ], // see below "sample_customers": [string] // hash-chosen sample of the CONFIRMED customers, whatever size the export published }
enumerate: true (the enumeration): { "slug": string, "confirmed": [ { "apex": string, "attributed_to": string | null, "lei": string | null } ], "candidates": [ same row shape ], "counts": { "candidates": number, "confirmed": number }, // what the research build holds "capped": boolean, // true = the build itself kept a subset of the candidates "truncated": boolean, // true = the API shortened a list for the key tier "free_slice": { "rows": number, "full_list": "pro" } | null, // Free limit per list; null for Pro "truncation_note": string // written by THIS server, only when it dropped rows to fit the character limit; counts and capped still describe the API's answer }
Both also carry "as_of" / "product_version", "snapshot_dates", and this server's "snapshot" / "snapshot_source" ("product" | "unavailable"; null snapshot means unknown freshness, never "current").
Reading the fields honestly:
co_use counts THIS vendor's confirmed customers that the other vendor also certifies — a candidate there, not a mutual confirmation.
countries_top counts confirmed customers that resolved to an LEI; candidates and LEI-less customers are not in it.
attributed_to is GLEIF's legal name when the apex resolves to one LEI, the single non-vendor certificate organization otherwise, and null when neither holds. It is an attribution, not an ownership claim.
Examples:
Use when: "How many customers does Cloudflare have in the index?" -> { slug: "cloudflare" } (report candidates and confirmed separately)
Use when: "List Cloudflare's confirmed customers" -> { slug: "cloudflare", enumerate: true }
Don't use when: you have a company and want its vendors — read vendors_confirmed from ctscout_lookup_lei instead.
Coverage & freshness:
A 404 means the slug is not in the published version, not that the vendor does not exist. The export is republished by the ctscout-research refresh, so these answers move on that cadence rather than the daily /scan warehouse sync.
Before the first publish the routes answer HTTP 503 and this tool returns a plain "not published yet" error. That is expected, not a fault in the query.
Corrections:
Wrong attribution? Open an issue at https://github.com/minghsuy/ctscout-mcp/issues. Missing entity? Email pro@ctscout.dev. Include the slug queried, the customer row in question and why it is wrong.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | The vendor's slug, e.g. 'cloudflare'. The slugs in a LEI record's vendors_confirmed are exactly these values. | |
| enumerate | No | Optional, default false. false returns the free vendor summary (counts, top countries, co-use, a customer sample). true returns the per-customer enumeration from GET /vendors/{slug}/customers, which requires an active ctscout.dev API key (any tier). | |
| response_format | No | Output format: 'markdown' for the counts (or the two customer tables), 'json' for the raw API response. | markdown |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| slug | No | The vendor slug the answer is filed under. | |
| as_of | No | The product version this answer was read from. | |
| capped | No | Enumeration view: true when the research build kept a subset of the candidates. Says nothing about this server's own truncation — see truncation_note. | |
| co_use | No | Summary view: other vendors certifying this vendor's confirmed customers. The count is this vendor's confirmed customers that the other vendor also certifies — a candidate there, not a mutual confirmation. | |
| counts | No | Enumeration view: the completeness metadata — the rows the research build holds. counts.candidates can exceed candidates.length; see `capped`. | |
| snapshot | Yes | The research product version (YYYY-MM-DD) this answer was read from — the `as_of` of the export the ctscout-research refresh published. null when the API response carried none. | |
| confirmed | No | Enumeration view: the DNS-confirmed customer rows. | |
| customers | No | Summary view: the candidate/confirmed split. Two different claims about the same vendor — confirmed is the DNS-confirmed subset of candidates, so adding them double-counts. | |
| truncated | No | Enumeration view: the API shortened either list for this key's tier. | |
| candidates | No | Enumeration view: the candidate customer rows. counts.confirmed is a subset of counts.candidates, but when `capped` is true the LISTED candidates are a hash-chosen subset that may omit rows the confirmed list carries. | |
| free_slice | No | Enumeration view: free-tier rows allowed per list and the tier for the published list; null for Pro. Separate from export and MCP size caps. | |
| vendor_apex | No | Summary view: the vendor's own apex, null when its brand token matches none. | |
| vendor_name | No | Summary view: the vendor's certificate name. | |
| countries_top | No | Summary view: top countries by CONFIRMED customers (candidates are not counted). | |
| snapshot_dates | No | Per-source provenance from the product manifest: elf, gleif, isin, psl, wikidata. Values are the dated snapshot each join read (psl is a bundle identifier, not a date). | |
| product_version | No | Same value as as_of; the manifest's version. | |
| snapshot_source | Yes | 'product' = the API response carried the export's as_of; 'unavailable' = it did not, snapshot is null and must be treated as unknown, never as current. | |
| truncation_note | No | Written by this MCP server, never by the API: present only when rows were dropped from the lists above to stay under the response character limit. `counts` and `capped` still describe the API's answer, not this list. | |
| sample_customers | No | Summary view: a hash-chosen sample of the CONFIRMED customers — whatever size the research export published, not a ranking and not a complete list. |