Referência abrangente de todos os códigos de erro na API GraphQL da Blue, organizada por categoria
Formato de Resposta de Erro
A API GraphQL da Blue retorna erros em um formato padronizado seguindo a especificação GraphQL. Quando um erro ocorre, a resposta inclui um array errors
com informações detalhadas sobre o que deu errado.
Exemplo de Resposta de Erro
{
"errors": [
{
"message": "Todo was not found.",
"extensions": {
"code": "TODO_NOT_FOUND"
}
}
]
}
Estrutura do Erro
Cada objeto de erro contém:
- mensagem: Uma descrição legível por humanos do erro
- extensions.code: Um código de erro legível por máquina para tratamento programático
Segurança de Erro em Produção
A Blue implementa um sistema de segurança para exposição de erros:
- Erros Seguros: Exibir códigos e mensagens de erro reais para os clientes
- Erros Não-Seguros: Retornar
INTERNAL_SERVER_ERROR
genéricos para ocultar detalhes sensíveis
- Recurso Não Encontrado: Todos os erros
*_NOT_FOUND
são considerados seguros e sempre expostos
Categorias de Erro
A Blue define 108 códigos de erro personalizados organizados nas seguintes categorias:
Erros de Autenticação e Autorização
Código de Erro |
Mensagem |
Descrição |
UNAUTHENTICATED |
"Autenticação requerida." |
A solicitação requer autenticação, mas nenhuma foi fornecida |
FORBIDDEN |
"Você não está autorizado." |
Autenticado, mas sem as permissões necessárias |
Erros de Recurso Não Encontrado (52 no total)
Recursos Principais
Código de Erro |
Mensagem |
Descrição |
TODO_NOT_FOUND |
"Todo não foi encontrado." |
Registro/todo não existe ou o usuário não tem acesso |
TODO_LIST_NOT_FOUND |
"Lista de tarefas não foi encontrada." |
Lista não existe ou o usuário não tem acesso |
PROJECT_NOT_FOUND |
"Projeto não foi encontrado." |
Projeto não existe ou o usuário não tem acesso |
COMPANY_NOT_FOUND |
"Empresa não foi encontrada." |
Empresa não existe ou o usuário não tem acesso |
USER_NOT_FOUND |
"Usuário não foi encontrado." |
Usuário não existe no sistema |
Código de Erro |
Mensagem |
Descrição |
CUSTOM_FIELD_NOT_FOUND |
"Campo personalizado não foi encontrado." |
Campo personalizado não existe |
CUSTOM_FIELD_OPTION_NOT_FOUND |
"Opção de campo personalizado não foi encontrada." |
Opção de campo de seleção não existe |
FORM_NOT_FOUND |
"Formulário não foi encontrado." |
Modelo de formulário não existe |
FORM_FIELD_NOT_FOUND |
"Campo do formulário não foi encontrado." |
Campo do formulário não existe |
Componentes do Projeto
Código de Erro |
Mensagem |
Descrição |
TAG_NOT_FOUND |
"Tag não foi encontrada." |
Tag não existe no projeto |
AUTOMATION_NOT_FOUND |
"Automação não foi encontrada." |
Regra de automação não existe |
CHART_NOT_FOUND |
"Gráfico não foi encontrado." |
Gráfico do painel não existe |
WEBHOOK_NOT_FOUND |
"Webhook não foi encontrado." |
Configuração do webhook não existe |
TEMPLATE_NOT_FOUND |
"Modelo não foi encontrado." |
Modelo de projeto não existe |
Comentários e Atividades
Código de Erro |
Mensagem |
Descrição |
COMMENT_NOT_FOUND |
"Comentário não foi encontrado." |
Comentário não existe |
ACTIVITY_NOT_FOUND |
"Atividade não foi encontrada." |
Registro de log de atividade não existe |
REACTION_NOT_FOUND |
"Reação não foi encontrada." |
Reação ao comentário não existe |
Outros Recursos
Código de Erro |
Mensagem |
Descrição |
FILE_NOT_FOUND |
"Arquivo não foi encontrado." |
Anexo de arquivo não existe |
SUBSCRIPTION_NOT_FOUND |
"Assinatura não encontrada." |
Assinatura de cobrança não existe |
INVOICE_NOT_FOUND |
"Fatura não encontrada." |
Registro de fatura não existe |
CHECKLIST_NOT_FOUND |
"Checklist não foi encontrado." |
Checklist não existe |
CHECKLIST_ITEM_NOT_FOUND |
"Item do checklist não foi encontrado." |
Item do checklist não existe |
PROJECT_ROLE_NOT_FOUND |
"Papel do projeto não foi encontrado." |
Papel de projeto personalizado não existe |
PROJECT_ACCESS_NOT_FOUND |
"Acesso ao projeto não foi encontrado." |
Acesso do usuário ao projeto não existe |
NOTIFICATION_NOT_FOUND |
"Notificação não foi encontrada." |
Notificação não existe |
DASHBOARD_NOT_FOUND |
"Painel não foi encontrado." |
Painel não existe |
KEY_NOT_FOUND |
"Chave não foi encontrada." |
Chave de configurações não existe |
Erros de Validação
Código de Erro |
Mensagem |
Descrição |
BAD_USER_INPUT |
"Entrada inválida." |
Falha de validação de entrada genérica |
VALIDATION_ERROR |
"Parâmetros inválidos" |
Parâmetros da solicitação falharam na validação |
BAD_EMAIL |
"Você precisa inserir um e-mail válido." |
Formato de e-mail inválido |
INVALID_IDS |
"IDs inválidos." |
Um ou mais IDs na solicitação são inválidos |
PHONE_INVALID |
"Telefone é inválido." |
Formato de número de telefone inválido |
URL_INVALID |
"URL é inválida." |
Formato de URL inválido |
INVALID_RECURRING_DUE_DATE |
"Data de vencimento inválida para tarefa recorrente" |
Validação da data da tarefa recorrente falhou |
INVALID_COLOR |
"Cor inválida" |
Valor de cor não corresponde ao formato esperado |
Erros de Lógica de Negócio
Limites e Quotas
Código de Erro |
Mensagem |
Descrição |
COMPANY_LIMIT |
"Você atingiu o limite de empresas para sua conta." |
Limite máximo de empresas atingido |
PROJECT_LIMIT |
"Você atingiu o limite de projetos para sua empresa." |
Limite máximo de projetos atingido |
USER_LIMIT |
"Você atingiu o limite de usuários para sua empresa." |
Limite máximo de usuários atingido |
PROJECT_TEMPLATE_LIMIT |
"Você atingiu o limite de modelos para sua empresa." |
Limite máximo de modelos atingido |
CUSTOM_FIELD_LIMIT |
"Limite de campos personalizados atingido." |
Limite máximo de campos personalizados atingido |
TODO_LIST_LIMIT |
"Você atingiu o limite de listas para seu projeto." |
Limite máximo de listas por projeto |
TOO_MANY_TODOS |
"Tantos todos." |
Limite de registros excedido |
TOO_MANY_OPTIONS |
"Muitas opções." |
Limite de opções de campo de seleção excedido |
MAX_FILE_SIZE |
"O tamanho máximo do arquivo é 4,8 GB" |
Limite de tamanho de upload de arquivo excedido |
Conflitos de Recursos
Código de Erro |
Mensagem |
Descrição |
TAG_ALREADY_EXISTS |
"Tag já existe." |
Tag com o mesmo nome existe no projeto |
COMPANY_SLUG_ALREADY_EXISTS |
"Empresa já existe." |
Slug/URL da empresa já está em uso |
USER_ALREADY_EXISTS |
"Usuário já existe." |
E-mail do usuário já registrado |
ALREADY_INVITED |
"O usuário já foi convidado." |
O usuário já tem um convite pendente |
USER_ALREADY_IN_PROJECT |
"Usuário já está neste projeto." |
O usuário já tem acesso ao projeto |
FILE_TYPE_NOT_ALLOWED |
"Tipo de arquivo não permitido." |
Tipo de arquivo enviado é restrito |
Erros de Permissão e Acesso
Código de Erro |
Mensagem |
Descrição |
UNABLE_TO_DELETE_ONLY_ADMIN |
"Não é possível excluir o único Admin na empresa." |
Não é possível remover o último admin |
UNABLE_TO_UPDATE_OWNER |
"Não é possível atualizar o PROPRIETÁRIO." |
Não é possível modificar permissões de proprietário |
TODO_LIST_IS_HIDDEN |
"Lista de tarefas está oculta." |
Lista oculta do papel do usuário |
COMPANY_NOT_ACTIVE |
"Empresa não está ativa." |
Assinatura da empresa inativa |
PROJECT_NOT_ACTIVE |
"Projeto não está ativo." |
Projeto está arquivado/inativo |
Erros de Integridade de Dados
Código de Erro |
Mensagem |
Descrição |
UNABLE_TO_DELETE_LIST_WITH_TODOS |
"Não é possível excluir lista com todos." |
A lista deve estar vazia para ser excluída |
UNABLE_TO_DELTE_FILE |
"Não é possível excluir arquivo." |
A exclusão do arquivo falhou (erro de digitação no código) |
UNABLE_TO_MOVE_TODO |
"Não é possível mover todo." |
Não é possível mover registro entre listas |
DEPENDENCY_HAS_DEPENDENCY |
"Dependência tem dependência" |
Dependência circular detectada |
TODO_DEPENDS_ON_ITSELF |
"Todo depende de si mesmo" |
Dependência autorreferencial |
Erros de Stripe/Pagamento
Código de Erro |
Mensagem |
Descrição |
STRIPE_CREATING_CUSTOMER |
"Erro ao criar cliente no stripe." |
Falha na criação do cliente no Stripe |
STRIPE_ALREADY_SUBSCRIBED |
"Já inscrito." |
Assinatura ativa existe |
STRIPE_MISSING_PAYMENT_METHOD |
"Método de pagamento ausente." |
Nenhum método de pagamento registrado |
STRIPE_CREATING_SUBSCRIPTION |
"Erro ao criar assinatura no stripe." |
Falha na criação da assinatura |
STRIPE_UPDATING_SUBSCRIPTION |
"Erro ao atualizar assinatura no stripe." |
Falha na atualização da assinatura |
STRIPE_CHECKOUT_SESSION |
"Erro ao criar sessão de checkout no stripe." |
Falha na criação da sessão de checkout |
STRIPE_CUSTOMER_PORTAL |
"Erro ao criar portal do cliente no stripe." |
Falha na criação da sessão do portal |
STRIPE_TAX_ID |
"Não foi possível salvar o ID fiscal" |
Validação/salvamento do ID fiscal falhou |
PAYMENT_REQUIRED |
"Pagamento necessário." |
Recurso requer assinatura ativa |
NO_PAYMENT_REQUIRED |
"Nenhum pagamento necessário." |
Pagamento não é necessário para a operação |
Erros de Autenticação e Sessão
Código de Erro |
Mensagem |
Descrição |
INVALID_CREDENTIALS |
"Credenciais inválidas." |
Nome de usuário/senha incorretos |
EXPIRED_RESET_TOKEN |
"Token de redefinição expirou." |
Token de redefinição de senha expirado |
OAUTH_FAILED |
"Processo OAuth falhou." |
Autenticação OAuth falhou |
SAML_NOT_ENABLED |
"SSO (SAML) não está habilitado." |
SSO SAML não configurado |
SSO_AUTO_PROVISION_DISABLED |
"Provisionamento automático está desativado." |
Não é possível criar usuários SSO automaticamente |
Limitação de Taxa
A limitação de taxa é tratada pelo pacote graphql-rate-limit
com diferentes configurações:
Tipo de Limite |
Janela |
Máx. Solicitações |
Aplicado a |
Standard |
60s |
500 |
Most queries/mutations |
Sensitive |
300s |
10 |
Password reset, auth operations |
Expensive |
60s |
20 |
Complex queries, bulk operations |
Search |
60s |
60 |
Search operations |
File Upload |
60s |
100 |
File upload operations |
Quando a taxa é limitada, você receberá um erro padrão do GraphQL com uma mensagem indicando que o limite foi excedido.
Erros do Sistema e Internos
Código de Erro |
Mensagem |
Descrição |
INTERNAL_SERVER_ERROR |
"Erro interno do servidor." |
Erro genérico para erros não seguros em produção |
UNKNOWN_ERROR |
"Erro desconhecido." |
Ocorreu um erro inesperado |
RESOLVER_NOT_FOUND |
"Resolvedor não encontrado" |
Resolver GraphQL ausente |
FIELD_NOT_IN_SCHEMA |
"Campo não está no esquema" |
Campo solicitado não existe |
Melhores Práticas para Tratamento de Erros
Tratamento do Lado do Cliente
try {
const result = await client.mutate({
mutation: CREATE_TODO,
variables: { input }
});
} catch (error) {
if (error.graphQLErrors?.length > 0) {
const errorCode = error.graphQLErrors[0].extensions?.code;
switch (errorCode) {
case 'UNAUTHENTICATED':
// Redirect to login
break;
case 'TODO_NOT_FOUND':
// Show "Record not found" message
break;
case 'VALIDATION_ERROR':
// Display validation errors
break;
default:
// Show generic error message
}
}
}
Cenários Comuns de Erro
- Autenticação Requerida:
UNAUTHENTICATED
- O usuário precisa fazer login
- Permissão Negada:
FORBIDDEN
- O usuário não possui o papel/permissão necessária
- Recurso Não Encontrado:
*_NOT_FOUND
- O recurso não existe ou o usuário não pode acessá-lo
- Validação Falhou:
VALIDATION_ERROR
, BAD_USER_INPUT
- Verifique os parâmetros de entrada
- Limite de Taxa: Verifique os cabeçalhos de limite de taxa e implemente um retrocesso
- Pagamento Necessário:
PAYMENT_REQUIRED
- O recurso requer uma assinatura
Documentação Relacionada