Referencia API

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/v1

Autenticación

Todos los endpoints usan HTTP Bearer (API Key):

Authorization: Bearer YOUR_API_KEY

Obté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_RPC donde code y status intercambiaban 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án code: string y status: number estables. El campo details puede llevar contexto estructurado — por ejemplo, errores de validación a nivel de campo como pares { field: message } que se devuelven en INVALID_PARAMETER.

Códigos de error canónicos

HTTPCodeSignificado
400INVALID_URLFormato de URL inválido
400INVALID_SCHEMAJSON Schema inválido
400INVALID_PARAMETERUno o más parámetros de la solicitud no pasaron la validación
400SCHEMA_OR_PROMPT_REQUIREDSe requiere schema (o prompt) para la extracción
400SCHEMA_AND_PROMPT_EXCLUSIVEschema y prompt no pueden enviarse a la vez
400BATCH_SIZE_EXCEEDEDLa solicitud por lotes supera el límite de 100 URLs
400MALFORMED_REQUEST_BODYEl cuerpo de la solicitud no es JSON válido
401API_KEY_MISSINGFalta la cabecera Authorization
401API_KEY_INVALID_FORMATEl formato de la API Key es inválido
401API_KEY_NOT_FOUNDAPI Key no encontrada en el sistema
401API_KEY_REVOKEDLa API Key ha sido revocada
401API_KEY_DISABLEDLa API Key ha sido deshabilitada
401API_KEY_EXPIREDLa API Key ha expirado
401INVALID_API_KEY(obsoleto, usa los códigos API_KEY_* específicos de arriba)
402INSUFFICIENT_CREDITSCréditos insuficientes en la cuenta
404JOB_NOT_FOUNDTrabajo por lotes no encontrado
404RESOURCE_NOT_FOUNDRecurso no encontrado
408REQUEST_TIMEOUTTiempo de espera de la solicitud agotado
408SCRAPE_TIMEOUTLa página objetivo tardó demasiado en responder
422SCRAPE_SSL_ERRORProblemas de SSL/TLS en el sitio objetivo
422SCRAPE_DNS_RESOLUTION_ERRORNo se pudo resolver el host objetivo
422SCRAPE_SITE_ERROREl sitio objetivo devolvió un error
422SCRAPE_EMPTY_CONTENTLa página objetivo devolvió contenido vacío
422SCRAPE_CONTENT_TOO_LARGELa página objetivo supera los límites de tamaño
422SCRAPE_TARGET_FORBIDDENEl sitio objetivo denegó el acceso (403)
422SCRAPE_TARGET_NOT_FOUNDLa URL objetivo devolvió 404
422SCRAPE_UNSUPPORTED_FILETipo de archivo objetivo no soportado
429RATE_LIMIT_EXCEEDEDLímite de tasa de la cuenta alcanzado
429SCRAPE_TARGET_RATE_LIMITEDEl sitio objetivo limitó nuestras solicitudes
500INTERNAL_ERRORError interno genérico
500DISTILL_FAILEDFalló el pipeline de destilación
500EXTRACT_FAILEDFalló el pipeline de extracción
500PIPELINE_ERRORUn paso del pipeline reportó un fallo
500AI_EXTRACTION_FAILEDFalló el paso de extracción con IA
500MARKDOWN_CONVERSION_FAILEDFalló la conversión de HTML a Markdown
502SCRAPE_ALL_PROVIDERS_FAILEDFallaron todos los proveedores de scraping
502UPSTREAM_BAD_GATEWAYEl upstream devolvió una respuesta inválida
503SCRAPE_PROVIDER_UNAVAILABLEProveedor de scraping no disponible
503AI_SERVICE_UNAVAILABLEServicio de IA no disponible
503DOWNSTREAM_SERVICE_UNAVAILABLEUn servicio downstream está temporalmente no disponible
504UPSTREAM_TIMEOUTTiempo de espera del gateway upstream agotado
504AI_TIMEOUTTiempo de espera de la llamada al servicio de IA agotado

Referencia de estrategia de reintentos

Clase de error¿Reintentar?Cómo
4xx (tu entrada)❌ NoCorrige la solicitud e inténtalo de nuevo
401 (auth)❌ NoRota / vuelve a emitir la API Key
402 (créditos)❌ NoRecarga
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ásReintenta una vez con renderMode mejorado