Company autocomplete API for Europe

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 and Denmark; the country is a parameter. 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 and legal_form_full), status (status, status_canonical and stage), address (address, postal_code, city and province), 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.

What it costs per 1,000 calls

Derived from the public tier prices, the monthly price divided by the monthly calls: Starter, EUR 9.99 for 10,000 calls, is about EUR 1.00 per 1,000 calls; Professional, EUR 29.99 for 100,000, about EUR 0.30; Scale, EUR 99.99 for 1,000,000, about EUR 0.10. The free tier is a 14-day trial of 1,000 calls a month, no card. A search that fires is one call, a batch item is one call, and a request that fails with a 4xx or 5xx is not counted.

Scope

The autocomplete returns company records. Officers and directors exist for Spain, France, the United Kingdom and Norway only, on other endpoints. Ireland and Poland are company-level, with no officers yet. Finland, Sweden, Belgium, Croatia and Denmark are company records only, with no officers, no corporate-event stream and no monitoring; Sweden, Belgium, Croatia and Denmark also have no registry-compliance signal and no insolvency notices, 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.

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 · Get a free API key

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_fullThe register's code or label, with legal_form_canonical, legal_form_abbreviation and legal_form_family to compare forms across countries. The full label only where the register publishes it.
Statusstatus, status_canonical, stageThe register's own word, a cross-country reading of it, and a lifecycle stage: active, distress, winding_up, closed or unknown.
Addressaddress, postal_code, city, provinceThe registered address. Province is the register's region: province, département, county, voivodeship or municipality.
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_euros is set when the currency is EUR.
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

What it costs per 1,000 calls

TierPrice a monthCalls a monthDerived, per 1,000 calls
Free, 14-day trial€0, no card1,000Not billed
Starter€9.9910,000About €1.00
Professional€29.99100,000About €0.30
Scale€99.991,000,000About €0.10

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 call quota 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, 300 on Professional and 600 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 and Belgium 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 counts as one call.
What counts as a call?
Every request that succeeds counts as one call against the monthly quota, whether it is a search, a company detail or a lookup. A keystroke search that fires is one call and each batch item is one call; requests that fail with a 4xx or 5xx are not counted. A request your code aborts may already have been served, so debounce the input rather than rely on aborting.