curl --request POST \
--url https://api.topograph.co/v2/search/global \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"query": "Bamberger GmbH, Wien",
"countries": [
"US"
],
"activeOnly": false,
"strictActiveOnly": false,
"stream": false
}
'import requests
url = "https://api.topograph.co/v2/search/global"
payload = {
"query": "Bamberger GmbH, Wien",
"countries": ["US"],
"activeOnly": False,
"strictActiveOnly": False,
"stream": False
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
query: 'Bamberger GmbH, Wien',
countries: ['US'],
activeOnly: false,
strictActiveOnly: false,
stream: false
})
};
fetch('https://api.topograph.co/v2/search/global', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.topograph.co/v2/search/global",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'query' => 'Bamberger GmbH, Wien',
'countries' => [
'US'
],
'activeOnly' => false,
'strictActiveOnly' => false,
'stream' => false
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.topograph.co/v2/search/global"
payload := strings.NewReader("{\n \"query\": \"Bamberger GmbH, Wien\",\n \"countries\": [\n \"US\"\n ],\n \"activeOnly\": false,\n \"strictActiveOnly\": false,\n \"stream\": false\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.topograph.co/v2/search/global")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"query\": \"Bamberger GmbH, Wien\",\n \"countries\": [\n \"US\"\n ],\n \"activeOnly\": false,\n \"strictActiveOnly\": false,\n \"stream\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.topograph.co/v2/search/global")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"query\": \"Bamberger GmbH, Wien\",\n \"countries\": [\n \"US\"\n ],\n \"activeOnly\": false,\n \"strictActiveOnly\": false,\n \"stream\": false\n}"
response = http.request(request)
puts response.read_body{
"id": "global-search-1791216000000-k3x9qa",
"status": "resolved",
"summary": "Found in Austria: Bamberger GmbH (370916s).",
"query": {
"name": "Bamberger GmbH",
"latinName": "<string>",
"legalForm": "GmbH",
"address": "Wien",
"identifier": "FN 370916s",
"website": "altria.com",
"mentionedCountries": [
"NL"
],
"sourceCountry": "GB"
},
"candidates": [
{
"selected": true,
"match": "strong",
"countryCode": "AT",
"id": "370916s",
"legalName": "Bamberger GmbH",
"explanation": {
"summary": "<string>",
"reasons": [
{
"kind": "legal_form",
"text": "The register in Austria lists it under exactly that name",
"countryCode": "AT",
"url": "https://www.sec.gov/cgi-bin/browse-edgar?action=getcompany&CIK=0000764180"
}
]
},
"legalNameInEnglish": "<string>",
"companyNameTransliterations": [
"<string>"
],
"address": {
"addressLine1": "10 rue de la Fraternité",
"addressLine2": "Topograph Building",
"city": "Bagnolet",
"postalCode": "93170",
"region": "FR",
"countryCode": "FR",
"poBox": "PO Box 123",
"careOf": "c/o John Doe",
"state": "Île-de-France",
"latitude": 59.9139,
"longitude": 10.7522
},
"isActive": true
}
],
"usage": {
"priceCents": 123,
"durationMs": 123
},
"reason": "not_a_legal_entity",
"likelyCountryCode": "KY"
}{
"statusCode": 400,
"error": {
"code": "invalid_request",
"message": "query cannot be empty"
}
}{
"statusCode": 402,
"error": {
"code": "insufficient_funds",
"message": "Not enough credits for a global search."
}
}{
"statusCode": 429,
"error": {
"code": "rate_limited",
"message": "Too many global searches this minute for this account. Retry shortly."
}
}{
"statusCode": 503,
"error": {
"code": "search_timeout",
"message": "The global search took too long to complete."
}
}Find a company across countries from its name
Takes what you know about a company in one free-text query (the name plus a city, a country, a registration number, a website…) and returns candidates across the countries Topograph covers, best first, each with a registration number you can pass to /v2/company, a match strength and an explanation of the evidence.
The search is agentic and bounded: it reads the legal form and any address, checks Topograph’s index, asks the web when the name and that data are not enough, confirms in the most likely registers (US states included), and stops as soon as one candidate is a strong match. At most 15 live and web searches, at most 100 seconds.
Countries. countries limits the search to some countries: ["US"] searches every US state and nothing else, ["US-DE", "US-NY"] two states, ["CA"] every Canadian jurisdiction (the federal register CA-FED and the provinces and territories, CA-ON, CA-QC…), ["DE", "AT", "CH"] three countries. Nothing outside them is searched or returned.
Status. resolved: one strong match, the candidate with selected: true, which you can use without a person checking. ambiguous: several plausible candidates (the same name in two countries, two namesakes in one register, a US company whose state is not established), all returned with their evidence. not_found: nothing acceptable; reason says why, and likelyCountryCode names the country the evidence pointed to even when Topograph does not cover it or it is outside countries.
Company status. A candidate’s isActive is indicative only and may be out of date; read company.status from /v2/company before relying on it.
Alpha. The request and response shapes may still change.
Billing. A search is billed only when it succeeds: status: resolved, one good candidate. Ambiguous and not-found searches, inputs rejected as not a legal entity, failures and timeouts are not billed. usage.priceCents shows what was charged; the price is on the pricing page.
Streaming. With stream: true and Accept: text/event-stream, the endpoint emits progress events (what the search is doing right now, and the candidates found so far), then one complete event with the final response, or an error event.
curl --request POST \
--url https://api.topograph.co/v2/search/global \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"query": "Bamberger GmbH, Wien",
"countries": [
"US"
],
"activeOnly": false,
"strictActiveOnly": false,
"stream": false
}
'import requests
url = "https://api.topograph.co/v2/search/global"
payload = {
"query": "Bamberger GmbH, Wien",
"countries": ["US"],
"activeOnly": False,
"strictActiveOnly": False,
"stream": False
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
query: 'Bamberger GmbH, Wien',
countries: ['US'],
activeOnly: false,
strictActiveOnly: false,
stream: false
})
};
fetch('https://api.topograph.co/v2/search/global', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.topograph.co/v2/search/global",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'query' => 'Bamberger GmbH, Wien',
'countries' => [
'US'
],
'activeOnly' => false,
'strictActiveOnly' => false,
'stream' => false
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.topograph.co/v2/search/global"
payload := strings.NewReader("{\n \"query\": \"Bamberger GmbH, Wien\",\n \"countries\": [\n \"US\"\n ],\n \"activeOnly\": false,\n \"strictActiveOnly\": false,\n \"stream\": false\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.topograph.co/v2/search/global")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"query\": \"Bamberger GmbH, Wien\",\n \"countries\": [\n \"US\"\n ],\n \"activeOnly\": false,\n \"strictActiveOnly\": false,\n \"stream\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.topograph.co/v2/search/global")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"query\": \"Bamberger GmbH, Wien\",\n \"countries\": [\n \"US\"\n ],\n \"activeOnly\": false,\n \"strictActiveOnly\": false,\n \"stream\": false\n}"
response = http.request(request)
puts response.read_body{
"id": "global-search-1791216000000-k3x9qa",
"status": "resolved",
"summary": "Found in Austria: Bamberger GmbH (370916s).",
"query": {
"name": "Bamberger GmbH",
"latinName": "<string>",
"legalForm": "GmbH",
"address": "Wien",
"identifier": "FN 370916s",
"website": "altria.com",
"mentionedCountries": [
"NL"
],
"sourceCountry": "GB"
},
"candidates": [
{
"selected": true,
"match": "strong",
"countryCode": "AT",
"id": "370916s",
"legalName": "Bamberger GmbH",
"explanation": {
"summary": "<string>",
"reasons": [
{
"kind": "legal_form",
"text": "The register in Austria lists it under exactly that name",
"countryCode": "AT",
"url": "https://www.sec.gov/cgi-bin/browse-edgar?action=getcompany&CIK=0000764180"
}
]
},
"legalNameInEnglish": "<string>",
"companyNameTransliterations": [
"<string>"
],
"address": {
"addressLine1": "10 rue de la Fraternité",
"addressLine2": "Topograph Building",
"city": "Bagnolet",
"postalCode": "93170",
"region": "FR",
"countryCode": "FR",
"poBox": "PO Box 123",
"careOf": "c/o John Doe",
"state": "Île-de-France",
"latitude": 59.9139,
"longitude": 10.7522
},
"isActive": true
}
],
"usage": {
"priceCents": 123,
"durationMs": 123
},
"reason": "not_a_legal_entity",
"likelyCountryCode": "KY"
}{
"statusCode": 400,
"error": {
"code": "invalid_request",
"message": "query cannot be empty"
}
}{
"statusCode": 402,
"error": {
"code": "insufficient_funds",
"message": "Not enough credits for a global search."
}
}{
"statusCode": 429,
"error": {
"code": "rate_limited",
"message": "Too many global searches this minute for this account. Retry shortly."
}
}{
"statusCode": 503,
"error": {
"code": "search_timeout",
"message": "The global search took too long to complete."
}
}Authorizations
Body
What you know about the company, in one string: the name first, then anything else, separated by commas ("Bamberger GmbH, Wien", "MFG Investments EOOD, from a UK filing", "Altria Group Inc., Richmond VA, altria.com", or an LEI alone). The name, the address, an identifier, a website and the countries it names are read out of it for you, and returned in query.
"Bamberger GmbH, Wien"
Search only these countries: Topograph country codes, US-DE for one US state, US for every US state, CA-FED for the Canadian federal register, CA-ON for one Canadian province or territory, CA for every Canadian jurisdiction. Nothing outside them is searched or returned. Unlike a country named in query, which only says where you think the company is, this is a filter. Omit it to search every country.
["US"]
Leave out companies the search sees as inactive. It filters on the same indicative status as isActive: a company whose status is unknown is kept, so a candidate is not proof that the company is active.
false
Return only candidates explicitly reported as active, excluding unknown statuses. Implies activeOnly. Status remains indicative and may come from a periodic snapshot.
false
Streaming mode: Server-Sent Events with progress events (the steps so far, and the candidates found so far), one complete event carrying the final response, or an error event. Set Accept to text/event-stream.
false
Response
The candidates and their explanations (JSON), or the SSE stream when stream is true.
Identifies this search. Quote it when you contact support about it.
"global-search-1791216000000-k3x9qa"
resolved: one strong match, the selected candidate. ambiguous: several plausible candidates (including namesakes in one register the evidence cannot tell apart), or one weak one. not_found: nothing acceptable; see reason.
resolved, ambiguous, not_found The outcome in one sentence.
"Found in Austria: Bamberger GmbH (370916s)."
What was understood from your input.
Show child attributes
Show child attributes
Candidates, best first. Empty on not_found. On resolved, the first one is selected.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Why the search ended not_found, or why it stopped early.
not_a_legal_entity, no_country_signal, country_not_covered, no_register_match, search_limit_reached, timeout, outside_countries The country the evidence points to, even when the company could not be confirmed, Topograph does not cover its register, or it is outside countries.
"KY"