Constaia
Endpoints

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 rutaQué hace
POST /v1/templatesCrea una plantilla.
GET /v1/templatesLista 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

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.

CampoTipoDescripción
expectstring | string[] | nullTipo o tipos aceptados (hasta 20), del catálogo.
checksobjetoReglas de validación, como options.checks.
extractboolean | objetotrue (campos del tipo), false o tu propio JSON Schema.
storagenone | review | temporary | persistent | nullQué se hace con el fichero original. Ver Almacenamiento y privacidad.
ttl_hoursentero 1–720 | nullHoras que se conserva el fichero con storage: "temporary".
keep_resultsbooleanfalse: los resultados se devuelven una vez y no se guardan. Por defecto true.
exportstring[]Exportaciones que se generan al terminar (json, csv, xlsx, xml, vcard, pdf, redacted_image).
processingsovereign | standard | nullPerfil de procesamiento.
languagees | en | pt | fr | nullIdioma de los mensajes del veredicto.
redactbooleanGenera una copia pixelada de la imagen. Ver Privacidad avanzada.
mask_fieldsstring[]Campos que se guardan enmascarados. Ver Privacidad avanzada.
verdict_without_expectbooleanv1.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? } | nullVerificació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

CampoTipoDescripción
retention_daysentero 1–3650 | nullDí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_decisionentero 0–720 | nullCon 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_daysentero 1–90 | nullCon 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)

CampoTipoPor defectoDescripción
review.auto_approve_validbooleantruefalse: los análisis valid también quedan pendientes de revisión humana.
review.require_human_forarray 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

CampoDescripción
idId con prefijo tpl_.
nameNombre visible (1–120 caracteres).
descriptionDescripción (hasta 1000 caracteres) o null.
exampletrue en las plantillas de ejemplo que se crean con la cuenta.
created_at, updated_atFechas 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óndeCómo se pasa
POST /v1/analyze y POST /v1/classifytemplate dentro de options (multipart) o en la raíz del JSON.
POST /v1/batchesEn las options comunes o en las de cada ítem.
POST /v1/verification-linksCampo template. Si no mandas documents, se pide uno con el expect de la plantilla.
POST /v1/sessionsCampo template. El navegador no puede cambiar sus opciones.
POST /v1/dossiersCampo 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/json

Solo 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ámetroTipoDescripción
limitentero 1–100Elementos por página. Por defecto 20.
starting_afterstringId (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"
  • PATCH es parcial: solo cambia los campos que mandas. Un campo de análisis a null lo quita de la plantilla (vuelve a mandar la petición o la cuenta). checks se sustituye entero, no se fusiona.
  • review se sustituye entero: lo que no mandes dentro de review vuelve a su valor por defecto.
  • Los cambios solo afectan a los análisis que se creen después.
  • DELETE devuelve { "id": "tpl_…", "object": "template", "deleted": true }. Los análisis, enlaces y expedientes ya creados con ella no cambian; las peticiones nuevas que la usen reciben 422 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

templates.ts
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

HTTPcodeCuándo
422invalid_parameterUn campo no es válido (param indica cuál), por ejemplo un tipo desconocido en expect.
422template_not_foundUsas en template un id que no existe en la cuenta.
404resource_missingGET, PATCH o DELETE de una plantilla que no existe.

Siguientes pasos

En esta página