Constaia
Integraciones

Retool

Crea en Retool un panel interno para validar documentos con Constaia: recurso REST con la clave en variables de configuración, subida de ficheros y resultados.

Retool es una buena opción para un panel interno de backoffice: una persona sube un documento, elige el tipo esperado y ve al momento el veredicto, los motivos y los campos extraídos. Las consultas a recursos REST se ejecutan desde el servidor de Retool, así que la clave no llega al navegador de quien usa la app.

Requisitos

  • Una organización de Retool con permisos para crear recursos y apps.
  • Una clave de test ck_test_… del panel. Consulta Autenticación.

Configurar el recurso

Guarda la clave como variable de configuración secreta

En Settings → Configuration variables crea CONSTAIA_API_KEY, márcala como secret y dale el valor ck_test_… (y el valor live en el entorno de producción, si usas entornos). Las variables secretas solo se pueden usar en la configuración de recursos, no en el código de las apps.

Crea el recurso REST API

En Resources → Create new → REST API:

CampoValor
NameConstaia
Base URLhttps://api.constaia.com/v1
HeadersAuthorization → Bearer {{ retoolContext.configVars.CONSTAIA_API_KEY }}

Todas las consultas que usen este recurso llevarán la cabecera sin que la clave aparezca en la app.

Construir la app

Componentes

Crea una app y añade:

  • fileInput1: un File Input que acepte imágenes y PDF.
  • typeSelect: un Select para el tipo esperado.
  • analyzeButton: un Button con el texto "Analizar".
  • fieldsTable: una Table para los campos extraídos.
  • reasonsTable: una Table para los motivos del veredicto.

Carga el catálogo de tipos

Crea la consulta documentTypes sobre el recurso Constaia: método GET, ruta document-types?language=es, ejecución automática. En typeSelect usa como datos {{ documentTypes.data.data }}, como valor {{ item.type }} y como etiqueta {{ item.label }}. El endpoint devuelve el catálogo completo, con los campos de cada tipo.

Crea la consulta de análisis

Crea la consulta analyzeDocument sobre el recurso Constaia:

CampoValor
Action typePOST
URLanalyze
HeadersContent-Type → application/json
BodyRaw
Run behaviormanual (solo al pulsar el botón)

Con este cuerpo:

analyzeDocument · Body (Raw)
{{ JSON.stringify({
  file_base64: fileInput1.value[0].base64Data,
  filename: fileInput1.value[0].name,
  options: {
    expect: typeSelect.value,
    language: "es",
    metadata: { reviewer: current_user.email }
  }
}) }}

fileInput1.value es la lista de ficheros seleccionados; cada uno trae el contenido en base64 y el nombre. Comprueba los nombres exactos de las propiedades en el inspector de estado del componente, porque pueden variar entre versiones de Retool. En analyzeButton, añade un manejador de evento Click que ejecute analyzeDocument.

Si trabajas con claves live, activa en la consulta la confirmación antes de ejecutarla: cada análisis consume créditos.

Muestra el resultado

  • Un Text con el veredicto: {{ analyzeDocument.data?.verdict?.status ?? analyzeDocument.data?.status }}.
  • reasonsTable con {{ analyzeDocument.data?.verdict?.reasons ?? [] }} (columnas code, severity, message).
  • fieldsTable con:
fieldsTable · Data
{{ Object.entries(analyzeDocument.data?.fields ?? {}).map(([name, f]) => ({
  campo: name,
  valor: typeof f.value === "object" ? JSON.stringify(f.value) : f.value,
  confianza: f.confidence,
  validado: f.validated,
})) }}
VeredictoQué significa en el panel
VálidoEl tipo coincide y no hay avisos ni errores
No válidoHay al menos un motivo con severidad error (tipo incorrecto, caducado, letra del NIF incorrecta…)
RevisarHay avisos (calidad baja, confianza baja…): que lo mire una persona

Más en Veredictos. Si la consulta falla, Retool la marca como fallida y el cuerpo del error de Constaia (error.code, error.message, error.request_id) aparece en el resultado de la consulta; añade un manejador Failure que muestre una notificación. Los códigos están en Errores.

Historial de análisis

Crea una consulta recentAnalyses con GET analyses?limit=20 y muéstrala en otra tabla para ver los últimos análisis de la clave (más recientes primero). Para paginar, pasa el id del último elemento como starting_after mientras has_more sea true. Si un análisis devolvió 202 (queued o processing), consulta GET analyses/{id} hasta que esté completed. Detalles en Análisis.

Probar en modo test

Con ck_test_… no se consumen créditos y la respuesta depende del nombre del fichero que se envía en filename (el contenido tiene que ser un JPEG, PNG, WEBP, HEIC o PDF real):

FicheroTipoResultado
dni_valid.jpges_dniVálido MARÍA GARCÍA LÓPEZ, 12345678Z
dni_expired.jpges_dniNo válido "Caducado el 15/06/2020."
blurry.jpges_dniRevisar low_quality
invoice.pdfinvoiceVálido total 121 EUR con el check invoice_totals superado

Más escenarios en Modo test.

Seguridad

  • La clave vive solo en la variable de configuración secreta y en el recurso. No la escribas en consultas, transformadores ni componentes.
  • Restringe quién puede usar el recurso Constaia y quién puede editar la app.
  • Usa la clave de test en el entorno de pruebas y la live en producción.
  • Constaia borra el fichero al terminar con storage: "none" (por defecto). Revisa qué guarda Retool en los registros de auditoría de consultas si procesas 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 la API envía Retry-After. Ver Límites de uso.

Siguientes pasos

En esta página