Constaia
Integraciones

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):

CampoValor
MethodPOST
URLhttps://api.constaia.com/v1/analyze
Data Pass-Through?False
HeadersAuthorization → 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…):

Data
{
  "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:

RamaCondiciónQué hacer
VálidoVerdict Status (Text) Exactly matches validGuardar datos, aprobar
No válido… Exactly matches invalidResponder al usuario con los message de verdict.reasons
Revisar… Exactly matches reviewCrear 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:

Code by Zapier (JavaScript)
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:

filenameCon expect: "es_dni"
dni_valid.jpgVálido
dni_expired.jpgNo válido (not_expired, severidad error)
blurry.jpgRevisar (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:

Terminal
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):

CampoValor
URLhttps://api.constaia.com/v1/analyses/ + Data Id
HeadersAuthorization → 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

En esta página