Plantillas
Referencia de /v1/templates: guarda una configuración de verificación (expect, checks, almacenamiento, revisión humana, retención) y reutilízala con template en analyze, classify, lotes, enlaces, sesiones y expedientes.
Una plantilla (tpl_…) es una configuración de verificación guardada: qué documentos aceptas (expect), qué
compruebas (checks), qué se guarda y durante cuánto tiempo, y cuándo tiene que mirar el resultado una persona. La
creas una vez y la usas por su id con template en cualquier flujo, en lugar de repetir las mismas opciones en cada
llamada. Guía paso a paso con ejemplos en cuatro lenguajes: Reutilizar la configuración con plantillas.
| Método y ruta | Qué hace |
|---|---|
POST /v1/templates | Crea una plantilla. |
GET /v1/templates | Lista las plantillas de la cuenta. |
GET /v1/templates/{id} | Recupera una plantilla. |
PATCH /v1/templates/{id} | Cambia una plantilla (parcial). |
DELETE /v1/templates/{id} | Borra una plantilla. |
Todas las rutas usan una clave secreta (ck_test_… o ck_live_…) desde tu backend. Las plantillas son de la
cuenta, no de un modo: la misma plantilla sirve con claves de test y de live. También se gestionan en el
panel, en Plantillas.
El objeto template
{
"id": "tpl_01J9Z8Q3K4M5N6P7Q8R9S0T1V2",
"object": "template",
"name": "DNI vigente mayor de edad",
"description": "DNI español en vigor de una persona de 18 años o más.",
"expect": "es_dni",
"checks": { "not_expired": true, "min_age_years": 18 },
"extract": true,
"storage": "review",
"ttl_hours": null,
"keep_results": true,
"export": [],
"processing": null,
"language": null,
"redact": false,
"mask_fields": ["document_number"],
"verdict_without_expect": true,
"retention_days": 90,
"review_retention_hours_after_decision": 0,
"review_max_days": 7,
"review": { "auto_approve_valid": true, "require_human_for": ["review", "invalid"] },
"example": false,
"created_at": "2026-09-30T09:12:44Z",
"updated_at": "2026-09-30T09:12:44Z"
}Opciones de análisis
Tienen el mismo significado y la misma validación que en POST /v1/analyze. Un valor
null en la respuesta significa que la plantilla no lo fija: se usa el de la petición o, si tampoco lo trae, el de la
cuenta.
| Campo | Tipo | Descripción |
|---|---|---|
expect | string | string[] | null | Tipo o tipos aceptados (hasta 20), del catálogo. |
checks | objeto | Reglas de validación, como options.checks. |
extract | boolean | objeto | true (campos del tipo), false o tu propio JSON Schema. |
storage | none | review | temporary | persistent | null | Qué se hace con el fichero original. Ver Almacenamiento y privacidad. |
ttl_hours | entero 1–720 | null | Horas que se conserva el fichero con storage: "temporary". |
keep_results | boolean | false: los resultados se devuelven una vez y no se guardan. Por defecto true. |
export | string[] | Exportaciones que se generan al terminar (json, csv, xlsx, xml, vcard, pdf, redacted_image). |
processing | sovereign | standard | null | Perfil de procesamiento. |
language | es | en | pt | fr | null | Idioma de los mensajes del veredicto. |
redact | boolean | Genera una copia pixelada de la imagen. Ver Privacidad avanzada. |
mask_fields | string[] | Campos que se guardan enmascarados. Ver Privacidad avanzada. |
verdict_without_expect | boolean | v1.2. Sin expect, veredicto contra el tipo detectado (verdict.basis: "detected"). false: verdict: null sin expect. Por defecto true. Ver Veredictos. |
face_verification | { enabled, required? } | null | Verificación facial en los enlaces y expedientes creados con la plantilla (módulo opcional; activarla exige el módulo activo en la cuenta). Ver Verificación facial. |
Al crear o cambiar una plantilla también se admite precise_bboxes (como en analyze), aunque no se devuelve en el
objeto.
Retención y plazos de revisión
| Campo | Tipo | Descripción |
|---|---|---|
retention_days | entero 1–3650 | null | Días que se conservan los resultados (datos extraídos, veredicto, exportaciones) de los análisis hechos con la plantilla. null: el plazo de la cuenta. Ver Retención. |
review_retention_hours_after_decision | entero 0–720 | null | Con storage: "review", horas que se conserva el original después de decidir la revisión. 0: se borra al decidir. null: el de la cuenta (24 por defecto). |
review_max_days | entero 1–90 | null | Con storage: "review", días máximos que se conserva el original si nadie decide. null: el de la cuenta (30 por defecto). |
Los plazos se resuelven al crear cada análisis y se guardan con él: cambiar la plantilla después no altera los análisis ya hechos.
Política de revisión humana (review)
| Campo | Tipo | Por defecto | Descripción |
|---|---|---|---|
review.auto_approve_valid | boolean | true | false: los análisis valid también quedan pendientes de revisión humana. |
review.require_human_for | array de valid, invalid, review | ["review"] | Veredictos que entran en la cola de revisión. Añade invalid si una persona debe confirmar cada rechazo. |
Un análisis hecho con la plantilla queda pendiente (review.status: "pending", verdict.final_status: null) si su
veredicto está en require_human_for, o si es valid y auto_approve_valid es false. Sin plantilla, solo los
review. La cola se atiende en el panel o por API: ver Revisiones.
Otros campos
| Campo | Descripción |
|---|---|
id | Id con prefijo tpl_. |
name | Nombre visible (1–120 caracteres). |
description | Descripción (hasta 1000 caracteres) o null. |
example | true en las plantillas de ejemplo que se crean con la cuenta. |
created_at, updated_at | Fechas ISO 8601. |
Usar una plantilla
Pasa el id de la plantilla con template. Primero se aplica la plantilla y encima las opciones de la petición, que
mandan; checks se fusiona clave a clave (puedes añadir holder en cada petición y conservar el resto de checks de la
plantilla).
| Dónde | Cómo se pasa |
|---|---|
POST /v1/analyze y POST /v1/classify | template dentro de options (multipart) o en la raíz del JSON. |
POST /v1/batches | En las options comunes o en las de cada ítem. |
POST /v1/verification-links | Campo template. Si no mandas documents, se pide uno con el expect de la plantilla. |
POST /v1/sessions | Campo template. El navegador no puede cambiar sus opciones. |
POST /v1/dossiers | Campo template. Se aplica a cada documento que se analiza en el expediente. |
curl https://api.constaia.com/v1/analyze \
-H "Authorization: Bearer $CONSTAIA_API_KEY" \
-F "file=@dni.jpg" \
-F 'options={"template":"tpl_01J9Z8Q3K4M5N6P7Q8R9S0T1V2","checks":{"holder":{"full_name":"María García López"}},"metadata":{"user_id":"123"}}'El análisis devuelve la plantilla usada en template_id (y en su alias template). Si la plantilla no existe en la
cuenta (o se borró): 422 template_not_found, con param: "options.template" en analyze, classify, lotes y
sesiones, y param: "template" en enlaces y expedientes.
Crear una plantilla
POST /v1/templates
Content-Type: application/jsonSolo name es obligatorio. El resto de campos son los del objeto (sin id, object, example ni fechas). Los campos
son estrictos: uno desconocido devuelve 422 invalid_parameter con su param.
curl https://api.constaia.com/v1/templates \
-H "Authorization: Bearer $CONSTAIA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "DNI vigente mayor de edad",
"expect": ["es_dni", "es_nie"],
"checks": { "not_expired": true, "min_age_years": 18 },
"storage": "review",
"review_max_days": 7,
"mask_fields": ["document_number"],
"review": { "require_human_for": ["review", "invalid"] }
}'Responde 201 con el objeto template. Si expect o un check no son válidos, 422 invalid_parameter con el param
exacto (expect, checks.min_age_years, review.require_human_for…).
Listar plantillas
GET /v1/templates?limit=20| Parámetro | Tipo | Descripción |
|---|---|---|
limit | entero 1–100 | Elementos por página. Por defecto 20. |
starting_after | string | Id (tpl_…) de la última plantilla de la página anterior. |
Devuelve { "object": "list", "data": [...], "has_more": false, "url": "/v1/templates" }, de la más reciente a la más
antigua. Ver Paginación.
Recuperar, cambiar y borrar
curl https://api.constaia.com/v1/templates/tpl_01J9Z8Q3K4M5N6P7Q8R9S0T1V2 \
-H "Authorization: Bearer $CONSTAIA_API_KEY"
curl -X PATCH https://api.constaia.com/v1/templates/tpl_01J9Z8Q3K4M5N6P7Q8R9S0T1V2 \
-H "Authorization: Bearer $CONSTAIA_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "checks": { "not_expired": true, "min_age_years": 16 }, "ttl_hours": null }'
curl -X DELETE https://api.constaia.com/v1/templates/tpl_01J9Z8Q3K4M5N6P7Q8R9S0T1V2 \
-H "Authorization: Bearer $CONSTAIA_API_KEY"PATCHes parcial: solo cambia los campos que mandas. Un campo de análisis anulllo quita de la plantilla (vuelve a mandar la petición o la cuenta).checksse sustituye entero, no se fusiona.reviewse sustituye entero: lo que no mandes dentro dereviewvuelve a su valor por defecto.- Los cambios solo afectan a los análisis que se creen después.
DELETEdevuelve{ "id": "tpl_…", "object": "template", "deleted": true }. Los análisis, enlaces y expedientes ya creados con ella no cambian; las peticiones nuevas que la usen reciben422 template_not_found.
Una plantilla que no existe en la cuenta devuelve 404 resource_missing.
Plantillas de ejemplo
Cada cuenta empieza con cinco plantillas (example: true), con el nombre en el idioma de la cuenta: DNI vigente mayor
de edad, certificado médico deportivo de menos de 6 meses, certificado de delitos sexuales sin antecedentes,
justificante de transferencia y factura (con exportación a XLSX). Se crean al dar de alta la cuenta o, en cuentas
anteriores, en la primera lectura de la lista. Puedes usarlas tal cual, cambiarlas o borrarlas.
SDK
import { Constaia } from "@constaia/sdk";
const constaia = new Constaia();
const tpl = await constaia.templates.create({
name: "DNI vigente mayor de edad",
expect: ["es_dni", "es_nie"],
checks: { notExpired: true, minAgeYears: 18 },
review: { requireHumanFor: ["review", "invalid"] },
reviewMaxDays: 7,
});
for await (const t of constaia.templates.list()) console.log(t.id, t.name);
await constaia.templates.update(tpl.id, { maskFields: ["document_number"] });
await constaia.templates.delete(tpl.id);Errores
| HTTP | code | Cuándo |
|---|---|---|
422 | invalid_parameter | Un campo no es válido (param indica cuál), por ejemplo un tipo desconocido en expect. |
422 | template_not_found | Usas en template un id que no existe en la cuenta. |
404 | resource_missing | GET, PATCH o DELETE de una plantilla que no existe. |
Siguientes pasos
POST /v1/batches
Referencia de POST /v1/batches: analiza hasta 100 documentos en una llamada asíncrona, con opciones comunes o por documento y export combinado.
Enlaces de verificación
Referencia de /v1/verification-links: crea una página alojada donde la persona sube sus documentos desde el móvil, recibe los resultados por webhook, callback o email y consulta, lista o cancela enlaces.