Die Notiondesk-API beantwortet jeden Fehler mit demselben JSON-Envelope und einem maschinenlesbaren code-Header, beschränkt jeden Schlüssel auf 120 Lese- und 20 Schreibvorgänge pro Minute und ermöglicht es Ihnen, jede Änderung sicher mit einem Idempotency-Key-Header zu wiederholen. Dieser Artikel listet alle Fehlercodes der Notiondesk-API auf, erläutert die Ratenbegrenzungen und ihre Header und zeigt, wie Sie Wiederholungsversuche erstellen, die niemals zweimal Änderungen vornehmen.
Der API-Fehlerumschlag Notiondesk
Jeder Fehler hat die gleiche Form, und jedes Feld ist immer vorhanden:
{
"object": "error",
"code": "validation_error",
"message": "The request parameters are invalid.",
"request_id": "0f2c1e94-7a1b-4c2d-9e3f-5a6b7c8d9e0f",
"errors": [
{"field": "page_size", "message": "This value should be between 1 and 100."}
]
}| Feld | Bedeutung |
|---|---|
object | Immer __RESERVIERT_78__ |
code | Der maschinenlesbare Fehler. Verzweigen Sie Ihren Code nur an diesem Feld. |
message | Eine für Menschen verständliche Erklärung. Sie kann sich ändern, also analysieren Sie sie niemals. |
request_id | Kennzeichnet die Anfrage, wenn Sie den Support kontaktieren. null wird angezeigt, wenn die Anfrage vor Erreichen einer Route fehlgeschlagen ist, beispielsweise auf einem unbekannten Pfad. |
errors | Feldbezogene Probleme, jeweils mit einem field und einem message. Leer, wenn der Fehler nicht eine bestimmte Eingabe betrifft. |
Wie field einen Wert benennt
- Ein Feld der obersten Ebene ist sein Name:
page_size.
- Ein Feld innerhalb einer Liste benennt die Liste, den Eintrag in Klammern und dann das Feld:
items[fr].page_title.
- Die Klammer enthält die Kennung des Eintrags, wie Sie sie übermittelt haben (z. B.
localeinitems,category_idinchangelog_categories), sofern jeder Eintrag eine eindeutige Kennung besitzt. Andernfalls enthält sie die nullbasierte Position des Eintrags:items[0].locale.
- Ein Problem mit der Anfrage als Ganzes hat
"field": null.
Notiondesk API-Fehlercodes
code | HTTP-Status | Bedeutung | Was zu tun |
|---|---|---|---|
authentication_error | 401 | Der Schlüssel oder das Zugriffstoken fehlt oder kann nicht verwendet werden. | Prüfen Sie den Schlüssel, dessen Ablaufdatum und den Tarif. Siehe Authentifizierung mit der Notiondesk-API |
insufficient_scope | 403 | Die Anmeldeinformationen haben nicht den erforderlichen Geltungsbereich für die Route. | Verwenden Sie einen Schlüssel mit dem in WWW-Authenticate angegebenen Bereich. |
permission_denied | 402, 403 | Die Anmeldeinformationen können diese Aktion für diese Ressource nicht ausführen, beispielsweise weil der Plan die entsprechende Funktion nicht enthält. | Überprüfen Sie Ihren Tarif und die Einstellungen im Hilfecenter. Versuchen Sie es nicht unverändert erneut. |
invalid_version | 400 | Der Header nd-version nennt eine unbekannte Version. | Senden Sie 2026-10-16 oder lassen Sie den Header weg. |
validation_error | 400, 422 | Ein Parameter oder ein Feld im Body ist ungültig, unbekannt oder außerhalb des zulässigen Bereichs. | Korrigieren Sie die in errors aufgeführten Felder. |
not_found | 404, 405 | Der Pfad, die Ressource oder die Methode existiert nicht. | Überprüfen Sie die IDs und die Methode. |
conflict_error | 409 | Die Anfrage steht im Konflikt mit dem aktuellen Zustand, beispielsweise läuft bereits eine Synchronisierung. | Warten Sie, dann versuchen Sie es erneut. |
idempotency_key_invalid | 400 | Der Idempotency-Key-Header ist leer oder länger als 255 Zeichen. | Senden Sie 1 bis 255 Zeichen |
idempotency_key_reused | 422 | Die Idempotency-Key wurde bereits für eine andere Anfrage verwendet. | Verwenden Sie einen neuen Schlüssel für eine neue Anfrage. |
request_in_progress | 409 | Eine Anfrage mit demselben Idempotency-Key wird noch ausgeführt. | Warten Sie, und versuchen Sie es dann mit demselben Schlüssel erneut. |
rate_limited | 429 | Zu viele Anfragen | Warten Sie Retry-After Sekunden |
internal_error | 500 und mehr | Notiondesk fehlgeschlagen | Versuchen Sie es später erneut und geben Sie die request_id an, wenn Sie den Support kontaktieren. |
Eine Anfrage an ein Hilfecenter oder eine Ressource außerhalb Ihres Arbeitsbereichs wird mit dem Fehlercode 404 not_found beantwortet, sodass die API niemals offenlegt, ob diese existiert.
Notiondesk API-Ratenbegrenzungen
Jeder API-Schlüssel und jede OAuth-Berechtigung verfügt über zwei Anfragebudgets, die innerhalb eines gleitenden Ein-Minuten-Fensters gezählt werden:
| Budget | Routen | Anfragen pro Minute |
|---|---|---|
| Liest | GET Routen | 120 |
| Schreibt | POST, PATCH und DELETE Routen | 20 |
Die Analyseberichte werden auch auf ein Budget von 30 Anfragen pro Minute pro Hilfezentrum angerechnet, das von allen Schlüsseln und OAuth-Apps des Arbeitsbereichs gemeinsam genutzt wird.
Die Antworten enthalten drei Überschriften:
| Kopfzeile | Bedeutung |
|---|---|
X-RateLimit-Limit | Im aktuellen Fenster zulässige Anfragen |
X-RateLimit-Remaining | Im aktuellen Fenster verbliebene Anfragen |
Retry-After | Sekunden bis zur Annahme der nächsten Anfrage; 0 solange Anfragen bestehen |
Eine Anfrage über das Budget hinaus beantwortet 429 rate_limited. Warten Sie die in Retry-After angegebene Anzahl Sekunden, bevor Sie die nächste Anfrage senden.
Sicherer Neustart mit Idempotency-Key
Bei einem Netzwerk-Timeout ist unklar, ob eine Änderung erfolgreich war. Der Header Idempotency-Key ermöglicht es Ihnen, dieselbe Anfrage erneut zu senden, ohne die Änderungen zweimal vornehmen zu müssen.
Jede Route, die eine Änderung vornimmt, akzeptiert diese: Änderungen an Seitenweiterleitungen, Aktualisierungen von Einstellungen und Branding, Änderungen an Integrationen und Synchronisierungsauslöser. Senden Sie beim ersten Versuch einen eindeutigen Wert von 1 bis 255 Zeichen, z. B. eine UUID, und denselben Wert bei jedem weiteren Versuch.
Was passiert bei einem Wiederholungsversuch?
curl -X POST "https://api.notiondesk.so/sites/c74781f6-1aea-4e17-ab23-bbb8b4d174b6/page-redirects" \
-H "Authorization: Bearer $NOTIONDESK_API_KEY" \
-H "nd-version: 2026-10-16" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 6f0d6b1e-create-getting-started" \
-d '{"type": "article", "source_path": "/legacy/getting-started", "target_id": "1761580412", "locale": "en"}'| Wiederholen | Ergebnis |
|---|---|
| Gleicher Schlüssel, gleicher Body, gleiche Route, nachdem die erste Anfrage abgeschlossen ist | Die erste Antwort, einschließlich Status und Nachrichtentext, mit X-Idempotent-Replay: true. Es ändert sich nichts. |
| Derselbe Schlüssel wird verwendet, während die erste Anfrage noch läuft. | 409 request_in_progress. Warten und erneut versuchen. |
| Gleicher Schlüssel mit unterschiedlichen Body-, Routen- oder Pfad-IDs | 422 idempotency_key_reused |
| Derselbe Schlüssel und derselbe Anfragetext führten nach der ersten Anfrage zu einem Fehler. | Die Anfrage wird erneut ausgeführt |
Eine erfolgreiche Antwort enthält beim ersten Mal X-Idempotent-Replay: false und bei einer Wiederholung true. Notiondesk speichert einen Schlüssel mindestens 24 Stunden lang. Ein Schlüssel gehört zum API-Schlüssel oder OAuth-Grant, der ihn gesendet hat, und ein OAuth-Grant behält seine Schlüssel auch nach Token-Aktualisierungen bei.
Ohne den Header wird eine Anfrage einmal ausgeführt, und ein Wiederholungsversuch wird erneut ausgeführt.
Eine Wiederholungsstrategie, die funktioniert
- Erzeuge pro logischer Änderung ein
Idempotency-Keyund verwende es bei jedem Wiederholungsversuch dieser Änderung wieder.
- Bei
429 rate_limitedwarteRetry-AfterSekunden und versuche es dann erneut.
- Warten Sie bei
409 request_in_progresseinige Sekunden und versuchen Sie es dann mit demselben Schlüssel erneut. Bei409 conflict_errorläuft bereits eine Synchronisierung des Hilfecenters: Warten Sie einige Minuten, bevor Sie den Vorgang erneut auslösen, oder überspringen Sie diesen Lauf.
- Bei
500und höher oder einem Netzwerkfehler wird ein erneuter Versuch mit exponentiellem Backoff unternommen, beispielsweise nach 1, 2, 4 und 8 Sekunden.
- Versuchen Sie niemals,
400,401,403,404oder422unverändert erneut anzufordern. Korrigieren Sie zuerst die Anfrage.
In JavaScript stoppt die Ausführung bei jeder Route, die etwas ändert, bei conflict_error und überlässt die Entscheidung Ihrem Code.
Häufig gestellte Fragen
import { randomUUID } from "node:crypto";
const sleep = (seconds) => new Promise((resolve) => setTimeout(resolve, seconds * 1000));
async function notiondeskRequest(method, path, body, attempts = 5) {
const idempotencyKey = randomUUID();
for (let attempt = 0; attempt < attempts; attempt++) {
let response;
try {
response = await fetch(`https://api.notiondesk.so${path}`, {
method,
headers: {
Authorization: `Bearer ${process.env.NOTIONDESK_API_KEY}`,
"nd-version": "2026-10-16",
"Content-Type": "application/json",
"Idempotency-Key": idempotencyKey,
},
body: body ? JSON.stringify(body) : undefined,
});
} catch {
await sleep(2 ** attempt);
continue;
}
if (response.ok) {
return response.status === 204 ? null : response.json();
}
const error = await response.json().catch(() => ({}));
const retryable = response.status === 429 || response.status >= 500 || error.code === "request_in_progress";
if (!retryable) {
throw new Error(`${response.status} ${error.code}: ${error.message}`);
}
const retryAfter = Number(response.headers.get("Retry-After"));
await sleep(retryAfter > 0 ? retryAfter : 2 ** attempt);
}
throw new Error(`Notiondesk request failed after ${attempts} attempts`);
} Welche Ratenbegrenzungen gelten für die Notiondesk API?
Pro API-Schlüssel oder OAuth-Grant sind 120 Lese- und 20 Schreibanfragen pro Minute zulässig, zuzüglich 30 Analyseanfragen pro Minute für jedes Hilfezentrum. Anfragen, die das Budget überschreiten, werden mit dem Statuscode 429 und dem Header „Retry-After“ beantwortet.
Welches Feld sollte mein Code im Fehlerfall überprüfen?
code. Es ist der einzige stabile, maschinenlesbare Klassifikator. Der message ist für Menschen bestimmt und kann sich ändern.
Was soll ich dem Support senden, wenn eine Anfrage fehlschlägt?
Die request_id aus der Fehlerantwort, die aufgerufene Route und der Zeitpunkt der Anfrage.
Ist es sicher, einen Synchronisierungstrigger erneut auszulösen?
Ja, mit einem Idempotency-Key. Ein erneuter Versuch mit demselben Schlüssel liefert erneut das erste Ergebnis und reiht nichts in die Warteschlange ein. Ohne Schlüssel liefert ein zweiter Site-Sync-Trigger, während der erste noch läuft, die Antwort 409 conflict_error.