Docs do Nodaro
DocumentaçãoReferência de nósModelosAgentes de IA (MCP)DesenvolvedoresSelf-hostingPesquisa
API REST

Erros

Todo erro da API do Nodaro tem status HTTP e código estável em um envelope. Veja o que cada código significa, quais repetir e como jobs relatam falhas.

Todo erro da API do Nodaro retorna um status HTTP e um envelope JSON com um code estável, para que o seu cliente decida o tratamento pelo código em vez de analisar mensagens. Há dois tipos de falha. Um erro de requisição acontece quando a própria chamada é recusada e nada começa. Uma falha de job acontece quando uma geração que começou falha depois e informa o motivo no job.

O envelope de erro

{ "error": { "code": "rate_limited", "message": "Too many requests. Max 30 per minute." } }
  • code é um slug estável. Decida o tratamento por ele.
  • message é um texto para pessoas. Ele pode mudar, então nunca use esse texto em comparações.
  • Alguns erros adicionam campos, listados com cada código abaixo. A maioria fica dentro de error. already_running coloca executionId ao lado de error, e uma verificação de limite de uso que falha antes da execução coloca required e remaining no nível superior.

O endpoint de token do OAuth é a única exceção: ele responde no formato do OAuth, por exemplo { "error": "invalid_grant", "error_description": "…" }. Veja Apps OAuth.

Quais erros tentar de novo

StatusO que fazer
5xxNormalmente temporário. Tente de novo com backoff exponencial.
429Espere e tente de novo com backoff: por exemplo, 5, depois 10, depois 20 segundos. Respeite o cabeçalho Retry-After quando ele existir.
402Adicione créditos, ou peça orçamento a um administrador do espaço de trabalho, e tente de novo.
Outros 4xxCorrija a requisição primeiro. A mesma requisição falha de novo.

Três erros de servidor exigem cuidado:

  • 503 price_not_configured não dá certo em uma nova tentativa: o modelo não tem preço nesta implantação até o operador dela definir um.
  • 503 provider_unavailable na rota assíncrona de saída estruturada de LLM é permanente em uma instalação que envia as chamadas de modelos de linguagem para o nodaro.ai.
  • Na publicação em redes sociais, 503 publish_retryable significa que nada foi publicado e que é seguro enviar a mesma requisição de novo. Já 500 publish_failed significa que o resultado é desconhecido, e enviar de novo pode publicar duas vezes.

Códigos de erro

400 Bad Request

CódigoSignificado
validation_errorUm corpo malformado, um UUID inválido, um campo inválido ou um cursor malformado.
limit_reachedVocê já tem 10 tokens de API, ativos ou não. Exclua um primeiro.
invalid_workflowUma entrada de workflowIds de um token não é um workflow do seu espaço pessoal.
token_workspace_mismatchUm token vinculado a um espaço de trabalho foi enviado com um cabeçalho X-Nodaro-Workspace que indica outro.
locked_fieldUma execução tentou mudar para onde um nó externo envia dados ou de onde ele os busca. Veja O que uma execução não pode mudar.
image_requiredPOST /v1/generate-video sem quadro inicial, em um modelo que não consegue fazer vídeo a partir de texto. A mensagem diz se referências funcionariam no lugar dele.
sequence_execution_requiredA execução inclui nós de produção do Studio que precisam ser gerados pela API de produções do Studio.
not_workspace_scopedVocê mudou visibility em um workflow que não está em um espaço de trabalho.
advanced_mode_unsupportedadvancedMode: true em um modelo que não tem uma via direta.

401 Unauthorized

CódigoSignificado
unauthorizedO token está ausente, é inválido, expirou ou foi revogado.

402 Payment Required

Estes códigos vêm do Nodaro Cloud e das implantações que fazem cobrança.

CódigoCampos extrasSignificado
insufficient_creditsrequired, balanceA conta ficou sem créditos. Em uma implantação com uma única conta de cobrança, significa que o saldo compartilhado da implantação está vazio: o erro então traz required, mas nunca balance, e só a conta de cobrança pode adicionar créditos.
insufficient_app_creditsA execução de um app publicado: a conta ficou sem créditos.
budget_exceededTrabalho pago por um espaço de trabalho: o orçamento do espaço de trabalho não cobre a execução. Peça mais a um administrador do espaço de trabalho.
member_cap_exceededTrabalho pago por um espaço de trabalho: o seu próprio limite de gastos nesse espaço de trabalho foi atingido.
user_allowance_exceededrequired, remainingUma implantação com uma única conta de cobrança que aplica limites de uso por usuário: o seu limite de uso não cobre a execução. Só a conta de cobrança pode aumentá-lo.
instance_cap_reachedUm token OAuth de uma instalação self-hosted conectada: a instalação gastou o limite mensal dela na conta que a conectou. Aumente ou remova o limite em Instâncias conectadas.

403 Forbidden

CódigoCampos extrasSignificado
forbiddenO escopo de workflows do token não inclui este workflow, ou a rota precisa de uma sessão com login. Veja Autenticação.
insufficient_scopemissingScopeUm token OAuth não tem um escopo de que a rota precisa. Peça de novo o consentimento do usuário, com o escopo mais amplo.
in_app_onlyA rota existe só para o app web do Nodaro, como o Workflow Copilot.
node_not_availableEsta implantação não oferece à sua conta o nó, ou a opção que você escolheu nele. A mensagem diz qual é. Nada é cobrado.
model_not_availableO provider que você enviou indica um modelo que esta implantação não oferece. Escolha outro modelo. Nada é cobrado.
edition_requiredrequired_editionA rota precisa de uma edição superior: cloud para a derivação de pipelines, business para o gerenciamento de tokens de API.
not_a_memberO cabeçalho X-Nodaro-Workspace indica um espaço de trabalho do qual você não é membro ativo.
member_suspendedA sua participação no espaço de trabalho está suspensa.
personal_space_disabledA sua organização só permite criar trabalho dentro de um espaço de trabalho. Envie o cabeçalho do espaço de trabalho.
project_create_not_allowedSó os administradores do espaço de trabalho podem criar projetos.
workspace_archivedUma escrita em um espaço de trabalho arquivado, como compartilhar um workflow. Criar trabalho nele responde 409 em vez disso.
not_permittedVocê não pode mover este workflow, ou não pode movê-lo para esse destino.
sso_requiredA implantação restringe o login ao provedor de identidade dela, e a conta desta sessão não foi criada por ele. Os tokens não são afetados.
subscription_requiredUma conta de pagamento por uso tentou gastar créditos pelo editor web. Os créditos do pagamento por uso funcionam pela API, pelo SDK, pela CLI e pelo MCP, então as chamadas com token nunca recebem este código.
api_tokens_payer_onlyEm uma implantação com uma única conta de cobrança, só essa conta pode criar tokens de API.
payer_balance_jwt_onlyEm uma implantação assim, a conta de cobrança leu o saldo compartilhado com um token. Só a própria sessão do navegador dela pode fazer isso.
payer_requiredUma rota de cobrança da implantação foi chamada por algo que não é a sessão do navegador da conta de cobrança.

404 Not Found

CódigoSignificado
not_foundO recurso não existe, ou você não pode vê-lo. As duas situações têm deliberadamente a mesma resposta, para que um ID nunca revele se algo existe.
workspace_not_foundUm trabalho pago por um espaço de trabalho indica um espaço de trabalho que não existe.

409 Conflict

CódigoCampos extrasSignificado
already_runningexecutionIdO workflow já tem uma execução ativa. Em vez disso, consulte essa execução periodicamente.
workflow_conflictcurrentVersion, currentUpdatedAt, currentRecordO workflow mudou desde a versão que você enviou. Mescle as suas mudanças com currentRecord e salve de novo.
workspace_archivedVocê tentou criar ou mover trabalho para um espaço de trabalho arquivado.
workspace_has_no_default_projectUma criação em um espaço de trabalho não indicou nenhum projeto, e o espaço de trabalho não tem nenhum. Indique um projeto.
move_blockedO trabalho foi criado para uma atividade e não pode ser movido.
production_capability_requiredUm salvamento genérico de workflow alterou uma produção do Studio que precisa da própria API.
retained_image_in_useUma exclusão removeria imagens protegidas, ou uma produção ainda tem jobs usando essas imagens. Termine ou cancele esses jobs primeiro.

413, 422 e 429

StatusCódigoSignificado
413A sua conta passou do limite de armazenamento. O SDK lança StorageExceededError com limitBytes.
422job_blockedA política de jobs da implantação recusou a geração antes da execução. Nenhum job foi criado e nada foi cobrado. Mostre message ao seu usuário como está e não repita a mesma requisição.
422upload_blockedA política de upload da implantação recusou um arquivo antes de ele ser armazenado. Mostre message como está.
422offsets_not_appliedO POST /v1/edit-plan recebeu um campo offsets bruto. Grave antes cada deslocamento na origem dele, como sources[].offsetMs. Veja Plano de edição.
422master_offsetO POST /v1/edit-plan recebeu um deslocamento diferente de 0 na origem mestre, ou na origem a partir da qual a transcrição foi feita. Nada é cobrado.
429rate_limitedO limite por token de um token de API pessoal.
429rate_limit_exceededQualquer outro limite: por endereço, por rota ou as execuções diárias de um app publicado.
429too_many_downloadsVocê já tem 4 importações de vídeo em andamento.

Os códigos job_blocked e upload_blocked só acontecem em implantações que registram uma política desse tipo. Veja Limites de taxa para os códigos 429.

500 e 503

StatusCódigoSignificado
500internal_errorUm erro do servidor ou uma falha de um serviço do qual ele depende. Tente de novo com backoff.
503price_not_configuredO modelo solicitado não tem preço nesta implantação, então o servidor recusa em vez de cobrar errado. Tentar de novo não adianta.
503rate_limit_unavailableUma rota que gasta créditos não conseguiu verificar o limite de taxa dela. Tente de novo mais tarde.
503provider_unavailableO provedor do modelo não está disponível.
503billing_unavailableO relatório de uso ainda não está disponível nesta instância.

Quando um job falha depois

Uma requisição bem-sucedida ainda pode produzir um job que falha. O job então traz error_message e, em dois tipos de falha, um error_hint estruturado:

  • { "kind": "safety-block", "class": "copyright" | "likeness" | "safety", "retried": boolean, "suggestedProvider"?: string } quando o filtro de segurança de um modelo bloqueou a requisição.
  • { "kind": "policy-block", "policyId": string, "reason": string, "hookPoint": "request" | "result" } quando a política de uma implantação rejeitou a requisição.

Os dois casos são sempre reembolsados, e o credit_status do job mostra isso. Leia Por que um job falhou para saber o que cada campo significa e quando tentar outro modelo.

Erros no SDK

O @nodaro/sdk lança um erro tipado para cada resposta com falha. Capture primeiro a classe mais específica:

ClasseStatusCampos extras
UnauthorizedError401
ForbiddenError403missingScope quando o código é insufficient_scope
NotFoundError404
InsufficientCreditsError402required, available
StorageExceededError413limitBytes
WorkflowConflictError409currentVersion, currentUpdatedAt, currentRecord. Também usado no conflito production_busy do Studio.
RateLimitedError429
JobBlockedError422
StudioOpError4xxopIndex: qual operação de um lote do Studio foi recusada
NodaroErrorqualquerA classe base: code, status e message
import {
  NodaroError,
  ForbiddenError,
  InsufficientCreditsError,
  RateLimitedError,
} from '@nodaro/sdk'

try {
  await client.workflows.run(workflowId)
} catch (err) {
  if (err instanceof InsufficientCreditsError) {
    showPaywall({ required: err.required, available: err.available })
  } else if (err instanceof ForbiddenError && err.missingScope) {
    requestConsent([err.missingScope])
  } else if (err instanceof RateLimitedError) {
    await new Promise((r) => setTimeout(r, 5_000))
  } else if (err instanceof NodaroError) {
    console.error(`API error ${err.status} (${err.code}): ${err.message}`)
  } else {
    throw err // a network failure, not an API error
  }
}

As funções auxiliares de consulta periódica adicionam erros próprios, como JobFailedError e JobTimeoutError. Veja Executar um único nó.

Erros na CLI

Código de saídaSignificado
0Sucesso.
1Não autorizado, não encontrado, um argumento errado ou um erro de rede.
2O --watch terminou e a execução falhou.
3O --watch parou porque o job está retido para revisão. Não é uma falha: verifique de novo mais tarde.
130O --watch terminou e a execução foi cancelada.

Com --json, a CLI imprime o payload e sai normalmente em vez de usar os códigos 2, 3 e 130, então verifique .status você mesmo.

Perguntas frequentes

Última atualização

Nesta página