Company autocomplete API from official registers

Type a few letters of a company name and get the official record back: legal name, identifier, legal form, status and registered address, from the register of the country you pick. One endpoint, one response shape and one key for Spain, France, the United Kingdom, Ireland, Poland, Norway, Finland, Sweden, Belgium, Croatia, Denmark, Estonia, Slovakia, Switzerland, Latvia, Cyprus, Romania, Lithuania, Canada, Australia, Japan, Israel, Singapore, Colombia, Taiwan, Czech Republic, Germany, Argentina, Ukraine, Serbia, Slovenia, Ecuador, Chile, Mexico, the Netherlands, Brazil and the United States; the country is a parameter. It returns legal identifiers from official registers, not brand domains or logos. The page carries a live demo that runs in the browser.

What the autocomplete does

GET /companies/search takes the typed letters as name, a country and a limit, and returns a ranked list: a normalised, partial match on the registered name, best match first, each record with a match_score from 0 to 100. Give it an identifier instead of a name (a NIF, a SIREN, a Companies House number) and the same call becomes an exact lookup. Nothing is returned for natural persons.

The code: a debounced React field and a server proxy

The browser calls your own server, which holds the key and forwards the search. The React field waits 350 ms after the last keystroke, sends nothing under three characters and aborts the previous request. The server proxy in Node:

app.get('/api/company-lookup', async (req, res) => {
  const q = String(req.query.q || '').trim()
  const country = String(req.query.country || 'ES').toUpperCase()
  if (q.length < 3) return res.json([])
  const isId = /^[A-Z]{0,2}\d{4,}[A-Z]?$/i.test(q.replace(/[\s.-]/g, ''))
  const params = new URLSearchParams({ country, limit: '6', [isId ? 'company_number' : 'name']: q })
  const r = await fetch('https://api.prometiam.com/functions/v1/risk-api/companies/search?' + params,
    { headers: { Authorization: 'Bearer ' + process.env.PROMETIAM_API_KEY } })
  if (!r.ok) return res.status(r.status === 429 ? 429 : 502).json([])
  const { data } = await r.json()
  res.json(data.map((c) => ({ id: c.id, name: c.company_name, number: c.company_number, form: c.legal_form,
    status: c.status, city: c.city, postal_code: c.postal_code, address: c.address })))
})

The same call from a shell:

curl "https://api.prometiam.com/functions/v1/risk-api/companies/search?name=telefonica&country=ES&limit=6" -H "Authorization: Bearer $PROMETIAM_API_KEY"

The fields your form fills

Legal name (company_name), the register's own identifier (company_number), legal form (legal_form, local_legal_form and local_legal_form_name), status (status, stage and local_status), address (address, postal_code, city and region), activity (activity_code and activity_description), founding_date, share capital where the register publishes it, match_score for name searches and last_seen_date. A field the register does not publish is null, never omitted.

Which country and which identifier

Spain: NIF or CIF. France: SIREN or SIRET. United Kingdom: Companies House number. Ireland: CRO number. Poland: KRS number, with NIP and REGON. Norway: organisasjonsnummer. Finland: Y-tunnus. Sweden: organisationsnummer. Belgium: enterprise number (KBO/BCE). Croatia: MBS and OIB. Denmark: CVR number. Estonia: registry code. Slovakia: IČO. Switzerland: UID. Latvia: registration number. Cyprus: registration number (HE or AE and the number). Romania: CUI.

What it costs per 1,000 searches

Derived from the public tier prices, the monthly price divided by the monthly credits (a search costs 1 credit): Starter, EUR 9.99 for 1,000 credits, is about EUR 10 per 1,000 credits; Professional, EUR 29.99 for 10,000, about EUR 3; Scale, EUR 99.99 for 50,000, about EUR 2. Starter begins with a 14-day trial of 500 credits, card required, nothing charged for 14 days. A search that fires costs 1 credit, a batch item costs 1 credit, and a request that fails with a 4xx or 5xx costs nothing. To price your own volume, use the credit estimator.

Scope

The autocomplete returns company records. Officers and directors exist for Spain, France, the United Kingdom, Norway, Poland and the Czech Republic (Polish natural persons are masked by the register itself; Czech natural persons are the name and the month and year of birth only) only, on other endpoints. Ireland is company-level, with no officers yet. Finland, Sweden, Belgium, Croatia, Denmark, Estonia, Slovakia, Switzerland, Latvia, Cyprus, Romania, Lithuania, Canada, Australia, Japan, Israel, Singapore, Colombia (apart from the name of its legal representative), Taiwan, Germany, Argentina, Ukraine, Serbia, Slovenia, Ecuador, the Netherlands, Brazil and the United States are company records only, with register-change events and monitoring (Argentina has no dissolution alert, and Mexico covers its LEI-registered entities only), but no officers and no registry-compliance signal; corporate insolvency notices cover Finland, Denmark, Croatia, Sweden and Switzerland (a Swiss notice is linked to the company by its UID where the notice names it) but not Belgium, Estonia or Slovakia, and their sole traders are never served (in Denmark, sole proprietorships and estates). Denmark carries no share capital, and its status includes the register's bankruptcy state. Chile is company records only, with no events and no monitoring.

Related

Company lookup API: validation, status and batches · Company lookup for onboarding forms, invoicing and CRMs · Free lookup tools, from the NIF lookup to the CVR lookup · API documentation for GET /companies/search · Pricing

Read the full page and try the live demo · Sign up

Business name lookup: the fields your form fills

Form fieldResponse fieldWhat it holds
Legal namecompany_nameThe registered name.
Tax or registration numbercompany_numberThe register's own number for the country: NIF, SIREN, Companies House number, CRO number, KRS, organisasjonsnummer and the equivalents for the other countries. nif and siren stay as native aliases.
Legal formlegal_form, legal_form_family, local_legal_form, local_legal_form_nameThe standard abbreviation (SA, SL, Ltd, AB...) and its family to compare forms across countries, beside the register's own code and its name where the register publishes one.
Statusstatus, stage, local_statusA standard status that means the same in every country, a lifecycle stage (active, distress, winding_up, closed or unknown) and the register's own word.
Addressaddress, postal_code, city, regionThe registered address. Region is the first-level region of the register: provincia, département, county, województwo, fylke, maakunta, län, province, županija or region.
Activityactivity_code, activity_descriptionThe register's own classification (CNAE, NAF, SIC, PKD, NACE); the description only where the register publishes a text.
Datesfounding_date, dissolution_dateIncorporation and, where it applies, dissolution.
Share capitalcapital_amount, capital_currencyWhere the register publishes it; capital_eur gives one euro figure for every country (converted at the ECB reference rate of 2 October 2026 when the register states another currency).
Match qualitymatch_score0 to 100 for a name search, best first. Null for an identifier lookup.
Freshnesslast_seen_dateThe most recent register publication or snapshot in which the record appeared.
Follow-up callidThe record id, which is the input of the company detail endpoint (GET /companies/ followed by the id).

Which country and which identifier

CountryRegisterIdentifierParameter
Spain (ES)Registro Mercantil, as published in the BORMENIF or CIFcompany_number (alias nif)
France (FR)INPI and SireneSIREN or SIRETsiren, siret
United Kingdom (GB)Companies HouseCompany number, such as 00445790 or SC095237company_number
Ireland (IE)Companies Registration Office (CRO)CRO numbercompany_number
Poland (PL)KRS, the National Court RegisterKRS number; NIP and REGON also resolvecompany_number, nip, regon
Norway (NO)BrønnøysundregistreneOrganisasjonsnummercompany_number
Finland (FI)Trade Register (PRH and YTJ)Y-tunnuscompany_number or vat
Sweden (SE)BolagsverketOrganisationsnummercompany_number or vat
Belgium (BE)Crossroads Bank for Enterprises (KBO/BCE)Enterprise numbercompany_number or vat
Croatia (HR)Sudski registar, the court registerMBS or OIBcompany_number (MBS), oib or vat
Denmark (DK)Central Business Register (CVR)CVR numbercompany_number or vat
Estonia (EE)e-Business Register (RIK)Registry codecompany_number or vat (KMKR)
Slovakia (SK)Register of Legal Entities (RPO)IČOcompany_number (no VAT number)
Switzerland (CH)Zefix (Swiss central business name index)UIDcompany_number, or vat (the UID with MWST, TVA or IVA)
Latvia (LV)Register of Enterprises (Uzņēmumu reģistrs)Registration numbercompany_number, or vat (LV plus the eleven digits)
Cyprus (CY)Registrar of Companies (DRCOR)Registration number (HE or AE and the number)company_number (no VAT number)
Romania (RO)National Trade Register Office (ONRC)CUIcompany_number, or vat (RO plus the CUI)

What it costs per 1,000 searches

TierPrice a monthCredits a monthDerived, per 1,000 searches
Free, 14-day trial€0, nothing charged for 14 days500Not billed
Starter€9.991,000About €10
Professional€29.9910,000About €3
Scale€99.9950,000About €2

Frequently asked questions

Can I call the autocomplete from the browser?
The API answers cross-origin requests, so a browser can call it, but a key in browser code is public: anyone can copy it and spend your quota. The demo on this page uses a shared, read-only demo key that is public on purpose and rate limited for every visitor. In production, call your own server, keep the key in an environment variable and forward the search, as in the proxy above.
What are the rate limits?
Every key has a monthly credit allowance plus a per-minute limit and a daily fair-use limit. The per-minute limit is 10 requests on the free trial, 60 on Starter, 120 on Professional and 300 on Scale. When a limit is hit the API answers 429 with a Retry-After header, and every response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset for the monthly quota. A debounce of about 350 ms, a three-character minimum and a server-side cache keep the calls per company entered to a handful.
Does it return sole traders or natural persons?
No person is ever returned as a search result: the API serves companies and other legal entities as the registers publish them. Sweden, Croatia, Belgium, Estonia, Slovakia and the United States never serve sole traders (enterprises of natural persons), Denmark never serves sole proprietorships or estates, and the Finnish records do not include sole traders, so a lookup of one there returns nothing even though the business exists.
How fresh is the data?
Each register is refreshed on its own schedule, most of them daily. A record carries last_seen_date, the most recent register publication or snapshot in which it appeared, and GET /coverage reports freshness per country. A company incorporated this week can take a few days to appear, as it does in the register itself; for the United Kingdom, last_seen_date can lag the register by up to a month between snapshots.
Can I search several countries at once?
One call searches one country: country is a parameter, and if you omit it the API uses the first country allowed for your key, usually ES. To offer a name across countries, send one search per country in parallel from your server, or one POST /companies/lookup with an item per country, which returns the best match for each. Every search and every batch item costs 1 credit.
What counts as a call?
Every request that succeeds costs credits against the monthly allowance: a search, a company record and a lookup item cost 1 credit each. A keystroke search that fires costs 1 credit and each batch item costs 1 credit; requests that fail with a 4xx or 5xx cost nothing, and the cost of each response is in its X-Credits-Cost header. A request your code aborts may already have been served, so debounce the input rather than rely on aborting.