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 |
|---|---|
object | Sempre __PRESERVADO_78__ |
code | O erro legível por máquina. Derive seu código apenas neste campo. |
message | Uma explicação em linguagem acessível a humanos. Ela pode mudar, então nunca a interprete de forma incorreta. |
request_id | Identifica 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. |
errors | Problemas 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
localeemitems, ocategory_idemchangelog_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
code | Status HTTP | Significado | O que fazer |
|---|---|---|---|
authentication_error | 401 | 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_scope | 403 | A credencial não possui o escopo necessário para a rota. | Use uma chave com o escopo nomeado em WWW-Authenticate |
permission_denied | 402, 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_version | 400 | O cabeçalho nd-version nomeia uma versão desconhecida. | Envie 2026-10-16 ou omita o cabeçalho. |
validation_error | 400, 422 | Um parâmetro ou campo do corpo é inválido, desconhecido ou está fora do intervalo. | Corrija os campos listados em errors |
not_found | 404, 405 | O caminho, o recurso ou o método não existe. | Verifique os IDs e o método. |
conflict_error | 409 | 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_invalid | 400 | O cabeçalho Idempotency-Key está vazio ou tem mais de 255 caracteres. | Enviar de 1 a 255 caracteres |
idempotency_key_reused | 422 | O campo Idempotency-Key já foi utilizado para outra solicitação. | Use uma nova chave para uma nova solicitação. |
request_in_progress | 409 | Uma solicitação com o mesmo Idempotency-Key ainda está em execução. | Aguarde e tente novamente com a mesma chave. |
rate_limited | 429 | Muitos pedidos | Aguarde Retry-After segundos |
internal_error | 500 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-Limit | Solicitações permitidas na janela atual. |
X-RateLimit-Remaining | Solicitações deixadas na janela atual |
Retry-After | Segundos 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.
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
- Gere um
Idempotency-Keypor alteração lógica e reutilize-o para cada nova tentativa dessa alteração.
- Em
429 rate_limited, aguardeRetry-Aftersegundos e tente novamente.
- Em
409 request_in_progress, aguarde alguns segundos e tente novamente com a mesma chave. Em409 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.
- Em versões
500e superiores, ou em caso de erro de rede, tente novamente com recuo exponencial, por exemplo, após 1, 2, 4 e 8 segundos.
- Nunca tente novamente
400,401,403,404ou422sem 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.