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 |
|---|---|
object | Sempre __PRESERVATO_78__ |
code | Errore leggibile dalla macchina. Esegui un'espansione del codice solo su questo campo. |
message | Una spiegazione comprensibile all'uomo. Può cambiare, quindi non analizzarla mai |
request_id | Identifica la richiesta quando contatti l'assistenza. null quando la richiesta non è riuscita prima di raggiungere un percorso, ad esempio su un percorso sconosciuto |
errors | Problemi 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
localeinitems, ilcategory_idinchangelog_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
code | stato dell'HTTP | Senso | Cosa fare |
|---|---|---|---|
authentication_error | 401 | 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_scope | 403 | La credenziale non ha la portata richiesta dal percorso | Utilizzare una chiave con l'ambito denominato WWW-Authenticate |
permission_denied | 402, 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_version | 400 | L'intestazione nd-version indica una versione sconosciuta | Invia 2026-10-16 oppure ometti l'intestazione |
validation_error | 400, 422 | Un parametro o un campo del corpo non è valido, è sconosciuto o è fuori intervallo | Correggere i campi elencati in errors |
not_found | 404, 405 | Il percorso, la risorsa o il metodo non esistono | Controlla gli ID e il metodo |
conflict_error | 409 | La richiesta è in conflitto con lo stato attuale, ad esempio è già in corso una sincronizzazione | Attendi, poi riprova. |
idempotency_key_invalid | 400 | L'intestazione Idempotency-Key è vuota o più lunga di 255 caratteri | Invia da 1 a 255 caratteri |
idempotency_key_reused | 422 | Il parametro Idempotency-Key è già stato utilizzato per un'altra richiesta | Utilizzare una nuova chiave per una nuova richiesta |
request_in_progress | 409 | Una richiesta con lo stesso Idempotency-Key è ancora in esecuzione | Attendi, poi riprova con lo stesso tasto |
rate_limited | 429 | Troppe richieste | Attendi Retry-After secondi |
internal_error | 500 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-Limit | Richieste consentite nella finestra corrente |
X-RateLimit-Remaining | Richieste lasciate nella finestra corrente |
Retry-After | Secondi 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.
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
- Genera un oggetto
Idempotency-Keyper ogni modifica logica e riutilizzalo per ogni tentativo di ripetere tale modifica.
- Il
429 rate_limited, attendiRetry-Aftersecondi, quindi riprova.
- Il giorno
409 request_in_progress, attendi qualche secondo, quindi riprova con lo stesso tasto. Il giorno409 conflict_errorè già in corso una sincronizzazione del centro assistenza: attendi qualche minuto prima di riprovare oppure salta questa esecuzione.
- Su
500e 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.
- Non riprovare mai
400,401,403,404o422senza 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.