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, Grenze429, allgemeiner Begriff500) geben immer JSON zurück mitErfolg: falseund einen entsprechenden HTTP-Status. - Einige JSON-Handler (insbesondere große TikTok-Shop-Payloads) können HTTP-Antworten zurückgeben
200bei einem Body, der Flags auf Unternehmensebene enthält – lesen Sie immer das Schema für diesen Endpunkt, anstatt davon auszugehen, dassErfolgerfasst 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:
- Erfassen Sie die URL der Anfrage, die Methode, die Header (bitte schwärzen Sie Ihren Schlüssel) und den Textkörper.
- Erfassen Sie den Antwortstatus und den Antworttext.
- Beachten Sie den Zeitstempel.
- Senden Sie das Datenpaket an den Support – das Team kann es anhand der Benutzer-ID und des Zeitstempels mit den Serverprotokollen abgleichen.