API HTTP de solo lectura que renderiza documentos de identidad españoles especimen a partir de una URL. Cada salida lleva un pie permanente ESPECIMEN · SIN VALIDEZ LEGAL. Pensada para QA: pruebas de OCR, formularios KYC, maquetas y demostraciones.
| Ruta | Devuelve |
|---|---|
GET /{type}/{side}/{format}?… | Imagen del documento. side: front rear both (por defecto front; both apila las dos caras). format: svg png jpg jpeg webp avif json (por defecto svg). Atajos: /{type}, /{type}/png, /{type}/rear. |
GET /{type}/json?… | JSON con la identidad resuelta, la MRZ (líneas y dígitos de control) y el SVG de cada cara. |
GET /identity/json?seed=… | Identidad coherente y determinista sin imágenes (admite type y todos los parámetros de identidad). |
GET /validate/{type}?number=… | { valid, normalized, expected, checkLetter | control, complete, error }. Completa la letra/control si falta. |
GET /types | Catálogo JSON de tipos, caras, formatos, países UE y parámetros. |
GET /healthz | ok |
| type | Documento | Caras | Formato de number | Ejemplo |
|---|---|---|---|---|
dni | DNI 3.0 | front rear | 8 dígitos + letra de control (12345678Z). Se completa la letra si falta. | /dni/both/png?seed=ana&size=900 |
nif (alias de dni) | NIF (persona física) | front rear | Igual que dni. | /nif/front/svg?number=12345678 |
nie | TIE (NIE) | front rear | X/Y/Z + 7 dígitos + letra (X1234567L). Se completa la letra si falta. | /nie/both/png?seed=omar&nationality=MAR |
permiso_residencia (alias de nie) | Permiso de residencia | front rear | Igual que nie. | /permiso_residencia/front/png?seed=elena&nationality=ROU |
pasaporte | Pasaporte | front rear | 3 letras + 6 dígitos (PAB123456). Sin carácter de control. | /pasaporte/front/png?number=PAB123456 |
cif | CIF / NIF de entidad | front | Letra de entidad + 7 dígitos + control (B12345674, Q2826000H). Se completa el control si falta. | /cif/front/svg?number=B1234567 |
eu | Documento país de origen (UE) | front rear | 6–12 letras o dígitos (los formatos reales varían por país). | /eu/both/png?seed=luca&country=IT |
Países para eu: PT FR IT DE RO BG PL NL. Cada país aporta su bandera, su nombre oficial en el idioma local, su tinte y un banco de nombres propio.
Todos son opcionales. Lo que no se indique se deriva de seed; si no hay seed, la semilla es number, y si tampoco hay número, "especimen". Los valores inválidos devuelven 400 con un JSON explicativo ({ error, expected… }).
| Parámetro | Tipo | Por defecto | Descripción |
|---|---|---|---|
seed | string | number, si no "especimen" | Semilla determinista: todo lo que no se indique se deriva de ella. Misma semilla, mismo documento. |
number | string | derivado de seed | Número del documento. Se valida y se completa (letra DNI/NIE, control CIF). Formato según tipo. |
name | string | derivado | Nombre de pila (admite compuestos: "María del Carmen"). |
surname1 | string | derivado | Primer apellido. |
surname2 | string | derivado | Segundo apellido (vacío para la mayoría de nacionalidades no hispanas). |
sex | M | F | X | coherente con el nombre | Sexo impreso y en la MRZ (X se codifica como "<"). |
birth | YYYY-MM-DD | 18–85 años | Fecha de nacimiento. |
issue | YYYY-MM-DD | últimos 0–9 años | Fecha de expedición. |
expiry | YYYY-MM-DD | según edad | Fecha de validez. DNI: +5 años (<30), +10 (<70), PERMANENTE (≥70, impreso 01 01 9999). Pasaporte: +5/+10. |
nationality | ISO-3 | ESP (nie: MAR, ROU, COL…) | Nacionalidad del titular. Para nie elige además el banco de nombres. |
birthplace | string | derivado | Localidad de nacimiento. |
province | string | coherente con city | Provincia del domicilio. |
address | string | derivado | Vía y número del domicilio. |
city | string | derivado | Localidad del domicilio (si es conocida fija provincia y prefijo postal). |
postal | 5 dígitos | coherente con la provincia | Código postal. |
parents | "Nombre / Nombre" | derivado | Nombres del padre y de la madre (campo HIJO/A DE). |
support | string | BCA + 6 dígitos | Número de soporte (IDESP). Va en la MRZ de las tarjetas. |
photo | estilo de avatars.suils.es | suils | Estilo del avatar usado como fotografía. |
photoSeed | string | number | Semilla del avatar. |
lang | es | en | ca | es | Idioma principal de las etiquetas (la secundaria se mantiene como subtítulo). |
watermark | 1 | 0 | 1 | Marca de agua diagonal "ESPECIMEN". El pie "ESPECIMEN · SIN VALIDEZ LEGAL" se imprime siempre. |
country | PT | FR | IT | DE | RO | BG | PL | NL | derivado | Solo tipo eu: país emisor de la tarjeta. |
dni | string | derivado | Solo pasaporte: número de DNI del titular (campo "Nº DNI" y número personal de la MRZ). |
size | entero | anchura natural | Anchura en píxeles de la salida raster (limitada por MAX_SIZE). |
backgroundColor | hex sin # | transparente (jpg: blanco) | Color de fondo tras la tarjeta. |
Raster: size es la anchura en píxeles (máximo 1600 en esta instancia); la altura sigue la proporción ID-1 (85,6 × 53,98 mm) o la de la página del pasaporte (125 × 88 mm). jpg se aplana sobre blanco.
PERMANENTE si ≥70, impreso 01 01 9999; pasaporte +5/+10; TIE +5; UE +10). Si necesitas estabilidad absoluta entre años, fija birth, issue y expiry.avatars.suils.es/{photo}/png?seed={photoSeed}, incrustada en base64. Si el servicio de avatares no responde en 4 s se dibuja una silueta neutra."TRWAGMYFPDXBNJZSQVHLCKE"[número mod 23]. 12345678 → Z, 00000000 → T.X1234567 → L, Y1234567 → X, Z1234567 → R.(10 − ((Σ pares + Σ dígitos de 2×impares) mod 10)) mod 10; letra JABCDEFGHI[n] si la entidad es P, Q, R, S, N o W, dígito si es A, B, E o H, cualquiera en el resto. A58818501, B12345674, Q2826000H son válidos.PAB123456).<=0) mod 10, incluido el compuesto. En DNI/TIE la línea 1 lleva IDESP + número de soporte + control y el DNI/NIE en el campo opcional, como en las tarjetas reales; el pasaporte lleva el DNI como número personal. Transliteración: Ñ→N, sin acentos, espacios→<.docker compose up -d --build levanta la API (Node 20, node:http, resvg + sharp) y una pasarela nginx publicada en :8182. Variables: PUBLIC_BASE_URL, AVATARS_BASE_URL, MAX_SIZE, CACHE_CONTROL_MAX_AGE, UV_THREADPOOL_SIZE. Las respuestas llevan Cache-Control: public, max-age=… y CORS abierto.
Los diseños son originales (no reproducen escudos ni elementos de seguridad reales) y cada cara incluye un pie de especimen que no puede desactivarse. Los datos son ficticios y generados a partir de la semilla. Código © 2026 Suils, licencia MIT.