Visão Geral da API
URL base, autenticação, formato de erro e referência completa de códigos de erro
URL base
https://openapi.thunderbit.com/openapi/v1Autenticação
Todos os endpoints usam HTTP Bearer (API Key):
Authorization: Bearer YOUR_API_KEYPegue sua chave no Painel Thunderbit. As chaves são revogáveis e por ambiente — nunca embuta uma chave de produção em código do lado do cliente.
Estrutura de erro
Todas as respostas de erro compartilham o mesmo envelope. Por padrão (formato LEGACY):
{
"success": false,
"error": {
"code": "INVALID_URL",
"status": 400,
"message": "The provided URL is not valid",
"details": null
}
}Note: Anteriormente era documentado um envelope alternativo
GOOGLE_RPCem quecodeestatustrocavam de tipos (string ↔ number). Está descontinuado e não recomendado — clientes com tipagem forte (OpenAPI codegen, Pydantic,serde,encoding/json) falharão na desserialização. Use o formato LEGACY acima; futuras atualizações manterãocode: stringestatus: numberestáveis. O campodetailspode trazer contexto estruturado — por exemplo, erros de validação por campo como pares{ field: message }retornados emINVALID_PARAMETER.
Códigos de erro canônicos
| HTTP | Code | Significado |
|---|---|---|
| 400 | INVALID_URL | Formato de URL inválido |
| 400 | INVALID_SCHEMA | JSON Schema inválido |
| 400 | INVALID_PARAMETER | Um ou mais parâmetros da requisição falharam na validação |
| 400 | SCHEMA_OR_PROMPT_REQUIRED | schema (ou prompt) é obrigatório para extração |
| 400 | SCHEMA_AND_PROMPT_EXCLUSIVE | schema e prompt não podem ser fornecidos juntos |
| 400 | BATCH_SIZE_EXCEEDED | Requisição em lote excede o limite de 100 URLs |
| 400 | MALFORMED_REQUEST_BODY | Corpo da requisição não é JSON válido |
| 401 | API_KEY_MISSING | Cabeçalho Authorization ausente |
| 401 | API_KEY_INVALID_FORMAT | Formato da API Key é inválido |
| 401 | API_KEY_NOT_FOUND | API Key não encontrada no sistema |
| 401 | API_KEY_REVOKED | API Key revogada |
| 401 | API_KEY_DISABLED | API Key desabilitada |
| 401 | API_KEY_EXPIRED | API Key expirada |
| 401 | INVALID_API_KEY | (obsoleto, use os códigos API_KEY_* específicos acima) |
| 402 | INSUFFICIENT_CREDITS | Créditos insuficientes na conta |
| 404 | JOB_NOT_FOUND | Tarefa em lote não encontrada |
| 404 | RESOURCE_NOT_FOUND | Recurso não encontrado |
| 408 | REQUEST_TIMEOUT | Tempo limite da requisição API esgotado |
| 408 | SCRAPE_TIMEOUT | Página alvo demorou demais para responder |
| 422 | SCRAPE_SSL_ERROR | Problemas de SSL/TLS no site alvo |
| 422 | SCRAPE_DNS_RESOLUTION_ERROR | Não foi possível resolver o hostname alvo |
| 422 | SCRAPE_SITE_ERROR | Site alvo retornou erro |
| 422 | SCRAPE_EMPTY_CONTENT | Página alvo retornou conteúdo vazio |
| 422 | SCRAPE_CONTENT_TOO_LARGE | Página alvo excede limites de tamanho |
| 422 | SCRAPE_TARGET_FORBIDDEN | Site alvo recusou acesso (403) |
| 422 | SCRAPE_TARGET_NOT_FOUND | URL alvo retornou 404 |
| 422 | SCRAPE_UNSUPPORTED_FILE | Tipo de arquivo alvo não suportado |
| 429 | RATE_LIMIT_EXCEEDED | Rate limit da conta acionado |
| 429 | SCRAPE_TARGET_RATE_LIMITED | Site alvo aplicou rate limit à nossa requisição |
| 500 | INTERNAL_ERROR | Erro interno genérico |
| 500 | DISTILL_FAILED | Pipeline de destilação falhou |
| 500 | EXTRACT_FAILED | Pipeline de extração falhou |
| 500 | PIPELINE_ERROR | Um passo do pipeline reportou falha |
| 500 | AI_EXTRACTION_FAILED | Passo de extração com IA falhou |
| 500 | MARKDOWN_CONVERSION_FAILED | Conversão HTML para Markdown falhou |
| 502 | SCRAPE_ALL_PROVIDERS_FAILED | Todos os provedores de scraping falharam |
| 502 | UPSTREAM_BAD_GATEWAY | Upstream retornou resposta inválida |
| 503 | SCRAPE_PROVIDER_UNAVAILABLE | Provedor de scraping indisponível |
| 503 | AI_SERVICE_UNAVAILABLE | Serviço de IA indisponível |
| 503 | DOWNSTREAM_SERVICE_UNAVAILABLE | Um serviço downstream está temporariamente indisponível |
| 504 | UPSTREAM_TIMEOUT | Tempo limite do gateway upstream esgotado |
| 504 | AI_TIMEOUT | Tempo limite da chamada ao serviço de IA esgotado |
Referência de estratégia de retry
| Classe de erro | Retry? | Como |
|---|---|---|
4xx (sua entrada) | ❌ Não | Corrija a requisição e tente novamente |
401 (auth) | ❌ Não | Rotacione / reemita a API Key |
402 (créditos) | ❌ Não | Recarregue |
408 / 504 (timeout) | ✅ Sim | Backoff exponencial, máx. 3 tentativas |
429 (rate-limit) | ✅ Sim | Aguarde até X-RateLimit-Reset — veja Rate Limits |
5xx (servidor) | ✅ Sim | Backoff exponencial, máx. 3 tentativas |
SCRAPE_TARGET_* (site alvo) | ⚠️ Talvez | Tente novamente uma vez com renderMode elevado |