Topograph Search API
The Search API from Topograph — 1 operation(s) for search.
The Search API from Topograph — 1 operation(s) for search.
openapi: 3.0.0
info:
title: Topograph Billing Search API
description: The Topograph API
version: '0.1'
contact: {}
servers:
- url: https://api.topograph.co
security:
- x-api-key: []
tags:
- name: Search
paths:
/v2/search:
get:
description: 'This endpoint allows you to search for companies based on a country code and a query string.
The search can be performed using either a company legal name, commercial name, historical name, or registration number. Capabilities vary by country.
**Standard Mode (stream=false or omitted):**
Returns JSON array of results once all search sources have completed.
**Streaming Mode (stream=true):**
Returns Server-Sent Events (SSE) with progressive results as each search source completes. The endpoint emits named events:
- `progress`: Partial results from completed sources
- `complete`: Final results when all sources finish
- `error`: If the search fails
Streaming is beneficial for countries with multiple search sources (e.g., Germany queries both Unternehmensregister and Handelsregister), providing faster time-to-first-result.
Response times vary by country: from sub-second to up to 10 seconds.'
operationId: SearchController_searchV2_v2
parameters:
- name: country
required: true
in: query
description: The country code in ISO 3166-1 alpha-2 format (e.g., "FR" for France, "DE" for Germany).
schema:
example: FR
type: string
enum:
- AT
- BE
- BG
- CH
- CN
- CZ
- CY
- DE
- DK
- EE
- ES
- FI
- FR
- GB
- GG
- GR
- HK
- HR
- HU
- IE
- IS
- IT
- JE
- LI
- LU
- LV
- MC
- MT
- MU
- NL
- 'NO'
- PL
- PT
- RO
- RU
- SE
- SG
- SI
- SK
- VG
- name: query
required: true
in: query
description: The search query, which can be a company name or registration number. Note that search capabilities may vary by country, with some supporting only name or registration number searches.
schema:
example: Topograph
type: string
- name: stream
required: false
in: query
description: Enable streaming mode. When true, returns Server-Sent Events (SSE) with progressive results as each search source completes. Set Accept header to "text/event-stream" for proper streaming. When false or omitted, returns standard JSON array after all sources complete.
schema:
example: true
type: boolean
- name: transliterate
required: false
in: query
description: 'When true, user-facing string fields in the response (company names, addresses, person names, activity descriptions) are romanized from their native script to Latin characters on the way out. Internal data, cache, and billing are unaffected — only the response payload is transformed. Routing: Cyrillic/Greek/Hangul/Hebrew/Arabic/Thai via unidecode, Chinese via pinyin-pro (toneless), Japanese via kuroshiro (Hepburn).'
schema:
example: false
type: boolean
responses:
'200':
description: List of companies (JSON when stream=false, SSE when stream=true)
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/SearchResult'
text/event-stream:
schema:
type: string
description: 'Server-Sent Events stream with named events:
- `progress`: Partial results as sources complete
- `complete`: Final results when all sources finish
- `error`: Error occurred'
example: 'event: progress
data: {"results":[{"id":"123","legalName":"Company A","countryCode":"DE","address":{...}}]}
event: complete
data: {"results":[{"id":"123","legalName":"Company A",...},{"id":"456","legalName":"Company B",...}]}'
'400':
description: Bad Request - Invalid search query
content:
application/json:
schema:
type: object
properties:
statusCode:
type: number
example: 400
error:
type: object
properties:
code:
type: string
example: invalid_request
message:
type: string
example: Query is too short. Please provide at least 2 characters for company name search
details:
type: array
items:
type: string
example:
- Query must be at least 2 characters
'500':
description: Internal Server Error - Search failed
content:
application/json:
schema:
type: object
properties:
statusCode:
type: number
example: 500
error:
type: object
properties:
code:
type: string
example: service_unavailable
message:
type: string
example: An error occurred while searching. Please try again later.
security:
- x-api-key: []
summary: Search for companies
tags:
- Search
components:
schemas:
MatchReason:
type: object
properties:
matchType:
description: 'The type of match that produced this result. "id" means a guaranteed 1:1 match from an ID-based search (e.g., VAT number, CCIAA+REA). "exactLegalName" means the legal name exactly matches the search query. "partialId" means matched by a partial identifier that is not guaranteed unique (e.g., REA without CCIAA). "default" is used when the exact matching criteria is unknown. Results are ordered: id > exactLegalName > partialId > default.'
example: id
allOf:
- $ref: '#/components/schemas/MatchType'
identifier:
description: The identifier that matched this result. Present when matchType is "id" or "partialId". Shows which identifier type and value were used to find this company.
oneOf:
- $ref: '#/components/schemas/ItalyIdentifiers'
title: IT
- $ref: '#/components/schemas/FranceIdentifiers'
title: FR
example:
VAT: 02580590541
required:
- matchType
ItalyIdentifiers:
type: object
properties:
VAT:
type: string
description: 'Partita IVA (P.IVA) - VAT registration number. Format: 11 digits (e.g., "02580590541"). Issued by: Agenzia delle Entrate (Revenue Agency)'
example: 02580590541
Codice Fiscale:
type: string
description: 'Codice Fiscale - Tax identification code. Format: 16 alphanumeric characters for individuals (e.g., "RSSMRA70A01H501U"), 11 digits for companies (often same as VAT). Issued by: Agenzia delle Entrate (Revenue Agency)'
example: RSSMRA70A01H501U
CCIAA:
type: string
description: 'CCIAA - Camera di Commercio (Chamber of Commerce) province code. Format: 2-letter province code (e.g., "TO" for Torino, "MI" for Milano). Indicates which Chamber of Commerce the company is registered with.'
example: TO
REA Code:
type: string
description: 'REA Code - Registro Economico Amministrativo (Economic Administrative Register) number. Format: Numeric (e.g., "1234567"). Unique within each CCIAA province. Combined with CCIAA forms a unique identifier.'
example: '1234567'
description: Identifiers for Italian companies (IT)
AddressDTO:
type: object
properties:
addressLine1:
type: string
description: First line of the address
example: 10 rue de la Fraternité
addressLine2:
type: string
description: Second line of the address
example: Topograph Building
city:
type: string
description: City of the address
example: Bagnolet
postalCode:
type: string
description: Postal code of the address
example: '93170'
region:
type: string
description: Region of the address
example: FR
countryCode:
type: string
description: Country of the address using ISO 3166-1 alpha-2 country code
example: FR
poBox:
type: string
description: Post Office Box number
example: PO Box 123
careOf:
type: string
description: Care of (c/o) recipient
example: c/o John Doe
state:
type: string
description: State of the address
example: Île-de-France
latitude:
type: number
description: Latitude coordinate
example: 59.9139
longitude:
type: number
description: Longitude coordinate
example: 10.7522
MatchType:
type: string
enum:
- id
- exactLegalName
- partialId
- default
description: 'The type of match that produced this result. "id" means a guaranteed 1:1 match from an ID-based search (e.g., VAT number, CCIAA+REA). "exactLegalName" means the legal name exactly matches the search query. "partialId" means matched by a partial identifier that is not guaranteed unique (e.g., REA without CCIAA). "default" is used when the exact matching criteria is unknown. Results are ordered: id > exactLegalName > partialId > default.'
SearchResult:
type: object
properties:
address:
description: The legal address of the company
allOf:
- $ref: '#/components/schemas/AddressDTO'
id:
type: string
example: '932884117'
description: 'The company number. In some countries, this might be a concatenation of the registry and city (e.g., in Germany: "Augsburg HRB 34617"). The search function will always return a usable company number. Check the documentation to see which number format is used for each country.'
legalName:
type: string
description: Legal name of the company
example: SEMAPHORE
legalNameInEnglish:
type: string
example: Test Display Hong Kong Trading Limited
description: The English translation or romanization of the legal name, commonly used for international business. Particularly relevant for companies registered with non-Latin alphabet names (e.g., Chinese, Japanese, Korean, etc.).
companyNameTransliterations:
example:
- Naftogaz
- Naftohaz
description: 'Deterministic Latin transliterations of the company name, computed using per-country standards (e.g. UA: GOST + KMU 55 + ISO 9). Useful for displaying alternative Latin spellings alongside the original-script `legalName`. Absent or empty for Latin-script companies and for non-Latin countries not yet covered.'
type: array
items:
type: string
countryCode:
type: string
enum:
- AF
- AX
- AL
- DZ
- AS
- AD
- AO
- AI
- AQ
- AG
- AR
- AM
- AW
- AU
- AT
- AZ
- BS
- BH
- BD
- BB
- BY
- BE
- BZ
- BJ
- BM
- BT
- BO
- BQ
- BA
- BW
- BV
- BR
- IO
- BN
- BG
- BF
- BI
- KH
- CM
- CA
- CV
- KY
- CF
- TD
- CL
- CN
- CX
- CC
- CO
- KM
- CG
- CD
- CK
- CR
- CI
- HR
- CU
- CW
- CY
- CZ
- DK
- DJ
- DM
- DO
- EC
- EG
- SV
- GQ
- ER
- EE
- ET
- FK
- FO
- FJ
- FI
- FR
- GF
- PF
- TF
- GA
- GM
- GE
- DE
- GH
- GI
- GR
- GL
- GD
- GP
- GU
- GT
- GG
- GN
- GW
- GY
- HT
- HM
- VA
- HN
- HK
- HU
- IS
- IN
- ID
- IR
- IQ
- IE
- IM
- IL
- IT
- JM
- JP
- JE
- JO
- KZ
- KE
- KI
- KR
- KP
- KW
- KG
- LA
- LV
- LB
- LS
- LR
- LY
- LI
- LT
- LU
- MO
- MK
- MG
- MW
- MY
- MV
- ML
- MT
- MH
- MQ
- MR
- MU
- YT
- MX
- FM
- MD
- MC
- MN
- ME
- MS
- MA
- MZ
- MM
- NA
- NR
- NP
- NL
- NC
- NZ
- NI
- NE
- NG
- NU
- NF
- MP
- 'NO'
- OM
- PK
- PW
- PS
- PA
- PG
- PY
- PE
- PH
- PN
- PL
- PT
- PR
- QA
- RE
- RO
- RU
- RW
- BL
- SH
- KN
- LC
- MF
- PM
- VC
- WS
- SM
- ST
- SA
- SN
- RS
- SC
- SL
- SG
- SX
- SK
- SI
- SB
- SO
- ZA
- GS
- SS
- ES
- LK
- SD
- SR
- SJ
- SZ
- SE
- CH
- SY
- TW
- TJ
- TZ
- TH
- TL
- TG
- TK
- TO
- TT
- TN
- TR
- TM
- TC
- TV
- UG
- UA
- AE
- GB
- US
- UM
- UY
- UZ
- VU
- VE
- VN
- VG
- VI
- WF
- EH
- YE
- ZM
- ZW
- US-FL
- US-CO
- US-IL
- US-MA
- US-MD
- US-MI
- US-NJ
- US-NY
- US-OH
- US-TX
- US-DE
- US-WA
- US-TN
- US-WY
- US-GA
- US-MN
- US-MO
- US-NV
- US-PA
- US-CT
- US-UT
- US-IA
- US-AZ
- US-VA
- US-MS
- US-CA
- US-OR
- US-KY
- US-NE
- US-NC
- US-AR
- US-WI
- US-SC
- TEST
example: FR
description: The country code in ISO 3166-1 alpha-2 format (e.g., "FR" for France, "DE" for Germany).
matchReason:
description: Match reason containing information about why this result was returned. Includes the match type and which identifier matched for ID matches.
example:
matchType: default
allOf:
- $ref: '#/components/schemas/MatchReason'
required:
- address
- id
- legalName
- countryCode
- matchReason
FranceIdentifiers:
type: object
properties:
siren:
type: string
description: 'SIREN - Système d''Identification du Répertoire des Entreprises. Format: 9 digits (e.g., "443061841"). Issued by: INSEE (Institut National de la Statistique et des Études Économiques). This is the primary company identifier in France.'
example: '443061841'
siret:
type: string
description: 'SIRET - Système d''Identification du Répertoire des Établissements. Format: 14 digits = SIREN (9) + NIC (5) (e.g., "44306184100047"). Identifies a specific establishment (location) of a company. Issued by: INSEE.'
example: '44306184100047'
VAT:
type: string
description: 'TVA Intracommunautaire - French VAT number. Format: FR + 2 check digits + SIREN (e.g., "FR27443061841"). Issued by: Direction Générale des Finances Publiques (DGFiP). Required for EU cross-border transactions.'
example: FR27443061841
rna:
type: string
description: 'RNA - Répertoire National des Associations. Format: W + 9 digits (e.g., "W751234567"). Identifies associations registered in mainland France. Issued by: Préfecture.'
example: W751234567
rnaAlsaceMoselle:
type: string
description: 'RNA Alsace-Moselle - Special identifier for associations in the Alsace-Moselle region. Format: Letter + year + code + number (e.g., "A2002THI000075"). These associations are registered under local law (droit local).'
example: A2002THI000075
description: Identifiers for French companies (FR)
securitySchemes:
x-api-key:
type: apiKey
in: header
name: x-api-key