Resumen de la API
URL base, autenticación, formato de error y referencia completa de códigos de error
URL base
https://openapi.thunderbit.com/openapi/v1Autenticación
Todos los endpoints usan HTTP Bearer (API Key):
Authorization: Bearer YOUR_API_KEYObtén tu key desde el Panel de Thunderbit. Las keys son revocables y por entorno — nunca incrustes una key de producción en código del cliente.
Estructura del error
Todas las respuestas de error comparten la misma envoltura. Por defecto (formato LEGACY):
{
"success": false,
"error": {
"code": "INVALID_URL",
"status": 400,
"message": "The provided URL is not valid",
"details": null
}
}Note: Anteriormente se documentaba un envelope alternativo
GOOGLE_RPCdondecodeystatusintercambiaban tipos (string ↔ number). Está obsoleto y no se recomienda — los clientes con tipado estricto (OpenAPI codegen, Pydantic,serde,encoding/json) fallarán al deserializar. Usa el formato LEGACY anterior; las actualizaciones futuras mantendráncode: stringystatus: numberestables. El campodetailspuede llevar contexto estructurado — por ejemplo, errores de validación a nivel de campo como pares{ field: message }que se devuelven enINVALID_PARAMETER.
Códigos de error canónicos
| HTTP | Code | Significado |
|---|---|---|
| 400 | INVALID_URL | Formato de URL inválido |
| 400 | INVALID_SCHEMA | JSON Schema inválido |
| 400 | INVALID_PARAMETER | Uno o más parámetros de la solicitud no pasaron la validación |
| 400 | SCHEMA_OR_PROMPT_REQUIRED | Se requiere schema (o prompt) para la extracción |
| 400 | SCHEMA_AND_PROMPT_EXCLUSIVE | schema y prompt no pueden enviarse a la vez |
| 400 | BATCH_SIZE_EXCEEDED | La solicitud por lotes supera el límite de 100 URLs |
| 400 | MALFORMED_REQUEST_BODY | El cuerpo de la solicitud no es JSON válido |
| 401 | API_KEY_MISSING | Falta la cabecera Authorization |
| 401 | API_KEY_INVALID_FORMAT | El formato de la API Key es inválido |
| 401 | API_KEY_NOT_FOUND | API Key no encontrada en el sistema |
| 401 | API_KEY_REVOKED | La API Key ha sido revocada |
| 401 | API_KEY_DISABLED | La API Key ha sido deshabilitada |
| 401 | API_KEY_EXPIRED | La API Key ha expirado |
| 401 | INVALID_API_KEY | (obsoleto, usa los códigos API_KEY_* específicos de arriba) |
| 402 | INSUFFICIENT_CREDITS | Créditos insuficientes en la cuenta |
| 404 | JOB_NOT_FOUND | Trabajo por lotes no encontrado |
| 404 | RESOURCE_NOT_FOUND | Recurso no encontrado |
| 408 | REQUEST_TIMEOUT | Tiempo de espera de la solicitud agotado |
| 408 | SCRAPE_TIMEOUT | La página objetivo tardó demasiado en responder |
| 422 | SCRAPE_SSL_ERROR | Problemas de SSL/TLS en el sitio objetivo |
| 422 | SCRAPE_DNS_RESOLUTION_ERROR | No se pudo resolver el host objetivo |
| 422 | SCRAPE_SITE_ERROR | El sitio objetivo devolvió un error |
| 422 | SCRAPE_EMPTY_CONTENT | La página objetivo devolvió contenido vacío |
| 422 | SCRAPE_CONTENT_TOO_LARGE | La página objetivo supera los límites de tamaño |
| 422 | SCRAPE_TARGET_FORBIDDEN | El sitio objetivo denegó el acceso (403) |
| 422 | SCRAPE_TARGET_NOT_FOUND | La URL objetivo devolvió 404 |
| 422 | SCRAPE_UNSUPPORTED_FILE | Tipo de archivo objetivo no soportado |
| 429 | RATE_LIMIT_EXCEEDED | Límite de tasa de la cuenta alcanzado |
| 429 | SCRAPE_TARGET_RATE_LIMITED | El sitio objetivo limitó nuestras solicitudes |
| 500 | INTERNAL_ERROR | Error interno genérico |
| 500 | DISTILL_FAILED | Falló el pipeline de destilación |
| 500 | EXTRACT_FAILED | Falló el pipeline de extracción |
| 500 | PIPELINE_ERROR | Un paso del pipeline reportó un fallo |
| 500 | AI_EXTRACTION_FAILED | Falló el paso de extracción con IA |
| 500 | MARKDOWN_CONVERSION_FAILED | Falló la conversión de HTML a Markdown |
| 502 | SCRAPE_ALL_PROVIDERS_FAILED | Fallaron todos los proveedores de scraping |
| 502 | UPSTREAM_BAD_GATEWAY | El upstream devolvió una respuesta inválida |
| 503 | SCRAPE_PROVIDER_UNAVAILABLE | Proveedor de scraping no disponible |
| 503 | AI_SERVICE_UNAVAILABLE | Servicio de IA no disponible |
| 503 | DOWNSTREAM_SERVICE_UNAVAILABLE | Un servicio downstream está temporalmente no disponible |
| 504 | UPSTREAM_TIMEOUT | Tiempo de espera del gateway upstream agotado |
| 504 | AI_TIMEOUT | Tiempo de espera de la llamada al servicio de IA agotado |
Referencia de estrategia de reintentos
| Clase de error | ¿Reintentar? | Cómo |
|---|---|---|
4xx (tu entrada) | ❌ No | Corrige la solicitud e inténtalo de nuevo |
401 (auth) | ❌ No | Rota / vuelve a emitir la API Key |
402 (créditos) | ❌ No | Recarga |
408 / 504 (timeout) | ✅ Sí | Backoff exponencial, máx. 3 intentos |
429 (rate-limit) | ✅ Sí | Espera hasta X-RateLimit-Reset — ver Límites de tasa |
5xx (servidor) | ✅ Sí | Backoff exponencial, máx. 3 intentos |
SCRAPE_TARGET_* (sitio objetivo) | ⚠️ Quizás | Reintenta una vez con renderMode mejorado |