Dokumente
Strg+K Suchen Alt+[Alt+] Hilfslinien
API-Schlüssel abrufen

Anleitungen

Fehler

Alle API-Key-Endpunkte geben JSON zurück. Bei jeder Antwort, die nicht zum Statuscode 2xx gehört, hat der Antworttext denselben Aufbau:

{
  "success": false,
  "error": "<human-readable message>"
}

Manche Fehler enthalten zusätzlichen Kontext (z. B. Im Abspann (bei einem 429-Quotenfehler). Der HTTP-Statuscode ist die maßgebliche Quelle – je nach Status verzweigen, dann lesen Fehler zur Anzeige oder Protokollierung.


Statuscode

Status Wenn Typisch Fehler Text
200 Erfolg.
401 Nicht autorisiert Es wurde kein Schlüssel angegeben oder der Schlüssel existiert nicht. Unbefugt
403 Zugriff verweigert Der Schlüssel wurde aufgelöst, aber der API-Zugriff ist für das Konto nicht aktiviert. Die Meldung variiert; behandeln Sie sie so, als könne kein erneuter Versuch unternommen werden, bis sich der Zugriff ändert.
404 Nicht gefunden Unbekannter Pfad oder die TikTok-Shop-URL ist für API-Schlüssel nicht freigegeben. Unbekannter TikTok-Shop-Endpunkt
414 URL zu lang Die Abfragezeichenfolge hat das Limit des Webservers überschritten (typischerweise beim Senden umfangreicher Filterlisten als HOLEN). Standard-HTML des Servers – wechseln zu BEITRAG JSON.
429 Zu viele Anfragen Entweder durch die Ratenbegrenzung oder weil das Guthaben aufgebraucht ist (siehe unten). Ratenbegrenzung überschritten. Maximal 60 Anfragen pro Minute. oder Das monatliche Kreditlimit (20000) ist erreicht. Es wird im nächsten Monat zurückgesetzt.
500 Interner Serverfehler Unbehandelte Ausnahme im vorgelagerten Handler. Der Proxy gibt {"success": false, "error": "Internal server error"}. Interner Serverfehler

Die beiden unterscheiden 429 Fälle

A 429 bedeutet immer „vorerst nicht mehr senden“, aber warum ist wichtig.

Ratenbegrenzung (60 pro Minute und Benutzer):

{
  "success": false,
  "error": "Rate limit exceeded. Max 60 requests per minute."
}

Monatliches Guthabenlimit (20.000 pro Monat und Nutzer):

{
  "success": false,
  "error": "Monthly credit limit reached (20000). Resets next month.",
  "credits": { "used": 20000, "limit": 20000, "remaining": 0 }
}

Verzweigung je nach Vorhandensein des Im Abspann Objekt oder bei einer Übereinstimmung mit einer Teilzeichenfolge für „Monatliches Kreditlimit“. Siehe Ratenbegrenzungen und Impressum & Rechnungsstellung für die jeweilige Wiederherstellungsstrategie.


Muster zur Fehlerbehandlung (Node.js)

async function whFetch(path, init = {}) {
  const res = await fetch(`${ORIGIN}${path}`, {
    ...init,
    headers: { 'X-API-Key': process.env.WH_API_KEY, ...(init.headers || {}) },
  });

  let body = null;
  try { body = await res.json(); } catch { /* non-JSON, leave null */ }

  if (res.ok) return body;

  const error = (body && body.error) || res.statusText;

  if (res.status === 401) throw new Error(`Auth failed: ${error}`);
  if (res.status === 403) throw new Error(`Plan required: ${error}`);
  if (res.status === 404) throw new Error(`Unknown endpoint: ${path}`);
  if (res.status === 429) {
    const retryable = body && body.credits ? false : true; // monthly quota is not retryable today
    const err = new Error(error);
    err.retryable = retryable;
    throw err;
  }
  if (res.status >= 500) {
    const err = new Error(`Upstream error: ${error}`);
    err.retryable = true;
    throw err;
  }
  throw new Error(`HTTP ${res.status}: ${error}`);
}

Muster zur Fehlerbehandlung (Python)

import os, requests

def wh_fetch(path, **kwargs):
    r = requests.request(
        method=kwargs.pop("method", "GET"),
        url=f"{ORIGIN}{path}",
        headers={"X-API-Key": os.environ["WH_API_KEY"], **kwargs.pop("headers", {})},
        **kwargs,
    )

    body = None
    try:
        body = r.json()
    except ValueError:
        pass

    if r.ok:
        return body

    error = (body or {}).get("error") or r.reason

    if r.status_code == 401:
        raise PermissionError(f"Auth failed: {error}")
    if r.status_code == 403:
        raise PermissionError(f"Plan required: {error}")
    if r.status_code == 429:
        is_quota = bool((body or {}).get("credits"))
        raise RuntimeError(f"Rate limited (quota={is_quota}): {error}")
    if r.status_code >= 500:
        raise RuntimeError(f"Upstream error: {error}")

    raise RuntimeError(f"HTTP {r.status_code}: {error}")

Antwortformat vs. HTTP

  • Fehler beim Schutz des API-Schlüssels mit Datenvolumenbegrenzung (401, 403, Grenze 429, allgemeiner Begriff 500) geben immer JSON zurück mit Erfolg: false und einen entsprechenden HTTP-Status.
  • Einige JSON-Handler (insbesondere große TikTok-Shop-Payloads) können HTTP-Antworten zurückgeben 200 bei einem Body, der Flags auf Unternehmensebene enthält – lesen Sie immer das Schema für diesen Endpunkt, anstatt davon auszugehen, dass Erfolg erfasst ausschließlich HTTP-Daten.

HTML statt JSON? Festgelegte programmatische Routen mit Messung Content-Type: application/json. HTML deutet in der Regel auf einen falschen Host, eine Proxy-Fehlerseite oder einen Pfad hin, der nie von der App aufgerufen wurde – siehe Fehlerbehebung.


melden#

Wenn du auf eine 500 oder eine Antwort, die im Widerspruch zur Dokumentation steht:

  1. Erfassen Sie die URL der Anfrage, die Methode, die Header (bitte schwärzen Sie Ihren Schlüssel) und den Textkörper.
  2. Erfassen Sie den Antwortstatus und den Antworttext.
  3. Beachten Sie den Zeitstempel.
  4. Senden Sie das Datenpaket an den Support – das Team kann es anhand der Benutzer-ID und des Zeitstempels mit den Serverprotokollen abgleichen.