Gestionar errores de la API Notiondesk, límites de velocidad y reintentos.

Notiondesk Códigos de error de API y sobre, límites de velocidad de 120 lecturas y 20 escrituras por minuto, Retry-After y reintentos seguros con Idempotency-Key.

7 min de lectura

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
objectSiempre __PRESERVADO_78__
codeEl error legible por máquina. Ramifique su código solo en este campo.
messageUna explicación legible para humanos. Puede cambiar, así que nunca la analices.
request_idIdentifica la solicitud cuando contactas con soporte. null cuando la solicitud falló antes de llegar a una ruta, por ejemplo, en una ruta desconocida.
errorsProblemas 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 locale en items, el category_id en changelog_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

codeestado HTTP Significado ¿Qué hacer?
authentication_error401 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_scope403 La credencial carece del alcance que requiere la ruta. Utilice una clave con el ámbito especificado en WWW-Authenticate
permission_denied402, 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_version400 El encabezado nd-version nombra una versión desconocida. Enviar 2026-10-16 o dejar el encabezado fuera
validation_error400, 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_found404, 405 La ruta, el recurso o el método no existe. Comprueba los identificadores y el método.
conflict_error409 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_invalid400 El encabezado Idempotency-Key está vacío o tiene más de 255 caracteres. Enviar de 1 a 255 caracteres
idempotency_key_reused422 El Idempotency-Key ya se utilizó para otra solicitud. Utilice una nueva clave para una nueva solicitud.
request_in_progress409 Todavía se está ejecutando una solicitud con el mismo Idempotency-Key. Espera y vuelve a intentarlo con la misma clave.
rate_limited429 Demasiadas solicitudes Espere Retry-After segundos
internal_error500 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-LimitSolicitudes permitidas en la ventana actual
X-RateLimit-RemainingSolicitudes dejadas en la ventana actual
Retry-AfterSegundos 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.

Nota: Los límites de velocidad se contabilizan por clave o por concesión de OAuth, no por espacio de trabajo. Dos integraciones con claves independientes no se ralentizan entre sí, excepto en lo que respecta al presupuesto de análisis compartido.

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

  1. Genera un Idempotency-Key por cada cambio lógico y reutilízalo para cada reintento de ese cambio.
  1. En 429 rate_limited, espere Retry-After segundos y vuelva a intentarlo.
  1. En 409 request_in_progress, espere unos segundos y vuelva a intentarlo con la misma clave. En 409 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.
  1. En caso de 500 o superior, o un error de red, reintente con retroceso exponencial, por ejemplo, después de 1, 2, 4 y 8 segundos.
  1. Nunca vuelva a intentar 400, 401, 403, 404 o 422 sin 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.

¿Qué sigue?

Artículos relacionados

¿Fue útil esta página?

Still need help? Ask us