Documentación

documents.suils.es

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.

Endpoints

RutaDevuelve
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 /typesCatálogo JSON de tipos, caras, formatos, países UE y parámetros.
GET /healthzok

Tipos

typeDocumentoCarasFormato de numberEjemplo
dniDNI 3.0front rear8 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 rearIgual que dni./nif/front/svg?number=12345678
nieTIE (NIE)front rearX/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 residenciafront rearIgual que nie./permiso_residencia/front/png?seed=elena&nationality=ROU
pasaportePasaportefront rear3 letras + 6 dígitos (PAB123456). Sin carácter de control./pasaporte/front/png?number=PAB123456
cifCIF / NIF de entidadfrontLetra de entidad + 7 dígitos + control (B12345674, Q2826000H). Se completa el control si falta./cif/front/svg?number=B1234567
euDocumento país de origen (UE)front rear6–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.

Parámetros

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ámetroTipoPor defectoDescripción
seedstringnumber, si no "especimen"Semilla determinista: todo lo que no se indique se deriva de ella. Misma semilla, mismo documento.
numberstringderivado de seedNúmero del documento. Se valida y se completa (letra DNI/NIE, control CIF). Formato según tipo.
namestringderivadoNombre de pila (admite compuestos: "María del Carmen").
surname1stringderivadoPrimer apellido.
surname2stringderivadoSegundo apellido (vacío para la mayoría de nacionalidades no hispanas).
sexM | F | Xcoherente con el nombreSexo impreso y en la MRZ (X se codifica como "<").
birthYYYY-MM-DD18–85 añosFecha de nacimiento.
issueYYYY-MM-DDúltimos 0–9 añosFecha de expedición.
expiryYYYY-MM-DDsegún edadFecha de validez. DNI: +5 años (<30), +10 (<70), PERMANENTE (≥70, impreso 01 01 9999). Pasaporte: +5/+10.
nationalityISO-3ESP (nie: MAR, ROU, COL…)Nacionalidad del titular. Para nie elige además el banco de nombres.
birthplacestringderivadoLocalidad de nacimiento.
provincestringcoherente con cityProvincia del domicilio.
addressstringderivadoVía y número del domicilio.
citystringderivadoLocalidad del domicilio (si es conocida fija provincia y prefijo postal).
postal5 dígitoscoherente con la provinciaCódigo postal.
parents"Nombre / Nombre"derivadoNombres del padre y de la madre (campo HIJO/A DE).
supportstringBCA + 6 dígitosNúmero de soporte (IDESP). Va en la MRZ de las tarjetas.
photoestilo de avatars.suils.essuilsEstilo del avatar usado como fotografía.
photoSeedstringnumberSemilla del avatar.
langes | en | caesIdioma principal de las etiquetas (la secundaria se mantiene como subtítulo).
watermark1 | 01Marca de agua diagonal "ESPECIMEN". El pie "ESPECIMEN · SIN VALIDEZ LEGAL" se imprime siempre.
countryPT | FR | IT | DE | RO | BG | PL | NLderivadoSolo tipo eu: país emisor de la tarjeta.
dnistringderivadoSolo pasaporte: número de DNI del titular (campo "Nº DNI" y número personal de la MRZ).
sizeenteroanchura naturalAnchura en píxeles de la salida raster (limitada por MAX_SIZE).
backgroundColorhex 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.

Determinismo

Algoritmos

Ejemplos

ejemplos
https://documents.suils.es/dni/both/png?seed=ana&size=1200 https://documents.suils.es/dni/front/svg?number=12345678&name=Ana&surname1=Pérez&surname2=Ruiz&birth=1990-05-17&city=Girona https://documents.suils.es/nie/rear/png?number=X1234567&nationality=ROU&lang=en https://documents.suils.es/pasaporte/both/webp?seed=viajera&size=1000 https://documents.suils.es/cif/front/avif?number=B1234567&name=Talleres%20Norte%20SL&city=Bilbao https://documents.suils.es/eu/both/png?seed=luca&country=IT&photo=anime https://documents.suils.es/dni/json?seed=ana https://documents.suils.es/validate/cif?number=B1234567

Autoalojado

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.

Aviso y licencia

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.