Pular para o conteúdo

Tratamento de Erros

A API External do Efflux usa códigos de status HTTP padrão e retorna respostas de erro estruturadas para ajudar você a identificar e resolver problemas.

Formato de Resposta de Erro

Todas as respostas de erro seguem uma estrutura JSON consistente:

{
"error": "Mensagem de erro legível",
"code": "CODIGO_ERRO"
}
CampoTipoDescrição
errorstringUma descrição legível do erro
codestringUm código de erro legível por máquina para tratamento programático

Códigos de Status HTTP

StatusCategoriaDescrição
400Bad RequestParâmetros ou formato de requisição inválidos
401UnauthorizedAutenticação falhou
403ForbiddenAutenticado mas sem permissão
404Not FoundRecurso não existe
500Server ErrorErro interno do servidor

Erros de Autenticação (401)

Esses erros ocorrem quando a API key está ausente, inválida ou não está mais ativa.

CódigoMensagemCausaResolução
MISSING_API_KEYAPI key requiredHeader X-API-Key não fornecidoAdicione o header à sua requisição
MISSING_KEYAPI key is requiredAPI key vazia ou em brancoForneça uma API key válida
INVALID_FORMATInvalid API key formatKey não corresponde ao formato esperadoUse uma key começando com efflux_live_
INVALID_KEYInvalid API keyKey não encontrada no banco de dadosVerifique a key ou crie uma nova
KEY_EXPIREDAPI key has expiredKey passou da data de expiraçãoCrie uma nova API key
KEY_REVOKEDAPI key has been revokedKey foi revogada manualmenteCrie uma nova API key

Exemplo: Tratando Erros de Autenticação

async function fetchContent() {
const response = await fetch('https://api.efflux.media/api/external/content', {
headers: { 'X-API-Key': process.env.EFFLUX_API_KEY }
});
if (response.status === 401) {
const error = await response.json();
switch (error.code) {
case 'KEY_EXPIRED':
case 'KEY_REVOKED':
// Notificar admin para criar nova key
console.error('API key não é mais válida. Por favor, crie uma nova.');
break;
case 'INVALID_KEY':
case 'INVALID_FORMAT':
console.error('API key inválida. Verifique sua configuração.');
break;
case 'MISSING_API_KEY':
console.error('API key está ausente na requisição.');
break;
default:
console.error('Autenticação falhou:', error.error);
}
return null;
}
return response.json();
}

Erros de Autorização (403)

Esses erros ocorrem quando a autenticação é bem-sucedida mas a API key não possui o escopo necessário.

CódigoMensagemCausaResolução
-Missing required scope: {scope}API key não tem o escopo necessárioCrie uma nova key com o escopo necessário

Escopos Necessários por Endpoint

EndpointEscopo Necessário
/content, /content/{id}content:read
/schedulesschedules:read
/playersplayers:read
/analytics/summaryanalytics:read

Erros de Requisição Inválida (400)

Esses erros indicam parâmetros de requisição inválidos.

MensagemCausaResolução
Invalid status: {value}Valor de filtro de status inválidoUse active, inactive ou archived
Invalid UUID formatUUID malformado no pathForneça um UUID válido

Exemplo: Tratando Erros de Validação

const response = await fetch(
'https://api.efflux.media/api/external/content?status=invalido'
);
if (response.status === 400) {
const error = await response.json();
console.error('Requisição inválida:', error.error);
// error.error: "Invalid status: invalido"
}

Erros de Não Encontrado (404)

Esses erros indicam que o recurso solicitado não existe ou não pertence ao seu tenant.

EndpointCausa
/content/{id}ID de conteúdo não existe ou pertence a outro tenant

Erros de Servidor (500)

Erros de servidor indicam um problema do lado do Efflux. São raros mas devem ser tratados graciosamente.

Boas Práticas para Erros de Servidor

  1. Tente novamente com backoff exponencial
  2. Registre o erro para debugging
  3. Mostre mensagem amigável ao usuário
  4. Contate o suporte se persistir
async function fetchWithRetry(url, options, maxRetries = 3) {
let lastError;
for (let attempt = 0; attempt < maxRetries; attempt++) {
try {
const response = await fetch(url, options);
if (response.status >= 500) {
throw new Error(`Erro de servidor: ${response.status}`);
}
return response;
} catch (error) {
lastError = error;
// Backoff exponencial: 1s, 2s, 4s
const delay = Math.pow(2, attempt) * 1000;
await new Promise(resolve => setTimeout(resolve, delay));
}
}
throw lastError;
}

Boas Práticas de Tratamento de Erros

1. Sempre Verifique Códigos de Status

const response = await fetch(url, options);
if (!response.ok) {
const error = await response.json();
throw new ApiError(response.status, error.code, error.error);
}

2. Crie uma Classe de Erro Customizada

class EffluxApiError extends Error {
constructor(status, code, message) {
super(message);
this.status = status;
this.code = code;
this.name = 'EffluxApiError';
}
isAuthError() {
return this.status === 401;
}
isScopeError() {
return this.status === 403;
}
isNotFound() {
return this.status === 404;
}
}

3. Centralize o Tratamento de Erros

async function effluxRequest(endpoint, options = {}) {
const response = await fetch(
`https://api.efflux.media/api/external${endpoint}`,
{
...options,
headers: {
'X-API-Key': process.env.EFFLUX_API_KEY,
...options.headers
}
}
);
if (!response.ok) {
const error = await response.json();
throw new EffluxApiError(response.status, error.code, error.error);
}
return response.json();
}
// Uso
try {
const content = await effluxRequest('/content');
} catch (error) {
if (error.isAuthError()) {
handleAuthFailure(error);
} else if (error.isNotFound()) {
handleNotFound(error);
} else {
handleGenericError(error);
}
}

4. Registre Erros para Debugging

Inclua contexto relevante ao registrar erros:

function logApiError(error, context) {
console.error({
timestamp: new Date().toISOString(),
status: error.status,
code: error.code,
message: error.message,
endpoint: context.endpoint,
requestId: context.requestId
});
}