Treffer Logo treffer Docs

Companies

Company profile

Enrichment data for a German company, by domain or name.

POST 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.

Privacy Policy Terms of Service Imprint