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, or browse by structured filters — industry codes, officer count, status, and more — across 19 jurisdictions. The q parameter matches company names only; it does not filter by SIC or NACE code. Use industryCode to filter by industry. The searchMode parameter controls name 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, find entities before fetching their full profile, or browse companies in a sector without a name query. For exact lookups by company number, use Get company instead.

Request

Authentication

Authorization: Bearer YOUR_API_KEY

Get your API key →

Parameters

ParameterTypeRequiredDefaultDescription
qstringno*Company name to search. Min 2 characters. Matching behaviour controlled by searchMode. Does not match by industry code — use industryCode for that. Required unless at least one other filter is provided.
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.
industryCodestringnoFilter by SIC (UK) or NACE (EU) industry code. Comma-separate multiple codes for OR semantics — e.g. 69201,69202 returns companies with either code. Each code is matched exactly against stored codes (no prefix matching). Can be used without q to browse companies in a sector.
minOfficerCountintegernoFilter to companies with at least this many active officers (resigned officers excluded). Must be ≥ 0.
maxOfficerCountintegernoFilter to companies with at most this many active officers. Must be ≥ 0 and ≥ minOfficerCount when both are provided.
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: 'uk', 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': 'uk', 'status': 'active'},
    headers={'Authorization': 'Bearer YOUR_API_KEY'},
)
data = r.json()

Response

200 — Success

{
  "results": [
    {
      "entityId": "uk-08804411",
      "entityName": "Revolut Ltd",
      "jurisdiction": "uk",
      "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; pageSize exceeds 100; minOfficerCount or maxOfficerCount is negative or min > max; no query and no filters provided
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

The q parameter is 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.

Using q to search by industry

q matches company names only. A query of q=accountantswill not return companies unless they have "accountants" in their registered name — it won't match SIC 69201. Use industryCode=69201 (optionally combined with jurisdiction and status) to browse companies in an industry.

Not filtering by jurisdiction in single-market products

Without jurisdiction, search queries all 19registries. 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.