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.nl becomes 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

GET
/api/website/html
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

ParameterRequiredDescription
urlyesThe 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://.
extractnotrue to include the candidates array with company signals found in the page. Default false.
maxBytesnoCap 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 the website filter or as the domain to cache on.
  • statusCode: HTTP status of the final response. A 404 or 503 page is still returned so you can inspect it.
  • contentType and charset: as declared by the server and used for decoding.
  • html: the page body as text, up to maxBytes.
  • bytes and truncated: how much was downloaded and whether the cap was hit.
  • redirects: every redirect target that was followed, in order.
  • candidates (only with extract=true): company signals in order of trust, deduplicated, at most 12.

Candidate sources

sourceWhat it isReliability
jsonldOrganization / LocalBusiness from schema.org JSON-LD: legalName or name, vatID or taxID, addressHigh when present
identifierRegistration or VAT number from the footer or imprint: KVK (NL), Company No. (GB), HRA/HRB (DE), EU VAT numbersVery high: search it with nationalId=
copyrightThe name after the copyright lineMedium: often a trade name
legal-suffixNames ending in B.V., GmbH, Ltd, Inc., S.A. and similar found in the footerMedium to high
ogog:site_name or application-name meta tagLow: 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

  1. Call /api/website/html?url=<domain>&extract=true.
  2. If a candidate has a nationalId, search it directly: /api/company/search?nationalId=<id>&countryCode=<countryHint>. A hit here is near-certain.
  3. Otherwise search the best name candidate: /api/company/search?search=<name>&countryCode=<countryHint>&statusCode=0,1, and compare the returned Company Name and Trade Name with the candidate.
  4. If nothing matches, fall back to the registry's own website field: /api/company/search?website=<hostname>.
  5. Export the match with /api/company/export?ID=<id> for the full lead record: phone, email, employees, revenue, industry codes, executives and headquarters fields.

Errors

StatuscodeMeaning
400invalid_urlurl is missing, not http(s), contains credentials, or is not a public hostname.
401Missing or invalid API key.
403blocked_hostThe host is an IP literal, an internal name, or resolves to a private or reserved address. Only public websites can be fetched.
415not_htmlThe URL returned a non-HTML document (an image, a PDF, a JSON API).
429Monthly quota exceeded for this key.
502unreachable, too_many_redirectsThe site could not be reached, did not resolve, or redirected more than 5 times.
504timeoutThe 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 CompanyDataBot user agent from our servers; sites that block bots may return a challenge page instead of their content (check statusCode and the html).
  • Only http and https URLs 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.

Was this page helpful?