Skip to main content
A API Upay utiliza códigos de status HTTP convencionais para indicar o sucesso ou falha de uma requisição. Códigos na faixa 2xx indicam sucesso, códigos na faixa 4xx indicam erros causados por informações fornecidas (ex: parâmetro obrigatório faltando, autenticação falhou, etc.), e códigos na faixa 5xx indicam erros nos servidores da Upay.

Estrutura de erro

Todas as respostas de erro seguem o mesmo formato:
{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "Erro de validação nos dados fornecidos",
    "details": [
      {
        "field": "amount",
        "message": "O valor deve ser maior que zero"
      }
    ]
  }
}

Campos da resposta

  • code: Código único identificando o tipo de erro
  • message: Mensagem descritiva do erro em português
  • details: Array com detalhes adicionais (opcional, presente em erros de validação)

Códigos de status HTTP

2xx - Sucesso

200 OK
success
A requisição foi bem-sucedida. O corpo da resposta contém os dados solicitados.
201 Created
success
O recurso foi criado com sucesso. O corpo da resposta contém o recurso criado.
204 No Content
success
A requisição foi bem-sucedida, mas não há conteúdo para retornar (comum em operações DELETE).

4xx - Erros do cliente

400 Bad Request
error
A requisição não pôde ser processada devido a sintaxe inválida ou parâmetros incorretos.Códigos comuns:
  • VALIDATION_ERROR: Dados de entrada inválidos
  • INVALID_REQUEST: Formato da requisição inválido
  • MISSING_PARAMETER: Parâmetro obrigatório ausente
401 Unauthorized
error
A autenticação falhou ou não foi fornecida. Verifique sua API Key.Códigos comuns:
  • AUTHENTICATION_FAILED: API Key inválida ou ausente
  • INVALID_API_KEY: API Key não encontrada ou revogada
  • API_KEY_EXPIRED: API Key expirada
403 Forbidden
error
Você não tem permissão para acessar este recurso.Códigos comuns:
  • INSUFFICIENT_PERMISSIONS: Permissões insuficientes
  • RESOURCE_ACCESS_DENIED: Acesso negado ao recurso
404 Not Found
error
O recurso solicitado não foi encontrado.Códigos comuns:
  • RESOURCE_NOT_FOUND: Recurso não existe
  • PAYMENT_LINK_NOT_FOUND: Link de pagamento não encontrado
  • TRANSACTION_NOT_FOUND: Transação não encontrada
  • PRODUCT_NOT_FOUND: Produto não encontrado
409 Conflict
error
A requisição conflita com o estado atual do recurso.Códigos comuns:
  • DUPLICATE_RESOURCE: Recurso duplicado
  • SLUG_ALREADY_EXISTS: Slug já está em uso
  • CONFLICT: Conflito de estado
422 Unprocessable Entity
error
A requisição está bem formada, mas não pode ser processada devido a erros semânticos.Códigos comuns:
  • BUSINESS_RULE_VIOLATION: Violação de regra de negócio
  • INVALID_STATE_TRANSITION: Transição de estado inválida
  • INSUFFICIENT_BALANCE: Saldo insuficiente
429 Too Many Requests
error
Você excedeu o limite de requisições. Aguarde antes de tentar novamente.Códigos comuns:
  • RATE_LIMIT_EXCEEDED: Limite de taxa excedido
Headers de resposta:
  • X-RateLimit-Limit: Limite total de requisições
  • X-RateLimit-Remaining: Requisições restantes
  • X-RateLimit-Reset: Timestamp quando o limite será resetado

5xx - Erros do servidor

500 Internal Server Error
error
Ocorreu um erro interno no servidor. Entre em contato com o suporte se o problema persistir.Códigos comuns:
  • INTERNAL_ERROR: Erro interno do servidor
  • UNEXPECTED_ERROR: Erro inesperado
502 Bad Gateway
error
O servidor recebeu uma resposta inválida de um servidor upstream.Códigos comuns:
  • GATEWAY_ERROR: Erro no gateway
  • PAYMENT_PROVIDER_ERROR: Erro no provedor de pagamento
503 Service Unavailable
error
O serviço está temporariamente indisponível. Tente novamente mais tarde.Códigos comuns:
  • SERVICE_UNAVAILABLE: Serviço indisponível
  • MAINTENANCE_MODE: Sistema em manutenção
504 Gateway Timeout
error
O servidor não recebeu resposta a tempo de um servidor upstream.Códigos comuns:
  • GATEWAY_TIMEOUT: Timeout no gateway
  • REQUEST_TIMEOUT: Timeout na requisição

Códigos de erro específicos

Erros de validação

CódigoDescriçãoSolução
VALIDATION_ERRORDados de entrada inválidosVerifique os campos no array details
INVALID_EMAILFormato de email inválidoForneça um email válido
INVALID_PHONEFormato de telefone inválidoUse o formato: +5511999999999
INVALID_CPFCPF inválidoForneça um CPF válido (apenas números)
INVALID_CNPJCNPJ inválidoForneça um CNPJ válido (apenas números)
INVALID_AMOUNTValor inválidoO valor deve ser maior que zero
INVALID_DATEData inválidaUse formato ISO 8601
INVALID_ENUM_VALUEValor de enum inválidoUse um dos valores permitidos

Erros de autenticação

CódigoDescriçãoSolução
AUTHENTICATION_FAILEDFalha na autenticaçãoVerifique sua API Key
INVALID_API_KEYAPI Key inválidaGere uma nova API Key no dashboard
API_KEY_EXPIREDAPI Key expiradaGere uma nova API Key
MISSING_API_KEYAPI Key não fornecidaInclua o header Authorization: Bearer YOUR_API_KEY

Erros de recursos

CódigoDescriçãoSolução
RESOURCE_NOT_FOUNDRecurso não encontradoVerifique o ID do recurso
PAYMENT_LINK_NOT_FOUNDLink de pagamento não encontradoVerifique o slug ou ID do link
TRANSACTION_NOT_FOUNDTransação não encontradaVerifique o ID da transação
PRODUCT_NOT_FOUNDProduto não encontradoVerifique o ID do produto
CUSTOMER_NOT_FOUNDCliente não encontradoVerifique o ID do cliente
COUPON_NOT_FOUNDCupom não encontradoVerifique o código do cupom

Erros de negócio

CódigoDescriçãoSolução
SLUG_ALREADY_EXISTSSlug já está em usoUse um slug diferente
COUPON_EXPIREDCupom expiradoUse um cupom válido
COUPON_LIMIT_REACHEDLimite de uso do cupom atingidoUse outro cupom
INSUFFICIENT_STOCKEstoque insuficienteReduza a quantidade ou aguarde reposição
PAYMENT_LINK_EXPIREDLink de pagamento expiradoCrie um novo link
PAYMENT_LINK_INACTIVELink de pagamento inativoAtive o link ou crie um novo
INVALID_PAYMENT_METHODMétodo de pagamento inválidoUse: PIX, CREDIT_CARD, DEBIT_CARD ou BOLETO
INSUFFICIENT_BALANCESaldo insuficienteAguarde processamento de transações

Erros de webhook

CódigoDescriçãoSolução
INVALID_WEBHOOK_SIGNATUREAssinatura do webhook inválidaVerifique o secret do webhook
WEBHOOK_DELIVERY_FAILEDFalha ao entregar webhookVerifique se sua URL está acessível
WEBHOOK_TIMEOUTTimeout ao entregar webhookSua URL deve responder em até 5 segundos

Exemplos de tratamento

JavaScript/TypeScript

import { UpayClient, UpayValidationError, UpayAuthenticationError } from '@upay/upay-js';

const upay = new UpayClient({ apiKey: 'sua_api_key' });

try {
  const link = await upay.paymentLinks.create({
    title: 'Produto',
    amount: 10000,
  });
} catch (error) {
  if (error instanceof UpayValidationError) {
    console.error('Erro de validação:', error.message);
    console.error('Detalhes:', error.details);
  } else if (error instanceof UpayAuthenticationError) {
    console.error('Erro de autenticação:', error.message);
  } else {
    console.error('Erro desconhecido:', error);
  }
}

Python

from upay import UpayClient, UpayValidationError, UpayAuthenticationError

upay = UpayClient(api_key="sua_api_key")

try:
    link = upay.payment_links.create({
        "title": "Produto",
        "amount": 10000
    })
except UpayValidationError as e:
    print(f"Erro de validação: {e.message}")
    print(f"Detalhes: {e.details}")
except UpayAuthenticationError as e:
    print(f"Erro de autenticação: {e.message}")
except Exception as e:
    print(f"Erro desconhecido: {e}")

PHP

use Upay\UpayClient;
use Upay\Utils\Exceptions\UpayValidationError;
use Upay\Utils\Exceptions\UpayAuthenticationError;

$upay = new UpayClient(apiKey: "sua_api_key");

try {
    $link = $upay->paymentLinks->create([
        'title' => 'Produto',
        'amount' => 10000
    ]);
} catch (UpayValidationError $e) {
    echo "Erro de validação: " . $e->getMessage() . "\n";
    print_r($e->details);
} catch (UpayAuthenticationError $e) {
    echo "Erro de autenticação: " . $e->getMessage() . "\n";
} catch (Exception $e) {
    echo "Erro desconhecido: " . $e->getMessage() . "\n";
}

cURL

# Exemplo de resposta de erro
curl -X POST https://upay-sistema-api.onrender.com/api/v1/payment-links \
  -H "Authorization: Bearer sua_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Produto",
    "amount": -100
  }'

# Resposta (400 Bad Request):
{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "Erro de validação nos dados fornecidos",
    "details": [
      {
        "field": "amount",
        "message": "O valor deve ser maior que zero"
      }
    ]
  }
}

Boas práticas

1. Sempre trate erros

Nunca assuma que uma requisição será bem-sucedida. Sempre implemente tratamento de erros adequado.

2. Use retry com backoff exponencial

Para erros 5xx e 429, implemente retry com backoff exponencial:
async function retryWithBackoff(fn: () => Promise<any>, maxRetries = 3) {
  for (let i = 0; i < maxRetries; i++) {
    try {
      return await fn();
    } catch (error) {
      if (error.status >= 500 || error.status === 429) {
        const delay = Math.pow(2, i) * 1000; // 1s, 2s, 4s
        await new Promise(resolve => setTimeout(resolve, delay));
      } else {
        throw error;
      }
    }
  }
  throw new Error('Max retries exceeded');
}

3. Monitore rate limits

Verifique os headers de rate limit e ajuste sua taxa de requisições:
const response = await fetch('https://upay-sistema-api.onrender.com/api/v1/payment-links', {
  headers: { 'Authorization': `Bearer ${apiKey}` }
});

const remaining = response.headers.get('X-RateLimit-Remaining');
const reset = response.headers.get('X-RateLimit-Reset');

if (remaining < 10) {
  console.warn('Próximo do limite de rate limit');
}

4. Log erros para análise

Mantenha logs detalhados de erros para facilitar debugging:
catch (error) {
  console.error({
    timestamp: new Date().toISOString(),
    errorCode: error.code,
    message: error.message,
    details: error.details,
    requestId: error.requestId, // Se disponível
  });
}

5. Valide dados antes de enviar

Valide dados no cliente antes de fazer requisições para reduzir erros:
function validatePaymentLink(data: any) {
  if (!data.title || data.title.length < 3) {
    throw new Error('Título deve ter pelo menos 3 caracteres');
  }
  if (!data.amount || data.amount <= 0) {
    throw new Error('Valor deve ser maior que zero');
  }
  // ... outras validações
}

Suporte

Se você encontrar um erro não documentado ou precisar de ajuda: