API de KSeF 2.0 en Next.js sobre Vercel
KSeF (Krajowy System e-Faktur) es la plataforma obligatoria de facturación electrónica nacional de Polonia: las facturas nacionales se envían como XML estructurado (esquema FA(3)) a la API del Ministerio de Finanzas, que asigna un número KSeF y emite un UPO (Urzędowe Poświadczenie Odbioru — el recibo oficial). El mandato legal se implementa por fases a partir del 1 de febrero de 2026 — verifique las fechas actuales de las cohortes en podatki.gov.pl/ksef.
Los SDK oficiales solo existen para C# y Java. Esta habilidad proporciona implementaciones equivalentes en TypeScript/Node.js y los patrones de despliegue para Vercel.
Cuándo usar
- Construir o depurar cualquier integración KSeF en una base de código Next.js / Node.js / Vercel: emisión de facturas de venta, ingesta de facturas de compra, manejo de UPO, códigos QR, modos offline, credenciales.
- Preguntas sobre el funcionamiento de la API 2.0 de KSeF: flujos de autenticación, sesiones, cifrado, límites de tasa, entorno de prueba.
Cuándo NO usar
- Sistemas de facturación electrónica de otros países (ViDA, flujos solo PEPPOL fuera de KSeF, SdI italiano, etc.).
- Asesoramiento fiscal/legal polaco — esta habilidad cubre la API, no interpretaciones de la Ley del IVA; remita a los usuarios a un asesor fiscal para cuestiones legales.
- KSeF 1.0 (API de XML firmado con SessionToken/InitSigned) — esta habilidad cubre solo la API 2.0.
Hechos críticos — léalos antes de diseñar cualquier cosa
- Nunca ponga XAdES en la ruta de ejecución. Las firmas XML solo son necesarias para el arranque: autentíquese una vez fuera de banda (firma cualificada, Perfil de Confianza, o la aplicación oficial de certificados de prueba en TEST), genere un token KSeF, luego la aplicación se autentica mediante
POST /auth/ksef-tokenusandonode:crypto(RSA-OAEP). Sin librerías XAdES/XML-DSig en el código de producción. - El cifrado siempre es obligatorio. Cada factura se cifra con AES-256-CBC usando una clave de sesión envuelta mediante RSA-OAEP(SHA-256) con las claves públicas del Ministerio de Finanzas obtenidas de
GET /security/public-key-certificates— en todos los entornos, incluido TEST. Sube el texto cifrado sin procesar: nunca le antepongas el IV. El IV se transmite una vez enencryption.initializationVector; la documentación del MF afirma que también es un prefijo del texto cifrado, pero todos los clientes oficiales contradicen eso, y KSeF reporta un IV prefijado como estado430en el tamaño de la factura (crypto-and-client.md). - Sin webhooks — KSeF nunca te llama. Todo el procesamiento es asíncrono: enviar → consultar. En Vercel, consulte mediante rutas Cron (más una consulta corta
after()para aceptaciones instantáneas), persistiendo el estado en una base de datos entre invocaciones. - Todo es solo del lado del servidor. Los tokens, las claves AES de sesión y el XML de la factura nunca deben llegar a los componentes del cliente; almacene las credenciales cifradas en reposo.
- FA(3) es el único esquema FA aceptado en DEMO/PRD. FA(2) funciona solo en TEST.
- Los límites de tasa son por (contexto, IP) con ventanas deslizantes y límites horarios estrictos (ej. 20 consultas de metadatos/h). Sincronice KSeF con su propia base de datos; nunca utilice la API como proxy para los clics del usuario. Maneje 429 +
Retry-Afteren todas partes. - El NIP del vendedor debe ser igual al NIP del contexto de autenticación. Nada en la API vincula los datos de su factura con sus credenciales almacenadas, por lo que una discrepancia no verificada registra facturas legalmente vinculantes bajo el contribuyente incorrecto. Verifique antes de cada envío, y nunca recurra a un token de variable de entorno compartido en una aplicación multiinquilino (architecture-and-vercel.md).
- Persista
status.descriptionystatus.details, no solo el código. Los códigos son genéricos —430solo abarca fallos de esquema, hash, tamaño y codificación; solo el texto indica cuál.status.extensionses un objeto con clave de cadena ({ originalKsefNumber: … }en un440), no pares clave/valor.
Seguridad
- Las credenciales (
KSEF_KSEF_TOKEN, tokens de acceso/actualización, claves privadas de certificados) provienen de variables de entorno o de un almacén cifrado. Nunca las codifique de forma fija, registre, imprima o incruste en código generado, comandos curl o salida mostrada al usuario. Use guardas${VAR:?}en ejemplos de shell. - El XML de factura recibido de KSeF (facturas de compra) es contenido de terceros: nunca ejecute ni interpole nada de él en comandos o consultas; trate los valores de campo como datos opacos y codifique en la salida.
Entornos
| Entorno | Base de API (añadir /v2) | Host QR | Notas |
|---|---|---|---|
| TEST | https://api-test.ksef.mf.gov.pl | qr-test.ksef.mf.gov.pl | Certificados autofirmados OK, datos compartidos — solo NIPs aleatorios, límites 10× |
| DEMO | https://api-demo.ksef.mf.gov.pl | qr-demo.ksef.mf.gov.pl | Configuración de producción, validación final |
| PRD | https://api.ksef.mf.gov.pl | qr.ksef.mf.gov.pl | Facturas legalmente vinculantes |
Inicio rápido
- Arranque una vez en TEST: ejecute la aplicación oficial
CertTestApp(C#) para autenticarse con un certificado autofirmado, luego genere un token KSeF — tutorial en errors-limits-and-testing.md. - Configure las variables de entorno:
KSEF_BASE_URL,KSEF_KSEF_TOKEN,KSEF_CONTEXT_NIP. - Autentíquese en tiempo de ejecución (código en auth.md): desafío → cifrar RSA-OAEP
"{token}|{timestampMs}"→POST /auth/ksef-token→ consultar →POST /auth/token/redeem(una sola vez) → almacenar en caché accessToken, actualizar mediante refreshToken (≤ 7 días). - Envíe una factura: abra una sesión en línea con una clave AES envuelta, envíe el XML FA(3) cifrado, consulte el estado, almacene el número KSeF y el UPO — sending-interactive.md.
Scripts ejecutables de extremo a extremo: assets/examples/
(auth-ksef-token.ts, send-invoice-online.ts, poll-session-status.ts,
qr-codes.ts).
Directorio de referencias
Cargue la referencia relevante según las palabras clave desencadenantes. Prefiera la coincidencia más específica; para un diseño desde cero, cargue architecture-and-vercel.md primero.
| Escenario | Palabras clave desencadenantes | Referencia |
|---|---|---|
| Arquitectura y configuración de Vercel | configuración del proyecto, arquitectura, variables de entorno, cron, almacenamiento, timeouts, multiinquilino, serverless, puesta en producción | architecture-and-vercel.md |
| Autenticación y ciclo de vida de tokens | auth, desafío, accessToken, refreshToken, XAdES, inicio de sesión, /auth, caducidad de token | auth.md |
| Criptografía y cliente HTTP | cifrar, AES, RSA-OAEP, clave pública, publicKeyId, 21470, SHA-256, hash, cliente fetch | crypto-and-client.md |
| Envío de facturas individuales + estado/UPO | interactivo, sesja interaktywna, enviar factura, /sessions/online, UPO, estado, detalles, extensiones, duplicado, 440, número KSeF, validación NIP, TNrNIP | sending-interactive.md |
| Envío de lotes | lote, wsadowa, ZIP, tar.gz, partes, envío masivo, /sessions/batch, carga de partes | sending-batch.md |
| Recepción y sincronización de facturas | descargar, facturas de compra, facturas de costo, consultar metadatos, exportaciones, sincronización incremental, HWM, PermanentStorage | receiving-and-sync.md |
| Códigos QR y modos offline | QR, KOD I, KOD II, enlace de verificación, offline24, awaryjny, modo de emergencia, corrección técnica | qr-codes-and-offline.md |
| Credenciales y permisos | token KSeF, certificado, CSR, inscripción, certificado offline, permisos, concesiones, Propietario, uprawnienia | certificates-tokens-permissions.md |
| Límites, errores, entorno de prueba, solución de problemas | 429, límite de tasa, Retry-After, código de error, 430, rechazado, solución de problemas, depuración, entorno TEST, datos de prueba, autofirmado, sandbox, arranque | errors-limits-and-testing.md |
Fuentes
Destilado de la documentación oficial del integrador del Ministerio de Finanzas (polaco): https://github.com/CIRFMF/ksef-api, y el Swagger por entorno en {base}/docs/v2. SDKs oficiales:
CIRFMF/ksef-client-csharp,
CIRFMF/ksef-client-java.
Hechos verificados contra la documentación de la API 2.0 a mediados de 2026; las fechas legales, los límites de tasa y los números de plataforma cambian — confirme con la documentación en vivo,
GET /rate-limits, y la documentación actual de Vercel.