Errores comunes y cómo manejarlos
Errores HTTP del API
Estructura de respuesta de error
code y HTTP status. No parsees el texto de message — puede cambiar.
Errores de items en webhooks
Los webhooksverification_item.v2.completed y verification_item.v2.internal_status_changed pueden incluir item_error:
Ejemplo de manejo
Errores de búsqueda de CURP
El webhookverification_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:- URL no es HTTPS → Trébol solo entrega a https://
- Firewall bloquea las IPs
35.170.236.123y54.162.134.233 - El servidor responde lento (>30s) → timeout, Trébol asume error
- 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 responde2xx. 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:- 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)
- Express:
- Estás usando comparación normal (
===,==) → usacrypto.timingSafeEqual(Node) ohmac.compare_digest(Python) para evitar timing attacks - Secret incorrecto — verifica que estás usando el secret del webhook correcto (cada webhook tiene su propio secret)
- 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 usax-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 errores5xx o de red, implementa reintentos:
4xx — son problemas de tu request, no se van a arreglar reintentando.