Fehler
Die Webmetic-API gibt diese Statuscodes und Fehlercodes zurück, und so reagiert Ihr Code darauf.
Die API meldet jeden Fehler als JSON mit Statuscode, festem Fehlercode und einem lesbaren Text.
Aufbau einer Fehlerantwort
Alle öffentlichen Endpunkte antworten bei einem Fehler im selben Format. Ein Beispiel ist eine Anfrage ohne API-Schlüssel:
curl "https://hub.webmetic.de/company-sessions?domain=ihre-website.de"Die API antwortet mit Status 403:
{
"detail": {
"error": "API_KEY_MISSING",
"message": "Send your API key in the Authorization header."
}
}detail.error: der Fehlercode in Großbuchstaben. Werten Sie in Ihrem Code dieses Feld aus.detail.message: ein englischer Text zum Lesen, zum Beispiel für Ihr Log. Prüfen Sie diesen Text nicht im Code, denn er kann sich ändern.
Dieses Format gilt nicht für den Data Layer, der mit einem kürzeren Body antwortet.
Manche Fehler enthalten in detail weitere Felder:
| Feld | Kommt bei | Bedeutung |
|---|---|---|
errors | VALIDATION_ERROR | Liste der fehlenden oder ungültigen Parameter und Felder. Jeder Eintrag nennt in loc die Stelle, in msg das Problem und in type die Art des Fehlers |
feature | PLAN_REQUIRED, FEATURE_DISABLED | Die Funktion, die Ihr Plan nicht enthält oder die abgeschaltet ist |
required_tier | PLAN_REQUIRED | Der Plan, den die Funktion braucht |
current_tier | PLAN_REQUIRED | Ihr aktueller Plan |
required | INSUFFICIENT_CREDITS | Wie viele Credits die Aktion braucht |
available | INSUFFICIENT_CREDITS | Wie viele Credits Ihr Konto hat |
website | WEBSITE_NOT_AUTHORIZED, SEGMENT_WEBSITE | Die Website, um die es geht |
limit | WEBHOOK_LIMIT_REACHED | Die höchste Zahl an Webhooks für Ihr Konto |
Die API meldet Probleme mit dem Schlüssel immer mit 403, nie mit 401. Bei RATE_LIMITED, CONCURRENT_UPDATE, PROVIDER_UNAVAILABLE, PROVIDER_ERROR und INTERNAL_ERROR kann ein neuer Versuch funktionieren, weil der Fehler vorübergehend ist. Bei allen anderen Fehlern ändern Sie erst die Anfrage, das Konto oder den Plan.
Dieses Format gilt für die Endpunkte der API. Bei einem vertippten Pfad außerhalb davon antwortet die API mit {"detail": "Not Found"}. Prüfen Sie deshalb im Code, ob detail ein Objekt ist.
Gemeinsame Fehler
Jeder Endpunkt kann diese Fehler zurückgeben. Die Schlüssel-Codes gelten für den Schlüssel Visitor Intelligence, den Sie auch für /contacts/* und /webhooks nutzen. Enrichment hat eigene Codes.
| Status | Code | Bedeutung | Was Sie tun |
|---|---|---|---|
| 403 | API_KEY_MISSING | Die Anfrage hat keinen Header Authorization | Schicken Sie den Schlüssel im Header Authorization |
| 403 | API_KEY_INVALID | Der Schlüssel hat nicht das richtige Format, zum Beispiel mit Bearer davor | Schicken Sie den Schlüssel unverändert, ohne Bearer, Leerzeichen oder Anführungszeichen |
| 403 | API_KEY_NOT_FOUND | Kein Konto hat diesen Schlüssel, zum Beispiel nach dem Neuerzeugen oder beim Enrichment-Schlüssel | Kopieren Sie den aktuellen Schlüssel unter Menü > Integrationen > API |
| 404 | NOT_FOUND | Den Pfad gibt es nicht | Prüfen Sie die Adresse in der Referenz |
| 405 | METHOD_NOT_ALLOWED | Der Pfad kennt diese Methode nicht, zum Beispiel POST statt GET | Nutzen Sie die Methode aus der Referenz |
| 422 | VALIDATION_ERROR | Ein Parameter oder Feld fehlt oder ist ungültig, zum Beispiel page kleiner als 1 oder page_size größer als 10.000 | Korrigieren Sie die Stellen aus errors. Mehr dazu unter Paginierung |
| 500 | INTERNAL_ERROR | Ein Fehler bei Webmetic, ohne Details in der Antwort | Versuchen Sie es später erneut. Bleibt der Fehler, schreiben Sie dem Support |
Visitor Intelligence
Die acht Besuchs-Endpunkte, zum Beispiel /company-sessions und /company, geben zusätzlich diese Fehler zurück.
| Status | Code | Bedeutung | Was Sie tun |
|---|---|---|---|
| 400 | INVALID_DATE | Die API kann from_date oder to_date nicht lesen, zum Beispiel -3 weeks oder 31.02.2026 | Nutzen Sie zum Beispiel 2026-10-01 oder -7 days. Mehr dazu unter Zeiträume und Zeitzonen |
| 403 | API_KEY_NOT_AUTHORIZED | Die domain gehört nicht zu Ihrem Konto oder ist anders geschrieben | Geben Sie die Domain genau so an, wie sie unter Menü > Websites steht |
| 429 | RATE_LIMITED | Mehr als eine Anfrage pro Sekunde an denselben Endpunkt | Warten Sie die Sekunden aus Retry-After ab und senden Sie die Anfrage dann erneut. Mehr dazu unter Anfragelimits |
Im Free-Plan meldet die API für verborgene Unternehmen keinen Fehler, sondern liefert die Zeile mit blurred: true und nur wenigen Feldern. Mehr dazu unter Pläne.
Enrichment
Die Endpunkte unter /enrichment/* nutzen den Schlüssel Enrichment.
| Status | Code | Bedeutung | Was Sie tun |
|---|---|---|---|
| 400 | INVALID_DOMAIN | Aus der Eingabe in GET /enrichment/company lässt sich keine Domain lesen | Geben Sie eine Domain wie ihre-website.de an |
| 403 | ENRICHMENT_KEY_MISSING | Die Anfrage hat keinen Header Authorization | Schicken Sie den Enrichment-Schlüssel im Header Authorization |
| 403 | ENRICHMENT_KEY_INVALID | Der Schlüssel hat nicht das richtige Format | Schicken Sie den Schlüssel unverändert, ohne Bearer |
| 403 | ENRICHMENT_KEY_NOT_FOUND | Kein Konto hat diesen Enrichment-Schlüssel, zum Beispiel beim Schlüssel für Visitor Intelligence | Kopieren Sie den aktuellen Schlüssel Enrichment unter Menü > Integrationen > API |
| 403 | PLAN_REQUIRED | Neue Listen, neue Domains und Einzelabfragen brauchen den Plan Growth. Lesen und Exportieren bleibt möglich, außer bei ACCOUNT_NOT_ELIGIBLE | Wechseln Sie in den Plan aus required_tier, siehe Pläne |
| 403 | ACCOUNT_NOT_ELIGIBLE | Ihr Konto kann Enrichment derzeit nicht nutzen, zum Beispiel nach einer Kündigung | Schreiben Sie dem Support. Ein neuer Versuch ändert nichts |
| 404 | LIST_NOT_FOUND | Die Liste gibt es nicht oder sie gehört zu einem anderen Konto | Nutzen Sie die ID einer Liste aus GET /enrichment/lists |
| 422 | VALIDATION_ERROR | Zum Beispiel domain unter 3 Zeichen, mehr als 5.000 Domains je Aufruf oder ein unbekannter Wert in status | Korrigieren Sie den Parameter. Verteilen Sie viele Domains auf mehrere Aufrufe |
GET /enrichment/company antwortet auch mit 202 und 404, die keine Fehler sind. 202 heißt, dass das Ergebnis noch nicht fertig ist, und 404 mit "status": "not_found" heißt, dass zu dieser Domain keine Unternehmensdaten vorliegen. Mehr dazu unter Asynchrone Ergebnisse.
Ansprechpartner
Die Endpunkte unter /contacts/* nutzen den Schlüssel Visitor Intelligence. Wenn ein Aufruf mit einem Fehler endet, bucht Webmetic keine Credits ab. Mehr dazu unter Credits in der API.
| Status | Code | Bedeutung | Was Sie tun |
|---|---|---|---|
| 402 | INSUFFICIENT_CREDITS | Ihre Credits reichen nicht. Webmetic bucht nichts ab und schaltet nichts frei | Kaufen Sie im Dashboard Credits nach und wiederholen Sie den Aufruf |
| 403 | CONTACTS_SETUP_REQUIRED | Ihr Konto hat die Ansprechpartner noch nicht eingerichtet. Das betrifft search, reveal und find | Richten Sie die Ansprechpartner einmal ein, siehe Ansprechpartner einrichten |
| 403 | COMPANY_NOT_IDENTIFIED | Die company_id gehört zu keinem Unternehmen, das Ihre Websites besucht hat | Nutzen Sie eine company_id aus /company-sessions oder /company |
| 403 | PLAN_REQUIRED | Das Unternehmen ist im Free-Plan verborgen | Wählen Sie ein Unternehmen, das Sie sehen, oder wechseln Sie den Plan |
| 403 | FEATURE_DISABLED | Ihr Partner hat für Ihr Konto die Funktion Datenprofile abgeschaltet | Bitten Sie Ihren Partner, die Funktion freizugeben, siehe Funktionen für Kunden festlegen |
| 404 | COMPANY_WITHOUT_WEBSITE | Zu diesem Unternehmen ist keine Website hinterlegt | Für dieses Unternehmen liefert die API keine Ansprechpartner |
| 404 | CONTACT_NOT_FOUND | Die Ansprechperson stammt nicht aus Ihrer Suche, ist nicht mehr auffindbar oder darf nicht geliefert werden | Suchen Sie erneut und nutzen Sie das neue Ergebnis |
| 409 | CONCURRENT_UPDATE | Dieselbe Freischaltung läuft schon, oder eine andere Abbuchung lief im selben Moment | Wiederholen Sie den Aufruf nach kurzer Zeit. Webmetic bucht nie doppelt ab |
| 502 | PROVIDER_UNAVAILABLE | Die Datenquelle ist vorübergehend nicht erreichbar | Versuchen Sie es nach einigen Minuten erneut |
| 502 | PROVIDER_ERROR | Der Abruf bei der Datenquelle ist fehlgeschlagen | Versuchen Sie es später erneut. Bleibt der Fehler, schreiben Sie dem Support |
Webhooks
Die Endpunkte unter /webhooks nutzen den Schlüssel Visitor Intelligence. Mehr dazu unter Webhooks.
| Status | Code | Bedeutung | Was Sie tun |
|---|---|---|---|
| 400 | INVALID_URL | Die URL ist leer, länger als 2.048 Zeichen, nicht https, enthält Zugangsdaten oder hat keinen gültigen Host oder Port | Nutzen Sie eine öffentliche https-URL ohne Zugangsdaten |
| 400 | PRIVATE_ADDRESS | Der Host zeigt auf eine private oder reservierte Adresse | Nutzen Sie einen Server, der aus dem Internet erreichbar ist |
| 400 | UNRESOLVABLE_HOST | Der Host lässt sich nicht auflösen | Prüfen Sie den Hostnamen und seinen DNS-Eintrag |
| 400 | SEGMENT_REQUIRED | Das Ereignis segment.entered braucht eine segment_id | Geben Sie die segment_id mit |
| 400 | SEGMENT_WEBSITE | Das Segment gehört zu einer Website, die der Webhook nicht abdeckt | Nehmen Sie die Website in websites auf |
| 400 | NO_WEBSITE | Ihr Konto hat noch keine Website | Legen Sie zuerst eine Website an |
| 400 | UNKNOWN_EVENT | GET /webhooks/sample kennt das Ereignis nicht | Nutzen Sie einen Ereignisnamen aus der Referenz |
| 403 | WEBSITE_NOT_AUTHORIZED | Eine Website in websites oder website gehört nicht zu Ihrem Konto | Geben Sie die Website so an, wie sie in Ihrem Konto steht |
| 404 | WEBHOOK_NOT_FOUND | Den Webhook gibt es nicht oder er gehört zu einem anderen Konto | Nutzen Sie die ID eines Webhooks aus GET /webhooks |
| 404 | SEGMENT_NOT_FOUND | Das Segment gibt es nicht | Prüfen Sie die segment_id |
| 409 | WEBHOOK_LIMIT_REACHED | Ihr Konto hat schon die höchste Zahl an Webhooks. limit nennt sie | Löschen Sie Webhooks, die Sie nicht mehr brauchen |
Fehlerbehandlung im Code
Das Beispiel liest bei einem Fehler den Code aus detail.error und verarbeitet auch einen Text in detail. Bei RATE_LIMITED und CONCURRENT_UPDATE wartet es die Sekunden aus Retry-After und versucht es bis zu dreimal. Wenn der Header fehlt, wartet es nur kurz. Bei allen anderen Fehlern meldet es Status, Code und Text.
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
const RETRY = ['RATE_LIMITED', 'CONCURRENT_UPDATE'];
async function callWebmetic(url, attempts = 3) {
for (let i = 1; i <= attempts; i++) {
const res = await fetch(url, {
headers: { Authorization: 'wmtc_IHR_API_SCHLUESSEL' },
});
if (res.ok) return res.json();
const { detail } = await res.json();
// Paths outside the API answer {"detail": "Not Found"}
const known = detail !== null && typeof detail === 'object';
const error = known ? detail.error : `HTTP_${res.status}`;
const message = known ? detail.message : String(detail);
// Temporary errors: wait and try again
if (RETRY.includes(error) && i < attempts) {
const retryAfter = Number(res.headers.get('Retry-After'));
await sleep(retryAfter > 0 ? retryAfter * 1000 : 1000 * i); // Retry-After first, else the backoff
continue;
}
throw new Error(`${res.status} ${error}: ${message}`);
}
}
const data = await callWebmetic(
'https://hub.webmetic.de/company-sessions?domain=ihre-website.de',
);Wenn Ihr Code einen Fehlercode nicht kennt, behandeln Sie ihn wie einen Fehler, den ein neuer Versuch nicht löst.