WebmeticDocs

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:

FeldKommt beiBedeutung
errorsVALIDATION_ERRORListe 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
featurePLAN_REQUIRED, FEATURE_DISABLEDDie Funktion, die Ihr Plan nicht enthält oder die abgeschaltet ist
required_tierPLAN_REQUIREDDer Plan, den die Funktion braucht
current_tierPLAN_REQUIREDIhr aktueller Plan
requiredINSUFFICIENT_CREDITSWie viele Credits die Aktion braucht
availableINSUFFICIENT_CREDITSWie viele Credits Ihr Konto hat
websiteWEBSITE_NOT_AUTHORIZED, SEGMENT_WEBSITEDie Website, um die es geht
limitWEBHOOK_LIMIT_REACHEDDie 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.

StatusCodeBedeutungWas Sie tun
403API_KEY_MISSINGDie Anfrage hat keinen Header AuthorizationSchicken Sie den Schlüssel im Header Authorization
403API_KEY_INVALIDDer Schlüssel hat nicht das richtige Format, zum Beispiel mit Bearer davorSchicken Sie den Schlüssel unverändert, ohne Bearer, Leerzeichen oder Anführungszeichen
403API_KEY_NOT_FOUNDKein Konto hat diesen Schlüssel, zum Beispiel nach dem Neuerzeugen oder beim Enrichment-SchlüsselKopieren Sie den aktuellen Schlüssel unter Menü > Integrationen > API
404NOT_FOUNDDen Pfad gibt es nichtPrüfen Sie die Adresse in der Referenz
405METHOD_NOT_ALLOWEDDer Pfad kennt diese Methode nicht, zum Beispiel POST statt GETNutzen Sie die Methode aus der Referenz
422VALIDATION_ERROREin Parameter oder Feld fehlt oder ist ungültig, zum Beispiel page kleiner als 1 oder page_size größer als 10.000Korrigieren Sie die Stellen aus errors. Mehr dazu unter Paginierung
500INTERNAL_ERROREin Fehler bei Webmetic, ohne Details in der AntwortVersuchen 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.

StatusCodeBedeutungWas Sie tun
400INVALID_DATEDie API kann from_date oder to_date nicht lesen, zum Beispiel -3 weeks oder 31.02.2026Nutzen Sie zum Beispiel 2026-10-01 oder -7 days. Mehr dazu unter Zeiträume und Zeitzonen
403API_KEY_NOT_AUTHORIZEDDie domain gehört nicht zu Ihrem Konto oder ist anders geschriebenGeben Sie die Domain genau so an, wie sie unter Menü > Websites steht
429RATE_LIMITEDMehr als eine Anfrage pro Sekunde an denselben EndpunktWarten 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.

StatusCodeBedeutungWas Sie tun
400INVALID_DOMAINAus der Eingabe in GET /enrichment/company lässt sich keine Domain lesenGeben Sie eine Domain wie ihre-website.de an
403ENRICHMENT_KEY_MISSINGDie Anfrage hat keinen Header AuthorizationSchicken Sie den Enrichment-Schlüssel im Header Authorization
403ENRICHMENT_KEY_INVALIDDer Schlüssel hat nicht das richtige FormatSchicken Sie den Schlüssel unverändert, ohne Bearer
403ENRICHMENT_KEY_NOT_FOUNDKein Konto hat diesen Enrichment-Schlüssel, zum Beispiel beim Schlüssel für Visitor IntelligenceKopieren Sie den aktuellen Schlüssel Enrichment unter Menü > Integrationen > API
403PLAN_REQUIREDNeue Listen, neue Domains und Einzelabfragen brauchen den Plan Growth. Lesen und Exportieren bleibt möglich, außer bei ACCOUNT_NOT_ELIGIBLEWechseln Sie in den Plan aus required_tier, siehe Pläne
403ACCOUNT_NOT_ELIGIBLEIhr Konto kann Enrichment derzeit nicht nutzen, zum Beispiel nach einer KündigungSchreiben Sie dem Support. Ein neuer Versuch ändert nichts
404LIST_NOT_FOUNDDie Liste gibt es nicht oder sie gehört zu einem anderen KontoNutzen Sie die ID einer Liste aus GET /enrichment/lists
422VALIDATION_ERRORZum Beispiel domain unter 3 Zeichen, mehr als 5.000 Domains je Aufruf oder ein unbekannter Wert in statusKorrigieren 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.

StatusCodeBedeutungWas Sie tun
402INSUFFICIENT_CREDITSIhre Credits reichen nicht. Webmetic bucht nichts ab und schaltet nichts freiKaufen Sie im Dashboard Credits nach und wiederholen Sie den Aufruf
403CONTACTS_SETUP_REQUIREDIhr Konto hat die Ansprechpartner noch nicht eingerichtet. Das betrifft search, reveal und findRichten Sie die Ansprechpartner einmal ein, siehe Ansprechpartner einrichten
403COMPANY_NOT_IDENTIFIEDDie company_id gehört zu keinem Unternehmen, das Ihre Websites besucht hatNutzen Sie eine company_id aus /company-sessions oder /company
403PLAN_REQUIREDDas Unternehmen ist im Free-Plan verborgenWählen Sie ein Unternehmen, das Sie sehen, oder wechseln Sie den Plan
403FEATURE_DISABLEDIhr Partner hat für Ihr Konto die Funktion Datenprofile abgeschaltetBitten Sie Ihren Partner, die Funktion freizugeben, siehe Funktionen für Kunden festlegen
404COMPANY_WITHOUT_WEBSITEZu diesem Unternehmen ist keine Website hinterlegtFür dieses Unternehmen liefert die API keine Ansprechpartner
404CONTACT_NOT_FOUNDDie Ansprechperson stammt nicht aus Ihrer Suche, ist nicht mehr auffindbar oder darf nicht geliefert werdenSuchen Sie erneut und nutzen Sie das neue Ergebnis
409CONCURRENT_UPDATEDieselbe Freischaltung läuft schon, oder eine andere Abbuchung lief im selben MomentWiederholen Sie den Aufruf nach kurzer Zeit. Webmetic bucht nie doppelt ab
502PROVIDER_UNAVAILABLEDie Datenquelle ist vorübergehend nicht erreichbarVersuchen Sie es nach einigen Minuten erneut
502PROVIDER_ERRORDer Abruf bei der Datenquelle ist fehlgeschlagenVersuchen 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.

StatusCodeBedeutungWas Sie tun
400INVALID_URLDie URL ist leer, länger als 2.048 Zeichen, nicht https, enthält Zugangsdaten oder hat keinen gültigen Host oder PortNutzen Sie eine öffentliche https-URL ohne Zugangsdaten
400PRIVATE_ADDRESSDer Host zeigt auf eine private oder reservierte AdresseNutzen Sie einen Server, der aus dem Internet erreichbar ist
400UNRESOLVABLE_HOSTDer Host lässt sich nicht auflösenPrüfen Sie den Hostnamen und seinen DNS-Eintrag
400SEGMENT_REQUIREDDas Ereignis segment.entered braucht eine segment_idGeben Sie die segment_id mit
400SEGMENT_WEBSITEDas Segment gehört zu einer Website, die der Webhook nicht abdecktNehmen Sie die Website in websites auf
400NO_WEBSITEIhr Konto hat noch keine WebsiteLegen Sie zuerst eine Website an
400UNKNOWN_EVENTGET /webhooks/sample kennt das Ereignis nichtNutzen Sie einen Ereignisnamen aus der Referenz
403WEBSITE_NOT_AUTHORIZEDEine Website in websites oder website gehört nicht zu Ihrem KontoGeben Sie die Website so an, wie sie in Ihrem Konto steht
404WEBHOOK_NOT_FOUNDDen Webhook gibt es nicht oder er gehört zu einem anderen KontoNutzen Sie die ID eines Webhooks aus GET /webhooks
404SEGMENT_NOT_FOUNDDas Segment gibt es nichtPrüfen Sie die segment_id
409WEBHOOK_LIMIT_REACHEDIhr Konto hat schon die höchste Zahl an Webhooks. limit nennt sieLö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.

Nächste Schritte

Auf dieser Seite