Gestire gli errori dell'API Notiondesk, i limiti di frequenza e i tentativi di ripetizione.

Notiondesk Codici di errore API e involucro, limiti di velocità di 120 letture e 20 scritture al minuto, Retry-After e tentativi sicuri con Idempotency-Key.

6 min di lettura

L'API Notiondesk risponde a ogni errore con la stessa busta JSON e un'intestazione code leggibile dalla macchina, limita ogni chiave a 120 letture e 20 scritture al minuto e consente di riprovare qualsiasi modifica in modo sicuro con un'intestazione Idempotency-Key. Questo articolo elenca tutti i codici di errore dell'API Notiondesk, spiega i limiti di frequenza e le relative intestazioni e mostra come creare tentativi di ripetizione che non modifichino mai nulla due volte.

L'involucro di errore dell'API Notiondesk

Ogni errore risponde alla stessa forma e ogni campo è sempre presente:

{
  "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."}
  ]
}
Campo Senso
objectSempre __PRESERVATO_78__
codeErrore leggibile dalla macchina. Esegui un'espansione del codice solo su questo campo.
messageUna spiegazione comprensibile all'uomo. Può cambiare, quindi non analizzarla mai
request_idIdentifica la richiesta quando contatti l'assistenza. null quando la richiesta non è riuscita prima di raggiungere un percorso, ad esempio su un percorso sconosciuto
errorsProblemi a livello di campo, ciascuno con un field e un message. Vuoto quando l'errore non riguarda un input specifico

Come field nomina un valore

  • Il nome del campo di primo livello è: page_size.
  • Un campo all'interno di un elenco specifica il nome dell'elenco, la voce tra parentesi quadre e quindi il nome del campo: items[fr].page_title.
  • La parentesi quadre contiene l'identificativo della voce così come è stato inviato (il locale in items, il category_id in changelog_categories) quando ogni voce ha un identificativo univoco. Altrimenti contiene la posizione della voce a base zero: items[0].locale.
  • Si è verificato un problema con la richiesta nel suo complesso "field": null.

Notiondesk Codici di errore API

codestato dell'HTTP Senso Cosa fare
authentication_error401 La chiave o il token di accesso sono mancanti o non possono essere utilizzati. Verifica la chiave, la sua data di scadenza e il piano. Vedi Autenticazione con l'API Notiondesk
insufficient_scope403 La credenziale non ha la portata richiesta dal percorso Utilizzare una chiave con l'ambito denominato WWW-Authenticate
permission_denied402, 403 Le credenziali non possono eseguire questa azione su questa risorsa, ad esempio perché il piano non dispone della funzionalità Controlla il piano e le impostazioni del centro assistenza. Non riprovare senza modifiche.
invalid_version400 L'intestazione nd-version indica una versione sconosciuta Invia 2026-10-16 oppure ometti l'intestazione
validation_error400, 422 Un parametro o un campo del corpo non è valido, è sconosciuto o è fuori intervallo Correggere i campi elencati in errors
not_found404, 405 Il percorso, la risorsa o il metodo non esistono Controlla gli ID e il metodo
conflict_error409 La richiesta è in conflitto con lo stato attuale, ad esempio è già in corso una sincronizzazione Attendi, poi riprova.
idempotency_key_invalid400 L'intestazione Idempotency-Key è vuota o più lunga di 255 caratteri Invia da 1 a 255 caratteri
idempotency_key_reused422 Il parametro Idempotency-Key è già stato utilizzato per un'altra richiesta Utilizzare una nuova chiave per una nuova richiesta
request_in_progress409 Una richiesta con lo stesso Idempotency-Key è ancora in esecuzione Attendi, poi riprova con lo stesso tasto
rate_limited429 Troppe richieste Attendi Retry-After secondi
internal_error500 e oltre Notiondesk non riuscito Riprova più tardi e, se contatti l'assistenza, cita il codice request_id.

Una richiesta di centro assistenza o di una risorsa esterna al tuo spazio di lavoro risponde con il codice 404 not_found, quindi l'API non rivela mai se esiste.

Notiondesk Limiti di frequenza API

Ogni chiave API e ogni concessione OAuth dispone di due budget di richieste, conteggiati su una finestra temporale scorrevole di un minuto:

Bilancio Percorsi Richieste al minuto
Letture GET percorsi 120
Scrive percorsi POST, PATCH e DELETE 20

I report analitici vengono inoltre conteggiati in base a un budget di 30 richieste al minuto per ogni centro assistenza , condiviso da ogni chiave e app OAuth dell'area di lavoro.

Le risposte contengono tre intestazioni:

Intestazione Senso
X-RateLimit-LimitRichieste consentite nella finestra corrente
X-RateLimit-RemainingRichieste lasciate nella finestra corrente
Retry-AfterSecondi prima che la prossima richiesta venga accettata; 0 mentre le richieste rimangono

Una richiesta che supera il budget risponde 429 rate_limited. Attendi il numero di secondi in Retry-After prima di inviare la richiesta successiva.

Nota: i limiti di frequenza vengono conteggiati per chiave o per concessione OAuth, non per spazio di lavoro. Due integrazioni con chiavi separate non si rallentano a vicenda, tranne che per il budget di analisi condiviso.

Riprova in sicurezza con Idempotency-Key

Un timeout di rete non consente di avere la certezza che una modifica sia andata a buon fine. L'intestazione Idempotency-Key permette di inviare nuovamente la stessa richiesta senza apportare due volte le stesse modifiche.

Ogni percorso che apporta modifiche lo accetta: modifiche al reindirizzamento di pagina, aggiornamenti di impostazioni e branding, modifiche di integrazione e trigger di sincronizzazione. Invia un valore univoco da 1 a 255 caratteri, come un UUID, al primo tentativo e lo stesso valore a ogni tentativo successivo:

Cosa succede se si riprova:

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"}'
Riprova Risultato
Stessa chiave, stesso corpo, stesso percorso, dopo che la prima richiesta è terminata La prima risposta di nuovo, stato e corpo inclusi, con X-Idempotent-Replay: true. Nulla cambia
Stessa chiave mentre la prima richiesta è ancora in esecuzione 409 request_in_progress. Attendi e riprova.
Stessa chiave con ID di corpo, percorso o percorso diversi 422 __PRESERVATO_24__
Stessa chiave e stesso corpo dopo che la prima richiesta ha risposto con un errore La richiesta viene eseguita di nuovo

Una risposta positiva contiene X-Idempotent-Replay: false la prima volta e true in caso di ripetizione. Notiondesk conserva una chiave per almeno 24 ore. Una chiave appartiene alla chiave API o alla concessione OAuth che l'ha inviata e una concessione OAuth conserva le sue chiavi anche dopo l'aggiornamento del token.

Senza l'intestazione, una richiesta viene eseguita una sola volta e un eventuale tentativo di ripetizione viene eseguito nuovamente.

Una strategia di riprova che funziona

  1. Genera un oggetto Idempotency-Key per ogni modifica logica e riutilizzalo per ogni tentativo di ripetere tale modifica.
  1. Il 429 rate_limited, attendi Retry-After secondi, quindi riprova.
  1. Il giorno 409 request_in_progress, attendi qualche secondo, quindi riprova con lo stesso tasto. Il giorno 409 conflict_error è già in corso una sincronizzazione del centro assistenza: attendi qualche minuto prima di riprovare oppure salta questa esecuzione.
  1. Su 500 e versioni successive, o in caso di errore di rete, riprova con un intervallo di tempo esponenziale, ad esempio dopo 1, 2, 4 e 8 secondi.
  1. Non riprovare mai 400, 401, 403, 404 o 422 senza modifiche. Correggi prima la richiesta.

In JavaScript, per qualsiasi percorso che modifichi qualcosa, si ferma su conflict_error e lascia quella decisione al tuo codice:

Domande frequenti

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`);
}

Quali sono i limiti di frequenza dell'API Notiondesk?

120 richieste di lettura e 20 richieste di scrittura al minuto per ogni chiave API o concessione OAuth, più 30 richieste di analisi al minuto per ogni centro assistenza. Una richiesta che supera il budget risponde con il codice 429 e l'intestazione Retry-After.

Quale campo dovrebbe controllare il mio codice in caso di errore?

code. È l'unico classificatore stabile e leggibile dalla macchina. Il message è per le persone e può cambiare.

Cosa devo inviare all'assistenza quando una richiesta non va a buon fine?

Il request_id dalla risposta di errore, il percorso chiamato e l'ora della richiesta.

È sicuro riprovare ad attivare la sincronizzazione?

Sì, con un Idempotency-Key. Un nuovo tentativo con la stessa chiave risponde di nuovo al primo risultato e non mette in coda nulla. Senza una chiave, un secondo trigger di sincronizzazione del sito mentre il primo è in esecuzione risponde 409 conflict_error.

Cosa succederà dopo?

Articoli correlati

Questa pagina è stata utile?

Still need help? Ask us