AdressMonster
StartseiteAlle BranchenData-ShopFAQ

Warenkorb

Kein Artikel im Warenkorb

Nur mit Reseller-Lizenzvertrag

API-Dokumentation

Die Reseller-API liefert Trefferzahlen, Preise und deutsche Firmenadressen direkt in Ihr System. 7 Endpunkte über HTTPS, Antworten als JSON, Authentifizierung per Bearer-Token. Version 1.0.0.

Zugang und Authentifizierung

Die Schnittstelle steht ausschließlich Reseller-Vertragspartnern offen. Die Standardlizenz des Shops gestattet ausschließlich die eigene Nutzung; Weitergabe oder Weiterverkauf ist nur mit gesondertem Reseller-Lizenzvertrag zulässig.

Jeder Aufruf trägt den Schlüssel im Header:

curl -H "Authorization: Bearer am_live_..." \
  "https://api.adressmonster.de/v1/count?suchart=gesamt&branchenIds=92"

Ein Schlüssel beginnt mit am_live_ oder — für die Sandbox — mit am_test_. Er wird bei der Erzeugung genau einmal angezeigt und nirgends gespeichert; geht er verloren, hilft nur eine Rotation.

Der wirksame Zugriff ist die Schnittmenge aus den Rechten des Schlüssels und denen des Vertrags. Mögliche Scopes: count:read · records:read · bulk:write · bulk:read · suppressions:read · webhooks:manage · usage:read. Welche für Sie gelten, steht in GET /me.

Endpunkte

PfadZweckScopeAbrechnung
/meVertrag, Limits und Kriterienpolitikusage:readkostenlos
/branchenBranchen und Kategoriencount:readkostenlos
/regionsBundesländer und Suchartencount:readkostenlos
/countTrefferzahl, Feldabdeckung, indikativer Preiscount:readkostenlos
/recordsDatensätze abrufenrecords:readkostenpflichtig
/suppressionsgesperrte und gelöschte Datensätzesuppressions:readkostenlos
/openapi.jsondiese Schnittstelle als OpenAPI 3.1öffentlich

Basis-URL: https://api.adressmonster.de/v1. Bulk-Exporte, Verbrauchsabruf und Webhooks folgen in späteren Ausbaustufen und stehen bewusst noch nicht in der OpenAPI-Spezifikation — ein generierter Client soll keine Methoden enthalten, die es nicht gibt.

Der übliche Ablauf

1. Zählen. GET /count liefert Trefferzahl, Feldabdeckung und einen indikativen Preis. Kostenlos und für den hohen Takt einer Suchmaske ausgelegt — Ergebnisse werden zwischengespeichert.

2. Abrufen. GET /records liefert die Datensätze seitenweise. Der erste Aufruf friert die Treffermenge ein; solange Sie den zurückgegebenen nextCursor verwenden, bleibt sie stabil, auch wenn zwischenzeitlich Daten importiert werden.

3. Bereinigen. GET /suppressions nennt Datensätze, die gesperrt oder gelöscht wurden. Regelmäßig abzurufen — dazu verpflichtet der Lizenzvertrag.

Der queryHash ist in Zählung und Abruf identisch. Damit lässt sich belegen, dass beide dieselbe Filtermenge betreffen — nützlich, wenn ein Endkunde eine Rechnung in Frage stellt.

Filter und Kriterien

Die geografische Eingrenzung geschieht über suchart:

  • gesamtBundesweit, ohne geografische Einschraenkung.
  • bundeslandEin oder mehrere Bundeslaender, kommagetrennt. Parameter: bundeslaender
  • umkreisRadius um eine Postleitzahl, 1 bis 500 Kilometer. Parameter: plzumkreis
  • plzBereichPostleitzahlbereiche als VON-BIS-Paare ('76000-76999'), maximal 25 Bereiche. Praefixe wie '76' sind eine Bequemlichkeit der Shop-Oberflaeche und werden hier nicht aufgeloest. Parameter: plzRanges

branchenIds ist Pflicht. Ohne Branchenauswahl lässt sich die Treffermenge nicht vorab abschätzen; eine solche Abfrage würde über den gesamten Bestand laufen und wird deshalb nicht ausgeführt.

Welche Datenarten Sie liefern lassen dürfen, legt Ihr Vertrag fest. Die sieben Kriterien sind: basis · strasse · telefon · email · homepage · ansprechpartner · groesse.

felder=telefon,email lässt die Spalten liefern. hatTelefon=true filtert zusätzlich auf Datensätze, bei denen das Feld gefüllt ist — das verkleinert die Treffermenge und ändert den Preis. Ein Kriterium, das Ihr Vertrag nicht freigibt, führt zu einem Fehler und wird nicht stillschweigend verworfen: Ein Filter ohne Wirkung wäre in Ihrer Oberfläche nicht erklärbar.

Manche Kriterien sind erzwungen. Sie wirken immer, auch wenn Sie sie nicht anfragen, und erscheinen in GET /me mit mode: "forced".

Wasserzeichen in jeder ausgelieferten ID

Jeder über diese Schnittstelle ausgelieferte Datensatz trägt eine lieferungsspezifische ID. Das Suffix ist immer exakt 13 Zeichen lang: die Kennung 99999 und eine auf 8 Stellen aufgefüllte Liefernummer.

"id":     "AM87339999900004387"
"baseId": "AM8733"

Basis-ID = id.slice(0, -13)

Speichern Sie die baseId mit. Der Löschkanal nennt Basis-IDs; ohne sie finden Sie Ihre eigenen Datensätze dort nicht wieder, und ein Löschverlangen liefe ins Leere. Der Lizenzvertrag verpflichtet dazu, die Basis-ID mitzuführen und das Wasserzeichen weder zu entfernen noch zu verändern.

Löschkanal — Ihre Pflicht

GET /suppressions nennt alle Datensätze, die seit Ihrem letzten Abruf gesperrt, deaktiviert oder gelöscht wurden. Sie dürfen nicht mehr genutzt und müssen in Ihren Systemen entfernt werden.

Rufen Sie inkrementell ab: pagination.nextSince der letzten Antwort als since mitgeben. Ohne since beginnt der Feed bei Ihrem Vertragsbeginn — Ihr Erstbestand ist per Definition sauber, weil gesperrte Datensätze nie ausgeliefert werden.

Jede Antwort trägt matchRule: "strip-last-13" — die Regel, mit der sich eine von Ihnen gespeicherte, gewasserzeichnete ID auf die hier genannte Basis-ID zurückführen lässt.

Der Endpunkt ist kostenlos und bleibt auch dann erreichbar, wenn ein Vertrag wegen offener Rechnungen gesperrt ist. Eine Zahlungssperre darf nicht die Betroffenen treffen.

Fehlerbehandlung

Jede Fehlerantwort hat dieselbe Form. Werten Sie den code aus, nicht den Freitext — der code ist Teil des Vertrags und wird nicht umbenannt, die message kann sich ändern.

{ "error": {
    "code": "criterion_not_permitted",
    "message": "…",
    "requestId": "3f2504e0-4f89-11d3-9a0c-0305e82c3301"
} }

Die requestId steht auch im Header X-Request-Id. Nennen Sie sie in jeder Supportanfrage — damit lässt sich der Vorgang eindeutig finden.

HTTPcodeBedeutung
400criterion_not_permittedEin angefragtes Kriterium ist fuer diesen Vertrag nicht verfuegbar.
400invalid_parameterEin Parameter fehlt oder ist ungueltig.
401invalid_keyAPI-Key unbekannt oder falsch.
401key_expiredDer API-Key ist abgelaufen.
401key_revokedDer API-Key wurde widerrufen.
401malformed_keyDas Format des API-Keys ist ungueltig.
401missing_authorizationAuthorization-Header fehlt. Erwartet: 'Authorization: Bearer am_live_...'
403contract_inactiveDer Vertrag ist nicht (mehr) aktiv.
403full_database_deniedAbfragen ohne Branchen- und Geo-Einschraenkung sind fuer diesen Vertrag nicht freigegeben.
403insufficient_scopeDer Key besitzt den fuer diesen Endpunkt noetigen Scope nicht.
403ip_not_allowedAufruf von dieser IP-Adresse ist fuer diesen Key nicht freigegeben.
403reseller_suspendedDas Reseller-Konto ist gesperrt.
404not_foundNicht gefunden.
409idempotency_in_flightEine Anfrage mit diesem Idempotency-Key wird gerade bearbeitet.
409idempotency_key_reuseDer Idempotency-Key wurde bereits fuer eine andere Anfrage verwendet.
413result_too_largeDie Treffermenge ueberschreitet das Limit fuer synchrone Abfragen. Bitte Bulk-Export verwenden.
422selection_too_broadDie Auswahl ist zu breit. Bitte weiter eingrenzen.
429quota_exceededDas vertraglich vereinbarte Kontingent ist aufgebraucht.
429rate_limitedZu viele Anfragen.
500internal_errorInterner Fehler.
503service_unavailableDienst voruebergehend nicht verfuegbar.

Grenzen und Kontingente

Die konkreten Werte stehen in GET /me unter limits und sind vertraglich vereinbart. Die Mechanik ist immer dieselbe:

  • Anfragen je Minute — getrennt für Zählung und Auslieferung. Überschreitung ergibt rate_limited mit Retry-After.
  • Zu breite Auswahl — vor der teuren Abfrage abgefangen, selection_too_broad. Grenzen Sie die Branchenauswahl ein.
  • Ergebnis zu groß — über maxRecordsPerSyncQuery antwortet /records mit result_too_large. Solche Mengen gehören in einen Bulk-Export.
  • Datensätze je Tag und Monatquota_exceeded. Eine Seite kann auf den verbleibenden Rest gekürzt werden; prüfen Sie pagination.returned, nicht Ihr angefragtes limit.

Eine Seite ist auch dann kürzer als angefragt, wenn ein Datensatz seit dem Einfrieren der Treffermenge gesperrt wurde. Abgerechnet wird immer nur, was tatsächlich geliefert wurde.

Sandbox

Ein Schlüssel mit dem Präfix am_test_ arbeitet gegen einen kleinen, breit gestreuten Ausschnitt echter Firmen. Zählung, Preise, Blättern, Wasserzeichen und Fehlerverhalten sind identisch zur Produktion — nur die Datenmenge ist klein.

Bewusst echte Datensätze statt erfundener: Umlaute, fehlende Hausnummern, null in optionalen Feldern und Ortsnamen wie Schwedt/Oder sind genau die Dinge, an denen eine Anbindung scheitert. Wer dagegen entwickelt, ist beim Umstieg auf am_live_ fertig.

Sandbox-Abrufe werden protokolliert, aber nicht abgerechnet und nicht auf Kontingente angerechnet.

Häufige Fragen

Wie bekomme ich Zugang zur API?

Die Schnittstelle steht ausschließlich Reseller-Vertragspartnern offen. Die Standardlizenz des Shops gestattet nur die eigene Nutzung; Weitergabe oder Weiterverkauf ist ohne gesonderten Reseller-Lizenzvertrag nicht zulässig. Wenden Sie sich an support@adressmonster.de.

Warum ist branchenIds ein Pflichtparameter?

Ohne Branchenauswahl lässt sich die Treffermenge nicht vorab abschätzen. Eine solche Abfrage würde über den gesamten Bestand laufen und die Datenbank für Sekunden belasten, die auch den Shop bedient. Deshalb wird sie nicht ausgeführt, sondern mit invalid_parameter abgewiesen.

Was bedeutet das Suffix in den ausgelieferten IDs?

Jede über die API ausgelieferte Datensatz-ID trägt ein Wasserzeichen von exakt 13 Zeichen, das die Lieferung eindeutig kennzeichnet. Die unveränderte Basis-ID steht zusätzlich als baseId in jeder Zeile. Der Lizenzvertrag verpflichtet dazu, die Basis-ID mitzuführen und das Wasserzeichen weder zu entfernen noch zu verändern.

Ist der bei /count genannte Preis verbindlich?

Nein. Er kann auf einer zwischengespeicherten Trefferzahl beruhen und ist deshalb mit indicative: true gekennzeichnet. Verbindlich abgerechnet wird immer die tatsächlich gelieferte Menge bei /records, dort steht indicative: false.

Wie oft muss ich /suppressions abrufen?

Regelmäßig, mindestens wöchentlich — der Lizenzvertrag legt die Frist fest. Der Endpunkt nennt Datensätze, die gesperrt, deaktiviert oder gelöscht wurden und nicht mehr genutzt werden dürfen. Er ist kostenlos und bleibt auch bei offenen Rechnungen erreichbar.

Was passiert, wenn die Verbindung während eines Abrufs abbricht?

Wiederholen Sie dieselbe Anfrage mit demselben Idempotency-Key. Sie erhalten die identische Antwort samt Liefernummer, ohne dass ein zweites Mal abgerechnet wird. Ohne diesen Header entsteht eine zweite, kostenpflichtige Lieferung.

Zugang anfragen

Die API setzt einen Reseller-Lizenzvertrag voraus. Schreiben Sie uns, wofür Sie die Daten einsetzen möchten — wir melden uns mit einem Vorschlag für Kriterien, Preisen und Kontingenten.

Kontakt aufnehmen