Errores

Un solo formato de error, con códigos estables sobre los que programar.

Los errores usan el formato problem details del RFC 9457, con Content-Type: application/problem+json. Así se ve uno pedido con Accept-Language: es:

{
  "type": "urn:typesearch:error:invalid_request",
  "title": "Pedido inválido",
  "status": 400,
  "detail": "query: La consulta necesita dos letras como mínimo.",
  "code": "invalid_request",
  "request_id": "req_8fKq2mZr1xYt",
  "errors": [{ "path": "query", "message": "La consulta necesita dos letras como mínimo." }]
}

Usa code en tu código: es estable. title, detail y message son para personas y pueden cambiar. title y detail vienen en inglés; envía Accept-Language: es para recibirlos en español. Cada respuesta, buena o mala, trae un encabezado X-Request-Id: inclúyelo cuando escribas a soporte.

Códigos

EstadocodeQué hacer
400invalid_json, invalid_requestCorrige el pedido. errors lista cada campo inválido. Los campos desconocidos también se rechazan.
400invalid_url, invalid_site, site_not_found, unsupportedCorrige la URL o el sitio.
401missing_api_key, invalid_api_key, revoked_api_keyMira Autenticación.
402budget_too_smallSube max_tokens.
402insufficient_creditsNo queda crédito en tu cuenta. Recarga en el panel.
402spend_limit_reachedLa key llegó a su tope de gasto del mes. Súbelo en el panel.
403robots_disallowedEl robots.txt del sitio no lo permite o no se pudo leer (lo reintentamos a los 10 minutos).
403source_unavailableLa fuente no está disponible ahora. No decimos por qué, y puede ser temporal. Prueba con otra fuente.
404job_not_foundEl trabajo no existe para esta key, o venció (duran un día).
404chart_not_foundNo hay un gráfico con ese id para tu organización: se borró o venció. Mira Gráficos.
422insufficient_dataUn gráfico desde una consulta no encontró notas sobre el tema en el período (con index o questions: no hay datos suficientes para el gráfico). No se cobra. Prueba con más days o una consulta más amplia.
429rate_limitedReintenta después de Retry-After segundos.
429quota_exceededSe usó la cuota diaria de tokens. Se renueva a las 00:00 UTC.
499cancelledLa búsqueda se detuvo porque el cliente cerró la conexión o cortó el flujo. No hay nada que corregir; vuelve a enviarla si todavía la necesitas.
500internal_errorAlgo falló de nuestro lado. Reintenta; si se repite, escribe a soporte con el request_id.
502site_unreachable, invalid_redirect, bot_protectionFalló el sitio. Prueba más tarde u otro sitio.
503upstream_unavailable, browser_unavailable, browser_busyTemporal. Reintenta con espera creciente; browser_busy dice cuándo en Retry-After.
503shutting_downEl servidor se está reiniciando. Reintenta después de Retry-After segundos.
503spend_cap_reachedEl servicio llegó a su tope de gasto del día. Retry-After dice cuándo se renueva (00:00 UTC).
503job_interruptedEn el error de un trabajo (GET /v1/jobs/{id}): el servidor se reinició antes de terminarlo. Vuelve a pedirlo.
504timeout, site_timeoutTemporal. Reintenta, o usa un modo más liviano.

En POST /v1/contents cada URL tiene su propio estado: una página de una fuente que no está disponible vuelve con source_unavailable en results[].error.code, y el resto del pedido sale bien.

Reintentos

Los SDKs reintentan dos veces los errores de conexión, los tiempos de espera agotados, 429 rate_limited y 5xx, con espera exponencial y aleatoria, respetando Retry-After. Nunca reintentan quota_exceeded. Si llamas a la API directamente, haz lo mismo.

Los avisos no son errores

Lo que no detiene un pedido —un dominio que no está en el índice, un tope alcanzado— vuelve en el arreglo warnings de la respuesta, cada uno con un code y un message (en inglés, o en español con Accept-Language: es).

En esta página