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:
| Campo | Valor |
|---|---|
| Name | Constaia |
| Base URL | https://api.constaia.com/v1 |
| Headers | Authorization → 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:
| Campo | Valor |
|---|---|
| Action type | POST |
| URL | analyze |
| Headers | Content-Type → application/json |
| Body | Raw |
| Run behavior | manual (solo al pulsar el botón) |
Con este cuerpo:
{{ 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 }}. reasonsTablecon{{ analyzeDocument.data?.verdict?.reasons ?? [] }}(columnascode,severity,message).fieldsTablecon:
{{ 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,
})) }}| Veredicto | Qué significa en el panel |
|---|---|
| Válido | El tipo coincide y no hay avisos ni errores |
| No válido | Hay al menos un motivo con severidad error (tipo incorrecto, caducado, letra del NIF incorrecta…) |
| Revisar | Hay 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):
| Fichero | Tipo | Resultado |
|---|---|---|
dni_valid.jpg | es_dni | Válido MARÍA GARCÍA LÓPEZ, 12345678Z |
dni_expired.jpg | es_dni | No válido "Caducado el 15/06/2020." |
blurry.jpg | es_dni | Revisar low_quality |
invoice.pdf | invoice | Vá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
Constaiay 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
Airtable
Valida los adjuntos de Airtable con una automatización "Run a script" que envía la URL del adjunto a Constaia y escribe el veredicto en el registro.
Function calling (OpenAI y Anthropic)
Expón Constaia como herramienta validate_document para modelos de OpenAI y Anthropic, ejecútala en tu servidor y devuelve al modelo un resultado recortado.