Zapier
Valida documentos en Zapier con Webhooks by Zapier (JSON con file_url) o Code by Zapier (base64), filtra por veredicto y recibe eventos con Catch Hook.
Zapier no necesita un conector propio para usar Constaia: la acción Webhooks by Zapier envía la petición a la API y el disparador Catch Hook recibe los eventos. Si el fichero no está en una URL descargable, Code by Zapier lo puede convertir a base64.
Requisitos
- Una cuenta de Zapier con acceso a Webhooks by Zapier (y a Code by Zapier si usas la opción con código). Consulta qué incluye tu plan.
- Una clave de test
ck_test_…del panel. Consulta Autenticación. - Un paso anterior que aporte el documento: un adjunto de Gmail, un fichero de Google Drive, un formulario
(Typeform, Jotform…). Zapier suele exponer los ficheros como una URL
https://descargable.
Opción 1: Webhooks by Zapier con file_url
Añade la acción Custom Request
Añade Webhooks by Zapier con el evento Custom Request (permite escribir el JSON completo, con objetos anidados):
| Campo | Valor |
|---|---|
| Method | POST |
| URL | https://api.constaia.com/v1/analyze |
| Data Pass-Through? | False |
| Headers | Authorization → Bearer ck_test_… · Content-Type → application/json |
Escribe el cuerpo
En Data escribe el JSON e inserta los valores de pasos anteriores donde corresponda (la URL del fichero, su nombre, el nombre del titular…):
{
"file_url": "https://files.example.com/uploads/dni.jpg",
"filename": "dni.jpg",
"options": {
"expect": ["es_dni", "es_nie", "passport"],
"checks": { "min_age_years": 18, "holder": { "full_name": "María García López" } },
"language": "es",
"metadata": { "source": "zapier" }
}
}file_url tiene que ser https, sin IPs privadas, con un máximo de 20 MB y descargable en 15 s. filename
sustituye al nombre que Constaia deduce de la URL (útil en modo test). Todas las opciones están en
POST /v1/analyze.
Si no necesitas objetos anidados, el evento POST con Payload Type json también sirve: la API acepta las
opciones en la raíz del cuerpo (file_url, filename, expect, language…).
Filtra o bifurca según el veredicto
Zapier aplana la respuesta en campos como Verdict Status, Verdict Reasons Message o
Fields Document Number Value. Usa Filter by Zapier para continuar solo con valid, o Paths by Zapier
para tres ramas:
| Rama | Condición | Qué hacer |
|---|---|---|
| Válido | Verdict Status (Text) Exactly matches valid | Guardar datos, aprobar |
| No válido | … Exactly matches invalid | Responder al usuario con los message de verdict.reasons |
| Revisar | … Exactly matches review | Crear una tarea de revisión humana |
Si el análisis tarda más de 30 s (PDFs largos), la API responde 202 con status: "queued" o "processing" y
sin veredicto: filtra por Status = completed o usa "async": true y el webhook (más abajo). El significado de
cada estado está en Veredictos.
Opción 2: Code by Zapier (base64)
Si el paso anterior no te da una URL que Constaia pueda descargar (por ejemplo, requiere tu sesión), descarga el
fichero en un paso Code by Zapier → Run JavaScript y envíalo como file_base64.
En Input Data define file_url (el fichero del paso anterior), file_name y api_key, y usa:
const file = await fetch(inputData.file_url);
if (!file.ok) throw new Error(`No se pudo descargar el fichero: ${file.status}`);
const base64 = Buffer.from(await file.arrayBuffer()).toString("base64");
const res = await fetch("https://api.constaia.com/v1/analyze", {
method: "POST",
headers: {
Authorization: `Bearer ${inputData.api_key}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
file_base64: base64,
filename: inputData.file_name,
options: { expect: "payment_receipt", checks: { expected_amount: 45 } },
}),
});
const analysis = await res.json();
if (!res.ok) {
throw new Error(`${analysis.error.code}: ${analysis.error.message} (${analysis.error.request_id})`);
}
return {
id: analysis.id,
status: analysis.status,
verdict: analysis.verdict?.status ?? null,
reasons: (analysis.verdict?.reasons ?? []).map((r) => r.message).join(" | "),
amount: analysis.fields.amount?.value ?? null,
};Devuelve solo lo que usarán los pasos siguientes. Los pasos de código tienen un tiempo máximo de ejecución que
depende del plan de Zapier; si tus documentos son PDFs largos o el análisis se acerca a ese límite, usa
async: true y recibe el resultado por webhook.
El valor de api_key en Input Data queda guardado en el Zap y es visible para quien pueda editarlo. No uses una
clave ck_live_… en Zaps compartidos; limita quién puede editar el Zap.
Probar en modo test
Con una clave ck_test_… no se consumen créditos y la respuesta depende del nombre del fichero (el fichero
tiene que ser un JPEG, PNG, WEBP, HEIC o PDF real). En el cuerpo JSON fija "filename" a uno de estos nombres:
filename | Con expect: "es_dni" |
|---|---|
dni_valid.jpg | Válido |
dni_expired.jpg | No válido (not_expired, severidad error) |
blurry.jpg | Revisar (low_quality, severidad warning) |
Para la opción 2 prueba con payment_receipt.pdf y expected_amount: 45. Todos los escenarios en
Modo test.
Recibir eventos con Catch Hook
Crea el disparador
Crea un Zap nuevo con Webhooks by Zapier → Catch Hook y copia la URL. Regístrala en el panel o por API:
curl https://api.constaia.com/v1/webhook-endpoints \
-H "Authorization: Bearer $CONSTAIA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url":"https://hooks.zapier.com/hooks/catch/…","events":["analysis.completed","analysis.failed"]}'Lanza un análisis con "async": true para que Zapier reciba un evento de ejemplo (type, created_at, data).
Vuelve a leer el análisis
Catch Hook no te permite verificar la firma HMAC de los webhooks, así que no te fíes del
contenido del evento. Añade un Filter que compruebe que Data Id empieza por an_ y después una acción
Webhooks by Zapier → GET (o Custom Request con GET):
| Campo | Valor |
|---|---|
| URL | https://api.constaia.com/v1/analyses/ + Data Id |
| Headers | Authorization → Bearer ck_test_… |
Decide con esa respuesta, que viene de la API con tu clave. La API solo devuelve análisis de tu cuenta, así que un evento falsificado como mucho te hace releer un análisis tuyo.
Sé idempotente
Constaia reintenta las entregas que no reciben un 2xx durante unos 3 días, y Catch Hook puede recibir el mismo
evento más de una vez. Antes de crear registros, comprueba en tu destino (hoja, CRM, base de datos) si ese
Data Id ya se procesó.
La relectura necesita que el análisis siga guardado: no uses keep_results: false en los análisis que quieras
recibir por webhook.
Seguridad
- Nunca pegues una clave
ck_live_…en Zaps compartidos o en plantillas. Quien pueda editar el Zap puede ver las cabeceras y los Input Data. - Monta y prueba el Zap con una clave de test; cámbiala por la live al activarlo.
- Zapier guarda los datos de cada ejecución en el historial de Zaps. Tenlo en cuenta con documentos de identidad. Más en Almacenamiento y privacidad.
Límites
- 20 MB por fichero; PDFs de hasta 30 páginas en síncrono y hasta 200 con
async: true. - 2 peticiones por segundo por clave en el plan gratuito (10 en el de pago); ante un 429 respeta
Retry-After. Para muchos ficheros a la vez usa lotes. Ver Límites de uso.
Siguientes pasos
Make
Valida documentos en Make con el módulo HTTP en multipart/form-data, enruta por veredicto con un Router y recibe eventos de Constaia con un webhook.
Power Automate
Valida documentos de SharePoint u OneDrive con la acción HTTP de Power Automate, analiza la respuesta con Parse JSON y recibe eventos de Constaia.