Diagnostique e resolva erros de conexão com a API, falhas de autenticação e problemas de integração.
A API REST do Zenovay está disponível em planos pagos (Pro e superior). Chaves do plano gratuito são rejeitadas com uma resposta 403 API_PAID_PLAN_REQUIRED — atualize para usar chaves de API.
Erros de Autenticação
"Invalid API Key" (401)
Causas comuns:
-
Formato de chave incorreto
- A chave de API deve começar com o prefixo
zv_ - Chaves sem este prefixo são inválidas
- Verifique se você copiou a chave completa do painel
- A chave de API deve começar com o prefixo
-
Chave revogada
- Vá para Configurações → Conta → Segurança e acesso e abra a seção Chaves de API pessoais
- Crie uma nova chave se a existente foi revogada
-
Chave salva apenas uma vez
- A chave completa é mostrada apenas no momento da criação — apenas o prefixo é armazenado depois
- Se você não a copiou, crie uma nova chave
Correção:
// Incorreto - formato inválido
const key = 'abc123_not_valid...';
// Correto - chave de API do Zenovay
const key = 'zv_xyz789abc...';
"API Key Not Found" (401)
Verifique o formato do cabeçalho:
# Incorreto
curl -H "Api-Key: zv_..."
# Correto (API Externa)
curl -H "X-API-Key: zv_..."
"API requires a paid plan" (403)
A API REST é um recurso pago. Uma chave criada em (ou agora vinculada a) um plano gratuito retorna:
{
"error": "The Zenovay API requires a paid plan. Upgrade to Pro or higher to use API keys.",
"code": "API_PAID_PLAN_REQUIRED"
}
Correção: Atualize o time para Pro ou superior e crie a chave em Configurações → Conta → Segurança e acesso → Chaves de API pessoais.
"Access denied to this website" (403)
Uma chave de API pessoal tem dois escopos quando você a cria:
| Configuração | Opções |
|---|---|
| Permissões | Acesso completo, ou apenas Leitura / Escrita / Admin |
| Acesso ao time | Todos os times a que você pertence, ou apenas times selecionados |
Uma chave só pode acessar sites nos times aos quais tem permissão de agir (e apenas enquanto você ainda for membro desses times). Se uma solicitação retornar 403 para um site específico, o time que o possui provavelmente está fora do acesso do time da chave, ou você não pertence mais a esse time. Analise a chave em Configurações → Conta → Segurança e acesso → Chaves de API pessoais, ou crie uma chave com o acesso necessário.
Erros de Conexão
"Connection Refused"
Verifique o endpoint:
Correto: https://api.zenovay.com/api/external/v1/
Incorreto: http://api.zenovay.com/api/external/v1/ (sem HTTPS)
Incorreto: https://zenovay.com/api/ (domínio incorreto)
"Connection Timeout"
Causas:
- Problemas de rede
- Firewall bloqueando
- Falha na resolução de DNS
Etapas de depuração:
-
Teste a conectividade:
curl -v https://api.zenovay.com/api/external/v1/usage -
Verifique DNS:
nslookup api.zenovay.com -
Verifique o firewall:
- Permitir HTTPS de saída (443)
- Permitir domínio api.zenovay.com
"SSL Certificate Error"
Causas:
- Certificados raiz desatualizados
- Interferência de proxy corporativo
- Desvio de relógio no servidor
Correção:
# Atualizar certificados (Ubuntu)
sudo apt update && sudo apt install ca-certificates
# Verifique a hora do sistema
date
# Se estiver usando Node.js, não desabilite a verificação:
// DON'T DO THIS IN PRODUCTION
// process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
Erros de Limite de Taxa
"Rate Limit Exceeded" (429)
Cabeçalhos de resposta:
X-RateLimit-Limit: 30
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 2026-06-13T12:01:00.000Z
Retry-After: 42
A API também retorna seu uso mensal em cada resposta:
X-Usage-Monthly: 4231
X-Usage-Limit: 10000
Implemente backoff:
async function apiCallWithRetry(fn, maxRetries = 3) {
for (let i = 0; i < maxRetries; i++) {
try {
return await fn();
} catch (error) {
if (error.status === 429) {
const retryAfter = error.headers.get('Retry-After') || 60;
await sleep(retryAfter * 1000);
continue;
}
throw error;
}
}
}
Limites de taxa da API REST
A API REST é limitada por chave, por nível de plano — tanto uma taxa por minuto quanto uma cota mensal de solicitações:
| Plano | Por minuto | Por mês |
|---|---|---|
| Pro | 30 req/min | 10.000 |
| Scale | 60 req/min | 100.000 |
| Enterprise | 120 req/min | 1.000.000 |
Exceder a taxa por minuto retorna 429 com Retry-After. Exceder a cota mensal retorna 429 e reseta no início do próximo mês (veja os cabeçalhos X-Usage-Monthly / X-Usage-Limit).
Limites de rastreamento e endpoints públicos
A ingestão de rastreamento e outros endpoints públicos são limitados por IP (não por plano), independentemente dos limites de chave de API REST:
| Contexto | Limite |
|---|---|
| Rastreamento (burst) | 60 req/10 sec por IP |
| Rastreamento (sustentado) | 5.000 req/hour por IP |
| Endpoints públicos | 30 req/min por IP |
| Endpoints de autenticação | 30 req/min por IP |
Erros de Solicitação
"Bad Request" (400)
Problemas comuns:
-
JSON inválido:
// Incorreto - vírgula final { "name": "Test", } // Correto { "name": "Test" } -
Parâmetros de consulta ausentes ou malformados:
# Incorreto - intervalo de datas inválido GET /api/external/v1/analytics/{websiteId}?from=yesterday # Correto - datas ISO GET /api/external/v1/analytics/{websiteId}?from=2026-06-01&to=2026-06-13 -
Tipos de dados incorretos no corpo da solicitação:
// Incorreto - string em vez de número { "page": "1" } // Correto { "page": 1 }
"Not Found" (404)
Verifique:
- A URL do endpoint está correta
- O ID do recurso existe
- O recurso pertence à sua conta
# Verifique o endpoint (note o prefixo /api/external/v1 e plural "websites")
GET /api/external/v1/websites/{websiteId} # Correto
GET /api/external/v1/website/{websiteId} # Incorreto (singular)
"Unprocessable Entity" (422)
Validação falhou. Verifique o corpo da resposta:
{
"error": "validation_error",
"details": {
"url": "Invalid URL format",
"name": "Name too long (max 100 characters)"
}
}
Erros de SDK
JavaScript SDK
"Zenovay not defined":
<!-- Certifique-se de que o script foi carregado -->
<script src="https://api.zenovay.com/z.js"
data-tracking-code="YOUR_TRACKING_CODE"></script>
<!-- Verifique após carregar -->
<script>
window.addEventListener('load', () => {
if (typeof zenovay !== 'undefined') {
console.log('Zenovay loaded');
}
});
</script>
Chamadas de API do lado do servidor
Problemas de conexão com o endpoint de rastreamento:
// Use fetch com o endpoint de rastreamento - nenhum pacote npm necessário.
// O endpoint de ingestão valida a carga útil, então envie o evento completo:
// session_id (mín. 8 caracteres), uma URL absoluta, user_agent e os
// campos de dispositivo (device_type, browser, os) são todos obrigatórios.
const response = await fetch('https://api.zenovay.com/e/YOUR_TRACKING_CODE', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
event_type: 'pageview',
url: 'https://example.com/home',
session_id: 'srv-session-abcdef',
user_agent: 'MyServer/1.0',
device_type: 'desktop',
browser: 'Server',
os: 'Linux',
}),
});
if (!response.ok) {
console.error('Zenovay tracking error:', response.status);
}
Erros de timeout:
// Use AbortController para controle de timeout
const controller = new AbortController();
const timeout = setTimeout(() => controller.abort(), 30000);
const response = await fetch('https://api.zenovay.com/e/YOUR_TRACKING_CODE', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
event_type: 'pageview',
url: 'https://example.com/home',
session_id: 'srv-session-abcdef',
user_agent: 'MyServer/1.0',
device_type: 'desktop',
browser: 'Server',
os: 'Linux',
}),
signal: controller.signal,
});
clearTimeout(timeout);
Dicas de Depuração
Ativar Modo de Depuração
Em chamadas do lado do servidor:
// Ative registro detalhado para chamadas de API externa
const response = await fetch('https://api.zenovay.com/api/external/v1/websites', {
headers: { 'X-API-Key': 'zv_...' },
});
console.log('Status:', response.status);
console.log('Response:', await response.json());
Em script de rastreamento:
<script data-tracking-code="YOUR_TRACKING_CODE"
data-debug="true"
src="..."></script>
Verificar Status da API
- Visite status.zenovay.com
- Verifique o status do endpoint da API
- Revise o histórico de incidentes
Verificar atividade da chave
No painel:
- Vá para Configurações → Conta → Segurança e acesso e encontre suas Chaves de API pessoais
- Selecione uma chave para abrir sua visualização de detalhes
- Revise sua atividade — contagens de eventos aceitos nas últimas 24 horas, 7 dias e de todos os tempos, além de quando a chave foi usada pela última vez
Teste com cURL
# Teste a chave de API com o endpoint de uso
curl -H "X-API-Key: zv_..." \
https://api.zenovay.com/api/external/v1/usage
# Listar sites
curl -H "X-API-Key: zv_..." \
https://api.zenovay.com/api/external/v1/websites
# Com saída detalhada
curl -v -H "X-API-Key: zv_..." \
https://api.zenovay.com/api/external/v1/websites
Códigos de Erro Comuns
| Código | Significado | Solução |
|---|---|---|
| 400 | Solicitação incorreta | Verifique o corpo da solicitação |
| 401 | Não autorizado | Verifique a chave de API |
| 403 | Proibido | Verifique as permissões |
| 404 | Não encontrado | Verifique endpoint/ID |
| 422 | Validação falhou | Verifique valores dos campos |
| 429 | Limite de taxa excedido | Implemente backoff |
| 500 | Erro de servidor | Tente novamente, entre em contato com o suporte |
| 502 | Gateway incorreto | Tente novamente em 1 minuto |
| 503 | Indisponível | Verifique página de status |
Contactar Suporte
Ao relatar problemas de API, inclua:
-
Detalhes da solicitação:
- URL do endpoint
- Método HTTP
- Cabeçalhos da solicitação (redija a chave de API)
- Corpo da solicitação
-
Detalhes da resposta:
- Código de status
- Corpo da resposta
- Cabeçalhos da resposta
-
Contexto:
- Timestamp
- ID da solicitação (dos cabeçalhos)
- Versão do SDK, se aplicável
Email: [email protected]