La API Notiondesk responde a cada error con el mismo sobre JSON y un encabezado code legible por máquina, limita cada clave a 120 lecturas y 20 escrituras por minuto, y permite reintentar cualquier cambio de forma segura con un encabezado Idempotency-Key. Este artículo enumera todos los códigos de error de la API Notiondesk, explica los límites de velocidad y sus encabezados, y muestra cómo configurar reintentos que nunca realicen cambios dos veces.
El sobre de error de la API Notiondesk
Cada error responde con la misma forma, y cada campo siempre está 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 | Significado |
|---|---|
object | Siempre __PRESERVADO_78__ |
code | El error legible por máquina. Ramifique su código solo en este campo. |
message | Una explicación legible para humanos. Puede cambiar, así que nunca la analices. |
request_id | Identifica la solicitud cuando contactas con soporte. null cuando la solicitud falló antes de llegar a una ruta, por ejemplo, en una ruta desconocida. |
errors | Problemas a nivel de campo, cada uno con un field y un message. Vacío cuando el error no se refiere a una entrada específica. |
Cómo field nombra un valor
- Un campo de nivel superior es su nombre:
page_size.
- Un campo dentro de una lista nombra la lista, la entrada entre corchetes y luego el campo:
items[fr].page_title.
- El corchete contiene el identificador de la entrada tal como lo enviaste (el
localeenitems, elcategory_idenchangelog_categories) cuando cada entrada tiene uno distinto. De lo contrario, contiene la posición de la entrada basada en cero:items[0].locale.
- Se ha detectado un problema con la solicitud en su conjunto (
"field": null).
Códigos de error de la API Notiondesk
code | estado HTTP | Significado | ¿Qué hacer? |
|---|---|---|---|
authentication_error | 401 | La clave o el token de acceso no se pueden utilizar. | Verifique la clave, su fecha de vencimiento y el plan. Consulte Autenticarse con la API Notiondesk. |
insufficient_scope | 403 | La credencial carece del alcance que requiere la ruta. | Utilice una clave con el ámbito especificado en WWW-Authenticate |
permission_denied | 402, 403 | La credencial no puede realizar esta acción en este recurso, por ejemplo, porque el plan carece de la función. | Comprueba el plan y la configuración del centro de ayuda. No lo vuelvas a intentar sin cambios. |
invalid_version | 400 | El encabezado nd-version nombra una versión desconocida. | Enviar 2026-10-16 o dejar el encabezado fuera |
validation_error | 400, 422 | Un parámetro o campo del cuerpo no es válido, es desconocido o está fuera de rango. | Corrige los campos que aparecen en errors. |
not_found | 404, 405 | La ruta, el recurso o el método no existe. | Comprueba los identificadores y el método. |
conflict_error | 409 | La solicitud entra en conflicto con el estado actual; por ejemplo, ya se está ejecutando una sincronización. | Espera y vuelve a intentarlo. |
idempotency_key_invalid | 400 | El encabezado Idempotency-Key está vacío o tiene más de 255 caracteres. | Enviar de 1 a 255 caracteres |
idempotency_key_reused | 422 | El Idempotency-Key ya se utilizó para otra solicitud. | Utilice una nueva clave para una nueva solicitud. |
request_in_progress | 409 | Todavía se está ejecutando una solicitud con el mismo Idempotency-Key. | Espera y vuelve a intentarlo con la misma clave. |
rate_limited | 429 | Demasiadas solicitudes | Espere Retry-After segundos |
internal_error | 500 y más | Notiondesk falló | Inténtalo de nuevo más tarde y menciona request_id si te pones en contacto con el soporte técnico. |
Una solicitud de un centro de ayuda o recurso fuera de su espacio de trabajo devuelve el error 404 not_found, por lo que la API nunca revela si existe.
Límites de velocidad de la API
Cada clave API y cada concesión OAuth tiene dos presupuestos de solicitud, contabilizados en una ventana deslizante de un minuto:
| Presupuesto | Rutas | Solicitudes por minuto |
|---|---|---|
| Lecturas | Rutas __PRESERVADAS_38__ | 120 |
| Escribe | Rutas POST, PATCH y DELETE | 20 |
Los informes analíticos también se contabilizan dentro de un presupuesto de 30 solicitudes por minuto por centro de ayuda , compartido por cada aplicación clave y OAuth del espacio de trabajo.
Las respuestas llevan tres encabezados:
| Encabezamiento | Significado |
|---|---|
X-RateLimit-Limit | Solicitudes permitidas en la ventana actual |
X-RateLimit-Remaining | Solicitudes dejadas en la ventana actual |
Retry-After | Segundos hasta que se acepte la siguiente solicitud; 0 mientras queden solicitudes |
Una solicitud que excede el presupuesto responde 429 rate_limited. Espere el número de segundos en Retry-After antes de enviar la siguiente solicitud.
Inténtalo de nuevo de forma segura con Idempotency-Key
Un tiempo de espera de red deja la duda de si se realizó un cambio. El encabezado Idempotency-Key permite enviar la misma solicitud nuevamente sin modificar nada dos veces.
Cada ruta que modifica algo lo acepta: cambios de redireccionamiento de página, actualizaciones de configuración y marca, cambios de integración y activadores de sincronización. Envíe un valor único de 1 a 255 caracteres, como un UUID, en el primer intento, y el mismo valor en cada reintento:
¿Qué sucede al reintentarlo?
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"}'| Rever | Resultado |
|---|---|
| Misma clave, mismo cuerpo, misma ruta, después de que finalizó la primera solicitud. | La primera respuesta de nuevo, estado y cuerpo incluidos, con X-Idempotent-Replay: true. Nada cambia. |
| La misma clave mientras la primera solicitud aún está en ejecución. | 409 __PRESERVADO_25__. Espere y vuelva a intentarlo. |
| Misma clave con un cuerpo, ruta o identificador de ruta diferente. | 422 __CONSERVADO_24__ |
| La misma clave y el mismo cuerpo después de que la primera solicitud respondiera con un error. | La solicitud se ejecuta de nuevo |
Una respuesta exitosa incluye X-Idempotent-Replay: false la primera vez y true en una respuesta posterior. Notiondesk conserva una clave durante al menos 24 horas. Una clave pertenece a la clave API o concesión OAuth que la envió, y una concesión OAuth conserva sus claves entre actualizaciones de tokens.
Sin la cabecera, una solicitud se ejecuta una vez y un reintento se ejecuta de nuevo.
Una estrategia de reintento que funciona
- Genera un
Idempotency-Keypor cada cambio lógico y reutilízalo para cada reintento de ese cambio.
- En
429 rate_limited, espereRetry-Aftersegundos y vuelva a intentarlo.
- En
409 request_in_progress, espere unos segundos y vuelva a intentarlo con la misma clave. En409 conflict_error, ya se está ejecutando una sincronización del centro de ayuda: espere unos minutos antes de volver a intentarlo o omita esta ejecución.
- En caso de
500o superior, o un error de red, reintente con retroceso exponencial, por ejemplo, después de 1, 2, 4 y 8 segundos.
- Nunca vuelva a intentar
400,401,403,404o422sin cambios. Corrija la solicitud primero.
En JavaScript, para cualquier ruta que cambie algo, se detiene en conflict_error y deja esa decisión a tu código:
Preguntas frecuentes
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`);
} ¿Cuáles son los límites de velocidad de la API Notiondesk?
120 solicitudes de lectura y 20 de escritura por minuto para cada clave API o concesión OAuth, más 30 solicitudes de análisis por minuto para cada centro de ayuda. Una solicitud que supere un límite recibe una respuesta 429 con el encabezado Retry-After.
¿Qué campo debería comprobar mi código en caso de error?
code. Es el único clasificador estable y legible por máquina. El message es para personas y puede cambiar.
¿Qué debo enviar al servicio de soporte cuando falla una solicitud?
El request_id de la respuesta de error, la ruta que llamó y la hora de la solicitud.
¿Es seguro volver a intentar activar un disparador de sincronización?
Sí, con un Idempotency-Key. Un reintento con la misma clave responde de nuevo al primer resultado y no pone nada en cola. Sin una clave, un segundo activador de sincronización del sitio mientras el primero está en ejecución responde 409 conflict_error.