Domain Enrichment API
Endpoint: GET /api/website/html
Domain enrichment turns a website or email domain into a company record. The endpoint downloads a public web page and, with extract=true, returns the company candidates found in it: registration numbers (KVK, Companies House, Handelsregister), VAT numbers, JSON-LD organisation data, copyright and legal-suffix names. Resolve a candidate with /api/company/search and you have the registered legal entity behind the site, with firmographics, CEO, corporate group and contact data from 350M+ companies in official registers. This is the domain enrichment step that powers Find the Company Behind Any Website and the Chrome extension.
Typical uses:
- Inbound lead enrichment: a signup from
info@acme.nlbecomes Acme B.V. with size, industry, city and CEO before sales follows up. - CRM enrichment by domain: enrich every company record that only has a website field, in bulk.
- Prospect and account lists: turn a directory, a competitor's customer logos or a list of domains into a target list with registry-verified firmographics.
- Registry-backed alternative to Clearbit-style enrichment: the same domain-in, company-out call, sourced from official registers instead of scraped profiles.
- Fallback for the website filter: when
/api/company/search?website=returns nothing, the footer or imprint usually still names the operator. - Your own parsing: the raw HTML is returned as well, so you can run any extraction you like without hosting a fetcher.
Request
curl -G "https://app.companydata.com/api/website/html" \
-H "x-api-key: YOUR_API_KEY" \
--data-urlencode "url=coolblue.nl" \
--data-urlencode "extract=true"
Query parameters
| Parameter | Required | Description |
|---|---|---|
url | yes | The page to download. A bare domain (coolblue.nl), a host with path (www.example.com/imprint) or a full http(s):// URL. Bare domains default to https://. |
extract | no | true to include the candidates array with company signals found in the page. Default false. |
maxBytes | no | Cap on the downloaded body in bytes. Default 2000000 (2 MB), minimum 10000, maximum 5000000. Larger pages are cut off and flagged with truncated: true. |
Redirects are followed (up to 5 hops) and finalUrl tells you where the page ended up. The body is decoded using the charset declared by the server or the page; charset reports which one was used.
Response
{
"requestedUrl": "https://coolblue.nl/",
"finalUrl": "https://www.coolblue.nl/",
"statusCode": 200,
"contentType": "text/html; charset=utf-8",
"charset": "utf-8",
"html": "<!DOCTYPE html><html lang=\"nl\">...",
"bytes": 412873,
"truncated": false,
"redirects": ["https://www.coolblue.nl/"],
"fetchedAt": "2026-09-07T10:12:31.204Z",
"candidates": [
{ "source": "jsonld", "name": "Coolblue B.V.", "countryHint": "NL", "city": "Rotterdam" },
{ "source": "identifier", "nationalId": "24330083", "countryHint": "NL" },
{ "source": "identifier", "nationalId": "NL812688747B01", "countryHint": "NL" },
{ "source": "copyright", "name": "Coolblue", "countryHint": "NL" }
]
}
Response fields
requestedUrl: the normalised URL that was fetched first.finalUrl: the URL after redirects. Use its hostname for thewebsitefilter or as the domain to cache on.statusCode: HTTP status of the final response. A404or503page is still returned so you can inspect it.contentTypeandcharset: as declared by the server and used for decoding.html: the page body as text, up tomaxBytes.bytesandtruncated: how much was downloaded and whether the cap was hit.redirects: every redirect target that was followed, in order.candidates(only withextract=true): company signals in order of trust, deduplicated, at most 12.
Candidate sources
source | What it is | Reliability |
|---|---|---|
jsonld | Organization / LocalBusiness from schema.org JSON-LD: legalName or name, vatID or taxID, address | High when present |
identifier | Registration or VAT number from the footer or imprint: KVK (NL), Company No. (GB), HRA/HRB (DE), EU VAT numbers | Very high: search it with nationalId= |
copyright | The name after the copyright line | Medium: often a trade name |
legal-suffix | Names ending in B.V., GmbH, Ltd, Inc., S.A. and similar found in the footer | Medium to high |
og | og:site_name or application-name meta tag | Low: usually a brand |
Each candidate carries a countryHint (from the identifier prefix, the JSON-LD address, or the country-code top-level domain) that you should pass as countryCode to narrow the search.
From website to lead
- Call
/api/website/html?url=<domain>&extract=true. - If a candidate has a
nationalId, search it directly:/api/company/search?nationalId=<id>&countryCode=<countryHint>. A hit here is near-certain. - Otherwise search the best
namecandidate:/api/company/search?search=<name>&countryCode=<countryHint>&statusCode=0,1, and compare the returnedCompany NameandTrade Namewith the candidate. - If nothing matches, fall back to the registry's own website field:
/api/company/search?website=<hostname>. - Export the match with
/api/company/export?ID=<id>for the full lead record: phone, email, employees, revenue, industry codes, executives and headquarters fields.
Company websites list the operating company, not necessarily the ultimate owner. Once you have a match, the export record's Global Headquarter ID Number gives you the group parent; see Corporate Structure.
Errors
| Status | code | Meaning |
|---|---|---|
400 | invalid_url | url is missing, not http(s), contains credentials, or is not a public hostname. |
401 | Missing or invalid API key. | |
403 | blocked_host | The host is an IP literal, an internal name, or resolves to a private or reserved address. Only public websites can be fetched. |
415 | not_html | The URL returned a non-HTML document (an image, a PDF, a JSON API). |
429 | Monthly quota exceeded for this key. | |
502 | unreachable, too_many_redirects | The site could not be reached, did not resolve, or redirected more than 5 times. |
504 | timeout | The site did not respond within 10 seconds. |
Limits and quota
- One call counts as one request against your monthly quota, whatever the page size.
- Pages are fetched with a
CompanyDataBotuser agent from our servers; sites that block bots may return a challenge page instead of their content (checkstatusCodeand thehtml). - Only
httpandhttpsURLs on public hosts are fetched. Private networks, cloud metadata addresses and localhost are always refused. - Downloaded HTML is not stored; each call fetches the page live.