Skip to content

Erros da API

Referência completa dos códigos de erro da API Interflow.

EM ATUALIZAÇÃO

Esta documentação está em fase de atualização contínua.

Formato de Erro

Todas as respostas de erro seguem o formato:

json
{
  "success": false,
  "error": {
    "code": "ERROR_CODE",
    "message": "Descrição legível do erro",
    "details": [
      {
        "field": "campo_com_erro",
        "message": "Detalhes específicos"
      }
    ]
  }
}

Códigos HTTP

400 Bad Request

Requisição malformada ou com parâmetros inválidos.

json
{
  "success": false,
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "Dados de entrada inválidos",
    "details": [
      {
        "field": "email",
        "message": "Email inválido"
      }
    ]
  }
}

Causas comuns:

  • JSON malformado
  • Campos obrigatórios ausentes
  • Tipos de dados incorretos
  • Valores fora do range permitido

401 Unauthorized

Autenticação falhou ou não foi fornecida.

json
{
  "success": false,
  "error": {
    "code": "UNAUTHORIZED",
    "message": "API Key inválida ou ausente"
  }
}

Causas comuns:

  • Header Authorization ausente
  • API Key inválida
  • API Key revogada
  • Formato incorreto do token

403 Forbidden

Autenticação válida, mas sem permissão.

json
{
  "success": false,
  "error": {
    "code": "FORBIDDEN",
    "message": "Sem permissão para este recurso"
  }
}

Causas comuns:

  • API Key sem a permissão necessária
  • Tentando acessar recurso de outra organização
  • Recurso desabilitado no plano atual

404 Not Found

Recurso não encontrado.

json
{
  "success": false,
  "error": {
    "code": "NOT_FOUND",
    "message": "Cliente não encontrado"
  }
}

Causas comuns:

  • ID inexistente
  • Recurso foi deletado
  • URL incorreta

409 Conflict

Conflito com o estado atual do recurso.

json
{
  "success": false,
  "error": {
    "code": "CONFLICT",
    "message": "Email já está em uso"
  }
}

Causas comuns:

  • Tentativa de criar recurso duplicado
  • Violação de constraint único

422 Unprocessable Entity

Requisição válida mas não pode ser processada.

json
{
  "success": false,
  "error": {
    "code": "CHANNEL_DISCONNECTED",
    "message": "O canal está desconectado"
  }
}

Causas comuns:

  • Canal de mensagem desconectado
  • Limite de recursos atingido
  • Dependência não satisfeita

429 Too Many Requests

Rate limit excedido.

json
{
  "success": false,
  "error": {
    "code": "RATE_LIMIT_EXCEEDED",
    "message": "Limite de requisições excedido. Tente novamente em 60 segundos."
  }
}

Headers de resposta:

http
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1640995260
Retry-After: 60

500 Internal Server Error

Erro interno do servidor.

json
{
  "success": false,
  "error": {
    "code": "INTERNAL_ERROR",
    "message": "Erro interno do servidor"
  }
}

503 Service Unavailable

Serviço temporariamente indisponível.

json
{
  "success": false,
  "error": {
    "code": "SERVICE_UNAVAILABLE",
    "message": "Serviço temporariamente indisponível. Tente novamente mais tarde."
  }
}

Códigos de Erro Específicos

Autenticação

CódigoDescrição
UNAUTHORIZEDAPI Key inválida ou ausente
TOKEN_EXPIREDToken expirado
INVALID_TOKENToken malformado
REVOKED_KEYAPI Key foi revogada

Validação

CódigoDescrição
VALIDATION_ERRORErro de validação genérico
REQUIRED_FIELDCampo obrigatório ausente
INVALID_FORMATFormato inválido
OUT_OF_RANGEValor fora do range
INVALID_TYPETipo de dado incorreto

Recursos

CódigoDescrição
NOT_FOUNDRecurso não encontrado
CUSTOMER_NOT_FOUNDCliente não encontrado
CHANNEL_NOT_FOUNDCanal não encontrado
CHAT_NOT_FOUNDChat não encontrado
MESSAGE_NOT_FOUNDMensagem não encontrada

Mensagens

CódigoDescrição
CHANNEL_DISCONNECTEDCanal desconectado
TEMPLATE_NOT_APPROVEDTemplate não aprovado
INVALID_PHONENúmero de telefone inválido
MESSAGE_TOO_LONGMensagem muito longa
UNSUPPORTED_MEDIATipo de mídia não suportado
FILE_TOO_LARGEArquivo muito grande

Rate Limiting

CódigoDescrição
RATE_LIMIT_EXCEEDEDLimite de requisições excedido
QUOTA_EXCEEDEDCota do plano excedida

Permissões

CódigoDescrição
FORBIDDENSem permissão genérica
INSUFFICIENT_PERMISSIONSPermissões insuficientes
ORGANIZATION_MISMATCHRecurso pertence a outra organização

Tratamento de Erros

JavaScript/TypeScript

javascript
async function sendMessage(data) {
  try {
    const response = await fetch('https://api.interflow.chat/v1/messages/send', {
      method: 'POST',
      headers: {
        'Authorization': `Bearer ${apiKey}`,
        'Content-Type': 'application/json'
      },
      body: JSON.stringify(data)
    });

    const result = await response.json();

    if (!result.success) {
      switch (result.error.code) {
        case 'VALIDATION_ERROR':
          console.error('Dados inválidos:', result.error.details);
          break;
        case 'CHANNEL_DISCONNECTED':
          console.error('Canal desconectado, reconecte o canal');
          break;
        case 'RATE_LIMIT_EXCEEDED':
          console.error('Aguarde antes de tentar novamente');
          break;
        default:
          console.error('Erro:', result.error.message);
      }
      return null;
    }

    return result.data;
  } catch (error) {
    console.error('Erro de rede:', error);
    return null;
  }
}

Python

python
import requests

def send_message(data):
    try:
        response = requests.post(
            'https://api.interflow.chat/v1/messages/send',
            headers={
                'Authorization': f'Bearer {api_key}',
                'Content-Type': 'application/json'
            },
            json=data
        )
        
        result = response.json()
        
        if not result.get('success'):
            error = result.get('error', {})
            error_code = error.get('code')
            
            if error_code == 'VALIDATION_ERROR':
                print(f"Dados inválidos: {error.get('details')}")
            elif error_code == 'RATE_LIMIT_EXCEEDED':
                print("Limite excedido, aguarde...")
            else:
                print(f"Erro: {error.get('message')}")
            
            return None
            
        return result.get('data')
        
    except requests.exceptions.RequestException as e:
        print(f"Erro de rede: {e}")
        return None

Boas Práticas

Retry com Backoff

Para erros temporários (5xx, 429), implemente retry com backoff exponencial:

javascript
async function requestWithRetry(fn, maxRetries = 3) {
  for (let i = 0; i < maxRetries; i++) {
    try {
      return await fn();
    } catch (error) {
      if (i === maxRetries - 1) throw error;
      
      const delay = Math.pow(2, i) * 1000; // 1s, 2s, 4s
      await new Promise(r => setTimeout(r, delay));
    }
  }
}

Logging

Registre erros para debugging:

javascript
function logError(error, context) {
  console.error({
    timestamp: new Date().toISOString(),
    code: error.code,
    message: error.message,
    context: context
  });
}

Próximos Passos

Documentação em constante atualização