Interfejs API Notiondesk odpowiada na każdy błąd za pomocą tej samej koperty JSON i maszynowo czytelnego code, ogranicza liczbę odczytów i zapisów dla każdego klucza do 120 na minutę oraz pozwala na bezpieczne ponawianie prób wprowadzenia dowolnej zmiany za pomocą nagłówka Idempotency-Key. W tym artykule wymieniono wszystkie kody błędów interfejsu API Notiondesk, wyjaśniono limity częstotliwości i ich nagłówki oraz pokazano, jak tworzyć ponawianie prób, które nigdy nie zmieniają niczego dwa razy.
Obwiednia błędów interfejsu API Notiondesk
Każdy błąd odpowiada temu samemu kształtowi i każde pole jest zawsze obecne:
{
"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."}
]
}| Pole | Oznaczający |
|---|---|
object | Zawsze error |
code | Błąd czytelny dla maszyny. Rozgałęziaj kod tylko na podstawie tego pola. |
message | Wyjaśnienie zrozumiałe dla człowieka. Może się zmienić, więc nigdy go nie analizuj. |
request_id | Identyfikuje żądanie w momencie kontaktu z pomocą techniczną. null, jeśli żądanie nie powiodło się przed dotarciem do trasy, np. na nieznanej ścieżce |
errors | Problemy na poziomie pola, każdy z field i message. Pusty, gdy błąd nie dotyczy konkretnego wejścia |
Jak field nadaje nazwę wartości
- Pole najwyższego poziomu to jego nazwa:
page_size.
- Pole wewnątrz listy zawiera nazwę listy, wpis w nawiasach, a następnie pole:
items[fr].page_title.
- Nawias przechowuje identyfikator wpisu, jaki został przez Ciebie wysłany (
localewitems,category_idwchangelog_categories), gdy każdy wpis ma odrębny identyfikator. W przeciwnym razie przechowuje pozycję wpisu (licząc od zera):items[0].locale.
- Problem z całym żądaniem ma numer
"field": null.
Notiondesk Kody błędów API
code | Status HTTP | Oznaczający | Co robić |
|---|---|---|---|
authentication_error | 401 | Brakuje klucza lub tokenu dostępu lub nie można go użyć | Sprawdź klucz, jego datę ważności i plan. Zobacz Uwierzytelnianie za pomocą API Notiondesk |
insufficient_scope | 403 | Poświadczenie nie ma zakresu wymaganego przez trasę | Użyj klucza o zakresie nazwanym w WWW-Authenticate |
permission_denied | 402, 403 | Poświadczenie nie może wykonać tej akcji na tym zasobie, na przykład dlatego, że plan nie ma tej funkcji | Sprawdź plan i ustawienia centrum pomocy. Nie próbuj ponownie bez zmian. |
invalid_version | 400 | Nagłówek nd-version wskazuje nieznaną wersję | Wyślij 2026-10-16 lub pomiń nagłówek |
validation_error | 400, 422 | Parametr lub pole treści jest nieprawidłowe, nieznane lub znajduje się poza zakresem | Napraw pola wymienione w errors |
not_found | 404, 405 | Ścieżka, zasób lub metoda nie istnieje | Sprawdź identyfikatory i metodę |
conflict_error | 409 | Żądanie jest w konflikcie z bieżącym stanem, na przykład synchronizacja jest już uruchomiona | Poczekaj, a następnie spróbuj ponownie |
idempotency_key_invalid | 400 | Nagłówek Idempotency-Key jest pusty lub zawiera więcej niż 255 znaków | Wyślij od 1 do 255 znaków |
idempotency_key_reused | 422 | Idempotency-Key został już użyty w innym żądaniu | Użyj nowego klucza dla nowego żądania |
request_in_progress | 409 | Żądanie z tym samym Idempotency-Key jest nadal uruchomione | Poczekaj, a następnie spróbuj ponownie z tym samym kluczem |
rate_limited | 429 | Zbyt wiele próśb | Poczekaj Retry-After sekund |
internal_error | 500 i więcej | Notiondesk nie powiodło się | Spróbuj ponownie później i podaj kod request_id, jeśli kontaktujesz się z pomocą techniczną |
Prośba o dostęp do centrum pomocy lub zasobu spoza obszaru roboczego odpowiada na błąd 404 not_found, więc API nigdy nie ujawnia, czy takie centrum pomocy lub zasób istnieje.
Notiondesk Limity szybkości API
Każdy klucz API i każde przyznanie OAuth ma dwa budżety żądań, liczone w przesuwającym się oknie minutowym:
| Budżet | Trasy | Żądania na minutę |
|---|---|---|
| Czyta | GET tras | 120 |
| Pisze | Trasy POST, PATCH i DELETE | 20 |
Raporty analityczne są również uwzględniane w budżecie 30 żądań na minutę na centrum pomocy , współdzielonych przez każdy klucz i aplikację OAuth w obszarze roboczym.
Odpowiedzi zawierają trzy nagłówki:
| Chodnikowiec | Oznaczający |
|---|---|
X-RateLimit-Limit | Żądania dozwolone w bieżącym oknie |
X-RateLimit-Remaining | Prośby pozostawione w bieżącym oknie |
Retry-After | Sekundy do zaakceptowania kolejnego żądania; 0 dopóki żądania pozostają aktualne |
Żądanie przekraczające budżet odpowiada 429 rate_limited. Przed wysłaniem kolejnego żądania należy odczekać liczbę sekund równą liczbie Retry-After.
Spróbuj ponownie bezpiecznie z Idempotency-Key
Przekroczenie limitu czasu sieci nie daje pewności, czy zmiana została wprowadzona. Nagłówek Idempotency-Key pozwala na ponowne wysłanie tego samego żądania bez konieczności dwukrotnej zmiany.
Każda trasa, która coś zmienia, akceptuje to: zmiany przekierowań stron, aktualizacje ustawień i brandingu, zmiany integracji i wyzwalacze synchronizacji. Wyślij unikalną wartość od 1 do 255 znaków, taką jak UUID, przy pierwszej próbie i tę samą wartość przy każdej kolejnej próbie:
Co się dzieje przy ponownej próbie:
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"}'| Spróbować ponownie | Wynik |
|---|---|
| Ten sam klucz, to samo ciało, ta sama trasa po zakończeniu pierwszego żądania | Ponownie pierwsza odpowiedź, ze statusem i treścią, z X-Idempotent-Replay: true. Nic się nie zmienia |
| Ten sam klucz, gdy pierwsze żądanie jest nadal uruchomione | 409 request_in_progress. Poczekaj i spróbuj ponownie |
| Ten sam klucz z innym identyfikatorem treści, trasy lub ścieżki | 422 idempotency_key_reused |
| Ten sam klucz i to samo ciało po pierwszym żądaniu, które odpowiedziało na błąd | Żądanie zostanie uruchomione ponownie |
Pomyślna odpowiedź niesie ze sobą X-Idempotent-Replay: false przy pierwszym odtworzeniu i true przy ponownym odtworzeniu. Notiondesk przechowuje klucz przez co najmniej 24 godziny. Klucz należy do klucza API lub autoryzacji OAuth, która go wysłała, a autoryzacja OAuth przechowuje swoje klucze po odświeżeniu tokena.
Bez nagłówka żądanie jest uruchamiane raz, po czym następuje ponowna próba.
Strategia ponawiania prób, która działa
- Wygeneruj jeden
Idempotency-Keyna każdą zmianę logiczną i wykorzystuj go ponownie przy każdej próbie wprowadzenia tej zmiany.
- W dniu
429 rate_limitedodczekajRetry-Aftersekund, a następnie spróbuj ponownie.
- W dniu
409 request_in_progressodczekaj kilka sekund, a następnie spróbuj ponownie z tym samym kluczem. W dniu409 conflict_errorsynchronizacja centrum pomocy jest już uruchomiona: odczekaj kilka minut przed ponownym uruchomieniem lub pomiń to uruchomienie.
- W przypadku wersji
500i nowszych lub w przypadku błędu sieciowego należy ponowić próbę z wykładniczym opóźnieniem, np. po 1, 2, 4 i 8 sekundach.
- Nigdy nie próbuj ponownie użyć
400,401,403,404lub422bez zmian. Najpierw popraw żądanie.
W JavaScript, dla każdej trasy, która coś zmienia, zatrzymuje się na conflict_error i pozostawia decyzję Twojemu kodowi:
Często zadawane pytania
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`);
} Jakie są limity szybkości interfejsu API Notiondesk?
120 żądań odczytu i 20 żądań zapisu na minutę dla każdego klucza API lub przyznania OAuth, plus 30 żądań analitycznych na minutę dla każdego centrum pomocy. Żądanie przekraczające budżet odpowiada 429 nagłówkiem Retry-After.
Które pole powinienem sprawdzić w kodzie w przypadku błędu?
code. To jedyny stabilny, maszynowo czytelny klasyfikator. message jest przeznaczony dla ludzi i może się zmieniać.
Co powinienem wysłać do pomocy technicznej, jeśli prośba zostanie odrzucona?
request_id z odpowiedzi o błędzie, wywołanej trasy i czasu żądania.
Czy ponowna próba uruchomienia synchronizacji jest bezpieczna?
Tak, z Idempotency-Key. Ponowna próba z tym samym kluczem ponownie zwraca pierwszy wynik i nie umieszcza niczego w kolejce. Bez klucza, drugi wyzwalacz synchronizacji witryny, podczas gdy pierwszy jest uruchomiony, odpowiada 409 conflict_error.