# Constaia > European API to validate, classify and extract data from documents with AI. Ask “is this document a valid X?” and get a verdict (valid / invalid / review) with reasons, calibrated confidence, extracted fields and exports. EU-hosted, zero retention by default. Not biometric KYC and not proof of authenticity. - API base URL: https://api.constaia.com/v1 (Bearer auth, ck_live_… or ck_test_… keys) - OpenAPI: https://api.constaia.com/openapi.json · Interactive reference: https://api.constaia.com/reference - Dashboard and sign-up: https://app.constaia.com/signup (250 free credits per month) - SDKs: npm @constaia/sdk, composer constaia/constaia-php; widget @constaia/widget; MCP server: npx -y @constaia/mcp - Full docs as one file: https://constaia.com/llms-full.txt ## Docs (English) - [API reference](https://constaia.com/docs-md/en/api-reference): Interactive reference and OpenAPI 3.1 specification for the Constaia API, with a summary of every /v1 endpoint. - [Retrieve, list and delete analyses](https://constaia.com/docs-md/en/api/analyses): GET /v1/analyses/{id}, paginated list with status, type and metadata filters, DELETE and direct export download. - [Analyze a document](https://constaia.com/docs-md/en/api/analyze): POST /v1/analyze classifies, extracts and validates a document in one call. Inputs, options, field-by-field response and async mode. - [Balance and usage](https://constaia.com/docs-md/en/api/balance-usage): GET /v1/balance returns your available and reserved credits; GET /v1/usage returns consumption aggregated by day and document type. - [Batches](https://constaia.com/docs-md/en/api/batches): POST /v1/batches analyses up to 100 documents at once, always asynchronously, with a combined export and the batch.completed webhook. - [Classify a document](https://constaia.com/docs-md/en/api/classify): POST /v1/classify identifies the document type for 0.2 credits, without extracting fields. Useful as a pre-filter or a cheap yes/no. - [Document types (endpoint)](https://constaia.com/docs-md/en/api/document-types-endpoint): GET /v1/document-types and /v1/document-types/{type} return the catalogue with each type's fields, applicable checks and countries. - [Authentication](https://constaia.com/docs-md/en/authentication): How to authenticate calls to the Constaia API with Bearer keys, the difference between test and live keys, rotation, and why keys never go to the browser. - [Checks](https://constaia.com/docs-md/en/concepts/checks): The rules you can ask Constaia to apply (expiry, issue age, holder, age, signature, stamp, amount) and the deterministic checks it returns. - [Credits and billing](https://constaia.com/docs-md/en/concepts/credits-billing): How Constaia credits are calculated per page, what is not charged, packs and expiry, the free plan, balance, usage, low-credit alerts and VAT. - [Errors](https://constaia.com/docs-md/en/concepts/errors): The Constaia API error format, error types and HTTP status codes, the X-Request-Id header and how to handle errors in JavaScript and PHP. - [Exports](https://constaia.com/docs-md/en/concepts/exports): Download each analysis result as JSON, CSV, XLSX, XML, vCard or PDF, via signed URLs or direct download. Included in the price. - [Idempotency](https://constaia.com/docs-md/en/concepts/idempotency): Retry POST requests to Constaia without analysing or paying twice by sending an Idempotency-Key header. - [Limits](https://constaia.com/docs-md/en/concepts/rate-limits): Supported file formats and size, pages per analysis, requests-per-second limit, RateLimit headers, retries and switching to asynchronous processing. - [Storage and privacy](https://constaia.com/docs-md/en/concepts/storage-privacy): What Constaia keeps from each document, for how long and where. Zero retention by default, TTL, per-account encryption, health data and DPA. - [Verdicts and reasons](https://constaia.com/docs-md/en/concepts/verdicts): How to read Constaia's valid, invalid or review verdict, its reasons, warnings and calibrated confidence, and what to do in each case. - [Document type catalogue](https://constaia.com/docs-md/en/document-types): Document types Constaia recognises, with their fields, validators and countries. How to use expect with several types and generic with your own schema. - [Angular](https://constaia.com/docs-md/en/guides/angular): Validate documents from Angular with an HttpClient service that sends the file to your backend, and show the verdict with signals. - [Django](https://constaia.com/docs-md/en/guides/django): Validate documents in Django 5 with request.FILES and httpx against the Constaia REST API, and verify webhooks with HMAC. - [Expo / React Native](https://constaia.com/docs-md/en/guides/expo): Photograph or pick a document in an Expo app, upload it to your backend with FormData and show the Constaia verdict. The key never ships in the app. - [Express](https://constaia.com/docs-md/en/guides/express): Receive documents with in-memory multer, validate them with the Constaia SDK and verify webhooks with express.raw. - [FastAPI](https://constaia.com/docs-md/en/guides/fastapi): Validate documents in FastAPI with UploadFile and httpx.AsyncClient against the Constaia API, and verify webhooks with Standard Webhooks. - [Framework guides](https://constaia.com/docs-md/en/guides): Integrate Constaia with Next.js, React, Vue, Angular, SvelteKit, Expo, Express, Laravel, Symfony, WordPress, Django, FastAPI or n8n. - [Laravel](https://constaia.com/docs-md/en/guides/laravel): Validate documents in Laravel 12 with the constaia/constaia-php package: facade, FormRequest, queued job and an HMAC-verified webhook. - [n8n](https://constaia.com/docs-md/en/guides/n8n): Validate documents with Constaia from n8n using the HTTP Request node with multipart and an Authorization header, and route the flow by verdict. - [Next.js](https://constaia.com/docs-md/en/guides/nextjs): Validate documents with Constaia in the Next.js App Router: route handler, server action and a webhook verified against the raw body. - [React](https://constaia.com/docs-md/en/guides/react): Add document validation to a React form with the Constaia widget or with fetch to your backend, and show the verdict accessibly. - [SvelteKit](https://constaia.com/docs-md/en/guides/svelte): Validate documents in SvelteKit 2 with a form action or a +server.ts endpoint that uses the Constaia JavaScript SDK. - [Symfony](https://constaia.com/docs-md/en/guides/symfony): Validate documents in Symfony 7 with the Constaia PHP SDK configured as a service and a controller that receives the UploadedFile. - [Vue](https://constaia.com/docs-md/en/guides/vue): Validate documents from Vue 3 with the Constaia widget or with your own form that sends the file to your backend. - [WordPress](https://constaia.com/docs-md/en/guides/wordpress): Minimal WordPress plugin to validate documents with Constaia: a shortcode, a nonce-protected REST endpoint and the key stored in wp-config.php. - [Introduction](https://constaia.com/docs-md/en): A European API that tells you whether a document is what you expect and whether it is valid, with reasons, extracted fields and zero retention by default. - [MCP server](https://constaia.com/docs-md/en/mcp): @constaia/mcp connects Constaia to AI agents such as Claude Desktop, Claude Code or Cursor through the Model Context Protocol. - [Get started in 5 minutes](https://constaia.com/docs-md/en/quickstart): Create a free account, copy your test key and validate your first ID document with curl, JavaScript or PHP in under five minutes. - [JavaScript and TypeScript SDK](https://constaia.com/docs-md/en/sdks/javascript): @constaia/sdk: official client for Node.js 18+, Bun and Deno, with no dependencies. Analyses, batches, webhooks, typed errors and retries. - [PHP SDK](https://constaia.com/docs-md/en/sdks/php): constaia/constaia-php, the official client for PHP 8.1+ with Laravel integration. Analyses, batches, webhooks, typed exceptions and retries. - [Python](https://constaia.com/docs-md/en/sdks/python): The official Python SDK is on its way. Meanwhile, use the REST API with httpx; here is a complete analysis and webhook example. - [Test mode](https://constaia.com/docs-md/en/test-mode): Build your Constaia integration without spending credits. ck_test_ keys return deterministic responses based on the file name. - [Webhooks](https://constaia.com/docs-md/en/webhooks): Receive async analysis and batch results on your server. Endpoint registration, events, Standard Webhooks signatures, retries and idempotency. - [Upload widget](https://constaia.com/docs-md/en/widget): : a web component that lets your users upload documents from the browser or the phone camera without exposing your secret key. ## Documentación (español) - [Referencia de la API](https://constaia.com/docs-md/es/api-reference): Referencia interactiva y especificación OpenAPI 3.1 de la API de Constaia, con un resumen de todos los endpoints de /v1. - [Consultar, listar y borrar análisis](https://constaia.com/docs-md/es/api/analyses): GET /v1/analyses/{id}, listado paginado con filtros por estado, tipo y metadata, DELETE y descarga directa de exportaciones. - [Analizar un documento](https://constaia.com/docs-md/es/api/analyze): POST /v1/analyze clasifica, extrae y valida un documento en una sola llamada. Entradas, opciones, respuesta campo a campo y modo asíncrono. - [Saldo y uso](https://constaia.com/docs-md/es/api/balance-usage): GET /v1/balance devuelve tus créditos disponibles y reservados; GET /v1/usage, el consumo agregado por día y tipo de documento. - [Lotes](https://constaia.com/docs-md/es/api/batches): POST /v1/batches analiza hasta 100 documentos de una vez, siempre en asíncrono, con exportación combinada y webhook batch.completed. - [Clasificar un documento](https://constaia.com/docs-md/es/api/classify): POST /v1/classify identifica el tipo de documento por 0,2 créditos, sin extraer campos. Útil como filtro previo o para un sí/no barato. - [Tipos de documento (endpoint)](https://constaia.com/docs-md/es/api/document-types-endpoint): GET /v1/document-types y /v1/document-types/{type} devuelven el catálogo con los campos, checks aplicables y países de cada tipo. - [Autenticación](https://constaia.com/docs-md/es/authentication): Cómo autenticar tus llamadas a la API de Constaia con claves Bearer, diferencias entre claves test y live, rotación y por qué nunca van al navegador. - [Comprobaciones (checks)](https://constaia.com/docs-md/es/concepts/checks): Las reglas que puedes pedir a Constaia (caducidad, antigüedad, titular, edad, firma, sello, importe) y las comprobaciones deterministas que devuelve. - [Créditos y facturación](https://constaia.com/docs-md/es/concepts/credits-billing): Cómo se calculan los créditos de Constaia por páginas, qué no se cobra, packs y caducidad, plan gratis, saldo, uso, aviso de créditos bajos e IVA. - [Errores](https://constaia.com/docs-md/es/concepts/errors): Formato de los errores de la API de Constaia, tipos y códigos HTTP, la cabecera X-Request-Id y cómo manejarlos en JavaScript y PHP. - [Exportaciones](https://constaia.com/docs-md/es/concepts/exports): Descarga el resultado de cada análisis en JSON, CSV, XLSX, XML, vCard o PDF, con URLs firmadas o descarga directa. Incluidas en el precio. - [Idempotencia](https://constaia.com/docs-md/es/concepts/idempotency): Reintenta peticiones POST a Constaia sin miedo a analizar ni cobrar dos veces usando la cabecera Idempotency-Key. - [Límites](https://constaia.com/docs-md/es/concepts/rate-limits): Formatos y tamaño de fichero admitidos, páginas por análisis, límite de peticiones por segundo, cabeceras RateLimit, reintentos y paso a asíncrono. - [Almacenamiento y privacidad](https://constaia.com/docs-md/es/concepts/storage-privacy): Qué guarda Constaia de cada documento, cuánto tiempo y dónde. Retención cero por defecto, TTL, cifrado por cuenta, datos de salud y DPA. - [Veredictos y motivos](https://constaia.com/docs-md/es/concepts/verdicts): Cómo interpretar el veredicto valid, invalid o review de Constaia, sus motivos, los avisos y la confianza calibrada, y qué hacer con cada caso. - [Catálogo de tipos de documento](https://constaia.com/docs-md/es/document-types): Tipos de documento que reconoce Constaia, con sus campos, validadores y países. Cómo usar expect con varios tipos y generic con tu esquema. - [Angular](https://constaia.com/docs-md/es/guides/angular): Valida documentos desde Angular con un servicio HttpClient que envía el fichero a tu backend, y muestra el veredicto con signals. - [Django](https://constaia.com/docs-md/es/guides/django): Valida documentos en Django 5 con request.FILES y httpx contra la API REST de Constaia, y verifica los webhooks con HMAC. - [Expo / React Native](https://constaia.com/docs-md/es/guides/expo): Fotografía o elige un documento en una app Expo, súbelo a tu backend con FormData y muestra el veredicto de Constaia. La clave nunca va en la app. - [Express](https://constaia.com/docs-md/es/guides/express): Recibe documentos con multer en memoria, valídalos con el SDK de Constaia y verifica los webhooks con express.raw. - [FastAPI](https://constaia.com/docs-md/es/guides/fastapi): Valida documentos en FastAPI con UploadFile y httpx.AsyncClient contra la API de Constaia, y verifica los webhooks con Standard Webhooks. - [Guías por framework](https://constaia.com/docs-md/es/guides): Integra Constaia en Next.js, React, Vue, Angular, SvelteKit, Expo, Express, Laravel, Symfony, WordPress, Django, FastAPI o n8n. - [Laravel](https://constaia.com/docs-md/es/guides/laravel): Valida documentos en Laravel 12 con el paquete constaia/constaia-php: facade, FormRequest, job en cola y webhook con verificación HMAC. - [n8n](https://constaia.com/docs-md/es/guides/n8n): Valida documentos con Constaia desde n8n usando el nodo HTTP Request con multipart y la cabecera Authorization, y enruta el flujo según el veredicto. - [Next.js](https://constaia.com/docs-md/es/guides/nextjs): Valida documentos con Constaia en Next.js App Router: route handler, server action y webhook verificado con el cuerpo crudo. - [React](https://constaia.com/docs-md/es/guides/react): Añade validación de documentos a un formulario React con el widget de Constaia o con fetch a tu backend, y muestra el veredicto de forma accesible. - [SvelteKit](https://constaia.com/docs-md/es/guides/svelte): Valida documentos en SvelteKit 2 con una form action o un endpoint +server.ts que usa el SDK de JavaScript de Constaia. - [Symfony](https://constaia.com/docs-md/es/guides/symfony): Valida documentos en Symfony 7 con el SDK de PHP de Constaia configurado como servicio y un controlador que recibe el UploadedFile. - [Vue](https://constaia.com/docs-md/es/guides/vue): Valida documentos desde Vue 3 con el widget de Constaia o con un formulario propio que envía el fichero a tu backend. - [WordPress](https://constaia.com/docs-md/es/guides/wordpress): Plugin mínimo de WordPress para validar documentos con Constaia: shortcode, endpoint REST con nonce y la clave guardada en wp-config.php. - [Introducción](https://constaia.com/docs-md/es): Constaia es una API europea que responde si un documento es el que esperas y si es válido, con motivos, campos extraídos y retención cero por defecto. - [Servidor MCP](https://constaia.com/docs-md/es/mcp): @constaia/mcp conecta Constaia con agentes de IA como Claude Desktop, Claude Code o Cursor mediante Model Context Protocol. - [Empieza en 5 minutos](https://constaia.com/docs-md/es/quickstart): Crea una cuenta gratis, copia tu clave de test y valida tu primer DNI con curl, JavaScript o PHP en menos de cinco minutos. - [SDK de JavaScript y TypeScript](https://constaia.com/docs-md/es/sdks/javascript): @constaia/sdk: cliente oficial para Node.js 18+, Bun y Deno, sin dependencias. Análisis, lotes, webhooks, errores tipados y reintentos. - [SDK de PHP](https://constaia.com/docs-md/es/sdks/php): constaia/constaia-php, cliente oficial para PHP 8.1+ con integración para Laravel. Análisis, lotes, webhooks, excepciones tipadas y reintentos. - [Python](https://constaia.com/docs-md/es/sdks/python): El SDK oficial de Python está en preparación. Mientras tanto, usa la API REST con httpx; aquí tienes un ejemplo completo de análisis y webhooks. - [Modo test](https://constaia.com/docs-md/es/test-mode): Integra Constaia sin gastar créditos. Las claves ck_test_ devuelven respuestas deterministas según el nombre del fichero. - [Webhooks](https://constaia.com/docs-md/es/webhooks): Recibe los resultados de análisis asíncronos y lotes en tu servidor. Alta de endpoints, eventos, firma Standard Webhooks, reintentos e idempotencia. - [Widget de subida](https://constaia.com/docs-md/es/widget): : componente web para que tus usuarios suban documentos desde el navegador o la cámara del móvil, sin exponer tu clave secreta. ## Document types - `es_dni` — Spanish ID card (DNI): Check that a Spanish DNI is valid, not expired and belongs to the right person. Fields: document_number, first_name, last_name_1, last_name_2, sex, nationality, birth_date, expiry_date, issue_date, support_number, address, birth_place, parents. - `es_nie` — Spanish NIE / TIE: Validate the TIE card and NIE number of foreign residents in Spain. Fields: nie_number, names, nationality, birth_date, expiry_date, permit_type. - `passport` — Passport (any country): Read and validate the MRZ of passports from any country under ICAO 9303. Fields: document_number, names, nationality, birth_date, expiry_date, issuing_country, sex. - `eu_id_card` — EU national ID card: ID cards from other EU countries with a 3-line MRZ. Fields: document_number, names, nationality, birth_date, expiry_date, issuing_country, sex. - `es_driving_license` — Spanish driving licence: Extract categories and expiry from a Spanish driving licence and validate the NIF. Fields: number, names, birth_date, expiry_date, categories. - `medical_certificate_sport` — Sports medical certificate: Is it a medical certificate under 6 months old, signed and in the runner's name? Fields: patient_name, patient_id, issue_date, doctor_name, doctor_license_number, fit_for_sport, sport, restrictions, signature_present, stamp_present. - `es_sexual_offences_certificate` — Spanish sexual offences certificate: Check certificates from Spain's Central Sex Offenders Register for LOPIVI compliance. Fields: holder_name, holder_id, issue_date, has_records, csv_code. - `es_criminal_record_certificate` — Spanish criminal record certificate: Type, age and holder of the Spanish criminal record certificate. Fields: holder_name, holder_id, issue_date, has_records, csv_code. - `sports_license` — Sports federation licence: Check the licence is valid on the event date and belongs to the athlete. Fields: holder_name, holder_id, federation, license_number, season, category, valid_until. - `coach_qualification` — Coach or sports technician qualification: Extract qualification, level and issuer, and check the holder. Fields: holder_name, holder_id, qualification, level, issuer, issue_date. - `insurance_certificate` — Insurance certificate: Insurer, policy, coverage and validity on the activity date. Fields: insurer, policy_number, holder, coverage, valid_from, valid_until. - `payment_receipt` — Payment or bank transfer receipt: Do the amount, destination IBAN and registration reference match? Fields: amount, currency, date, payer_name, payer_iban, beneficiary_name, beneficiary_iban, concept, reference. - `bank_ownership_certificate` — Bank account ownership certificate: Account holder, tax ID and IBAN, validated. Fields: holder_name, holder_id, iban, bank, issue_date. - `invoice` — Invoice: Number, dates, seller and buyer tax IDs, lines, VAT and total, reconciled. Fields: number, issue_date, seller, buyer, lines, tax_base, vat, total, currency. - `es_disability_certificate` — Spanish disability certificate: Degree, holder and validity of the disability certificate. Fields: holder_name, holder_id, degree_percent, issue_date, valid_until, issuer. - `es_census_certificate` — Spanish census registration certificate: Municipality, holder and age of the census registration (empadronamiento) certificate. Fields: holder_name, holder_id, address, municipality, issue_date. - `es_family_book` — Spanish family book: Holders and children listed in the Spanish family book (libro de familia). Fields: holders, children. - `generic` — Any other document: Any document, with your own extraction schema. Fields: custom schema. ## Pricing 1 credit = 1 document of up to 2 pages (+1 credit per 2 extra pages); classify = 0.2 credits. Free: 250 credits/month. Packs: 1,000 = €30; 5,000 = €125; 25,000 = €500; 100,000 = €1,900 (valid 12 months, VAT excluded). ## Blog - [OCR vs LLM: why document validation needs deterministic rules](https://constaia.com/en/blog/ocr-vs-llm-deterministic-validation): What OCR does, what an LLM does, why a model's self-reported confidence is not a probability, and how to chain both with deterministic validators in a cascade. - [How to validate a bank transfer receipt](https://constaia.com/en/blog/validate-bank-transfer-receipt): Which fields to check on a transfer receipt, how to validate an IBAN with mod 97, how to match it to a registration and why a PDF does not prove payment. - [ICAO 9303 MRZ: how to validate ID cards and passports](https://constaia.com/en/blog/mrz-icao-9303-how-to-validate): TD1, TD2 and TD3 formats, 7-3-1 weighted modulo 10 check digits, a worked example with the official ICAO specimen and JavaScript code to validate an MRZ. - [Health data in sports registrations: GDPR Article 9](https://constaia.com/en/blog/health-data-gdpr-article-9-sports-registrations): What the GDPR says about medical certificates in race sign-ups, the Spanish DPA fine over COVID certificates, and what organisers should really ask for. - [LOPIVI: the sexual offences certificate in Spanish clubs](https://constaia.com/en/blog/lopivi-sexual-offences-certificate-sports-clubs): Who must provide Spain's negative certificate from the Central Sex Offender Registry, how it is obtained, how the CSV code is checked and what can be automated. - [Medical certificates for trail, ultra and triathlon](https://constaia.com/en/blog/medical-certificates-trail-triathlon): Real validity periods, what a sports medical certificate must include, and how to check it is valid for race day without storing health data you don't need. - [ID card copies and the Spanish DPA: verify without keeping](https://constaia.com/en/blog/aepd-id-card-copies-data-minimisation): What Spain's data protection authority says about collecting ID card copies (PS-00138-2025), what it means for sports clubs, and how to verify without storing. - [Spanish DNI and NIE check letter: algorithm and code](https://constaia.com/en/blog/spanish-dni-nie-check-letter-algorithm): How the check letter of the Spanish DNI and NIE is computed (modulo 23), with JavaScript, PHP and Python code, edge cases and why a valid letter proves nothing. - [OCR vs LLM: por qué validar documentos exige reglas deterministas](https://constaia.com/es/blog/ocr-vs-llm-validacion-determinista): Qué hace un OCR, qué hace un LLM, por qué la autoconfianza del modelo no es una probabilidad y cómo combinar ambos con validadores deterministas en cascada. - [Cómo validar un justificante de transferencia bancaria](https://constaia.com/es/blog/validar-justificante-transferencia): Qué campos revisar en un justificante, cómo comprobar un IBAN con mod 97, cómo cuadrarlo con la inscripción y por qué un PDF no prueba que el dinero ha llegado. - [MRZ ICAO 9303: cómo validar DNI y pasaportes](https://constaia.com/es/blog/mrz-icao-9303-como-validar): Formatos TD1, TD2 y TD3, dígitos de control con pesos 7-3-1 y módulo 10, ejemplo con el espécimen oficial de ICAO y código JavaScript para validar la MRZ. - [Datos de salud en inscripciones deportivas: el art. 9 del RGPD](https://constaia.com/es/blog/datos-salud-rgpd-articulo-9-inscripciones): Qué dice el RGPD sobre certificados médicos en inscripciones, la multa de la AEPD a una federación por pedir certificados COVID y qué debe pedir un organizador. - [LOPIVI: el certificado de delitos sexuales en clubes](https://constaia.com/es/blog/lopivi-certificado-delitos-sexuales-clubes): Quién debe aportar el certificado negativo del Registro Central de Delincuentes Sexuales, cómo se obtiene, cómo se verifica el CSV y qué puede automatizarse. - [Certificado médico en trail, ultra y triatlón: cómo validarlo](https://constaia.com/es/blog/certificado-medico-trail-triatlon): Plazos reales de validez, qué debe incluir un certificado médico deportivo y cómo comprobar si sirve para la prueba del día X sin guardar datos de salud. - [Copias del DNI y la AEPD: minimizar sin dejar de verificar](https://constaia.com/es/blog/copia-dni-aepd-minimizacion): Qué dice la AEPD sobre pedir y guardar copias del DNI (PS-00138-2025), qué implica para clubes y federaciones y cómo verificar sin conservar la imagen. - [Letra del DNI y del NIE: algoritmo oficial y código](https://constaia.com/es/blog/letra-dni-nie-algoritmo): Cómo se calcula la letra del DNI y del NIE (módulo 23), con código en JavaScript, PHP y Python, casos límite y por qué una letra correcta no prueba nada. ## Optional - [Pricing](https://constaia.com/en/pricing) - [DPA](https://constaia.com/en/legal/dpa) - [Privacy](https://constaia.com/en/legal/privacy)