Lidar com erros da API Notiondesk, limites de taxa e novas tentativas.

Códigos de erro e envelope da API Notiondesk, limites de taxa de 120 leituras e 20 gravações por minuto, Retry-After e novas tentativas seguras com Idempotency-Key.

7 min de leitura

A API Notiondesk responde a todos os erros com o mesmo envelope JSON e um cabeçalho code legível por máquina, limita cada chave a 120 leituras e 20 gravações por minuto e permite que você tente novamente qualquer alteração com segurança usando um cabeçalho Idempotency-Key. Este artigo lista todos os códigos de erro da API Notiondesk, explica os limites de taxa e seus respectivos cabeçalhos e mostra como criar novas tentativas que nunca alterem nada duas vezes.

O envelope de erro da API Notiondesk

Todas as respostas de erro têm o mesmo formato e todos os campos estão sempre presentes:

{
  "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
objectSempre __PRESERVADO_78__
codeO erro legível por máquina. Derive seu código apenas neste campo.
messageUma explicação em linguagem acessível a humanos. Ela pode mudar, então nunca a interprete de forma incorreta.
request_idIdentifica a solicitação quando você entra em contato com o suporte. null quando a solicitação falhou antes de alcançar uma rota, por exemplo, em um caminho desconhecido.
errorsProblemas de nível de campo, cada um com um field e um message. Vazio quando o erro não se refere a uma entrada específica.

Como field nomeia um valor

  • Um campo de nível superior é o seu nome: page_size.
  • Um campo dentro de uma lista nomeia a lista, a entrada entre colchetes e, em seguida, o campo: items[fr].page_title.
  • O colchete armazena o identificador da entrada conforme você o enviou (o locale em items, o category_id em changelog_categories) quando cada entrada possui um identificador distinto. Caso contrário, ele armazena a posição da entrada, baseada em zero: items[0].locale.
  • Um problema com a solicitação como um todo foi "field": null.

Códigos de erro da API Notiondesk

codeStatus HTTP Significado O que fazer
authentication_error401 A chave ou o token de acesso está ausente ou não pode ser usado. Verifique a chave, sua data de expiração e o plano. Consulte Autenticar com a API Notiondesk.
insufficient_scope403 A credencial não possui o escopo necessário para a rota. Use uma chave com o escopo nomeado em WWW-Authenticate
permission_denied402, 403 A credencial não pode executar esta ação neste recurso, por exemplo, porque o plano não possui a funcionalidade necessária. Verifique o plano e as configurações da central de ajuda. Não tente novamente sem alterar as configurações.
invalid_version400 O cabeçalho nd-version nomeia uma versão desconhecida. Envie 2026-10-16 ou omita o cabeçalho.
validation_error400, 422 Um parâmetro ou campo do corpo é inválido, desconhecido ou está fora do intervalo. Corrija os campos listados em errors
not_found404, 405 O caminho, o recurso ou o método não existe. Verifique os IDs e o método.
conflict_error409 A solicitação entra em conflito com o estado atual; por exemplo, uma sincronização já está em execução. Aguarde e tente novamente.
idempotency_key_invalid400 O cabeçalho Idempotency-Key está vazio ou tem mais de 255 caracteres. Enviar de 1 a 255 caracteres
idempotency_key_reused422 O campo Idempotency-Key já foi utilizado para outra solicitação. Use uma nova chave para uma nova solicitação.
request_in_progress409 Uma solicitação com o mesmo Idempotency-Key ainda está em execução. Aguarde e tente novamente com a mesma chave.
rate_limited429 Muitos pedidos Aguarde Retry-After segundos
internal_error500 ou mais Notiondesk falhou Tente novamente mais tarde e cite o código request_id se entrar em contato com o suporte.

Uma solicitação de um centro de ajuda ou recurso fora do seu espaço de trabalho retorna 404 not_found, portanto a API nunca revela se ele existe.

Notiondesk limites de taxa da API

Cada chave de API e cada concessão OAuth possui dois orçamentos de requisição, contabilizados em uma janela deslizante de um minuto:

Orçamento Rotas Solicitações por minuto
Lê GET rotas 120
Escreve rotas POST, PATCH e DELETE 20

Os relatórios analíticos também são contabilizados em um orçamento de 30 solicitações por minuto por central de ajuda , compartilhado por todas as chaves e aplicativos OAuth do espaço de trabalho.

As respostas contêm três cabeçalhos:

Cabeçalho Significado
X-RateLimit-LimitSolicitações permitidas na janela atual.
X-RateLimit-RemainingSolicitações deixadas na janela atual
Retry-AfterSegundos até que a próxima solicitação seja aceita; 0 enquanto as solicitações permanecerem

Uma solicitação acima do orçamento responde 429 rate_limited. Aguarde o número de segundos em Retry-After antes de enviar a próxima solicitação.

Observação: os limites de taxa são contabilizados por chave ou por concessão OAuth, não por espaço de trabalho. Duas integrações com chaves separadas não afetam o desempenho uma da outra, exceto no orçamento de análise compartilhado.

Tente novamente com segurança com Idempotency-Key

Um tempo limite de rede deixa você na dúvida se uma alteração foi efetivada. O cabeçalho Idempotency-Key permite que você envie a mesma solicitação novamente sem precisar alterar nada duas vezes.

Cada rota que altera algo aceita a mudança: alterações de redirecionamento de página, atualizações de configurações e identidade visual, alterações de integração e gatilhos de sincronização. Envie um valor exclusivo de 1 a 255 caracteres, como um UUID, na primeira tentativa e o mesmo valor em todas as tentativas subsequentes.

O que acontece em uma nova tentativa:

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"}'
Tentar novamente Resultado
Mesma chave, mesmo corpo, mesma rota, após a primeira requisição ser concluída. A primeira resposta novamente, incluindo status e corpo, com X-Idempotent-Replay: true. Nada muda.
A mesma chave é usada enquanto a primeira solicitação ainda está em execução. 409 __PRESERVADO_25__. Aguarde e tente novamente.
Mesma chave com IDs de corpo, rota ou caminho diferentes 422 __PRESERVADO_24__
Mesma chave e mesmo corpo após a primeira solicitação resultar em erro. A solicitação é executada novamente.

Uma resposta bem-sucedida carrega X-Idempotent-Replay: false na primeira vez e true em uma repetição. Notiondesk mantém uma chave por pelo menos 24 horas. Uma chave pertence à chave de API ou à concessão OAuth que a enviou, e uma concessão OAuth mantém suas chaves mesmo após a atualização do token.

Sem o cabeçalho, a solicitação é executada uma vez e, em caso de nova tentativa, é executada novamente.

Uma estratégia de repetição que funciona

  1. Gere um Idempotency-Key por alteração lógica e reutilize-o para cada nova tentativa dessa alteração.
  1. Em 429 rate_limited, aguarde Retry-After segundos e tente novamente.
  1. Em 409 request_in_progress, aguarde alguns segundos e tente novamente com a mesma chave. Em 409 conflict_error, uma sincronização da central de ajuda já está em andamento: aguarde alguns minutos antes de tentar novamente ou ignore esta execução.
  1. Em versões 500 e superiores, ou em caso de erro de rede, tente novamente com recuo exponencial, por exemplo, após 1, 2, 4 e 8 segundos.
  1. Nunca tente novamente 400, 401, 403, 404 ou 422 sem alterações. Corrija a solicitação primeiro.

Em JavaScript, para qualquer rota que altere algo, o código para em conflict_error e deixa essa decisão para o seu código:

Perguntas frequentes

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

Quais são os limites de taxa da API Notiondesk?

São permitidas 120 solicitações de leitura e 20 solicitações de gravação por minuto para cada chave de API ou concessão OAuth, além de 30 solicitações de análise por minuto para cada central de ajuda. Uma solicitação que exceda o limite retorna o código 429 com o cabeçalho Retry-After.

Em qual campo meu código deve ocorrer um erro?

__PRESERVADO_8__. É o único classificador estável e legível por máquina. O __PRESERVADO_7__ é para pessoas e pode mudar.

O que devo enviar ao suporte quando uma solicitação falhar?

O valor request_id da resposta de erro, a rota que você chamou e a hora da solicitação.

É seguro tentar novamente um gatilho de sincronização?

Sim, com um Idempotency-Key. Uma nova tentativa com a mesma chave retorna o primeiro resultado e não enfileira nada. Sem uma chave, um segundo gatilho de sincronização do site enquanto o primeiro está em execução retorna 409 conflict_error.

O que vem a seguir?

Artigos relacionados

Esta página foi útil?

Still need help? Ask us