Warenkorb
Kein Artikel im Warenkorb
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.
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.
| Pfad | Zweck | Scope | Abrechnung |
|---|---|---|---|
| /me | Vertrag, Limits und Kriterienpolitik | usage:read | kostenlos |
| /branchen | Branchen und Kategorien | count:read | kostenlos |
| /regions | Bundesländer und Sucharten | count:read | kostenlos |
| /count | Trefferzahl, Feldabdeckung, indikativer Preis | count:read | kostenlos |
| /records | Datensätze abrufen | records:read | kostenpflichtig |
| /suppressions | gesperrte und gelöschte Datensätze | suppressions:read | kostenlos |
| /openapi.json | diese 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.
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.
Die geografische Eingrenzung geschieht über suchart:
gesamt — Bundesweit, ohne geografische Einschraenkung.bundesland — Ein oder mehrere Bundeslaender, kommagetrennt. Parameter: bundeslaenderumkreis — Radius um eine Postleitzahl, 1 bis 500 Kilometer. Parameter: plzumkreisplzBereich — Postleitzahlbereiche als VON-BIS-Paare ('76000-76999'), maximal 25 Bereiche. Praefixe wie '76' sind eine Bequemlichkeit der Shop-Oberflaeche und werden hier nicht aufgeloest. Parameter: plzRangesbranchenIds 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".
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.
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.
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.
| HTTP | code | Bedeutung |
|---|---|---|
| 400 | criterion_not_permitted | Ein angefragtes Kriterium ist fuer diesen Vertrag nicht verfuegbar. |
| 400 | invalid_parameter | Ein Parameter fehlt oder ist ungueltig. |
| 401 | invalid_key | API-Key unbekannt oder falsch. |
| 401 | key_expired | Der API-Key ist abgelaufen. |
| 401 | key_revoked | Der API-Key wurde widerrufen. |
| 401 | malformed_key | Das Format des API-Keys ist ungueltig. |
| 401 | missing_authorization | Authorization-Header fehlt. Erwartet: 'Authorization: Bearer am_live_...' |
| 403 | contract_inactive | Der Vertrag ist nicht (mehr) aktiv. |
| 403 | full_database_denied | Abfragen ohne Branchen- und Geo-Einschraenkung sind fuer diesen Vertrag nicht freigegeben. |
| 403 | insufficient_scope | Der Key besitzt den fuer diesen Endpunkt noetigen Scope nicht. |
| 403 | ip_not_allowed | Aufruf von dieser IP-Adresse ist fuer diesen Key nicht freigegeben. |
| 403 | reseller_suspended | Das Reseller-Konto ist gesperrt. |
| 404 | not_found | Nicht gefunden. |
| 409 | idempotency_in_flight | Eine Anfrage mit diesem Idempotency-Key wird gerade bearbeitet. |
| 409 | idempotency_key_reuse | Der Idempotency-Key wurde bereits fuer eine andere Anfrage verwendet. |
| 413 | result_too_large | Die Treffermenge ueberschreitet das Limit fuer synchrone Abfragen. Bitte Bulk-Export verwenden. |
| 422 | selection_too_broad | Die Auswahl ist zu breit. Bitte weiter eingrenzen. |
| 429 | quota_exceeded | Das vertraglich vereinbarte Kontingent ist aufgebraucht. |
| 429 | rate_limited | Zu viele Anfragen. |
| 500 | internal_error | Interner Fehler. |
| 503 | service_unavailable | Dienst voruebergehend nicht verfuegbar. |
Die konkreten Werte stehen in GET /me unter limits und sind vertraglich vereinbart. Die Mechanik ist immer dieselbe:
rate_limited mit Retry-After.selection_too_broad. Grenzen Sie die Branchenauswahl ein.maxRecordsPerSyncQuery antwortet /records mit result_too_large. Solche Mengen gehören in einen Bulk-Export.quota_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.
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.
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.
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.
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.
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.
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.
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.
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