Webhook: operationFinished

Este evento se dispara cuando obtenemos una respuesta de la entidad a la operación enviada.

Funcionamiento en el modelo asíncrono

Cuando tu sistema envía documentos individuales en modo asíncrono:

  1. Agrupación automática: Nuestro backend acumula registros hasta formar una operación válida (1000 registros o cooldown completado)
  2. Comunicación con AEAT: El sistema envía la operación completa a la Agencia Tributaria
  3. Disparo del webhook: Inmediatamente al recibir respuesta de la AEAT, hacemos:
    1. Enviamos un POST a tu URL configurada
    2. Incluimos exactamente los headers que registraste
    3. Adjuntamos un payload con la información de la compañía

    Ejemplo del payload

{
  "message": "Successfully processed operation",
  "operationId": "01JRX47EQWZS92N1QW9GYA71TK",
  "officeId": "01JRX47DCGRKSC9K84S9HX8V7M",
  "installationNumber": "001",
  "type": "CREATION_ORDINARY_INVOICE",
  "trackingStatus": "FINALIZED",
  "issuedAt": "2025-04-15T16:23:59.484Z",
  "files": {
      "response": "http://api/01JRX47DCGRKSC9K84S9HX8V7M.xml"
  },
  "records": [
    {
      "id": "01JRX47DCGRKSC9K84S9HX8V7M",
      "type": "CREATION_SIMPLIFIED_INVOICE",
      "invoice": {
        "serialNumber": "D001-0000",
        "typeCode": "F1"
      },
      "veriFactuResponse": {
        "recordStatus": "AceptadoConErrores",
        "error": {
          "code": "2004",
          "description": "El valor del campo FechaHoraHusoGenRegistro debe ser la fecha actual del sistema de la AEAT, admitiéndose un margen de error de: 240 segundos."
        }
      }
    }
  ],
  "errors": []
}

Objeto errors

En caso de que haya ocurrido un problema en el envío de la operación, el array de la propiedad "errors" contendra objetos con el siguiente formato:

{
  // ...resto de la informacion (el files.response puede que no esté)
  "errors": [
    {
      "code": "AEP_VFR_0003",
      "message": "VeriFactu response returned a fatal error.",
      "reference": "VERIFACTU_RESPONSE_RETURNED_FATAL_ERROR",
      "extension": {
        "code": "4104",
        "description": "Error en la cabecera: el valor del campo NIF del bloque ObligadoEmision no está identificado.. NIF:XXX. NOMBRE_RAZON:XXX"
      }
    }
  ]
}