Obsługa błędów API Notiondesk, limitów szybkości i ponownych prób

Kody błędów API Notiondesk i koperta, limity szybkości odczytu do 120 odczytów i zapisu do 20 na minutę, ponawianie prób i bezpieczne ponowne próby z kluczem idempotencji.

6 min czytania

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
objectZawsze error
codeBłąd czytelny dla maszyny. Rozgałęziaj kod tylko na podstawie tego pola.
messageWyjaśnienie zrozumiałe dla człowieka. Może się zmienić, więc nigdy go nie analizuj.
request_idIdentyfikuje żądanie w momencie kontaktu z pomocą techniczną. null, jeśli żądanie nie powiodło się przed dotarciem do trasy, np. na nieznanej ścieżce
errorsProblemy 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 (locale w items, category_id w changelog_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

codeStatus HTTP Oznaczający Co robić
authentication_error401 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_scope403 Poświadczenie nie ma zakresu wymaganego przez trasę Użyj klucza o zakresie nazwanym w WWW-Authenticate
permission_denied402, 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_version400 Nagłówek nd-version wskazuje nieznaną wersję Wyślij 2026-10-16 lub pomiń nagłówek
validation_error400, 422 Parametr lub pole treści jest nieprawidłowe, nieznane lub znajduje się poza zakresem Napraw pola wymienione w errors
not_found404, 405 Ścieżka, zasób lub metoda nie istnieje Sprawdź identyfikatory i metodę
conflict_error409 Żądanie jest w konflikcie z bieżącym stanem, na przykład synchronizacja jest już uruchomiona Poczekaj, a następnie spróbuj ponownie
idempotency_key_invalid400 Nagłówek Idempotency-Key jest pusty lub zawiera więcej niż 255 znaków Wyślij od 1 do 255 znaków
idempotency_key_reused422 Idempotency-Key został już użyty w innym żądaniu Użyj nowego klucza dla nowego żądania
request_in_progress409 Żądanie z tym samym Idempotency-Key jest nadal uruchomione Poczekaj, a następnie spróbuj ponownie z tym samym kluczem
rate_limited429 Zbyt wiele próśb Poczekaj Retry-After sekund
internal_error500 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-RemainingProśby pozostawione w bieżącym oknie
Retry-AfterSekundy 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.

Uwaga: limity szybkości są naliczane dla każdego klucza lub uprawnienia OAuth, a nie dla każdego obszaru roboczego. Dwie integracje z oddzielnymi kluczami nie spowalniają się wzajemnie, z wyjątkiem wspólnego budżetu analitycznego.

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

  1. Wygeneruj jeden Idempotency-Key na każdą zmianę logiczną i wykorzystuj go ponownie przy każdej próbie wprowadzenia tej zmiany.
  1. W dniu 429 rate_limited odczekaj Retry-After sekund, a następnie spróbuj ponownie.
  1. W dniu 409 request_in_progress odczekaj kilka sekund, a następnie spróbuj ponownie z tym samym kluczem. W dniu 409 conflict_error synchronizacja centrum pomocy jest już uruchomiona: odczekaj kilka minut przed ponownym uruchomieniem lub pomiń to uruchomienie.
  1. W przypadku wersji 500 i 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.
  1. Nigdy nie próbuj ponownie użyć 400, 401, 403, 404 lub 422 bez 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.

Co dalej?

Powiązane artykuły

Czy ta strona była pomocna?

Still need help? Ask us