Skip to main content
Global search is in alpha. The request and response shapes may still change, and so may the wording of explanations and the list of reason kinds.
Every /v2/search call needs a country. Often you do not have one: a shareholder listed in a foreign filing, a counterparty on an invoice, a holding company whose stated domicile is not where it is incorporated. POST /v2/search/global takes what you know in one line of text and returns ranked candidates across every country Topograph covers. Each candidate has the country and registration number you pass to /v2/company, whether it is a strong or a possible match, and a one-sentence explanation of why it matched.

Quick example

The candidate is ready for a company request:

Sending what you know

Put everything in query, separated by commas. The name comes first; everything after it is read as a hint. What was understood is returned in query: the name, the legalForm it carries, and the hints read from the text, so you can check the search understood your input. If your data is already structured, send name and hints instead of query:
hints sent with a query take precedence over what was extracted from the text. Add "activeOnly": true to leave out companies the registers report as inactive.

How it decides

The search works through cheap signals first and stops as soon as one candidate is a strong match.
  1. The name. The legal form and the wording of the name point to the jurisdictions that use them: EOOD is Bulgarian, S.p.A. Italian, GmbH German, Austrian or Swiss. Ltd is most often British, but an American-sounding Ltd is weighed toward the United States. LLC and Inc. point to the United States, and the state still has to be found. Scanning noise such as S.a r.1. is corrected.
  2. Your hints, as above.
  3. Topograph’s company data, checked once across all countries.
  4. The web, only when the name and Topograph’s data are not enough, or the company is American and its state is unknown. A source page is kept as evidence.
  5. The registers. Live searches in the most likely countries, three at a time, with one rephrased retry when a register returns nothing. The search stops once a register returns the exact name and no other country is a serious contender.
For a US company with no known state, the usual incorporation states are tried first (Delaware, New York, Nevada, Wyoming, Florida, Texas). Then the search moves on through the other states, up to almost every state, six at a time and fastest registers first. When you give an address, it decides a lot. If the address names a country or a US state, that register is asked first, before any web search. When it returns the company under that name at the address you gave, or nearby, the search stops there and no other country is searched. When a register holds several companies with the same name, they are ranked by the distance between their registered address and yours, and each explanation says how far it is (“Its registered address is 3 km from Richmond”). A search runs at most 15 register and web searches, plus up to 40 state registers for a US company with no known state, within 100 seconds.

Reading the answer

status is the first thing to check. summary says the same thing in one sentence you can show a user. On not_found, reason says why: query.likelyCountryCode names the country the evidence settled on, even when the company could not be confirmed or its register is not covered. A Cayman Islands fund still gets its country.

Candidates

Each candidate carries countryCode, id, legalName, its registered address and isActive, and a match: strong when the evidence points to this company, possible when it needs a second look. A resolved search has one strong match. explanation.summary says why it matched in one or two sentences, and explanation.reasons lists the reasons one by one, each with a text you can show as is: countries lists the countries considered, each with an outcome (match, no_match, not_searched, not_covered, excluded, unavailable) and a sentence. steps is the search as it ran, one label per step.

Streaming

With "stream": true and the Accept: text/event-stream header, the endpoint sends Server-Sent Events while the search runs:
  • progress: the search so far, as { revision, steps, candidates, countries, query }. A step with status: "running" is in progress, and its label says what it is doing (“Asking the register in Austria”). A new event is sent every time something changes.
  • complete: the final response, same shape as the non-streaming answer.
  • error: { error: { code, message } }.
Streaming is the better choice for anything a person watches: candidates appear as each register answers, and a long search never runs into an HTTP timeout.

Billing

A search is billed only when it succeeds, that is when status is resolved. Ambiguous and not-found searches, inputs rejected as not a legal entity, failures and timeouts are not billed. usage.priceCents shows what the search was charged. The current price is on the pricing page.

Limits and errors

Each account can run 60 global searches per minute and 5 at the same time.

Development environments

With an sk_dev_ key, global search answers from generated data: candidates in the countries the name’s legal form points to, each resolvable with /v2/company in the same environment. Coverage is honoured, so a name that only points at uncovered countries ends not_found with country_not_covered, as it would live. Nothing is billed.

In the app

The same search is in the app under Global search in the sidebar: one text box, the search progressing live, and the candidates with their explanations. Click a candidate, or Get data, to pick the datapoints and order the company exactly as from the country search.