Hooks KSeF: registrar y recibir facturas en el KSeF polaco

Configurar el hook outbound KSeF para el registro automático de facturas en el sistema de facturación electrónica polaco.

La PSB dispone de dos hooks KSeF: un hook outbound para facturas salientes (parte vendedora / Podmiot1) y un hook inbound para facturas entrantes (parte compradora / Podmiot2). Ambos automatizan el intercambio con el Krajowy System e-Faktur (KSeF), el sistema nacional de facturación electrónica polaco. El hook outbound se describe primero a continuación; el hook inbound se encuentra al final de esta página.

Hook outbound KSeF (saliente, Podmiot1)

El hook outbound KSeF automatiza el registro de facturas salientes en KSeF. Las facturas se transforman de Peppol BIS Billing 3.0 / UBL (internamente también BisV3) al formato polaco FA(3) y se registran como lote. El cliente también puede suministrar FA(3) directamente, en cuyo caso se omite el paso de transformación. Tras el procesamiento correcto, el hook devuelve el UPO (Urzędowe Poswiadczenie Odbioru, el acuse de recibo oficial) y una prueba en PDF a través de la plataforma PSB.

Entornos KSeF (administración)

Para pruebas y aceptación, la administración polaca ofrece dos entornos además de producción:

EntornoURLDemohttps://ksef-demo.mf.gov.pl/Testhttps://ksef-test.mf.gov.pl/

El hook admite tanto un flujo en línea (registro directo) como un flujo fuera de línea (cuando KSeF no está disponible temporalmente, por ejemplo, durante el corte diario). En el flujo fuera de línea se genera un PDF fuera de línea basado en el certificado fuera de línea.

Requisitos previos
  • Un certificado en línea válido para KSeF (.key + .crt; autenticación durante el flujo en línea)
  • Un certificado fuera de línea válido para KSeF (.key + .crt; códigos QR en la salida PDF, tanto en procesamiento en línea como fuera de línea)
  • Las contraseñas correspondientes de ambos certificados
  • El hook debe estar activado en la configuración
Flujo de trabajo

Tras recibir una notificación de factura, el hook pasa por siete pasos:

PasoAcciónDescripción1UploadSube el paquete de facturas como lote a KSeF (POST /v2/sessions/batch)2StatusConsulta el estado del lote hasta que el procesamiento se complete (GET /v2/sessions/{referenceNumber}/status)3RetrieveInvoicesRecupera los resultados de las facturas procesadas por página (GET /v2/sessions/{referenceNumber}/invoices)4RetrieveUpoRecupera el documento UPO de la sesión (GET /v2/sessions/{referenceNumber}/upo)5PrintGenera un PDF por documento basado en los datos del UPO y el enlace de verificación, y lo registra como adjunto6DispatchEnvía todos los eventos almacenados en buffer como lote al Ingestor7FinalizeLimpia el estado y cierra la sesión

Cuando KSeF no está disponible (corte diario o avería), el flujo fuera de línea se inicia automáticamente: se genera un PDF fuera de línea mediante el certificado fuera de línea, tras lo cual la factura se envía por el canal regular.

Configuración

Registre el hook a través de la API de Hooks:

{
  "id": "ksef-sender",
  "action": "ksef",
  "name": "KSeF Hook Sender",
  "topics": [
    "ClearInvoiceBatched"
  ],
  "output": [
    {
      "when": "200",
      "topic": "SendInvoice"
    },
    {
      "when": "410",
      "topic": "SendInvoice"
    }
  ],
  "init": {
    "onlineCertificate": "{{ruta-al-certificado-en-linea}}",
    "onlineCertificatePassword": "{{contraseña}}",
    "offlineCertificate": "{{ruta-al-certificado-fuera-de-linea}}",
    "offlineCertificatePassword": "{{contraseña}}"
  },
  "isActive": true
}
Parámetros
ParámetroDescripciónonlineCertificateRuta al archivo de certificado en línea para la autenticación con KSeF durante el flujo en líneaonlineCertificatePasswordLa contraseña del certificado en líneaofflineCertificateRuta al archivo de certificado fuera de línea, utilizado para generar códigos QR en el PDF de salidaofflineCertificatePasswordLa contraseña del certificado fuera de líneatopicsLos topics en los que escucha el hook. Utilice ClearInvoiceBatched para facturas salientesoutputDefine qué topic se envía para un código de estado determinadoisActiveDebe estar en true para activar el hook

Importante: Los cuatro campos de certificado son obligatorios. El certificado en línea es necesario para la autenticación durante el flujo en línea. El certificado fuera de línea es necesario para la generación de códigos QR en el PDF, tanto en el procesamiento en línea como fuera de línea.

Códigos de estado
CódigoDescripciónTopic de salida200Factura registrada correctamente en KSeF (en línea)SendInvoice201Factura registrada correctamente tras procesamiento fuera de líneaInvoiceCleared410KSeF está fuera de línea; se inicia el flujo fuera de líneaSendInvoice429Temporalmente no disponible; se programa un reintento automáticoInvoiceClearedRetry500Error interno del servidorInvoiceClearedError

Con el código de estado 410, la PSB inicia automáticamente el flujo fuera de línea. La factura se procesa entonces localmente con el certificado fuera de línea y se envía cuando KSeF vuelve a estar disponible. Con 429, la PSB programa un reintento automático.

Flujo en línea vs. fuera de línea

KSeF tiene un periodo de corte diario durante el cual el sistema no está disponible para el registro en lotes. A partir de aproximadamente las 23:00 hora local polaca, el flujo fuera de línea se activa en cuanto KSeF no está accesible (código de estado 410):

  • En línea: la factura se registra directamente en KSeF, se recupera el UPO y se genera un PDF con códigos QR
  • Fuera de línea: la factura se procesa localmente, se genera un PDF fuera de línea con un código QR fuera de línea mediante el certificado fuera de línea. La factura se envía al destinatario sin haber sido aún registrada en KSeF.

Tras el regreso de KSeF, las facturas procesadas fuera de línea se registran a posteriori y la factura recibe el código de estado 201 (InvoiceCleared). La factura no se reenvía al destinatario; el código QR fuera de línea enviado anteriormente apunta, tras este registro posterior, al registro KSeF confirmado.

Número de referencia KSeF (clearance)

Tras la clearance en línea, KSeF devuelve un número de referencia. Este número aparece en el UPO y en los detalles del webhook saliente, por ejemplo:

"details": {
  "clearanceReference": "234563218-20260220-50683A000001-11",
  "clearanceSystem": "KSeF"
}

Conserve el número de referencia en el ERP emisor como prueba de registro ante KSeF.

Hook de lote antes de KSeF (limitación de velocidad)

Para volúmenes elevados: coloque un hook de lote antes del hook KSeF para que las facturas se envíen periódicamente (por ejemplo, cada 15 segundos hasta 1 minuto, o un máximo de 100 a la vez) como lote a KSeF. Así la integración alcanza con menor frecuencia los límites de velocidad de KSeF. Patrón de topic preferido: ClearInvoice → lote → ClearInvoiceBatched → hook KSeF. Además, se necesita un hook independiente que publique las facturas salientes en el topic ClearInvoice (según el flujo).

Ejemplo de hook de lote (preferido; parámetros a ajustar por cliente):

{
  "id": "batchClearInvoice",
  "name": "Batch Invoices for KSeF",
  "action": "batch://zip?period=00:01:00&maxBatchSize=100&excludePrimaryAttachment=false&includeAdditionalAttachments=true&hashAlgorithm=sha256&includeRefToMetaAttributes=true&targetDocumentTypeId=econnect-docid%3A%3Ahttp%3A%2F%2Fcrd.gov.pl%2Fwzor%2F2025%2F06%2F25%2F13775%3A%3AFaktura%23%23ksef%3A%3A3.0",
  "topics": ["ClearInvoice"],
  "isActive": true
}

Forma corta de la acción (mismo objetivo FA(3); period por ejemplo 00:00:15):

batch://zip?period=00:00:15&maxBatchSize=100&excludePrimaryAttachment=false&includeAdditionalAttachments=true&hashAlgorithm=sha256&includeRefToMetaAttributes=true&targetDocumentTypeId=econnect-docid%3A%3Ahttp%3A%2F%2Fcrd.gov.pl%2Fwzor%2F2025%2F06%2F25%2F13775%3A%3AFaktura%23%23ksef%3A%3A3.0
Alternativa: sin topic ClearInvoice (por ejemplo Business Central)

Algunos clientes no pueden enviar facturas con el topic ClearInvoice (por ejemplo Business Central). En ese caso, ajuste el hook de lote para que escuche SendInvoice y siga publicando ClearInvoiceBatched:

{
  "id": "batchClearInvoice",
  "name": "Batch Invoices for KSeF",
  "action": "batch://zip?period=00:01:00&maxBatchSize=100&excludePrimaryAttachment=false&includeAdditionalAttachments=true&hashAlgorithm=sha256&includeRefToMetaAttributes=true&targetDocumentTypeId=econnect-docid%3A%3Ahttp%3A%2F%2Fcrd.gov.pl%2Fwzor%2F2025%2F06%2F25%2F13775%3A%3AFaktura%23%23ksef%3A%3A3.0",
  "topics": ["SendInvoice"],
  "output": [
    { "when": "200", "topic": "ClearInvoiceBatched" },
    { "when": "500", "topic": "ClearInvoiceBatchedError" },
    { "when": "429", "topic": "ClearInvoiceBatchedRetry" }
  ],
  "isActive": true
}
Preguntas frecuentes
¿Por qué se requieren tanto un certificado en línea como uno fuera de línea en la configuración init?

La PSB utiliza el certificado en línea para autenticarse en KSeF durante el flujo de registro en línea. El certificado fuera de línea es necesario para los códigos QR en la salida PDF, tanto en el procesamiento en línea como fuera de línea. Los cuatro campos (ambas rutas de certificado y contraseñas) deben estar completos.

¿Qué hace la PSB con el código de estado 410 o 429 de KSeF?

Con 410, KSeF está fuera de línea (por ejemplo, durante el periodo de corte); la PSB inicia el flujo fuera de línea con un PDF fuera de línea y luego envía por el canal regular. Con 429, no hay capacidad temporalmente; la PSB programa automáticamente un reintento en InvoiceClearedRetry.

¿Qué topic debo configurar en el hook para facturas salientes hacia KSeF?

Utilice ClearInvoiceBatched en topics para que el hook escuche las notificaciones batch correctas. El objeto output asocia códigos de estado HTTP a topics de seguimiento como SendInvoice o InvoiceCleared, dependiendo del resultado del registro.


Hook inbound KSeF (entrante, Podmiot2)

El hook inbound KSeF procesa facturas entrantes para la parte compradora (Podmiot2). El hook consulta periódicamente KSeF en busca de nuevas facturas, recupera el XML de la factura por número KSeF y lo entrega a través de la plataforma PSB.

La autenticación frente a KSeF se realiza exclusivamente mediante un certificado en línea (.key + .crt + contraseña). El flujo inbound no tiene variante fuera de línea, a diferencia del hook outbound. En caso de indisponibilidad temporal de KSeF, la consulta se reintenta conforme a la política de reintentos configurada.

Flujo de trabajo por ciclo de consulta
PasoAcciónDescripción1FetchConsulta a KSeF los metadatos de las nuevas facturas dentro de la ventana temporal (POST /v2/invoices/query/metadata). Paginación mediante HasMore / NextPageOffset (bucle interno); truncamiento mediante IsTruncated / HwmDate (bucle externo) para más de 10.000 elementos.2ProcessRecupera el XML de la factura por número KSeF (GET /v2/invoices/ksef/{ksefNumber}) y lo sube al DocumentCarrier. Las facturas duplicadas (HTTP 409) se omiten. Tras cada subida correcta se elimina la clave pending, de modo que el paso se puede reanudar por completo en un reintento.3CompleteGuarda el checkpoint (HwmDate ?? ToDate) y programa el siguiente ciclo de consulta en el próximo horario fijo.

Si no se encuentra ninguna factura durante Fetch, el hook salta directamente a Complete: no se procesa ni publica nada.

Requisitos previos del hook inbound
  • Un certificado en línea válido para KSeF (.key + .crt) más la contraseña correspondiente.
  • El hook debe estar activado en la configuración.
  • Los campos init onlineCertificate y onlineCertificatePassword son obligatorios (sin campos de certificado fuera de línea).

El hook inbound se configura a través de TechSupport: el manejo de certificados es un procedimiento exclusivo de soporte técnico, no de autoservicio.

Configuración del hook inbound

El parámetro de acción determina la ventana temporal en la que el hook mira hacia atrás: ksef:inbound?lookbackWindow=<ventana>. En init solo figura el certificado en línea.

Estándar (publica en el topic ReceiveInvoice):

{
  "id": "ksef-inbound",
  "action": "ksef:inbound?lookbackWindow=08:00:00",
  "name": "KSeF Hook Inbound",
  "publishTopics": ["ReceiveInvoice"],
  "init": {
    "onlineCertificate": "{{ruta-al-certificado-en-linea}}",
    "onlineCertificatePassword": "{{contraseña}}"
  },
  "isActive": true
}

Tras el hook inbound siempre debe seguir un hook de seguimiento que procese posteriormente la factura recibida.

Variante de plataforma Collabrr: en la plataforma Collabrr, el hook escucha en el tenant con publishTopics: ["InvoiceReceived"]. La organización debe estar registrada para la recepción Peppol en la plataforma. Ejemplo de acción: ksef:inbound?lookbackWindow=08.00:00:00.

Parámetro lookbackWindow

El parámetro lookbackWindow determina la ventana temporal en la que el hook mira hacia atrás al consultar/crear:

  • En horas, por ejemplo "08:00:00"
  • En días, por ejemplo "60.00:00:00"

KSeF limita la mirada hacia atrás a un máximo de 3 meses. Al superarlo, se produce un error:

21405: Błąd walidacji danych wejściowych. - 'dateRange' must not exceed 3 months.

Además, existe un límite de velocidad de solicitudes hacia KSeF. Téngalo en cuenta al activar varias entidades con un lookbackWindow (grande).


¿Desea saber más sobre la facturación electrónica en Polonia? Consulte la página del país sobre la obligación KSeF polaca.

Ver la documentación de la API