RAYO
Erros

Tratamento de Erros

Entenda os codigos de erro e como trata-los em sua aplicacao.

Formato de Erro

A API Rayo segue o padrao RFC 7807 (Problem Details for HTTP APIs) para retornar erros de forma estruturada e consistente:

error-response.json
json
{
"type": "https://rayopay.com.br/errors/validation-error",
"title": "Validation Error",
"status": 400,
"detail": "Os dados fornecidos são inválidos.",
"errors": {
"amount": ["O campo amount é obrigatório"],
"customer.email": ["O email informado é inválido"]
}
}

Campos do Erro

CampoDescricao
typeURI que identifica o tipo do erro
titleTitulo curto do erro
statusCodigo HTTP do erro
detailDescricao detalhada do erro
errorsObjeto com erros de validacao por campo (opcional)

Codigos HTTP

CodigoNomeDescricao
200OKRequisicao bem sucedida
201CreatedRecurso criado com sucesso
400Bad RequestDados invalidos ou malformados
401UnauthorizedCredenciais invalidas ou ausentes
403ForbiddenSem permissao para acessar o recurso
404Not FoundRecurso nao encontrado
409ConflictConflito com estado atual do recurso
422Unprocessable EntityErro de validacao de negocios
429Too Many RequestsLimite de requisicoes excedido
500Internal Server ErrorErro interno do servidor
503Service UnavailableServico temporariamente indisponivel

Erros Comuns

Erro de Autenticacao (401)

401-unauthorized.json
json
{
"type": "https://rayopay.com.br/errors/unauthorized",
"title": "Unauthorized",
"status": 401,
"detail": "Credenciais inválidas ou ausentes."
}

Erro de Validacao (400)

400-validation.json
json
{
"type": "https://rayopay.com.br/errors/validation-error",
"title": "Validation Error",
"status": 400,
"detail": "Os dados fornecidos são inválidos.",
"errors": {
"amount": ["O campo amount deve ser maior que zero"],
"customer.cpfCnpj": ["CPF/CNPJ inválido"]
}
}

Saldo Insuficiente (422)

422-insufficient-balance.json
json
{
"type": "https://rayopay.com.br/errors/insufficient-balance",
"title": "Insufficient Balance",
"status": 422,
"detail": "Saldo insuficiente para realizar esta operação.",
"currentBalance": 5000,
"requiredAmount": 10000
}

Rate Limit (429)

429-rate-limit.json
json
{
"type": "https://rayopay.com.br/errors/rate-limit-exceeded",
"title": "Rate Limit Exceeded",
"status": 429,
"detail": "Você excedeu o limite de requisições. Tente novamente em alguns segundos.",
"retryAfter": 60
}

Tratamento de Erros

Exemplo de como tratar erros de forma adequada em sua aplicacao:

error-handling.js
javascript
async function createTransaction(data) {
try {
const response = await fetch('https://rayopay.com.br/api/v1/transactions', {
method: 'POST',
headers: {
'X-Client-Id': process.env.RAYO_CLIENT_ID,
'X-API-Key': process.env.RAYO_API_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify(data)
});
const result = await response.json();
if (!response.ok) {
// Tratar erros específicos
switch (response.status) {
case 400:
// Erro de validação - mostrar erros ao usuário
console.error('Erros de validação:', result.errors);
throw new ValidationError(result.detail, result.errors);
case 401:
// Credenciais inválidas - verificar configuração
console.error('Erro de autenticação');
throw new AuthError('Credenciais inválidas');
case 429:
// Rate limit - aguardar e tentar novamente
const retryAfter = result.retryAfter || 60;
console.warn(`Rate limit. Retry after ${retryAfter}s`);
await sleep(retryAfter * 1000);
return createTransaction(data); // Retry
case 500:
case 503:
// Erro do servidor - tentar novamente com backoff
console.error('Erro do servidor');
throw new ServerError(result.detail);
default:
throw new APIError(result.detail, response.status);
}
}
return result.data;
} catch (error) {
if (error.name === 'TypeError') {
// Erro de rede
console.error('Erro de conexão');
throw new NetworkError('Falha na conexão com a API');
}
throw error;
}
}
// Classes de erro customizadas
class ValidationError extends Error {
constructor(message, errors) {
super(message);
this.name = 'ValidationError';
this.errors = errors;
}
}
class AuthError extends Error {
constructor(message) {
super(message);
this.name = 'AuthError';
}
}
class ServerError extends Error {
constructor(message) {
super(message);
this.name = 'ServerError';
}
}

Retry com Backoff

Para erros 429 (Rate Limit) e 5xx (Server Error), implemente retry com exponential backoff para evitar sobrecarregar a API e melhorar a resiliencia da sua aplicacao.