Skip to main content
Docs

Documentation

Everything you need to integrate CompanyLens into your application or AI agent.

Search companies

GET https://api.companylens.io/v1/companies/search

Search for companies by name across 18 jurisdictions. The searchMode parameter controls matching: fuzzy (default) handles minor spelling variations and common abbreviations ("Ltd" / "Limited") automatically; prefix matches names that start with your query and is recommended for due-diligence workflows; exact matches the exact normalised name.

Use this endpoint to build company lookup UI, power autocomplete fields, or find entities before fetching their full profile. For exact lookups by company number, use Get company instead.

Request

Authentication

Authorization: Bearer YOUR_API_KEY

Get your API key →

Parameters

ParameterTypeRequiredDefaultDescription
qstringyesCompany name to search. Min 2 characters. Matching behaviour controlled by searchMode.
jurisdictionstringno*(all)*Filter to a single jurisdiction. ISO 3166-1 alpha-2 codes (gb, fr, de). See supported jurisdictions.
statusstringnoallFilter by status: active | dissolved | all
searchModestringnofuzzyMatching strategy: fuzzy — trigram similarity, typo-tolerant (default); prefix — starts-with match using a btree index, recommended for due-diligence workflows; exact — exact normalised name match.
pageintegerno1Page number, 1-indexed.
pageSizeintegerno20Results per page. Maximum: 100.

Examples

curl
curl -G https://api.companylens.io/v1/companies/search \
  -H "Authorization: Bearer YOUR_API_KEY" \
  --data-urlencode "q=Revolut" \
  --data-urlencode "jurisdiction=gb" \
  --data-urlencode "status=active"
Node.js
const res = await fetch(
  'https://api.companylens.io/v1/companies/search?' +
  new URLSearchParams({ q: 'Revolut', jurisdiction: 'gb', status: 'active' }),
  { headers: { Authorization: 'Bearer YOUR_API_KEY' } }
);
const data = await res.json();
Python
import httpx

r = httpx.get(
    'https://api.companylens.io/v1/companies/search',
    params={'q': 'Revolut', 'jurisdiction': 'gb', 'status': 'active'},
    headers={'Authorization': 'Bearer YOUR_API_KEY'},
)
data = r.json()

Response

200 — Success

{
  "results": [
    {
      "entityId": "gb-08804411",
      "entityName": "Revolut Ltd",
      "jurisdiction": "gb",
      "status": "active",
      "incorporationDate": "2015-07-23",
      "dissolutionDate": null,
      "address": {
        "line1": "7 Westferry Circus",
        "line2": "Canary Wharf",
        "city": "London",
        "postcode": "E14 4HD",
        "country": "GB"
      },
      "industryCodes": ["K6419"],
      "ticker": null
    }
  ],
  "pagination": {
    "page": 1,
    "pageSize": 20,
    "total": 3,
    "hasMore": false
  }
}

Response fields

FieldTypeAlways presentDescription
entityIdstringyesStable unique identifier. Format: {jurisdiction}-{registry-number}
entityNamestringyesOfficial registered name as it appears in the source registry.
jurisdictionstringyesISO code of the registry this record comes from.
statusstringyesactive | dissolved | unknown
incorporationDatestring (ISO 8601)nonull if not recorded in the source registry.
dissolutionDatestring (ISO 8601)nonull for active entities.
addressobjectnoRegistered address. null if the registry doesn't publish addresses.
industryCodesstring[]noNACE or SIC codes depending on jurisdiction. Empty array if unavailable.
tickerstringnoStock ticker if listed. null for private entities.
pagination.totalintegeryesTotal matching results across all pages.
pagination.hasMorebooleanyesWhether additional pages exist. Increment page and request again if true.

Error responses

HTTP statusCodeWhen it happens
400INVALID_PARAMETERq is under 2 characters, searchMode is not a recognised value, or pageSize exceeds 100
400INVALID_JURISDICTIONJurisdiction code not in the supported list
401UNAUTHORIZEDAPI key is missing, malformed, or revoked
429RATE_LIMITEDMonthly or daily quota exceeded — see rate limits

Jurisdiction support

This endpoint searches all jurisdictions by default. The richness of results varies by registry:

FieldGBFRDEEELVOthers
entityName
statusVaries
incorporationDateVaries
addressVaries
industryCodes

Full coverage matrix: Jurisdictions & coverage →

Common mistakes

Using search to look up a known entity number

Search is fuzzy name matching only. If you have a registration number (e.g. 08804411 for Revolut Ltd), use Get companydirectly — it's exact, faster, and won't return unrelated results.

Not filtering by jurisdiction in single-market products

Without jurisdiction, search queries all 16 registries. A search for “Apple” returns hundreds of results from every jurisdiction. If your product is UK-only, always pass jurisdiction=gb.

Expecting consistent address and incorporationDate

Some registries don't publish addresses or dates. Always handle null for these fields. Check the coverage table above before relying on them in your logic.

Using pageSize: 100 to get "all results"

If pagination.total exceeds pageSize, you need to paginate. Always check hasMore — never assume the first page is complete.