Skip to main content

Errores comunes y cómo manejarlos

Errores HTTP del API

Estructura de respuesta de error

⚠️ Programa tu lógica con code y HTTP status. No parsees el texto de message — puede cambiar.

Errores de items en webhooks

Los webhooks verification_item.v2.completed y verification_item.v2.internal_status_changed pueden incluir item_error:

Ejemplo de manejo

Errores de búsqueda de CURP

El webhook verification_people.curp_search_completed puede incluir people_error:

Errores específicos de items KYB

unknown (clasificación falló)

Cuando subes un generic y Trébol no logra clasificar el documento, el item se actualiza a tipo unknown. Manejo:
  • Detectar en webhook: item_type === 'unknown'
  • Pedir al usuario que suba otro archivo o aclare qué documento es

corrupted_file (archivo dañado)

Cuando el archivo subido no es legible, el item se actualiza a corrupted_file. Manejo:
  • Detectar: item_type === 'corrupted_file'
  • Pedir al usuario que vuelva a subir el archivo en buen estado

Errores comunes de integración (no son del API)

“Mi webhook nunca llega”

Causas posibles, en orden de probabilidad:
  1. URL no es HTTPS → Trébol solo entrega a https://
  2. Firewall bloquea las IPs 35.170.236.123 y 54.162.134.233
  3. El servidor responde lento (>30s) → timeout, Trébol asume error
  4. El webhook está desactivado en Trébol — verificar con GET /v2/webhooks

”Recibo el mismo webhook varias veces”

Es esperado. Trébol reintenta hasta 5 veces si tu endpoint no responde 2xx. Implementa idempotencia usando la firma v1= del header Trebol-Signature como clave de deduplicación (es única por evento). Detalles y ejemplo en flows/webhooks.md sección “Implementa idempotencia con la firma del header” o en la guía oficial.

”El payload del webhook no se valida — firma inválida”

Causas comunes:
  1. Estás parseando el body como JSON antes de verificar → tienes que validar contra el body raw (string original).
    • Express: app.post('/webhook', express.raw({ type: 'application/json' }), ...)
    • Flask: request.get_data(as_text=True)
  2. Estás usando comparación normal (===, ==) → usa crypto.timingSafeEqual (Node) o hmac.compare_digest (Python) para evitar timing attacks
  3. Secret incorrecto — verifica que estás usando el secret del webhook correcto (cada webhook tiene su propio secret)
  4. Encoding — el payload debe firmarse como UTF-8

”401 al hacer cualquier request”

Diagnóstico:
  • Si responde 401: la key es inválida o fue revocada
  • Verifica que NO uses Authorization: Bearer (Trébol usa x-api-key)
  • Las keys de producción usan el prefijo treb_sk_live_

”URL de mi documento da timeout”

file_url debe estar disponible al menos 5 minutos. Trébol descarga el archivo, no lo proxy-ea. Si tus URLs son privadas o efímeras (ej. URLs firmadas de S3 con TTL corto), usa el flujo de carga directa: Trébol te entrega un upload_url por item, tú subes el archivo a esa URL, Trébol procesa. Detalle del flujo: https://docs.gotrebol.com/guia-devs/crear-verificaciones/via-api/carga-directa

Patrón de reintento exponencial

Para errores 5xx o de red, implementa reintentos:
No reintentes errores 4xx — son problemas de tu request, no se van a arreglar reintentando.