Companies
Company profile
Enrichment data for a German company, by domain or name.
https://api.treffer.io/v1/companies/profile
Cost
2 credits per hit
On a miss
0 credits
Rate limit
60 per minute
We draw on public commercial registries, company website data, and other public sources. Registries supply the legal identity: name, legal form, address, and the register entry with status, incorporation date, purpose, capital and representatives. The website supplies the domain and the contact data.
Request
Send name, domain, or both.
Providing the domain will lead to more reliable and accurate
results.
| Field | Type | Required | Description |
|---|---|---|---|
name
|
string | Conditional | Company name to look up. Required when domain is not supplied. |
domain
|
string | Conditional | Company website domain, e.g. treffer.io. Required when name is not supplied. |
country
|
string | Optional | Defaults to DE, currently the only country this endpoint covers. |
Why the domain is preferred: it matches exactly one company. In Germany it is common for several companies to share the same or a very similar name, so a name alone can return the wrong one. We use AI to reject matches that are unlikely to be what you want, but a domain improves the reliability of the results.
Example request
curl -X POST 'https://api.treffer.io/v1/companies/profile' \
-H 'X-API-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"domain": "traderepublic.com"
}'
import requests
response = requests.post(
"https://api.treffer.io/v1/companies/profile",
headers={"X-API-Key": "YOUR_API_KEY"},
json={
"domain": "traderepublic.com",
},
timeout=120,
)
print(response.json())
Response
| Field | Type | Description |
|---|---|---|
found
|
boolean | Whether we found a matching company. |
credits_consumed
|
integer | Credits charged for this call. 0 on a miss. |
message
|
string | Human readable summary of the result. The wording can change, so do not parse or depend on it. |
legal_name
|
string | Registered company name, verbatim. |
legal_form
|
string | Normalized legal form, e.g. GmbH. Taken from the register entry or the company website. |
domain
|
string | Company website domain we matched. |
register
|
object | Data from the official register entry. All fields null for companies that are not registered. |
country
|
string | Country of the register, as ISO 3166-1 alpha-2. |
type
|
string | Register type, e.g. HRB. |
number
|
string | Register number, e.g. HRB 244347 B. |
authority
|
string | Court or office keeping the entry, e.g. Amtsgericht Charlottenburg. |
status
|
string | Register status, e.g. "active", "deleted", "liquidation", "insolvent" or "merged". |
incorporated_at
|
date | Date of the first register entry. Partnerships and registered sole traders can predate it. |
purpose
|
string | Registered business purpose, verbatim and therefore in German. |
capital
|
object | Registered capital. |
amount
|
number | Nominal capital as registered (Stammkapital, Grundkapital). Not cash on hand. |
currency
|
string | ISO 4217 code, e.g. EUR. |
representatives
|
object[] | People registered to act for the company, e.g. Geschäftsführer, Vorstand, Prokurist. The legal representation, not the organization chart. |
name
|
string | Full name of the person. |
role
|
string | Registered role, e.g. Geschäftsführer. |
address
|
object | Registered seat, or the address we found. |
street
|
string | Street and house number. |
postal_code
|
string | Postal code. |
city
|
string | City. |
country
|
string | Country, as ISO 3166-1 alpha-2, e.g. DE. |
imprint
|
object | General company contact data. |
email
|
string | Contact email. |
phone
|
string | Contact phone. |
url
|
string | Page we read it from. |
Every field is always in the response, hit or miss
A value we do not have is null, a list with no items is empty, and nested groups are always there with all their fields. You can map any path without checking whether a key exists.
Example response
{
"found": true,
"credits_consumed": 2,
"message": "Found Trade Republic Bank GmbH.",
"legal_name": "Trade Republic Bank GmbH",
"legal_form": "GmbH",
"domain": "traderepublic.com",
"register": {
"country": "DE",
"type": "HRB",
"number": "HRB 244347 B",
"authority": "Amtsgericht Charlottenburg",
"status": "active",
"incorporated_at": "2016-08-03",
"purpose": "Das Betreiben von Bankgeschäften gemäß\n(a) § 1 Abs. 1 Satz 2 Nr. 1 Kreditwesengesetz (KWG) (Einlagengeschäft),\n(b) § 1 Abs. 1 Satz 2 Nr. 2 KWG (Kreditgeschäft),\n(c) § 1 Abs. 1 Satz 2 Nr. 4 KWG (Finanzkommissionsgeschäft),\n(d) § 1 Abs. 1 Satz 2 Nr. 5 KWG (Depotgeschäft),\n(e) § 1 Abs. 1 Satz 2 Nr. 10 KWG (Emissionsgeschäft)\nund die Erbringung von Finanzdienstleistungen gemäß\n(a) § 1 Abs. 1a Satz 2 Nr. 1 KWG (Anlagevermittlung),\n(b) § 1 Abs. 1a Satz 2 Nr. 1a KVVG (Anlageberatung),\n(c) § 1 Abs. 1a Satz 2 Nr. 1c KWG (Platzierungsgeschäft)\n(d) § 1 Abs. 1a Satz 2 Nr. 2 KWG (Abschlussvermittlung),\n(e) § 1 Abs. 1a Satz 2 Nr. 3 KWG (Finanzportfolioverwaltung),\n(f) § 1 Abs. 1a Satz 2 Nr. 4a KWG (Market-Making),\n(g) § 1 Abs. 1a Satz 2 Nr. 4b KWG (systematische Internalisierung),\n(h) § 1 Abs. 1a Satz 2 Nr. 4c KWG (Eigenhandel),\n(i) § 1 Abs. 1a Satz 3 KWG (Eigengeschäft).\nDes Weiteren erbringt die Gesellschaft Zahlungsdienste im Sinne des Zahlungsdiensteaufsichtsgesetzes.",
"capital": {
"amount": 101677200.0,
"currency": "EUR"
},
"representatives": [
{
"name": "Gernot Mittendorfer",
"role": "Geschäftsführer"
},
{
"name": "Andreas Michael Torner",
"role": "Geschäftsführer"
},
{
"name": "Christian Hecker",
"role": "Geschäftsführer"
},
{
"name": "Thomas Pischke",
"role": "Geschäftsführer"
}
]
},
"address": {
"street": "Brunnenstraße 19-21",
"postal_code": "10119",
"city": "Berlin",
"country": "DE"
},
"imprint": {
"email": "[email protected]",
"phone": null,
"url": "https://traderepublic.com/de-de/imprint"
}
}
{
"found": false,
"credits_consumed": 0,
"message": "No matching company found.",
"legal_name": null,
"legal_form": null,
"domain": null,
"register": {
"country": null,
"type": null,
"number": null,
"authority": null,
"status": null,
"incorporated_at": null,
"purpose": null,
"capital": {
"amount": null,
"currency": null
},
"representatives": []
},
"address": {
"street": null,
"postal_code": null,
"city": null,
"country": null
},
"imprint": {
"email": null,
"phone": null,
"url": null
}
}
What to expect
Some hits have no register entry
Sole traders and small partnerships are not in the registries. For those, every field in
register is null and the answer is built from other
public sources alone. found is still true and the call is
still charged.
Imprint data
General company contact data, usually not the best way to reach a specific person. Not every company publishes it, so these fields can be null on a hit.
Lookups run against live sources and can sometimes be slow
Many answers arrive in under a second. Data is gathered from public sources, which can
sometimes lead to considerably slower responses, especially for large corporate groups. After 90 seconds we return
503 rather than hold the connection open. Set your client
timeout above that, like
120 seconds, so you receive the
503 instead of timing out first. It usually means a
public source was down, so retrying is worth it.
Coverage
Germany only for now. country is optional and resolves to
DE anyway, so you do not need to send it. It is there in case
we add more countries later, like Austria and Switzerland.
Errors
Failures use the shared error shape. See Errors for every code.