{ "data": { "response": "Batch of invoice records processed for deferred submission to Veri*Factu." }}
API Reference
Enviar registros de facturación en lote
Registra entre 1 y 500 registros de facturación que serán procesados en diferido.
La respuesta confirma la recepción del lote, pero no incluye los identificadores ni el resultado individual de los registros. Tampoco confirma su aceptación por Veri*Factu. El resultado de cada registro se obtiene posteriormente mediante la URL indicada en su campo callback_url o consultando el registro de facturación.
Si algún registro no supera la validación, la respuesta contiene los errores indexados según su posición en el array, por ejemplo, invoices.0.sif_id.
Resultado mediante callback
El campo callback_url se configura individualmente en cada elemento de invoices. Cuando los registros han sido procesados, KubiFACTU agrupa los resultados de una misma empresa cliente y URL de callback, y realiza una petición POST con contenido application/json.
El cuerpo del callback siempre es un array y puede contener uno o varios registros. Un callback no tiene por qué corresponder exactamente con el lote original, por lo que la integración debe correlacionar cada resultado mediante id o client_invoice_id, sin depender de su posición en el array. Un mismo registro puede llegar en más de un callback, así que procesa cada resultado de forma idempotente.
recovery va relleno en los elementos de los registros que sigue la recuperación automática, y los reintentos automáticos generan callbacks adicionales del mismo registro: cada nuevo retry, el paso a attention y el final de la recuperación (resolved). recovery.status = resolved no significa que la AEAT haya aceptado el registro: el resultado está en vf_record_registration_status.
Ejemplo de callback de un registro en recuperación automática:
El contrato completo de cada elemento se detalla en el campo callback_url de la petición. Este callback es independiente de la respuesta HTTP inmediata del endpoint.
API-KEY de la empresa que hace la petición. Este dato se puede consultar en el panel web, accediendo a la sección Empresas y accediendo a la ficha de la empresa en.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"KubiFactu Docs","colors":{"primary":"#0D9373","light":"#07C983","dark":"#0D9373"},"logo":{"light":"https://mintcdn.com/kubicode/c_MnoHUxTdI5_O4j/logo/light.svg?fit=max\u0026auto=format\u0026n=c_MnoHUxTdI5_O4j\u0026q=85\u0026s=ed19f7b6d4dbf284f34781b6b320ac48","dark":"https://mintcdn.com/kubicode/c_MnoHUxTdI5_O4j/logo/dark.svg?fit=max\u0026auto=format\u0026n=c_MnoHUxTdI5_O4j\u0026q=85\u0026s=3bee2696fbef6e0c54653a4e98280cf1"},"favicon":"https://mintcdn.com/kubicode/c_MnoHUxTdI5_O4j/favicon.svg?fit=max\u0026auto=format\u0026n=c_MnoHUxTdI5_O4j\u0026q=85\u0026s=ddbe44a854257f5d930e11e61f5cd1a7","api":{"playground":{"display":"interactive"},"mdx":{"server":["https://api.kubifactu.com","https://devapi.kubifactu.com"]}},"navbar":{"links":[{"href":"mailto:[email protected]","label":"Soporte"}]},"styling":{"codeblocks":"dark","latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"kubicode","hasAudioNarration":false,"actualSubdomain":"kubicode","customDomains":["apidocs.kubifactu.com"],"gitSource":{"type":"github","owner":"sportuondo","repo":"kubifactu-docs","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae12722282ca4391afec090","collectionId":"290b5c66-88a3-485d-ae9a-b417d9af5d5c","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae12722282ca4391afec090"},"entitlements":{},"buildId":"6ae12722282ca4391afec090","clientVersion":"0.0.4045","searchFilterCounts":[{"language":"default","tag":"API Reference","count":31},{"language":"default","tag":"Ejemplos","count":22},{"language":"default","tag":"Referencia de la API","count":21},{"language":"default","tag":"Endpoints de KubiBAI","count":8},{"language":"default","tag":"Inicio","count":7},{"language":"default","tag":"Empieza","count":7},{"language":"default","tag":"Otros endpoints","count":2}]},"assistantConfig":{},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"openapi-reference/enviar-registros-de-facturación-en-lote","slug":"/openapi-reference/enviar-registros-de-facturación-en-lote","pageMetadata":{"title":"Enviar registros de facturación en lote","description":"Registra entre 1 y 500 registros de facturación que **serán procesados en diferido**.\n\nLa respuesta confirma la recepción del lote, pero no incluye los identificadores ni el resultado individual de los registros. Tampoco confirma su aceptación por Veri*Factu. El resultado de cada registro se obtiene posteriormente mediante la URL indicada en su campo `callback_url` o consultando el registro de facturación.\n\nSi algún registro no supera la validación, la respuesta contiene los errores indexados según su posición en el array, por ejemplo, `invoices.0.sif_id`.\n\n### Resultado mediante callback\n\nEl campo `callback_url` se configura individualmente en cada elemento de `invoices`. Cuando los registros han sido procesados, KubiFACTU agrupa los resultados de una misma empresa cliente y URL de callback, y realiza una petición `POST` con contenido `application/json`.\n\nEl cuerpo del callback siempre es un array y puede contener uno o varios registros. Un callback no tiene por qué corresponder exactamente con el lote original, por lo que la integración debe correlacionar cada resultado mediante `id` o `client_invoice_id`, sin depender de su posición en el array. Un mismo registro puede llegar en más de un callback, así que procesa cada resultado de forma idempotente.\n\n`recovery` va relleno en los elementos de los registros que sigue la recuperación automática, y los reintentos automáticos generan callbacks adicionales del mismo registro: cada nuevo `retry`, el paso a `attention` y el final de la recuperación (`resolved`). `recovery.status = resolved` no significa que la AEAT haya aceptado el registro: el resultado está en `vf_record_registration_status`.\n\nEjemplo de callback de un registro en recuperación automática:\n\n```json\n[\n {\n \"id\": \"7d76c4a6-6603-4fc6-946a-8b9ffcc93480\",\n \"client_invoice_id\": \"FACTURA-2026-0042\",\n \"record_type\": \"creation\",\n \"sif_id\": \"0995c42c-6708-44fb-bfbf-b363a5fe873e\",\n \"sender_company_name\": \"Ferretería Ejemplo, S.L.\",\n \"sender_tax_id_number\": \"B12345678\",\n \"fiscal_year\": 2026,\n \"full_invoice_number\": \"F-2026-0042\",\n \"fingerprint\": \"8f3d7aa5530f5f6c3a96a5c8a9516a7fd9ce90b9bf3b60375682d8b45ca72867\",\n \"csv\": \"CSV-DE-EJEMPLO\",\n \"vf_post_status\": \"success\",\n \"vf_record_registration_status\": \"success\",\n \"has_warnings\": false,\n \"vf_error_descriptions\": null,\n \"vf_response_body\": \"PHhtbD5SZXNwdWVzdGEgZGUgZWplbXBsbzwveG1sPg==\",\n \"qr_value\": \"https://www2.agenciatributaria.gob.es/wlpl/TIKE-CONT/ValidarQR?nif=B12345678\u0026numserie=F-2026-0042\u0026fecha=01-09-2026\u0026importe=121.00\",\n \"qr_image_url\": \"https://devapi.kubifactu.com/api/invoices/7d76c4a6-6603-4fc6-946a-8b9ffcc93480/qr-image\",\n \"xml_url\": \"https://devapi.kubifactu.com/api/invoices/7d76c4a6-6603-4fc6-946a-8b9ffcc93480/xml\",\n \"recovery\": {\n \"status\": \"resolved\",\n \"reason_code\": null,\n \"message\": \"Automatic recovery has finished. Check the registration status for the result.\",\n \"attempts\": 1,\n \"next_attempt_at\": null\n }\n }\n]\n```\n\nEl contrato completo de cada elemento se detalla en el campo `callback_url` de la petición. Este callback es independiente de la respuesta HTTP inmediata del endpoint.\n","deprecated":null,"version":null,"openapi":"/api-reference/openapi/openapi.yaml post /api/invoices/batch","href":"/openapi-reference/enviar-registros-de-facturación-en-lote","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n h3: \"h3\",\n p: \"p\",\n pre: \"pre\",\n span: \"span\",\n strong: \"strong\",\n ..._provideComponents(),\n ...props.components\n }, {CodeBlock} = _components;\n if (!CodeBlock) _missingMdxReference(\"CodeBlock\", true);\n return _jsxs(_Fragment, {\n children: [_jsxs(_components.p, {\n children: [\"Registra entre 1 y 500 registros de facturación que \", _jsx(_components.strong, {\n children: \"serán procesados en diferido\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"La respuesta confirma la recepción del lote, pero no incluye los identificadores ni el resultado individual de los registros. Tampoco confirma su aceptación por Veri*Factu. El resultado de cada registro se obtiene posteriormente mediante la URL indicada en su campo \", _jsx(_components.code, {\n children: \"callback_url\"\n }), \" o consultando el registro de facturación.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Si algún registro no supera la validación, la respuesta contiene los errores indexados según su posición en el array, por ejemplo, \", _jsx(_components.code, {\n children: \"invoices.0.sif_id\"\n }), \".\"]\n }), \"\\n\", _jsx(_components.h3, {\n children: \"Resultado mediante callback\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"El campo \", _jsx(_components.code, {\n children: \"callback_url\"\n }), \" se configura individualmente en cada elemento de \", _jsx(_components.code, {\n children: \"invoices\"\n }), \". Cuando los registros han sido procesados, KubiFACTU agrupa los resultados de una misma empresa cliente y URL de callback, y realiza una petición \", _jsx(_components.code, {\n children: \"POST\"\n }), \" con contenido \", _jsx(_components.code, {\n children: \"application/json\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"El cuerpo del callback siempre es un array y puede contener uno o varios registros. Un callback no tiene por qué corresponder exactamente con el lote original, por lo que la integración debe correlacionar cada resultado mediante \", _jsx(_components.code, {\n children: \"id\"\n }), \" o \", _jsx(_components.code, {\n children: \"client_invoice_id\"\n }), \", sin depender de su posición en el array. Un mismo registro puede llegar en más de un callback, así que procesa cada resultado de forma idempotente.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.code, {\n children: \"recovery\"\n }), \" va relleno en los elementos de los registros que sigue la recuperación automática, y los reintentos automáticos generan callbacks adicionales del mismo registro: cada nuevo \", _jsx(_components.code, {\n children: \"retry\"\n }), \", el paso a \", _jsx(_components.code, {\n children: \"attention\"\n }), \" y el final de la recuperación (\", _jsx(_components.code, {\n children: \"resolved\"\n }), \"). \", _jsx(_components.code, {\n children: \"recovery.status = resolved\"\n }), \" no significa que la AEAT haya aceptado el registro: el resultado está en \", _jsx(_components.code, {\n children: \"vf_record_registration_status\"\n }), \".\"]\n }), \"\\n\", _jsx(_components.p, {\n children: \"Ejemplo de callback de un registro en recuperación automática:\"\n }), \"\\n\", _jsx(CodeBlock, {\n numberOfLines: \"29\",\n language: \"json\",\n children: _jsx(_components.pre, {\n className: \"shiki shiki-themes github-light-default dark-plus\",\n style: {\n backgroundColor: \"#ffffff\",\n \"--shiki-dark-bg\": \"#0B0C0E\",\n color: \"#1f2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n language: \"json\",\n children: _jsxs(_components.code, {\n language: \"json\",\n numberOfLines: \"29\",\n children: [_jsx(_components.span, {\n className: \"line\",\n children: _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \"[\"\n })\n }), \"\\n\", _jsx(_components.span, {\n className: \"line\",\n children: _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \" {\"\n })\n }), \"\\n\", _jsxs(_components.span, {\n className: \"line\",\n children: [_jsx(_components.span, {\n style: {\n color: \"#116329\",\n \"--shiki-dark\": \"#9CDCFE\"\n },\n children: \" \\\"id\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \": \"\n }), _jsx(_components.span, {\n style: {\n color: \"#0A3069\",\n \"--shiki-dark\": \"#CE9178\"\n },\n children: \"\\\"7d76c4a6-6603-4fc6-946a-8b9ffcc93480\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \",\"\n })]\n }), \"\\n\", _jsxs(_components.span, {\n className: \"line\",\n children: [_jsx(_components.span, {\n style: {\n color: \"#116329\",\n \"--shiki-dark\": \"#9CDCFE\"\n },\n children: \" \\\"client_invoice_id\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \": \"\n }), _jsx(_components.span, {\n style: {\n color: \"#0A3069\",\n \"--shiki-dark\": \"#CE9178\"\n },\n children: \"\\\"FACTURA-2026-0042\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \",\"\n })]\n }), \"\\n\", _jsxs(_components.span, {\n className: \"line\",\n children: [_jsx(_components.span, {\n style: {\n color: \"#116329\",\n \"--shiki-dark\": \"#9CDCFE\"\n },\n children: \" \\\"record_type\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \": \"\n }), _jsx(_components.span, {\n style: {\n color: \"#0A3069\",\n \"--shiki-dark\": \"#CE9178\"\n },\n children: \"\\\"creation\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \",\"\n })]\n }), \"\\n\", _jsxs(_components.span, {\n className: \"line\",\n children: [_jsx(_components.span, {\n style: {\n color: \"#116329\",\n \"--shiki-dark\": \"#9CDCFE\"\n },\n children: \" \\\"sif_id\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \": \"\n }), _jsx(_components.span, {\n style: {\n color: \"#0A3069\",\n \"--shiki-dark\": \"#CE9178\"\n },\n children: \"\\\"0995c42c-6708-44fb-bfbf-b363a5fe873e\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \",\"\n })]\n }), \"\\n\", _jsxs(_components.span, {\n className: \"line\",\n children: [_jsx(_components.span, {\n style: {\n color: \"#116329\",\n \"--shiki-dark\": \"#9CDCFE\"\n },\n children: \" \\\"sender_company_name\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \": \"\n }), _jsx(_components.span, {\n style: {\n color: \"#0A3069\",\n \"--shiki-dark\": \"#CE9178\"\n },\n children: \"\\\"Ferretería Ejemplo, S.L.\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \",\"\n })]\n }), \"\\n\", _jsxs(_components.span, {\n className: \"line\",\n children: [_jsx(_components.span, {\n style: {\n color: \"#116329\",\n \"--shiki-dark\": \"#9CDCFE\"\n },\n children: \" \\\"sender_tax_id_number\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \": \"\n }), _jsx(_components.span, {\n style: {\n color: \"#0A3069\",\n \"--shiki-dark\": \"#CE9178\"\n },\n children: \"\\\"B12345678\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \",\"\n })]\n }), \"\\n\", _jsxs(_components.span, {\n className: \"line\",\n children: [_jsx(_components.span, {\n style: {\n color: \"#116329\",\n \"--shiki-dark\": \"#9CDCFE\"\n },\n children: \" \\\"fiscal_year\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \": \"\n }), _jsx(_components.span, {\n style: {\n color: \"#0550AE\",\n \"--shiki-dark\": \"#B5CEA8\"\n },\n children: \"2026\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \",\"\n })]\n }), \"\\n\", _jsxs(_components.span, {\n className: \"line\",\n children: [_jsx(_components.span, {\n style: {\n color: \"#116329\",\n \"--shiki-dark\": \"#9CDCFE\"\n },\n children: \" \\\"full_invoice_number\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \": \"\n }), _jsx(_components.span, {\n style: {\n color: \"#0A3069\",\n \"--shiki-dark\": \"#CE9178\"\n },\n children: \"\\\"F-2026-0042\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \",\"\n })]\n }), \"\\n\", _jsxs(_components.span, {\n className: \"line\",\n children: [_jsx(_components.span, {\n style: {\n color: \"#116329\",\n \"--shiki-dark\": \"#9CDCFE\"\n },\n children: \" \\\"fingerprint\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \": \"\n }), _jsx(_components.span, {\n style: {\n color: \"#0A3069\",\n \"--shiki-dark\": \"#CE9178\"\n },\n children: \"\\\"8f3d7aa5530f5f6c3a96a5c8a9516a7fd9ce90b9bf3b60375682d8b45ca72867\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \",\"\n })]\n }), \"\\n\", _jsxs(_components.span, {\n className: \"line\",\n children: [_jsx(_components.span, {\n style: {\n color: \"#116329\",\n \"--shiki-dark\": \"#9CDCFE\"\n },\n children: \" \\\"csv\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \": \"\n }), _jsx(_components.span, {\n style: {\n color: \"#0A3069\",\n \"--shiki-dark\": \"#CE9178\"\n },\n children: \"\\\"CSV-DE-EJEMPLO\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \",\"\n })]\n }), \"\\n\", _jsxs(_components.span, {\n className: \"line\",\n children: [_jsx(_components.span, {\n style: {\n color: \"#116329\",\n \"--shiki-dark\": \"#9CDCFE\"\n },\n children: \" \\\"vf_post_status\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \": \"\n }), _jsx(_components.span, {\n style: {\n color: \"#0A3069\",\n \"--shiki-dark\": \"#CE9178\"\n },\n children: \"\\\"success\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \",\"\n })]\n }), \"\\n\", _jsxs(_components.span, {\n className: \"line\",\n children: [_jsx(_components.span, {\n style: {\n color: \"#116329\",\n \"--shiki-dark\": \"#9CDCFE\"\n },\n children: \" \\\"vf_record_registration_status\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \": \"\n }), _jsx(_components.span, {\n style: {\n color: \"#0A3069\",\n \"--shiki-dark\": \"#CE9178\"\n },\n children: \"\\\"success\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \",\"\n })]\n }), \"\\n\", _jsxs(_components.span, {\n className: \"line\",\n children: [_jsx(_components.span, {\n style: {\n color: \"#116329\",\n \"--shiki-dark\": \"#9CDCFE\"\n },\n children: \" \\\"has_warnings\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \": \"\n }), _jsx(_components.span, {\n style: {\n color: \"#0550AE\",\n \"--shiki-dark\": \"#569CD6\"\n },\n children: \"false\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \",\"\n })]\n }), \"\\n\", _jsxs(_components.span, {\n className: \"line\",\n children: [_jsx(_components.span, {\n style: {\n color: \"#116329\",\n \"--shiki-dark\": \"#9CDCFE\"\n },\n children: \" \\\"vf_error_descriptions\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \": \"\n }), _jsx(_components.span, {\n style: {\n color: \"#0550AE\",\n \"--shiki-dark\": \"#569CD6\"\n },\n children: \"null\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \",\"\n })]\n }), \"\\n\", _jsxs(_components.span, {\n className: \"line\",\n children: [_jsx(_components.span, {\n style: {\n color: \"#116329\",\n \"--shiki-dark\": \"#9CDCFE\"\n },\n children: \" \\\"vf_response_body\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \": \"\n }), _jsx(_components.span, {\n style: {\n color: \"#0A3069\",\n \"--shiki-dark\": \"#CE9178\"\n },\n children: \"\\\"PHhtbD5SZXNwdWVzdGEgZGUgZWplbXBsbzwveG1sPg==\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \",\"\n })]\n }), \"\\n\", _jsxs(_components.span, {\n className: \"line\",\n children: [_jsx(_components.span, {\n style: {\n color: \"#116329\",\n \"--shiki-dark\": \"#9CDCFE\"\n },\n children: \" \\\"qr_value\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \": \"\n }), _jsx(_components.span, {\n style: {\n color: \"#0A3069\",\n \"--shiki-dark\": \"#CE9178\"\n },\n children: \"\\\"https://www2.agenciatributaria.gob.es/wlpl/TIKE-CONT/ValidarQR?nif=B12345678\u0026numserie=F-2026-0042\u0026fecha=01-09-2026\u0026importe=121.00\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \",\"\n })]\n }), \"\\n\", _jsxs(_components.span, {\n className: \"line\",\n children: [_jsx(_components.span, {\n style: {\n color: \"#116329\",\n \"--shiki-dark\": \"#9CDCFE\"\n },\n children: \" \\\"qr_image_url\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \": \"\n }), _jsx(_components.span, {\n style: {\n color: \"#0A3069\",\n \"--shiki-dark\": \"#CE9178\"\n },\n children: \"\\\"https://devapi.kubifactu.com/api/invoices/7d76c4a6-6603-4fc6-946a-8b9ffcc93480/qr-image\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \",\"\n })]\n }), \"\\n\", _jsxs(_components.span, {\n className: \"line\",\n children: [_jsx(_components.span, {\n style: {\n color: \"#116329\",\n \"--shiki-dark\": \"#9CDCFE\"\n },\n children: \" \\\"xml_url\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \": \"\n }), _jsx(_components.span, {\n style: {\n color: \"#0A3069\",\n \"--shiki-dark\": \"#CE9178\"\n },\n children: \"\\\"https://devapi.kubifactu.com/api/invoices/7d76c4a6-6603-4fc6-946a-8b9ffcc93480/xml\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \",\"\n })]\n }), \"\\n\", _jsxs(_components.span, {\n className: \"line\",\n children: [_jsx(_components.span, {\n style: {\n color: \"#116329\",\n \"--shiki-dark\": \"#9CDCFE\"\n },\n children: \" \\\"recovery\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \": {\"\n })]\n }), \"\\n\", _jsxs(_components.span, {\n className: \"line\",\n children: [_jsx(_components.span, {\n style: {\n color: \"#116329\",\n \"--shiki-dark\": \"#9CDCFE\"\n },\n children: \" \\\"status\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \": \"\n }), _jsx(_components.span, {\n style: {\n color: \"#0A3069\",\n \"--shiki-dark\": \"#CE9178\"\n },\n children: \"\\\"resolved\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \",\"\n })]\n }), \"\\n\", _jsxs(_components.span, {\n className: \"line\",\n children: [_jsx(_components.span, {\n style: {\n color: \"#116329\",\n \"--shiki-dark\": \"#9CDCFE\"\n },\n children: \" \\\"reason_code\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \": \"\n }), _jsx(_components.span, {\n style: {\n color: \"#0550AE\",\n \"--shiki-dark\": \"#569CD6\"\n },\n children: \"null\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \",\"\n })]\n }), \"\\n\", _jsxs(_components.span, {\n className: \"line\",\n children: [_jsx(_components.span, {\n style: {\n color: \"#116329\",\n \"--shiki-dark\": \"#9CDCFE\"\n },\n children: \" \\\"message\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \": \"\n }), _jsx(_components.span, {\n style: {\n color: \"#0A3069\",\n \"--shiki-dark\": \"#CE9178\"\n },\n children: \"\\\"Automatic recovery has finished. Check the registration status for the result.\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \",\"\n })]\n }), \"\\n\", _jsxs(_components.span, {\n className: \"line\",\n children: [_jsx(_components.span, {\n style: {\n color: \"#116329\",\n \"--shiki-dark\": \"#9CDCFE\"\n },\n children: \" \\\"attempts\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \": \"\n }), _jsx(_components.span, {\n style: {\n color: \"#0550AE\",\n \"--shiki-dark\": \"#B5CEA8\"\n },\n children: \"1\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \",\"\n })]\n }), \"\\n\", _jsxs(_components.span, {\n className: \"line\",\n children: [_jsx(_components.span, {\n style: {\n color: \"#116329\",\n \"--shiki-dark\": \"#9CDCFE\"\n },\n children: \" \\\"next_attempt_at\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \": \"\n }), _jsx(_components.span, {\n style: {\n color: \"#0550AE\",\n \"--shiki-dark\": \"#569CD6\"\n },\n children: \"null\"\n })]\n }), \"\\n\", _jsx(_components.span, {\n className: \"line\",\n children: _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \" }\"\n })\n }), \"\\n\", _jsx(_components.span, {\n className: \"line\",\n children: _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \" }\"\n })\n }), \"\\n\", _jsx(_components.span, {\n className: \"line\",\n children: _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \"]\"\n })\n }), \"\\n\"]\n })\n })\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"El contrato completo de cada elemento se detalla en el campo \", _jsx(_components.code, {\n children: \"callback_url\"\n }), \" de la petición. Este callback es independiente de la respuesta HTTP inmediata del endpoint.\"]\n })]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\nfunction _missingMdxReference(id, component) {\n throw new Error(\"Expected \" + (component ? \"component\" : \"object\") + \" `\" + id + \"` to be defined: you likely forgot to import, pass, or provide it.\");\n}\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"codeStyling":"dark","config":{},"pageMetadata":{"title":"Enviar registros de facturación en lote","description":"Registra entre 1 y 500 registros de facturación que **serán procesados en diferido**.\n\nLa respuesta confirma la recepción del lote, pero no incluye los identificadores ni el resultado individual de los registros. Tampoco confirma su aceptación por Veri*Factu. El resultado de cada registro se obtiene posteriormente mediante la URL indicada en su campo `callback_url` o consultando el registro de facturación.\n\nSi algún registro no supera la validación, la respuesta contiene los errores indexados según su posición en el array, por ejemplo, `invoices.0.sif_id`.\n\n### Resultado mediante callback\n\nEl campo `callback_url` se configura individualmente en cada elemento de `invoices`. Cuando los registros han sido procesados, KubiFACTU agrupa los resultados de una misma empresa cliente y URL de callback, y realiza una petición `POST` con contenido `application/json`.\n\nEl cuerpo del callback siempre es un array y puede contener uno o varios registros. Un callback no tiene por qué corresponder exactamente con el lote original, por lo que la integración debe correlacionar cada resultado mediante `id` o `client_invoice_id`, sin depender de su posición en el array. Un mismo registro puede llegar en más de un callback, así que procesa cada resultado de forma idempotente.\n\n`recovery` va relleno en los elementos de los registros que sigue la recuperación automática, y los reintentos automáticos generan callbacks adicionales del mismo registro: cada nuevo `retry`, el paso a `attention` y el final de la recuperación (`resolved`). `recovery.status = resolved` no significa que la AEAT haya aceptado el registro: el resultado está en `vf_record_registration_status`.\n\nEjemplo de callback de un registro en recuperación automática:\n\n```json\n[\n {\n \"id\": \"7d76c4a6-6603-4fc6-946a-8b9ffcc93480\",\n \"client_invoice_id\": \"FACTURA-2026-0042\",\n \"record_type\": \"creation\",\n \"sif_id\": \"0995c42c-6708-44fb-bfbf-b363a5fe873e\",\n \"sender_company_name\": \"Ferretería Ejemplo, S.L.\",\n \"sender_tax_id_number\": \"B12345678\",\n \"fiscal_year\": 2026,\n \"full_invoice_number\": \"F-2026-0042\",\n \"fingerprint\": \"8f3d7aa5530f5f6c3a96a5c8a9516a7fd9ce90b9bf3b60375682d8b45ca72867\",\n \"csv\": \"CSV-DE-EJEMPLO\",\n \"vf_post_status\": \"success\",\n \"vf_record_registration_status\": \"success\",\n \"has_warnings\": false,\n \"vf_error_descriptions\": null,\n \"vf_response_body\": \"PHhtbD5SZXNwdWVzdGEgZGUgZWplbXBsbzwveG1sPg==\",\n \"qr_value\": \"https://www2.agenciatributaria.gob.es/wlpl/TIKE-CONT/ValidarQR?nif=B12345678\u0026numserie=F-2026-0042\u0026fecha=01-09-2026\u0026importe=121.00\",\n \"qr_image_url\": \"https://devapi.kubifactu.com/api/invoices/7d76c4a6-6603-4fc6-946a-8b9ffcc93480/qr-image\",\n \"xml_url\": \"https://devapi.kubifactu.com/api/invoices/7d76c4a6-6603-4fc6-946a-8b9ffcc93480/xml\",\n \"recovery\": {\n \"status\": \"resolved\",\n \"reason_code\": null,\n \"message\": \"Automatic recovery has finished. Check the registration status for the result.\",\n \"attempts\": 1,\n \"next_attempt_at\": null\n }\n }\n]\n```\n\nEl contrato completo de cada elemento se detalla en el campo `callback_url` de la petición. Este callback es independiente de la respuesta HTTP inmediata del endpoint.\n","deprecated":null,"version":null,"openapi":"/api-reference/openapi/openapi.yaml post /api/invoices/batch","href":"/openapi-reference/enviar-registros-de-facturación-en-lote","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"summary":"Enviar registros de facturación en lote","description":"Registra entre 1 y 500 registros de facturación que **serán procesados en diferido**.\n\nLa respuesta confirma la recepción del lote, pero no incluye los identificadores ni el resultado individual de los registros. Tampoco confirma su aceptación por Veri*Factu. El resultado de cada registro se obtiene posteriormente mediante la URL indicada en su campo `callback_url` o consultando el registro de facturación.\n\nSi algún registro no supera la validación, la respuesta contiene los errores indexados según su posición en el array, por ejemplo, `invoices.0.sif_id`.\n\n### Resultado mediante callback\n\nEl campo `callback_url` se configura individualmente en cada elemento de `invoices`. Cuando los registros han sido procesados, KubiFACTU agrupa los resultados de una misma empresa cliente y URL de callback, y realiza una petición `POST` con contenido `application/json`.\n\nEl cuerpo del callback siempre es un array y puede contener uno o varios registros. Un callback no tiene por qué corresponder exactamente con el lote original, por lo que la integración debe correlacionar cada resultado mediante `id` o `client_invoice_id`, sin depender de su posición en el array. Un mismo registro puede llegar en más de un callback, así que procesa cada resultado de forma idempotente.\n\n`recovery` va relleno en los elementos de los registros que sigue la recuperación automática, y los reintentos automáticos generan callbacks adicionales del mismo registro: cada nuevo `retry`, el paso a `attention` y el final de la recuperación (`resolved`). `recovery.status = resolved` no significa que la AEAT haya aceptado el registro: el resultado está en `vf_record_registration_status`.\n\nEjemplo de callback de un registro en recuperación automática:\n\n```json\n[\n {\n \"id\": \"7d76c4a6-6603-4fc6-946a-8b9ffcc93480\",\n \"client_invoice_id\": \"FACTURA-2026-0042\",\n \"record_type\": \"creation\",\n \"sif_id\": \"0995c42c-6708-44fb-bfbf-b363a5fe873e\",\n \"sender_company_name\": \"Ferretería Ejemplo, S.L.\",\n \"sender_tax_id_number\": \"B12345678\",\n \"fiscal_year\": 2026,\n \"full_invoice_number\": \"F-2026-0042\",\n \"fingerprint\": \"8f3d7aa5530f5f6c3a96a5c8a9516a7fd9ce90b9bf3b60375682d8b45ca72867\",\n \"csv\": \"CSV-DE-EJEMPLO\",\n \"vf_post_status\": \"success\",\n \"vf_record_registration_status\": \"success\",\n \"has_warnings\": false,\n \"vf_error_descriptions\": null,\n \"vf_response_body\": \"PHhtbD5SZXNwdWVzdGEgZGUgZWplbXBsbzwveG1sPg==\",\n \"qr_value\": \"https://www2.agenciatributaria.gob.es/wlpl/TIKE-CONT/ValidarQR?nif=B12345678\u0026numserie=F-2026-0042\u0026fecha=01-09-2026\u0026importe=121.00\",\n \"qr_image_url\": \"https://devapi.kubifactu.com/api/invoices/7d76c4a6-6603-4fc6-946a-8b9ffcc93480/qr-image\",\n \"xml_url\": \"https://devapi.kubifactu.com/api/invoices/7d76c4a6-6603-4fc6-946a-8b9ffcc93480/xml\",\n \"recovery\": {\n \"status\": \"resolved\",\n \"reason_code\": null,\n \"message\": \"Automatic recovery has finished. Check the registration status for the result.\",\n \"attempts\": 1,\n \"next_attempt_at\": null\n }\n }\n]\n```\n\nEl contrato completo de cada elemento se detalla en el campo `callback_url` de la petición. Este callback es independiente de la respuesta HTTP inmediata del endpoint.\n","operationId":"createBatchOfInvoiceRecords","requestBody":"d3266b8a-0cdc-49fb-b87c-c17fbd5239ed","responses":{"200":"e276402e-12b3-4737-8f46-a733d076470c","403":"8f51a14c-3fc7-40df-bffe-c555e7ff6a82","422":"ffb9e29b-671e-40f3-8a95-c50140f43dd5","500":"1fb03f00-269d-4b68-853c-62324b340114"},"security":["6e52b4ec-098c-474e-8522-21a666a9978b"],"method":"post","type":"path","servers":["303ac0a5-79a3-4351-acb8-8f25fe88f3ee","c6f56d55-3c61-4255-bb06-871019b322ea"],"path":"/api/invoices/batch","baseUrlOptions":["https://api.kubifactu.com","https://devapi.kubifactu.com"],"title":"Enviar registros de facturación en lote","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["invoices"],"properties":{"invoices":{"type":"array","minItems":1,"maxItems":500,"description":"Array de registros de facturación con la misma estructura que la del endpoint de **Enviar registro de facturación**.\n","items":{"type":"object","properties":{"sif_id":{"type":"string","format":"uuid","description":"ID del SIF que se quiere utilizar para el envío de la factura. Los SIFs se pueden registrar en el panel web de KubiFACTU.\n\nUn SIF puede procesar registros de facturación de diferentes empresas.\n\nUna empresa puede tener uno o varios SIFs. Por ejemplo, una empresa con varias tiendas puede operar con un SIF por cada establecimiento, de forma que el encadenamiento/trazabilidad de las facturas se trate por separado.\n","example":"9db0bca1-187e-4cf4-b87c-96f2044008d7","isRequired":true,"uniqueKey":"invoices.items.[INDEX].sif_id","typeLabel":"string\u003cuuid>"},"invoice_type_key":{"type":"string","description":"Especificación del tipo de factura: factura completa, factura simplificada, factura emitida en sustitución de facturas simplificadas o factura rectificativa.\n- `F1`: Factura (art. 6, 7.2 y 7.3 del RD 1619/2012).\n- `F2`: Factura Simplificada y Facturas sin identificación del destinatario art. 6.1.d) RD 1619/2012.\n- `F3`: Factura emitida en sustitución de facturas simplificadas facturadas y declaradas.\n- `R1`: Factura Rectificativa (Error fundado en derecho y Art. 80 Uno Dos y Seis LIVA)\n- `R2`: Factura Rectificativa (Art. 80.3)\n- `R3`: Factura Rectificativa (Art. 80.4)\n- `R4`: Factura Rectificativa (Resto)\n- `R5`: Factura Rectificativa en facturas simplificadas\n","example":"F1","enum":["F1","F2","F3","R1","R2","R3","R4","R5"],"isRequired":true,"uniqueKey":"invoices.items.[INDEX].invoice_type_key","typeLabel":"enum\u003cstring>"},"sender_data":{"type":"object","description":"Información referente al emisor de la factura.","required":["company_name","tax_id_number"],"properties":{"company_name":{"type":"string","description":"Nombre de la empresa emisora.","isRequired":true,"uniqueKey":"invoices.items.[INDEX].sender_data.company_name","typeLabel":"string"},"tax_id_number":{"type":"string","description":"NIF/CIF de la empresa emisora.","isRequired":true,"uniqueKey":"invoices.items.[INDEX].sender_data.tax_id_number","typeLabel":"string"}},"isRequired":true,"uniqueKey":"invoices.items.[INDEX].sender_data","typeLabel":"object"},"full_invoice_number":{"type":"string","description":"Serie+Nº Factura que identifica a la factura emitida. Sólo puedo contener caracteres ASCII del 32 a 126 (caracteres imprimibles).\nEjemplo: `2026-00001`.\n","example":"2026-00001","isRequired":true,"uniqueKey":"invoices.items.[INDEX].full_invoice_number","typeLabel":"string"},"fiscal_year":{"type":"integer","description":"Ejercicio fiscal en el que se emite la factura. Aunque este dato no se envía a la AEAT, se utiliza junto con el `sif_id` para verificar que no se están duplicando los números de factura.\n","example":2026,"isRequired":true,"uniqueKey":"invoices.items.[INDEX].fiscal_year","typeLabel":"integer"},"issue_date":{"type":"string","format":"date","example":"2026-09-15","description":"Fecha de expedición del registro de facturación.\n\nNo puede ser una fecha futura.\n","isRequired":true,"uniqueKey":"invoices.items.[INDEX].issue_date","typeLabel":"string\u003cdate>"},"operation_description":{"type":"string","description":"Descripción del objeto de la factura.\n","isRequired":true,"uniqueKey":"invoices.items.[INDEX].operation_description","typeLabel":"string"},"tax_breakdown":{"type":"array","maxItems":12,"description":"Anteriormente, este campo se denominaba `lines`. Este nombre sigue siendo válido como alias de retrocompatibilidad, pero las nuevas integraciones deben utilizar `tax_breakdown`.\n\nDesglose de la factura con la lista de los conceptos facturados **agrupados por condición fiscal completa**. El número máximo de líneas es de 12.\n\nEsta es la propiedad canónica para el desglose fiscal. Los errores de validación se devuelven usando la clave incluida en la petición. Si no se incluye ninguna clave compatible para el desglose, el error se devuelve en `tax_breakdown`.\n\nEn el endpoint por lotes, la ruta de esta propiedad es `invoices.*.tax_breakdown` y cada factura se valida de forma independiente.\n\nEl desglose debe agruparse por condición fiscal completa: `tax_rate` + `vat_tax_regime_key`, `ipsi_tax_regime_key` o `igic_tax_regime_key` (según `tax_type_key`) + `equalization_tax_rate` (si aplica). Esta agrupación responde a la condición fiscal de la operación, y no puede realizarse únicamente por tipo impositivo.\n\nA modo de ejemplo, indicar lo siguiente:\n\n### Caso 1: Factura con todas las líneas al 21%\nSi las líneas al 21% se acogen a regímenes diferentes, deben generarse múltiples agrupaciones en el desglose, cada una con su combinación única de `tax_rate` + `vat_tax_regime_key`, `ipsi_tax_regime_key` o `igic_tax_regime_key` (según `tax_type_key`) + `equalization_tax_rate` (si aplica).\n\nEjemplo válido:\n- Línea 1: 21%, régimen general\n- Línea 2: 21%, régimen criterio de caja\n\nEl desglose debe contener dos entradas distintas, ambas con tipo 21%, pero con claves de régimen diferentes.\n\n### Caso 2: Factura con líneas al 21% y al 10%\n\nSe pueden informar más de una clave de régimen por cada tipo impositivo, siempre que existan líneas que lo justifiquen.\n\nEjemplo válido:\n- Línea 1: 21%, régimen general\n- Línea 2: 21%, régimen especial agencias\n- Línea 3: 10%, régimen general\n\nEl desglose incluirá tres agrupaciones:\n1. 21% + régimen general\n2. 21% + régimen especial agencias\n3. 10% + régimen general\n","items":{"oneOf":[{"type":"object","required":["operation_type_key","tax_base","tax_type_key","vat_tax_regime_key"],"properties":{"tax_type_key":{"type":"string","description":"Impuesto de aplicación. Los valores posibles son:\n\n- `01`: Impuesto sobre el Valor Añadido (IVA).\n- `02`: Impuesto sobre la Producción, los Servicios y la Importación (IPSI) de Ceuta y Melilla.\n- `03`: Impuesto General Indirecto Canario (IGIC).\n- `05`: Otros.\n\nEn las peticiones, `vat_tax_regime_key` solo corresponde a `01`, `ipsi_tax_regime_key` a `02` y `igic_tax_regime_key` a `03`. Para `05` no se informa una clave de régimen. Estas opciones documentan los tipos admitidos por la API; no representan cobertura completa de todos los impuestos o regímenes IPSI.\n","enum":["01"],"isRequired":true,"uniqueKey":"invoices.items.[INDEX].tax_breakdown.items.[INDEX].oneOf.0.tax_type_key","typeLabel":"enum\u003cstring>"},"vat_tax_regime_key":{"type":"string","description":"Clave que identificará el tipo de régimen del impuesto o una operación con trascendencia tributaria en el contexto del IVA. Este campo no debe incluirse si se está incluyendo `igic_tax_regime_key` o `tax_type_key` tiene un valor diferente de `01`. Los valores posibles son:\n\n- `01`: Operación de régimen general.\n- `02`: Exportación.\n- `03`: Operaciones a las que se aplique el régimen especial de bienes usados, objetos de arte, antigüedades y objetos de colección.\n- `04`: Régimen especial del oro de inversión.\n- `05`: Régimen especial de las agencias de viajes.\n- `06`: Régimen especial grupo de entidades en IVA (Nivel Avanzado).\n- `07`: Régimen especial del criterio de caja.\n- `08`: Operaciones sujetas al IPSI / IGIC (Impuesto sobre la Producción, los Servicios y la Importación / Impuesto General Indirecto Canario).\n- `09`: Facturación de las prestaciones de servicios de agencias de viaje que actúan como mediadoras en nombre y por cuenta ajena (D.A.4ª RD1619/2012).\n- `10`: Cobros por cuenta de terceros de honorarios profesionales o de derechos derivados de la propiedad industrial, de autor u otros por cuenta de sus socios, asociados o colegiados efectuados por sociedades, asociaciones, colegios profesionales u otras entidades que realicen estas funciones de cobro.\n- `11`: Operaciones de arrendamiento de local de negocio.\n- `14`: Factura con IVA pendiente de devengo en certificaciones de obra cuyo destinatario sea una Administración Pública.\n- `15`: Factura con IVA pendiente de devengo en operaciones de tracto sucesivo.\n- `17`: Operación acogida a alguno de los regímenes previstos en el Capítulo XI del Título IX (OSS e IOSS).\n- `18`: Recargo de equivalencia.\n- `19`: Operaciones de actividades incluidas en el Régimen Especial de Agricultura, Ganadería y Pesca (REAGYP).\n- `20`: Régimen simplificado.\n","enum":["01","02","03","04","05","06","07","08","09","10","11","14","15","17","18","19","20"],"isRequired":true,"uniqueKey":"invoices.items.[INDEX].tax_breakdown.items.[INDEX].oneOf.0.vat_tax_regime_key","typeLabel":"enum\u003cstring>"},"operation_type_key":{"type":"string","description":"Código que identifica el tipo de operación según su sujeción o exención tributaria. Los valores posibles son:\n\n- `S1`: Operación Sujeta y No exenta - Sin inversión del sujeto pasivo.\n- `S2`: Operación Sujeta y No exenta - Con Inversión del sujeto pasivo.\n- `N1`: Operación No Sujeta artículo 7, 14, otros.\n- `N2`: Operación No Sujeta por Reglas de localización.\n","enum":["S1","S2","N1","N2"],"isRequired":true,"uniqueKey":"invoices.items.[INDEX].tax_breakdown.items.[INDEX].oneOf.0.operation_type_key","typeLabel":"enum\u003cstring>"},"tax_base":{"type":"number","format":"decimal","description":"Magnitud dineraria sobre la que se aplica el tipo impositivo/importe no sujeto.\nValor con 12 dígitos en la parte entera y 2 decimales. Ejemplo: `200.00`.\n","example":200,"isRequired":true,"uniqueKey":"invoices.items.[INDEX].tax_breakdown.items.[INDEX].oneOf.0.tax_base","typeLabel":"number\u003cdecimal>"},"igic_tax_regime_key":{"type":"string","description":"Clave que identificará el tipo de régimen del impuesto o una operación con trascendencia tributaria en el contexto del IGIC. Este campo no debe incluirse se se está incluyendo `vat_tax_regime_key`. Los valores posibles son:\n\n- `01`: Operación de régimen general.\n- `02`: Exportación.\n- `03`: Operaciones a las que se aplique el régimen especial de bienes usados, objetos de arte, antigüedades y objetos de colección.\n- `04`: Régimen especial del oro de inversión.\n- `05`: Régimen especial de las agencias de viajes.\n- `06`: Régimen especial grupo de entidades en IGIC (Nivel Avanzado).\n- `07`: Régimen especial del criterio de caja.\n- `08`: Operaciones sujetas al IPSI / IVA (Impuesto sobre la Producción, los Servicios y la Importación / Impuesto sobre el Valor Añadido).\n- `09`: Facturación de las prestaciones de servicios de agencias de viaje que actúan como mediadoras en nombre y por cuenta ajena (D.A.4ª RD1619/2012).\n- `10`: Cobros por cuenta de terceros de honorarios profesionales o de derechos derivados de la propiedad industrial, de autor u otros por cuenta de sus socios, asociados o colegiados efectuados por sociedades, asociaciones, colegios profesionales u otras entidades que realicen estas funciones de cobro.\n- `11`: Operaciones de arrendamiento de local de negocio.\n- `14`: Factura con IGIC pendiente de devengo en certificaciones de obra cuyo destinatario sea una Administración Pública.\n- `15`: Factura con IGIC pendiente de devengo en operaciones de tracto sucesivo.\n- `17`: Régimen especial de comerciante minorista.\n- `18`: Régimen especial del pequeño empresario o profesional.\n- `19`: Operaciones interiores exentas por aplicación artículo 25 Ley 19/1994.\n","enum":["01","02","03","04","05","06","07","08","09","10","11","14","15","17","18","19"],"uniqueKey":"invoices.items.[INDEX].tax_breakdown.items.[INDEX].oneOf.0.igic_tax_regime_key","typeLabel":"enum\u003cstring>"},"ipsi_tax_regime_key":{"type":"string","description":"Clave del régimen de IPSI aplicable a una operación sujeta a este impuesto. Es obligatoria para las nuevas peticiones con `tax_type_key: \"02\"` desde esta actualización. No se deben incluir `vat_tax_regime_key` ni `igic_tax_regime_key` en esas peticiones; las claves de régimen IPSI tampoco son compatibles con otros tipos impositivos. Los valores admitidos son:\n\n- `01`: Régimen general.\n- `08`: Operaciones sujetas al IGIC / IVA.\n- `11`: Arrendamiento de local de negocio.\n- `18`: Operaciones a que se refiere el artículo 73, apartados 4 y 5, de la Ordenanza fiscal del IPSI (solo aplicable en Ceuta).\n- `19`: Operaciones interiores exentas.\n- `20`: Régimen de estimación objetiva.\n","enum":["01","08","11","18","19","20"],"uniqueKey":"invoices.items.[INDEX].tax_breakdown.items.[INDEX].oneOf.0.ipsi_tax_regime_key","typeLabel":"enum\u003cstring>"},"exemption_cause_key":{"type":"string","description":"Causa de la exención. Los valores posibles son:\n\n- `E1`: Exenta por el artículo 20.\n- `E2`: Exenta por el artículo 21.\n- `E3`: Exenta por el artículo 22.\n- `E4`: Exenta por los artículos 23 y 24.\n- `E5`: Exenta por el artículo 25.\n- `E6`: Exenta por otros.\n","enum":["E1","E2","E3","E4","E5","E6"],"uniqueKey":"invoices.items.[INDEX].tax_breakdown.items.[INDEX].oneOf.0.exemption_cause_key","typeLabel":"enum\u003cstring>"},"tax_base_at_cost":{"type":"number","format":"decimal","description":"Magnitud dineraria sobre la que se aplica el tipo impositivo en **régimen especial de grupos nivel avanzado**.\nValor con 12 dígitos en la parte entera y 2 decimales. Ejemplo: `100.00`.\n","uniqueKey":"invoices.items.[INDEX].tax_breakdown.items.[INDEX].oneOf.0.tax_base_at_cost","typeLabel":"number\u003cdecimal>"},"tax_rate":{"type":"number","format":"decimal","description":"Porcentaje aplicado sobre la base imponible para calcular la cuota.\nValor con 3 dígitos en la parte entera y 2 decimales. Ejemplo: `21.00`.\n","example":21,"uniqueKey":"invoices.items.[INDEX].tax_breakdown.items.[INDEX].oneOf.0.tax_rate","typeLabel":"number\u003cdecimal>"},"tax_quota":{"type":"number","format":"decimal","description":"Cuota resultante de aplicar a la base imponible el tipo impositivo.\nValor con 12 dígitos en la parte entera y 2 decimales. Ejemplo: `42.00`.\n","example":42,"uniqueKey":"invoices.items.[INDEX].tax_breakdown.items.[INDEX].oneOf.0.tax_quota","typeLabel":"number\u003cdecimal>"},"equalization_tax_rate":{"type":"number","format":"decimal","description":"Tipo de recargo de equivalencia asociado en función del impuesto y tipo impositivo.\nValor con 3 dígitos en la parte entera y 2 decimales. Ejemplo: `5.20`.\n","example":5.2,"uniqueKey":"invoices.items.[INDEX].tax_breakdown.items.[INDEX].oneOf.0.equalization_tax_rate","typeLabel":"number\u003cdecimal>"},"equalization_tax_quota":{"type":"number","format":"decimal","description":"Cuota de resultante de aplicar a la base imponible el tipo de recargo de equivalencia.\nValor con 12 dígitos en la parte entera y 2 decimales. Ejemplo: `10.40`.\n","example":10.4,"uniqueKey":"invoices.items.[INDEX].tax_breakdown.items.[INDEX].oneOf.0.equalization_tax_quota","typeLabel":"number\u003cdecimal>"}},"uniqueKey":"invoices.items.[INDEX].tax_breakdown.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","required":["operation_type_key","tax_base","tax_type_key","ipsi_tax_regime_key"],"properties":{"tax_type_key":{"type":"string","description":"Impuesto de aplicación. Los valores posibles son:\n\n- `01`: Impuesto sobre el Valor Añadido (IVA).\n- `02`: Impuesto sobre la Producción, los Servicios y la Importación (IPSI) de Ceuta y Melilla.\n- `03`: Impuesto General Indirecto Canario (IGIC).\n- `05`: Otros.\n\nEn las peticiones, `vat_tax_regime_key` solo corresponde a `01`, `ipsi_tax_regime_key` a `02` y `igic_tax_regime_key` a `03`. Para `05` no se informa una clave de régimen. Estas opciones documentan los tipos admitidos por la API; no representan cobertura completa de todos los impuestos o regímenes IPSI.\n","enum":["02"],"isRequired":true,"uniqueKey":"invoices.items.[INDEX].tax_breakdown.items.[INDEX].oneOf.1.tax_type_key","typeLabel":"enum\u003cstring>"},"ipsi_tax_regime_key":{"type":"string","description":"Clave del régimen de IPSI aplicable a una operación sujeta a este impuesto. Es obligatoria para las nuevas peticiones con `tax_type_key: \"02\"` desde esta actualización. No se deben incluir `vat_tax_regime_key` ni `igic_tax_regime_key` en esas peticiones; las claves de régimen IPSI tampoco son compatibles con otros tipos impositivos. Los valores admitidos son:\n\n- `01`: Régimen general.\n- `08`: Operaciones sujetas al IGIC / IVA.\n- `11`: Arrendamiento de local de negocio.\n- `18`: Operaciones a que se refiere el artículo 73, apartados 4 y 5, de la Ordenanza fiscal del IPSI (solo aplicable en Ceuta).\n- `19`: Operaciones interiores exentas.\n- `20`: Régimen de estimación objetiva.\n","enum":["01","08","11","18","19","20"],"isRequired":true,"uniqueKey":"invoices.items.[INDEX].tax_breakdown.items.[INDEX].oneOf.1.ipsi_tax_regime_key","typeLabel":"enum\u003cstring>"},"operation_type_key":{"type":"string","description":"Código que identifica el tipo de operación según su sujeción o exención tributaria. Los valores posibles son:\n\n- `S1`: Operación Sujeta y No exenta - Sin inversión del sujeto pasivo.\n- `S2`: Operación Sujeta y No exenta - Con Inversión del sujeto pasivo.\n- `N1`: Operación No Sujeta artículo 7, 14, otros.\n- `N2`: Operación No Sujeta por Reglas de localización.\n","enum":["S1","S2","N1","N2"],"isRequired":true,"uniqueKey":"invoices.items.[INDEX].tax_breakdown.items.[INDEX].oneOf.1.operation_type_key","typeLabel":"enum\u003cstring>"},"tax_base":{"type":"number","format":"decimal","description":"Magnitud dineraria sobre la que se aplica el tipo impositivo/importe no sujeto.\nValor con 12 dígitos en la parte entera y 2 decimales. Ejemplo: `200.00`.\n","example":200,"isRequired":true,"uniqueKey":"invoices.items.[INDEX].tax_breakdown.items.[INDEX].oneOf.1.tax_base","typeLabel":"number\u003cdecimal>"},"vat_tax_regime_key":{"type":"string","description":"Clave que identificará el tipo de régimen del impuesto o una operación con trascendencia tributaria en el contexto del IVA. Este campo no debe incluirse si se está incluyendo `igic_tax_regime_key` o `tax_type_key` tiene un valor diferente de `01`. Los valores posibles son:\n\n- `01`: Operación de régimen general.\n- `02`: Exportación.\n- `03`: Operaciones a las que se aplique el régimen especial de bienes usados, objetos de arte, antigüedades y objetos de colección.\n- `04`: Régimen especial del oro de inversión.\n- `05`: Régimen especial de las agencias de viajes.\n- `06`: Régimen especial grupo de entidades en IVA (Nivel Avanzado).\n- `07`: Régimen especial del criterio de caja.\n- `08`: Operaciones sujetas al IPSI / IGIC (Impuesto sobre la Producción, los Servicios y la Importación / Impuesto General Indirecto Canario).\n- `09`: Facturación de las prestaciones de servicios de agencias de viaje que actúan como mediadoras en nombre y por cuenta ajena (D.A.4ª RD1619/2012).\n- `10`: Cobros por cuenta de terceros de honorarios profesionales o de derechos derivados de la propiedad industrial, de autor u otros por cuenta de sus socios, asociados o colegiados efectuados por sociedades, asociaciones, colegios profesionales u otras entidades que realicen estas funciones de cobro.\n- `11`: Operaciones de arrendamiento de local de negocio.\n- `14`: Factura con IVA pendiente de devengo en certificaciones de obra cuyo destinatario sea una Administración Pública.\n- `15`: Factura con IVA pendiente de devengo en operaciones de tracto sucesivo.\n- `17`: Operación acogida a alguno de los regímenes previstos en el Capítulo XI del Título IX (OSS e IOSS).\n- `18`: Recargo de equivalencia.\n- `19`: Operaciones de actividades incluidas en el Régimen Especial de Agricultura, Ganadería y Pesca (REAGYP).\n- `20`: Régimen simplificado.\n","enum":["01","02","03","04","05","06","07","08","09","10","11","14","15","17","18","19","20"],"uniqueKey":"invoices.items.[INDEX].tax_breakdown.items.[INDEX].oneOf.1.vat_tax_regime_key","typeLabel":"enum\u003cstring>"},"igic_tax_regime_key":{"type":"string","description":"Clave que identificará el tipo de régimen del impuesto o una operación con trascendencia tributaria en el contexto del IGIC. Este campo no debe incluirse se se está incluyendo `vat_tax_regime_key`. Los valores posibles son:\n\n- `01`: Operación de régimen general.\n- `02`: Exportación.\n- `03`: Operaciones a las que se aplique el régimen especial de bienes usados, objetos de arte, antigüedades y objetos de colección.\n- `04`: Régimen especial del oro de inversión.\n- `05`: Régimen especial de las agencias de viajes.\n- `06`: Régimen especial grupo de entidades en IGIC (Nivel Avanzado).\n- `07`: Régimen especial del criterio de caja.\n- `08`: Operaciones sujetas al IPSI / IVA (Impuesto sobre la Producción, los Servicios y la Importación / Impuesto sobre el Valor Añadido).\n- `09`: Facturación de las prestaciones de servicios de agencias de viaje que actúan como mediadoras en nombre y por cuenta ajena (D.A.4ª RD1619/2012).\n- `10`: Cobros por cuenta de terceros de honorarios profesionales o de derechos derivados de la propiedad industrial, de autor u otros por cuenta de sus socios, asociados o colegiados efectuados por sociedades, asociaciones, colegios profesionales u otras entidades que realicen estas funciones de cobro.\n- `11`: Operaciones de arrendamiento de local de negocio.\n- `14`: Factura con IGIC pendiente de devengo en certificaciones de obra cuyo destinatario sea una Administración Pública.\n- `15`: Factura con IGIC pendiente de devengo en operaciones de tracto sucesivo.\n- `17`: Régimen especial de comerciante minorista.\n- `18`: Régimen especial del pequeño empresario o profesional.\n- `19`: Operaciones interiores exentas por aplicación artículo 25 Ley 19/1994.\n","enum":["01","02","03","04","05","06","07","08","09","10","11","14","15","17","18","19"],"uniqueKey":"invoices.items.[INDEX].tax_breakdown.items.[INDEX].oneOf.1.igic_tax_regime_key","typeLabel":"enum\u003cstring>"},"exemption_cause_key":{"type":"string","description":"Causa de la exención. Los valores posibles son:\n\n- `E1`: Exenta por el artículo 20.\n- `E2`: Exenta por el artículo 21.\n- `E3`: Exenta por el artículo 22.\n- `E4`: Exenta por los artículos 23 y 24.\n- `E5`: Exenta por el artículo 25.\n- `E6`: Exenta por otros.\n","enum":["E1","E2","E3","E4","E5","E6"],"uniqueKey":"invoices.items.[INDEX].tax_breakdown.items.[INDEX].oneOf.1.exemption_cause_key","typeLabel":"enum\u003cstring>"},"tax_base_at_cost":{"type":"number","format":"decimal","description":"Magnitud dineraria sobre la que se aplica el tipo impositivo en **régimen especial de grupos nivel avanzado**.\nValor con 12 dígitos en la parte entera y 2 decimales. Ejemplo: `100.00`.\n","uniqueKey":"invoices.items.[INDEX].tax_breakdown.items.[INDEX].oneOf.1.tax_base_at_cost","typeLabel":"number\u003cdecimal>"},"tax_rate":{"type":"number","format":"decimal","description":"Porcentaje aplicado sobre la base imponible para calcular la cuota.\nValor con 3 dígitos en la parte entera y 2 decimales. Ejemplo: `21.00`.\n","example":21,"uniqueKey":"invoices.items.[INDEX].tax_breakdown.items.[INDEX].oneOf.1.tax_rate","typeLabel":"number\u003cdecimal>"},"tax_quota":{"type":"number","format":"decimal","description":"Cuota resultante de aplicar a la base imponible el tipo impositivo.\nValor con 12 dígitos en la parte entera y 2 decimales. Ejemplo: `42.00`.\n","example":42,"uniqueKey":"invoices.items.[INDEX].tax_breakdown.items.[INDEX].oneOf.1.tax_quota","typeLabel":"number\u003cdecimal>"},"equalization_tax_rate":{"type":"number","format":"decimal","description":"Tipo de recargo de equivalencia asociado en función del impuesto y tipo impositivo.\nValor con 3 dígitos en la parte entera y 2 decimales. Ejemplo: `5.20`.\n","example":5.2,"uniqueKey":"invoices.items.[INDEX].tax_breakdown.items.[INDEX].oneOf.1.equalization_tax_rate","typeLabel":"number\u003cdecimal>"},"equalization_tax_quota":{"type":"number","format":"decimal","description":"Cuota de resultante de aplicar a la base imponible el tipo de recargo de equivalencia.\nValor con 12 dígitos en la parte entera y 2 decimales. Ejemplo: `10.40`.\n","example":10.4,"uniqueKey":"invoices.items.[INDEX].tax_breakdown.items.[INDEX].oneOf.1.equalization_tax_quota","typeLabel":"number\u003cdecimal>"}},"uniqueKey":"invoices.items.[INDEX].tax_breakdown.items.[INDEX].oneOf.1","typeLabel":"object"},{"type":"object","required":["operation_type_key","tax_base","tax_type_key","igic_tax_regime_key"],"properties":{"tax_type_key":{"type":"string","description":"Impuesto de aplicación. Los valores posibles son:\n\n- `01`: Impuesto sobre el Valor Añadido (IVA).\n- `02`: Impuesto sobre la Producción, los Servicios y la Importación (IPSI) de Ceuta y Melilla.\n- `03`: Impuesto General Indirecto Canario (IGIC).\n- `05`: Otros.\n\nEn las peticiones, `vat_tax_regime_key` solo corresponde a `01`, `ipsi_tax_regime_key` a `02` y `igic_tax_regime_key` a `03`. Para `05` no se informa una clave de régimen. Estas opciones documentan los tipos admitidos por la API; no representan cobertura completa de todos los impuestos o regímenes IPSI.\n","enum":["03"],"isRequired":true,"uniqueKey":"invoices.items.[INDEX].tax_breakdown.items.[INDEX].oneOf.2.tax_type_key","typeLabel":"enum\u003cstring>"},"igic_tax_regime_key":{"type":"string","description":"Clave que identificará el tipo de régimen del impuesto o una operación con trascendencia tributaria en el contexto del IGIC. Este campo no debe incluirse se se está incluyendo `vat_tax_regime_key`. Los valores posibles son:\n\n- `01`: Operación de régimen general.\n- `02`: Exportación.\n- `03`: Operaciones a las que se aplique el régimen especial de bienes usados, objetos de arte, antigüedades y objetos de colección.\n- `04`: Régimen especial del oro de inversión.\n- `05`: Régimen especial de las agencias de viajes.\n- `06`: Régimen especial grupo de entidades en IGIC (Nivel Avanzado).\n- `07`: Régimen especial del criterio de caja.\n- `08`: Operaciones sujetas al IPSI / IVA (Impuesto sobre la Producción, los Servicios y la Importación / Impuesto sobre el Valor Añadido).\n- `09`: Facturación de las prestaciones de servicios de agencias de viaje que actúan como mediadoras en nombre y por cuenta ajena (D.A.4ª RD1619/2012).\n- `10`: Cobros por cuenta de terceros de honorarios profesionales o de derechos derivados de la propiedad industrial, de autor u otros por cuenta de sus socios, asociados o colegiados efectuados por sociedades, asociaciones, colegios profesionales u otras entidades que realicen estas funciones de cobro.\n- `11`: Operaciones de arrendamiento de local de negocio.\n- `14`: Factura con IGIC pendiente de devengo en certificaciones de obra cuyo destinatario sea una Administración Pública.\n- `15`: Factura con IGIC pendiente de devengo en operaciones de tracto sucesivo.\n- `17`: Régimen especial de comerciante minorista.\n- `18`: Régimen especial del pequeño empresario o profesional.\n- `19`: Operaciones interiores exentas por aplicación artículo 25 Ley 19/1994.\n","enum":["01","02","03","04","05","06","07","08","09","10","11","14","15","17","18","19"],"isRequired":true,"uniqueKey":"invoices.items.[INDEX].tax_breakdown.items.[INDEX].oneOf.2.igic_tax_regime_key","typeLabel":"enum\u003cstring>"},"operation_type_key":{"type":"string","description":"Código que identifica el tipo de operación según su sujeción o exención tributaria. Los valores posibles son:\n\n- `S1`: Operación Sujeta y No exenta - Sin inversión del sujeto pasivo.\n- `S2`: Operación Sujeta y No exenta - Con Inversión del sujeto pasivo.\n- `N1`: Operación No Sujeta artículo 7, 14, otros.\n- `N2`: Operación No Sujeta por Reglas de localización.\n","enum":["S1","S2","N1","N2"],"isRequired":true,"uniqueKey":"invoices.items.[INDEX].tax_breakdown.items.[INDEX].oneOf.2.operation_type_key","typeLabel":"enum\u003cstring>"},"tax_base":{"type":"number","format":"decimal","description":"Magnitud dineraria sobre la que se aplica el tipo impositivo/importe no sujeto.\nValor con 12 dígitos en la parte entera y 2 decimales. Ejemplo: `200.00`.\n","example":200,"isRequired":true,"uniqueKey":"invoices.items.[INDEX].tax_breakdown.items.[INDEX].oneOf.2.tax_base","typeLabel":"number\u003cdecimal>"},"vat_tax_regime_key":{"type":"string","description":"Clave que identificará el tipo de régimen del impuesto o una operación con trascendencia tributaria en el contexto del IVA. Este campo no debe incluirse si se está incluyendo `igic_tax_regime_key` o `tax_type_key` tiene un valor diferente de `01`. Los valores posibles son:\n\n- `01`: Operación de régimen general.\n- `02`: Exportación.\n- `03`: Operaciones a las que se aplique el régimen especial de bienes usados, objetos de arte, antigüedades y objetos de colección.\n- `04`: Régimen especial del oro de inversión.\n- `05`: Régimen especial de las agencias de viajes.\n- `06`: Régimen especial grupo de entidades en IVA (Nivel Avanzado).\n- `07`: Régimen especial del criterio de caja.\n- `08`: Operaciones sujetas al IPSI / IGIC (Impuesto sobre la Producción, los Servicios y la Importación / Impuesto General Indirecto Canario).\n- `09`: Facturación de las prestaciones de servicios de agencias de viaje que actúan como mediadoras en nombre y por cuenta ajena (D.A.4ª RD1619/2012).\n- `10`: Cobros por cuenta de terceros de honorarios profesionales o de derechos derivados de la propiedad industrial, de autor u otros por cuenta de sus socios, asociados o colegiados efectuados por sociedades, asociaciones, colegios profesionales u otras entidades que realicen estas funciones de cobro.\n- `11`: Operaciones de arrendamiento de local de negocio.\n- `14`: Factura con IVA pendiente de devengo en certificaciones de obra cuyo destinatario sea una Administración Pública.\n- `15`: Factura con IVA pendiente de devengo en operaciones de tracto sucesivo.\n- `17`: Operación acogida a alguno de los regímenes previstos en el Capítulo XI del Título IX (OSS e IOSS).\n- `18`: Recargo de equivalencia.\n- `19`: Operaciones de actividades incluidas en el Régimen Especial de Agricultura, Ganadería y Pesca (REAGYP).\n- `20`: Régimen simplificado.\n","enum":["01","02","03","04","05","06","07","08","09","10","11","14","15","17","18","19","20"],"uniqueKey":"invoices.items.[INDEX].tax_breakdown.items.[INDEX].oneOf.2.vat_tax_regime_key","typeLabel":"enum\u003cstring>"},"ipsi_tax_regime_key":{"type":"string","description":"Clave del régimen de IPSI aplicable a una operación sujeta a este impuesto. Es obligatoria para las nuevas peticiones con `tax_type_key: \"02\"` desde esta actualización. No se deben incluir `vat_tax_regime_key` ni `igic_tax_regime_key` en esas peticiones; las claves de régimen IPSI tampoco son compatibles con otros tipos impositivos. Los valores admitidos son:\n\n- `01`: Régimen general.\n- `08`: Operaciones sujetas al IGIC / IVA.\n- `11`: Arrendamiento de local de negocio.\n- `18`: Operaciones a que se refiere el artículo 73, apartados 4 y 5, de la Ordenanza fiscal del IPSI (solo aplicable en Ceuta).\n- `19`: Operaciones interiores exentas.\n- `20`: Régimen de estimación objetiva.\n","enum":["01","08","11","18","19","20"],"uniqueKey":"invoices.items.[INDEX].tax_breakdown.items.[INDEX].oneOf.2.ipsi_tax_regime_key","typeLabel":"enum\u003cstring>"},"exemption_cause_key":{"type":"string","description":"Causa de la exención. Los valores posibles son:\n\n- `E1`: Exenta por el artículo 20.\n- `E2`: Exenta por el artículo 21.\n- `E3`: Exenta por el artículo 22.\n- `E4`: Exenta por los artículos 23 y 24.\n- `E5`: Exenta por el artículo 25.\n- `E6`: Exenta por otros.\n","enum":["E1","E2","E3","E4","E5","E6"],"uniqueKey":"invoices.items.[INDEX].tax_breakdown.items.[INDEX].oneOf.2.exemption_cause_key","typeLabel":"enum\u003cstring>"},"tax_base_at_cost":{"type":"number","format":"decimal","description":"Magnitud dineraria sobre la que se aplica el tipo impositivo en **régimen especial de grupos nivel avanzado**.\nValor con 12 dígitos en la parte entera y 2 decimales. Ejemplo: `100.00`.\n","uniqueKey":"invoices.items.[INDEX].tax_breakdown.items.[INDEX].oneOf.2.tax_base_at_cost","typeLabel":"number\u003cdecimal>"},"tax_rate":{"type":"number","format":"decimal","description":"Porcentaje aplicado sobre la base imponible para calcular la cuota.\nValor con 3 dígitos en la parte entera y 2 decimales. Ejemplo: `21.00`.\n","example":21,"uniqueKey":"invoices.items.[INDEX].tax_breakdown.items.[INDEX].oneOf.2.tax_rate","typeLabel":"number\u003cdecimal>"},"tax_quota":{"type":"number","format":"decimal","description":"Cuota resultante de aplicar a la base imponible el tipo impositivo.\nValor con 12 dígitos en la parte entera y 2 decimales. Ejemplo: `42.00`.\n","example":42,"uniqueKey":"invoices.items.[INDEX].tax_breakdown.items.[INDEX].oneOf.2.tax_quota","typeLabel":"number\u003cdecimal>"},"equalization_tax_rate":{"type":"number","format":"decimal","description":"Tipo de recargo de equivalencia asociado en función del impuesto y tipo impositivo.\nValor con 3 dígitos en la parte entera y 2 decimales. Ejemplo: `5.20`.\n","example":5.2,"uniqueKey":"invoices.items.[INDEX].tax_breakdown.items.[INDEX].oneOf.2.equalization_tax_rate","typeLabel":"number\u003cdecimal>"},"equalization_tax_quota":{"type":"number","format":"decimal","description":"Cuota de resultante de aplicar a la base imponible el tipo de recargo de equivalencia.\nValor con 12 dígitos en la parte entera y 2 decimales. Ejemplo: `10.40`.\n","example":10.4,"uniqueKey":"invoices.items.[INDEX].tax_breakdown.items.[INDEX].oneOf.2.equalization_tax_quota","typeLabel":"number\u003cdecimal>"}},"uniqueKey":"invoices.items.[INDEX].tax_breakdown.items.[INDEX].oneOf.2","typeLabel":"object"},{"type":"object","required":["operation_type_key","tax_base","tax_type_key"],"properties":{"tax_type_key":{"type":"string","description":"Impuesto de aplicación. Los valores posibles son:\n\n- `01`: Impuesto sobre el Valor Añadido (IVA).\n- `02`: Impuesto sobre la Producción, los Servicios y la Importación (IPSI) de Ceuta y Melilla.\n- `03`: Impuesto General Indirecto Canario (IGIC).\n- `05`: Otros.\n\nEn las peticiones, `vat_tax_regime_key` solo corresponde a `01`, `ipsi_tax_regime_key` a `02` y `igic_tax_regime_key` a `03`. Para `05` no se informa una clave de régimen. Estas opciones documentan los tipos admitidos por la API; no representan cobertura completa de todos los impuestos o regímenes IPSI.\n","enum":["05"],"isRequired":true,"uniqueKey":"invoices.items.[INDEX].tax_breakdown.items.[INDEX].oneOf.3.tax_type_key","typeLabel":"enum\u003cstring>"},"operation_type_key":{"type":"string","description":"Código que identifica el tipo de operación según su sujeción o exención tributaria. Los valores posibles son:\n\n- `S1`: Operación Sujeta y No exenta - Sin inversión del sujeto pasivo.\n- `S2`: Operación Sujeta y No exenta - Con Inversión del sujeto pasivo.\n- `N1`: Operación No Sujeta artículo 7, 14, otros.\n- `N2`: Operación No Sujeta por Reglas de localización.\n","enum":["S1","S2","N1","N2"],"isRequired":true,"uniqueKey":"invoices.items.[INDEX].tax_breakdown.items.[INDEX].oneOf.3.operation_type_key","typeLabel":"enum\u003cstring>"},"tax_base":{"type":"number","format":"decimal","description":"Magnitud dineraria sobre la que se aplica el tipo impositivo/importe no sujeto.\nValor con 12 dígitos en la parte entera y 2 decimales. Ejemplo: `200.00`.\n","example":200,"isRequired":true,"uniqueKey":"invoices.items.[INDEX].tax_breakdown.items.[INDEX].oneOf.3.tax_base","typeLabel":"number\u003cdecimal>"},"vat_tax_regime_key":{"type":"string","description":"Clave que identificará el tipo de régimen del impuesto o una operación con trascendencia tributaria en el contexto del IVA. Este campo no debe incluirse si se está incluyendo `igic_tax_regime_key` o `tax_type_key` tiene un valor diferente de `01`. Los valores posibles son:\n\n- `01`: Operación de régimen general.\n- `02`: Exportación.\n- `03`: Operaciones a las que se aplique el régimen especial de bienes usados, objetos de arte, antigüedades y objetos de colección.\n- `04`: Régimen especial del oro de inversión.\n- `05`: Régimen especial de las agencias de viajes.\n- `06`: Régimen especial grupo de entidades en IVA (Nivel Avanzado).\n- `07`: Régimen especial del criterio de caja.\n- `08`: Operaciones sujetas al IPSI / IGIC (Impuesto sobre la Producción, los Servicios y la Importación / Impuesto General Indirecto Canario).\n- `09`: Facturación de las prestaciones de servicios de agencias de viaje que actúan como mediadoras en nombre y por cuenta ajena (D.A.4ª RD1619/2012).\n- `10`: Cobros por cuenta de terceros de honorarios profesionales o de derechos derivados de la propiedad industrial, de autor u otros por cuenta de sus socios, asociados o colegiados efectuados por sociedades, asociaciones, colegios profesionales u otras entidades que realicen estas funciones de cobro.\n- `11`: Operaciones de arrendamiento de local de negocio.\n- `14`: Factura con IVA pendiente de devengo en certificaciones de obra cuyo destinatario sea una Administración Pública.\n- `15`: Factura con IVA pendiente de devengo en operaciones de tracto sucesivo.\n- `17`: Operación acogida a alguno de los regímenes previstos en el Capítulo XI del Título IX (OSS e IOSS).\n- `18`: Recargo de equivalencia.\n- `19`: Operaciones de actividades incluidas en el Régimen Especial de Agricultura, Ganadería y Pesca (REAGYP).\n- `20`: Régimen simplificado.\n","enum":["01","02","03","04","05","06","07","08","09","10","11","14","15","17","18","19","20"],"uniqueKey":"invoices.items.[INDEX].tax_breakdown.items.[INDEX].oneOf.3.vat_tax_regime_key","typeLabel":"enum\u003cstring>"},"igic_tax_regime_key":{"type":"string","description":"Clave que identificará el tipo de régimen del impuesto o una operación con trascendencia tributaria en el contexto del IGIC. Este campo no debe incluirse se se está incluyendo `vat_tax_regime_key`. Los valores posibles son:\n\n- `01`: Operación de régimen general.\n- `02`: Exportación.\n- `03`: Operaciones a las que se aplique el régimen especial de bienes usados, objetos de arte, antigüedades y objetos de colección.\n- `04`: Régimen especial del oro de inversión.\n- `05`: Régimen especial de las agencias de viajes.\n- `06`: Régimen especial grupo de entidades en IGIC (Nivel Avanzado).\n- `07`: Régimen especial del criterio de caja.\n- `08`: Operaciones sujetas al IPSI / IVA (Impuesto sobre la Producción, los Servicios y la Importación / Impuesto sobre el Valor Añadido).\n- `09`: Facturación de las prestaciones de servicios de agencias de viaje que actúan como mediadoras en nombre y por cuenta ajena (D.A.4ª RD1619/2012).\n- `10`: Cobros por cuenta de terceros de honorarios profesionales o de derechos derivados de la propiedad industrial, de autor u otros por cuenta de sus socios, asociados o colegiados efectuados por sociedades, asociaciones, colegios profesionales u otras entidades que realicen estas funciones de cobro.\n- `11`: Operaciones de arrendamiento de local de negocio.\n- `14`: Factura con IGIC pendiente de devengo en certificaciones de obra cuyo destinatario sea una Administración Pública.\n- `15`: Factura con IGIC pendiente de devengo en operaciones de tracto sucesivo.\n- `17`: Régimen especial de comerciante minorista.\n- `18`: Régimen especial del pequeño empresario o profesional.\n- `19`: Operaciones interiores exentas por aplicación artículo 25 Ley 19/1994.\n","enum":["01","02","03","04","05","06","07","08","09","10","11","14","15","17","18","19"],"uniqueKey":"invoices.items.[INDEX].tax_breakdown.items.[INDEX].oneOf.3.igic_tax_regime_key","typeLabel":"enum\u003cstring>"},"ipsi_tax_regime_key":{"type":"string","description":"Clave del régimen de IPSI aplicable a una operación sujeta a este impuesto. Es obligatoria para las nuevas peticiones con `tax_type_key: \"02\"` desde esta actualización. No se deben incluir `vat_tax_regime_key` ni `igic_tax_regime_key` en esas peticiones; las claves de régimen IPSI tampoco son compatibles con otros tipos impositivos. Los valores admitidos son:\n\n- `01`: Régimen general.\n- `08`: Operaciones sujetas al IGIC / IVA.\n- `11`: Arrendamiento de local de negocio.\n- `18`: Operaciones a que se refiere el artículo 73, apartados 4 y 5, de la Ordenanza fiscal del IPSI (solo aplicable en Ceuta).\n- `19`: Operaciones interiores exentas.\n- `20`: Régimen de estimación objetiva.\n","enum":["01","08","11","18","19","20"],"uniqueKey":"invoices.items.[INDEX].tax_breakdown.items.[INDEX].oneOf.3.ipsi_tax_regime_key","typeLabel":"enum\u003cstring>"},"exemption_cause_key":{"type":"string","description":"Causa de la exención. Los valores posibles son:\n\n- `E1`: Exenta por el artículo 20.\n- `E2`: Exenta por el artículo 21.\n- `E3`: Exenta por el artículo 22.\n- `E4`: Exenta por los artículos 23 y 24.\n- `E5`: Exenta por el artículo 25.\n- `E6`: Exenta por otros.\n","enum":["E1","E2","E3","E4","E5","E6"],"uniqueKey":"invoices.items.[INDEX].tax_breakdown.items.[INDEX].oneOf.3.exemption_cause_key","typeLabel":"enum\u003cstring>"},"tax_base_at_cost":{"type":"number","format":"decimal","description":"Magnitud dineraria sobre la que se aplica el tipo impositivo en **régimen especial de grupos nivel avanzado**.\nValor con 12 dígitos en la parte entera y 2 decimales. Ejemplo: `100.00`.\n","uniqueKey":"invoices.items.[INDEX].tax_breakdown.items.[INDEX].oneOf.3.tax_base_at_cost","typeLabel":"number\u003cdecimal>"},"tax_rate":{"type":"number","format":"decimal","description":"Porcentaje aplicado sobre la base imponible para calcular la cuota.\nValor con 3 dígitos en la parte entera y 2 decimales. Ejemplo: `21.00`.\n","example":21,"uniqueKey":"invoices.items.[INDEX].tax_breakdown.items.[INDEX].oneOf.3.tax_rate","typeLabel":"number\u003cdecimal>"},"tax_quota":{"type":"number","format":"decimal","description":"Cuota resultante de aplicar a la base imponible el tipo impositivo.\nValor con 12 dígitos en la parte entera y 2 decimales. Ejemplo: `42.00`.\n","example":42,"uniqueKey":"invoices.items.[INDEX].tax_breakdown.items.[INDEX].oneOf.3.tax_quota","typeLabel":"number\u003cdecimal>"},"equalization_tax_rate":{"type":"number","format":"decimal","description":"Tipo de recargo de equivalencia asociado en función del impuesto y tipo impositivo.\nValor con 3 dígitos en la parte entera y 2 decimales. Ejemplo: `5.20`.\n","example":5.2,"uniqueKey":"invoices.items.[INDEX].tax_breakdown.items.[INDEX].oneOf.3.equalization_tax_rate","typeLabel":"number\u003cdecimal>"},"equalization_tax_quota":{"type":"number","format":"decimal","description":"Cuota de resultante de aplicar a la base imponible el tipo de recargo de equivalencia.\nValor con 12 dígitos en la parte entera y 2 decimales. Ejemplo: `10.40`.\n","example":10.4,"uniqueKey":"invoices.items.[INDEX].tax_breakdown.items.[INDEX].oneOf.3.equalization_tax_quota","typeLabel":"number\u003cdecimal>"}},"uniqueKey":"invoices.items.[INDEX].tax_breakdown.items.[INDEX].oneOf.3","typeLabel":"object"}],"uniqueKey":"invoices.items.[INDEX].tax_breakdown.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"invoices.items.[INDEX].tax_breakdown","typeLabel":"object[]"},"total_quota":{"type":"number","format":"decimal","description":"Importe total de la cuota (sumatorio de la cuota repercutida y cuota de recargo de equivalencia) de la factura.\nValor con 12 dígitos en la parte entera y 2 decimales. Ejemplo: `33.57`.\nSe compara con la suma de las cuotas y recargos del desglose, incluso cuando el resultado es cero. Una diferencia absoluta superior a 10,00 € devuelve HTTP 422 con `incorrect_total_quota` (en lotes, `invoices.N.incorrect_total_quota`).\nEsta comprobación se aplica a los envíos inmediatos, diferidos y por lotes, tanto con `tax_breakdown` como con su alias `lines`. Una diferencia de exactamente 10,00 € está dentro de la tolerancia.\nExcepciones por régimen: si existe al menos una línea válida de IVA (`tax_type_key: \"01\"`) con `vat_tax_regime_key` igual a `03`, `05`, `06`, `08` o `09`, de IGIC (`\"03\"`) con uno de esos valores en `igic_tax_regime_key`, o de IPSI (`\"02\"`) con `ipsi_tax_regime_key: \"08\"`, se omiten las comparaciones globales de `total_amount` y `total_quota` para toda esa factura.\nEn facturas mixtas basta una línea con uno de esos regímenes, independientemente de su posición. Es un criterio conservador de KubiFACTU para evitar falsos rechazos: no se comprueba la coherencia de ambas sumas globales ni se compara solo el subtotal de las líneas ordinarias. La documentación consultada de la AEAT no concreta este criterio para mezclas.\nLa excepción no elimina la obligatoriedad ni la validación del formato de los totales, del desglose o de los regímenes. El impuesto `05` (Otros) no es el régimen `05` y no activa la excepción. Cada factura de un lote se evalúa por separado.\n","isRequired":true,"uniqueKey":"invoices.items.[INDEX].total_quota","typeLabel":"number\u003cdecimal>"},"total_amount":{"type":"number","format":"decimal","description":"Importe total de la factura. Con carácter general se compara con Ʃ(`tax_base` + `tax_quota` + `equalization_tax_quota`) de todas las entradas de `tax_breakdown`, salvo las excepciones por régimen indicadas a continuación.\nValor con 12 dígitos en la parte entera y 2 decimales. Ejemplo: `2450.75`.\nSe compara con la suma del desglose, incluso cuando el resultado es cero. Una diferencia absoluta superior a 10,00 € devuelve HTTP 422 con `incorrect_total_amount` (en lotes, `invoices.N.incorrect_total_amount`).\nEsta comprobación se aplica a los envíos inmediatos, diferidos y por lotes, tanto con `tax_breakdown` como con su alias `lines`. Una diferencia de exactamente 10,00 € está dentro de la tolerancia.\nExcepciones por régimen: si existe al menos una línea válida de IVA (`tax_type_key: \"01\"`) con `vat_tax_regime_key` igual a `03`, `05`, `06`, `08` o `09`, de IGIC (`\"03\"`) con uno de esos valores en `igic_tax_regime_key`, o de IPSI (`\"02\"`) con `ipsi_tax_regime_key: \"08\"`, se omiten las comparaciones globales de `total_amount` y `total_quota` para toda esa factura.\nEn facturas mixtas basta una línea con uno de esos regímenes, independientemente de su posición. Es un criterio conservador de KubiFACTU para evitar falsos rechazos: no se comprueba la coherencia de ambas sumas globales ni se compara solo el subtotal de las líneas ordinarias. La documentación consultada de la AEAT no concreta este criterio para mezclas.\nLa excepción no elimina la obligatoriedad ni la validación del formato de los totales, del desglose o de los regímenes. El impuesto `05` (Otros) no es el régimen `05` y no activa la excepción. Cada factura de un lote se evalúa por separado.\nEjemplo ilustrativo de bienes usados (IVA, régimen `03`): compra de 1.000 €, venta de 1.242 €, base de 200 € y cuota de 42 €. Se declara `total_amount: 1242.00` y `total_quota: 42.00`; la diferencia entre precio total y suma del desglose (242 €) no genera este 422.\nReferencia: [Validaciones y errores de la AEAT, versión 1.2.2 de 08/04/2026, apartados 3.1.3.15.6, 3.1.3.16 y 3.1.3.17](https://www.agenciatributaria.es/static_files/AEAT_Desarrolladores/EEDD/IVA/VERI-FACTU/Validaciones_Errores_Veri-Factu.pdf#page=15).\n","isRequired":true,"uniqueKey":"invoices.items.[INDEX].total_amount","typeLabel":"number\u003cdecimal>"},"client_invoice_id":{"type":"string","maxLength":50,"description":"Identificador único de la factura **dentro del sistema del cliente**.\n","example":"96f2044008d7iujfd78jspo4","uniqueKey":"invoices.items.[INDEX].client_invoice_id","typeLabel":"string"},"callback_url":{"type":"string","format":"url","description":"URL a la que KubiFACTU llama con el resultado de la AEAT cuando procesa el registro de facturación: el envío de un [registro de facturación en diferido](/basic-concepts#registros-de-facturación-diferidos), un [reenvío](/openapi-reference/reenviar-registro-de-facturación) o una [consulta](/openapi-reference/consultar-registro-de-facturación-con-veri*factu). No se llama por el resultado que ya devuelve la respuesta de un envío inmediato.\n\nUn mismo registro puede generar varios callbacks. Correlaciona cada elemento por `id` y procésalo de forma idempotente.\n\nLos reintentos automáticos también llaman a esta URL, incluidos los de un envío inmediato que falló: cada nuevo `retry`, el paso a `attention` y el final de la recuperación (`resolved`). Por eso `callback_url` también sirve en los envíos inmediatos.\n\nSe hará una petición POST a esta URL y se enviarán un array en formato JSON con los datos de las facturas procesadas cuyos ítems contendrán los siguientes campos:\n\n- `id`: `string`. Identificador de KubiFACTU para el registro de facturación.\n- `client_invoice_id`: `string|null`. Identificador del cliente para el registro de facturación.\n- `record_type`: `string (creation|cancellation)`. Tipo de registro de facturación.\n- `sif_id`: `string`. ID del SIF utilizado para la creación del registro.\n- `sender_company_name`: `string`. Nombre de la empresa emisora.\n- `sender_tax_id_number`: `string`. CIF/NIF de la empresa emisora.\n- `fiscal_year`: `integer`. Año fiscal del registro de facturación.\n- `full_invoice_number`: `string`. Número de factura.\n- `fingerprint`: `string|null`. Huella del registro de facturación.\n- `csv`: `string|null`. Código Seguro de Verificación (CSV) de la remisión que contiene el registro. Puede ser `null` aunque el registro esté aceptado: para saber si está acreditado, usa `vf_record_registration_status`, no la presencia del `csv`. [Leer más en la FAQ](/faq).\n- `vf_post_status`: `string|null`. Ver valores posibles en la documentación del campo `vf_post_status` de la respuesta de envío de registros de facturación.\n- `vf_record_registration_status`: `string|null`. Ver valores posibles en la documentación del campo `vf_record_registration_status` de la respuesta de envío de registros de facturación.\n- `has_warnings`: `bool`. Indica si el registro contiene errores que deban ser subsanados.\n- `vf_error_descriptions`: `string|null`. Cadena con la descripción de los errores devueltos por Veri*Factu.\n- `vf_response_body`: `string|null`. Cuerpo de la respuesta de Veri*Factu en formato Base64. Contiene el XML completo devuelto por la AEAT tras el envío del registro de facturación.\n- `xml_url`: `string|null`. URL para descargar el XML del registro de facturación enviado a Veri*Factu mediante el endpoint [Descargar XML del registro de facturación](/openapi-reference/descargar-xml-del-registro-de-facturación). Será `null` si el XML aún no está disponible.\n- `qr_value`: `string|null`. URL del código QR para validación de la factura en Veri*Factu. Será `null` si el registro fue rechazado o no aplica mostrar QR.\n- `qr_image_url`: `string|null`. URL para descargar la imagen PNG del código QR generado por KubiFACTU mediante el endpoint [Descargar imagen QR del registro de facturación](/openapi-reference/descargar-imagen-qr-del-registro-de-facturación). Será `null` si el registro fue rechazado o no aplica mostrar QR.\n- `recovery`: `object` o `null`. Siempre presente. Vale `null` si la recuperación automática no sigue el registro; en ese caso puedes ignorarlo. Mismo formato que el campo `recovery` de la respuesta de envío de registros de facturación.\n","example":"https://www.tuempresa.com/kubifactu/callback","uniqueKey":"invoices.items.[INDEX].callback_url","typeLabel":"string\u003curl>"},"recipients":{"type":"array","description":"Información de los receptores de la factura. Obligatorio para facturas ordinarias.","items":{"type":"object","required":["company_name"],"properties":{"company_name":{"type":"string","description":"Nombre de la empresa receptora.","isRequired":true,"uniqueKey":"invoices.items.[INDEX].recipients.items.[INDEX].company_name","typeLabel":"string"},"tax_id_number":{"type":"string","description":"NIF/CIF de la empresa receptora. Este campo es obligatorio si el receptor es nacional y se identifica mediante CIF/NIF.\n","uniqueKey":"invoices.items.[INDEX].recipients.items.[INDEX].tax_id_number","typeLabel":"string"},"other_country_code":{"type":"string","description":"Código del país en formato [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-2). Sólo es necesario rellenarlo **si el sujeto no es nacional**. El código de país debe ser `ES` si `other_tax_id_type_key` es `07 (no censado)`. Ejemplo: `DE`\n","uniqueKey":"invoices.items.[INDEX].recipients.items.[INDEX].other_country_code","typeLabel":"string"},"other_tax_id_type_key":{"type":"string","description":"Clave para identificar el tipo de documento. Los valores posibles son:\n\n- `02`: **NIF-IVA**: Número de Identificación Fiscal para IVA.\n- `03`: **Pasaporte**: Documento oficial que acredita la identidad y nacionalidad del portador.\n- `04`: **Documento oficial de identificación expedido por el país o territorio de residencia**.\n- `05`: **Certificado de residencia**: Documento que acredita la residencia fiscal.\n- `06`: **Otro documento probatorio**: Documento adicional que sirve como prueba de identidad.\n- `07`: **No censado**: El receptor no está registrado en el censo fiscal.\n","enum":["02","03","04","05","06","07"],"uniqueKey":"invoices.items.[INDEX].recipients.items.[INDEX].other_tax_id_type_key","typeLabel":"enum\u003cstring>"},"other_tax_id_number":{"type":"string","description":"Número de identificación en el país de residencia del destinatario de la operación de la factura expedida. Ejemplo: `L74JF44L2` para una empresa de `DE`.\n","uniqueKey":"invoices.items.[INDEX].recipients.items.[INDEX].other_tax_id_number","typeLabel":"string"}},"uniqueKey":"invoices.items.[INDEX].recipients.items.[INDEX]","typeLabel":"object"},"uniqueKey":"invoices.items.[INDEX].recipients","typeLabel":"object[]"},"representative_company_name":{"type":"string","description":"Nombre/razón social del representante del obligado tributario.\nA rellenar solo en caso de que el registro de facturación remitido haya sido generado por un representante/asesor del obligado tributario.\n","uniqueKey":"invoices.items.[INDEX].representative_company_name","typeLabel":"string"},"representative_tax_id_number":{"type":"string","description":"NIF del representante del obligado tributario.\nA rellenar solo en caso de que el registro de facturación remitido haya sido generado por un representante/asesor del obligado tributario.\n","uniqueKey":"invoices.items.[INDEX].representative_tax_id_number","typeLabel":"string"},"previous_rejection_key":{"type":"string","description":"Indicador de rechazo previo que, en las subsanaciones, distingue si la factura **ya está registrada en la AEAT** o si se subsana **sin registro previo**.\n\nEn una subsanación se informa `correction_key = S` y se utiliza el valor de `previous_rejection_key` que corresponda a la situación de la factura en la AEAT.\n\nUn rechazo **no debe confundirse con un error técnico en el envío** (timeout, error de red, fallo del servicio, ausencia de respuesta, error SOAP técnico, etc.) que tendrá el campo `vf_post_status = failure`. En esos casos **el registro no se considera rechazado**, y debe **reenviarse exactamente igual**, **sin modificar datos** y **sin informar** `correction_key` ni `previous_rejection_key`. [Ver más información al respecto](/faq#¿qué-debo-hacer-si-no-puedo-enviar-un-registro-porque-veri-factu-tiene-problemas-técnicos-de-conexión).\n\nLos errores SOAP causados por el NIF o el nombre del obligado a emitir o del representante (códigos 4104, 4105, 4107, 4109, 4115, 4116, 4117, 4123 y 4124) **sí son un rechazo**: se guardan con `vf_post_status = success` y `vf_record_registration_status = failed`, porque reenviar los mismos datos no los resuelve. Corrige los datos y subsana con `correction_key = S` y `previous_rejection_key = X`. [Ver más información al respecto](/faq#¿qué-ocurre-si-veri-factu-no-identifica-el-nif-o-el-nombre-del-emisor).\n\n- `X`: El alta inicial fue **rechazada** y la factura **no está registrada en la AEAT**. También corresponde a las operativas especiales de **subsanación sin registro previo**. Solo puede informarse cuando `correction_key = S`; **no significa simplemente que el último envío fue rechazado**.\n- `S`: La factura **ya está registrada en la AEAT**, pero una subsanación posterior fue **rechazada**. Solo puede informarse cuando `correction_key = S`.\n- `N` u omitido: En una subsanación habitual de una factura **ya registrada en la AEAT**, se informa `correction_key = S`. También corresponde a un alta normal/inicial, sin subsanación.\n\nCon `correction_key = S` y `previous_rejection_key = X`, la API busca en KubiFACTU un registro de alta de la misma factura (mismo número y mismo ejercicio o fecha de expedición, en la misma empresa cliente) y devuelve HTTP `422` con el error en `previous_rejection_key` si ese registro:\n\n- Está **registrado en la AEAT** (`vf_record_registration_status` = `success`, `accepted_with_errors` o `cancelled`). La AEAT rechazaría la subsanación como registro duplicado (código 3000), porque con `X` la factura no debe existir previamente en la AEAT. No envíes `X`: para corregir el contenido del registro aceptado, envía la subsanación con `previous_rejection_key = N`.\n- Está **pendiente de envío** a la AEAT. Espera a conocer su resultado, mediante `callback_url` o consultando el registro, antes de decidir cómo subsanarlo.\n\n`X` sigue admitiéndose cuando el alta original fue rechazada (`failed`), no está registrada (`not_registered`) o no existe en KubiFACTU.\n","enum":["X","S","N"],"uniqueKey":"invoices.items.[INDEX].previous_rejection_key","typeLabel":"enum\u003cstring>"},"correction_key":{"type":"string","description":"Indicador que especifica que se trata de una subsanación de un registro de facturación de alta previamente generado, con o sin registro previo en la AEAT según el valor de `previous_rejection_key`. El contenido de este nuevo registro de facturación es el correcto y el que deberá tenerse en cuenta. Si no se informa este campo, se entenderá que tiene valor `N` (alta normal/inicial). [Ver más información al respecto](/faq#¿qué-debo-hacer-cuando-veri-factu-“acepta-con-errores”-una-de-mis-facturas).\n\n- `S`: Sí, se trata de una subsanación; debe utilizarse con el valor de `previous_rejection_key` que corresponda.\n- `N`: No, se trata de un alta normal/inicial.\n","enum":["S","N"],"uniqueKey":"invoices.items.[INDEX].correction_key","typeLabel":"enum\u003cstring>"},"affected_by_incidence_key":{"type":"string","description":"Indica si una incidencia técnica ha afectado a la remisión voluntaria del registro de facturación, por ejemplo un corte de luz, la caída de la conexión a Internet o un fallo del sistema de facturación. Si no se informa, vale `N`.\n\nKubiFACTU lo cambia a `S` por su cuenta, aunque el registro se haya creado con `N`, en estos casos:\n\n- Al [reenviar](/openapi-reference/reenviar-registro-de-facturación) un registro cuyo envío falló.\n- En los registros diferidos que esperan detrás de un registro anterior de la misma empresa cliente y SIF cuyo envío falló o tiene un resultado incierto. Los marca antes de enviarlos, cuando ese registro anterior se reenvía o una consulta aclara su resultado. Ver [la FAQ](/faq#¿qué-ocurre-con-los-registros-diferidos-que-esperan-detrás-de-un-registro-fallido).\n\nCada reintento automático del registro que falló y cada registro diferido que espera detrás de él salen con `S`, sin que nadie reenvíe ni consulte el registro.\n\nKubiFACTU nunca cambia un `S` a `N`.\n\n- `S`: Sí, una incidencia ha afectado a la remisión de este registro de facturación.\n- `N`: No\n","enum":["S","N"],"uniqueKey":"invoices.items.[INDEX].affected_by_incidence_key","typeLabel":"enum\u003cstring>"},"operation_date":{"type":"string","format":"date","description":"Fecha en la que se ha realizado la operación, siempre que sea diferente a la fecha de expedición. Determina el ejercicio y periodo fiscal al que pertenece la operación.\"\n\nFormato `yyyy-mm-dd`.\n","example":"2026-02-26","uniqueKey":"invoices.items.[INDEX].operation_date","typeLabel":"string\u003cdate>"},"simplified_invoice_key":{"type":"string","description":"Factura simplificada Articulo 7.2 Y 7.3 RD 1619/2012.\n\nSi no se informa este campo se entenderá que tiene valor `N`.\n\nSólo se podrá rellenar con `S` si `invoice_type_key` es `F1`, `F3`, `R1`, `R2`, `R3` o `R4`.\n\n- `S`: Sí\n- `N`: No\n","enum":["S","N"],"uniqueKey":"invoices.items.[INDEX].simplified_invoice_key","typeLabel":"enum\u003cstring>"},"without_recipient_identification_key":{"type":"string","description":"Factura sin identificación del destinatario según el artículo 6.1.d del RD 1619/2012.\n\nSi no se informa este campo, se entenderá que tiene valor `\"N\"`.\n\nSólo se podrá rellenar con `\"S\"` si `invoice_type_key` es `F2` o `R5`.\n\n- `S`: Sí\n- `N`: No\n","enum":["S","N"],"uniqueKey":"invoices.items.[INDEX].without_recipient_identification_key","typeLabel":"enum\u003cstring>"},"macrodata_key":{"type":"string","description":"Identificador que especifica aquellas facturas con base o importe >= |100.000.000,00| (valor absoluto).\n\nSi no se informa este campo, se entenderá que tiene valor `\"N\"`.\n\nSólo se podrá rellenar con `\"S\"` si `invoice_type_key` es `F2` o `R5`.\n\n- `S`: Sí\n- `N`: No\n","enum":["S","N"],"uniqueKey":"invoices.items.[INDEX].macrodata_key","typeLabel":"enum\u003cstring>"},"issued_by_third_party_or_recipient_key":{"type":"string","description":"Identificador que especifica si la factura ha sido expedida materialmente por un tercero o por el destinatario (contraparte).\n\n- Si es igual a `T` (tercero), el bloque `third_party_data` será de cumplimentación obligatoria.\n- Si es igual a `D` (destinatario), el bloque `recipients` será de cumplimentación obligatoria.\n\n- `T`: Tercero\n- `D`: Destinatario\n","enum":["T","D"],"uniqueKey":"invoices.items.[INDEX].issued_by_third_party_or_recipient_key","typeLabel":"enum\u003cstring>"},"third_party_data":{"type":"object","description":"Información del tercero que expide la factura.","required":["company_name"],"properties":{"company_name":{"type":"string","description":"Nombre de la empresa del tercero que expide la factura.","isRequired":true,"uniqueKey":"invoices.items.[INDEX].third_party_data.company_name","typeLabel":"string"},"tax_id_number":{"type":"string","description":"NIF/CIF de la empresa. Este campo es obligatorio si el tercero que expide la factura es nacional y se identifica mediante CIF/NIF\n","uniqueKey":"invoices.items.[INDEX].third_party_data.tax_id_number","typeLabel":"string"},"other_country_code":{"type":"string","description":"Código del país en formato [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-2). Sólo es necesario rellenarlo **si el sujeto no es nacional**. El código de país debe ser `ES` si `other_tax_id_type_key` es `07 (no censado)`. Ejemplo: `DE`\n","uniqueKey":"invoices.items.[INDEX].third_party_data.other_country_code","typeLabel":"string"},"other_tax_id_type_key":{"type":"string","description":"Clave para identificar el tipo de documento. Los valores posibles son:\n\n- `02`: **NIF-IVA**: Número de Identificación Fiscal para IVA.\n- `03`: **Pasaporte**: Documento oficial que acredita la identidad y nacionalidad del portador.\n- `04`: **Documento oficial de identificación expedido por el país o territorio de residencia**.\n- `05`: **Certificado de residencia**: Documento que acredita la residencia fiscal.\n- `06`: **Otro documento probatorio**: Documento adicional que sirve como prueba de identidad.\n- `07`: **No censado**: El receptor no está registrado en el censo fiscal.\n","enum":["02","03","04","05","06","07"],"uniqueKey":"invoices.items.[INDEX].third_party_data.other_tax_id_type_key","typeLabel":"enum\u003cstring>"},"other_tax_id_number":{"type":"string","description":"Número de identificación, en el país de residencia del tercero que expide la factura. Ejemplo: `L74JF44L2` para una empresa de `DE`.\n","uniqueKey":"invoices.items.[INDEX].third_party_data.other_tax_id_number","typeLabel":"string"}},"uniqueKey":"invoices.items.[INDEX].third_party_data","typeLabel":"object"},"rectificative_type_key":{"type":"string","description":"Campo que identifica si el tipo de factura rectificativa es por **sustitución** o por **diferencias**.\n\n- `S`: Por sustitución.\n- `I`: Por diferencias.\n","enum":["S","I"],"uniqueKey":"invoices.items.[INDEX].rectificative_type_key","typeLabel":"enum\u003cstring>"},"rectified_tax_base":{"type":"number","format":"decimal","description":"Base imponible rectificada.\nValor con 12 dígitos en la parte entera y 2 decimales. Ejemplo: `2500.55`.\n","example":2500.55,"uniqueKey":"invoices.items.[INDEX].rectified_tax_base","typeLabel":"number\u003cdecimal>"},"rectified_tax_quota":{"type":"number","format":"decimal","description":"Cuota de impuesto rectificada.\nValor con 12 dígitos en la parte entera y 2 decimales. Ejemplo: `42.30`.\n","example":42.3,"uniqueKey":"invoices.items.[INDEX].rectified_tax_quota","typeLabel":"number\u003cdecimal>"},"rectified_equalization_tax_quota":{"type":"number","format":"decimal","description":"Cuota de recargo de equivalencia rectificada.\nValor con 12 dígitos en la parte entera y 2 decimales. Ejemplo: `5.20`.\n","example":5.2,"uniqueKey":"invoices.items.[INDEX].rectified_equalization_tax_quota","typeLabel":"number\u003cdecimal>"},"rectified_invoices":{"type":"array","description":"Lista de facturas que se están rectificando.\n","items":{"type":"object","required":["tax_id_number","full_invoice_number","issue_date"],"properties":{"tax_id_number":{"type":"string","description":"NIF/CIF de la empresa emisora de la factura que quiere rectificar.\n","isRequired":true,"uniqueKey":"invoices.items.[INDEX].rectified_invoices.items.[INDEX].tax_id_number","typeLabel":"string"},"full_invoice_number":{"type":"string","description":"Serie+Nº Factura que identifica a la factura que se quiere rectificar.\nEjemplo: `2026-00001`.\n","isRequired":true,"uniqueKey":"invoices.items.[INDEX].rectified_invoices.items.[INDEX].full_invoice_number","typeLabel":"string"},"issue_date":{"type":"string","format":"date","description":"Fecha de expedición de la factura que se quiere rectificar en formato `yyyy-mm-dd`.\nEjemplo: `2026-02-26`.\n","example":"2026-02-26","isRequired":true,"uniqueKey":"invoices.items.[INDEX].rectified_invoices.items.[INDEX].issue_date","typeLabel":"string\u003cdate>"}},"uniqueKey":"invoices.items.[INDEX].rectified_invoices.items.[INDEX]","typeLabel":"object"},"uniqueKey":"invoices.items.[INDEX].rectified_invoices","typeLabel":"object[]"},"substituted_invoices":{"type":"array","description":"Lista de facturas que se quieren sustituir.\n\nSólo podrá incluirse esta agrupación cuando el campo `invoice_type_key` sea `F3`.\n","items":{"type":"object","required":["tax_id_number","full_invoice_number","issue_date"],"properties":{"tax_id_number":{"type":"string","description":"NIF/CIF de la empresa emisora de la factura que quiere rectificar.\n","isRequired":true,"uniqueKey":"invoices.items.[INDEX].substituted_invoices.items.[INDEX].tax_id_number","typeLabel":"string"},"full_invoice_number":{"type":"string","description":"Serie+Nº Factura que identifica a la factura que se quiere rectificar.\nEjemplo: `2026-00001`.\n","isRequired":true,"uniqueKey":"invoices.items.[INDEX].substituted_invoices.items.[INDEX].full_invoice_number","typeLabel":"string"},"issue_date":{"type":"string","format":"date","description":"Fecha de expedición de la factura que se quiere rectificar en formato `yyyy-mm-dd`.\nEjemplo: `2026-02-26`.\n","example":"2026-02-26","isRequired":true,"uniqueKey":"invoices.items.[INDEX].substituted_invoices.items.[INDEX].issue_date","typeLabel":"string\u003cdate>"}},"uniqueKey":"invoices.items.[INDEX].substituted_invoices.items.[INDEX]","typeLabel":"object"},"uniqueKey":"invoices.items.[INDEX].substituted_invoices","typeLabel":"object[]"},"coupon_key":{"type":"string","description":"Identificador que especifica si tiene minoración de la base imponible por la concesión de cupones, bonificaciones o descuentos cuando solo se expide el original de la factura.\nSi no se informa este campo, se entenderá que tiene valor `\"N\"`.\n\nSólo se podrá rellenar con `\"S\"` si `invoice_type_key` es `R5` o `R1`.\n","enum":["S","N"],"example":"N","uniqueKey":"invoices.items.[INDEX].coupon_key","typeLabel":"enum\u003cstring>"},"invoicing_agreement_registration_number":{"type":"string","description":"Número de registro obtenido al enviar la autorización en materia de facturación o de libros registro a que se refiere la disposición adicional primera del Real Decreto que aprueba el Reglamento.\n","uniqueKey":"invoices.items.[INDEX].invoicing_agreement_registration_number","typeLabel":"string"},"sif_agreement_id":{"type":"string","description":"Identificación del acuerdo (resolución) a que se refiere el artículo 5 del Reglamento.\n","uniqueKey":"invoices.items.[INDEX].sif_agreement_id","typeLabel":"string"}},"required":["sif_id","invoice_type_key","sender_data","full_invoice_number","fiscal_year","issue_date","operation_description","tax_breakdown","total_quota","total_amount"],"uniqueKey":"invoices.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"invoices","typeLabel":"object[]"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"invoices":[{"sif_id":"9db0bca1-187e-4cf4-b87c-96f2044008d7","invoice_type_key":"F1","sender_data":{"company_name":"\u003cstring>","tax_id_number":"\u003cstring>"},"full_invoice_number":"2026-00001","fiscal_year":2026,"issue_date":"2026-09-15","operation_description":"\u003cstring>","tax_breakdown":[{"tax_type_key":"01","tax_base":200,"tax_base_at_cost":123,"tax_rate":21,"tax_quota":42,"equalization_tax_rate":5.2,"equalization_tax_quota":10.4}],"total_quota":123,"total_amount":123,"client_invoice_id":"96f2044008d7iujfd78jspo4","callback_url":"https://www.tuempresa.com/kubifactu/callback","recipients":[{"company_name":"\u003cstring>","tax_id_number":"\u003cstring>","other_country_code":"\u003cstring>","other_tax_id_number":"\u003cstring>"}],"representative_company_name":"\u003cstring>","representative_tax_id_number":"\u003cstring>","operation_date":"2026-02-26","rectified_tax_base":2500.55,"rectified_tax_quota":42.3,"rectified_equalization_tax_quota":5.2,"rectified_invoices":[{"tax_id_number":"\u003cstring>","full_invoice_number":"\u003cstring>","issue_date":"2026-02-26"}],"substituted_invoices":[{"tax_id_number":"\u003cstring>","full_invoice_number":"\u003cstring>","issue_date":"2026-02-26"}],"coupon_key":"N","invoicing_agreement_registration_number":"\u003cstring>","sif_agreement_id":"\u003cstring>"}]}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"e276402e-12b3-4737-8f46-a733d076470c":{"description":"Lote recibido para su procesamiento diferido.","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","required":["response"],"properties":{"response":{"type":"string","description":"Confirmación de que el lote se ha registrado para su procesamiento diferido.","example":"Batch of invoice records processed for deferred submission to Veri*Factu.","isRequired":true,"uniqueKey":"data.response","typeLabel":"string"}},"isRequired":true,"uniqueKey":"data","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"data":{"response":"Batch of invoice records processed for deferred submission to Veri*Factu."}}}},"exampleType":"generated"}},"exampleType":"generated"},"8f51a14c-3fc7-40df-bffe-c555e7ff6a82":{"description":"No autorizado. La API-KEY proporcionada no es válida.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"error":{"type":"object","properties":{"message":{"type":"string","description":"Mensaje detallado del error.","example":"No client with API-KEY '5tVySMGJOpq8HfMgIX28Qz6kF0dFOoq37x55PLZcWsGeGeYkNgJyAcRTlFJ5NbVoDRm8qtCywEoiN3A9JkBanMBXYmxiqR3BItxgxx' was found.","uniqueKey":"data.error.message","typeLabel":"string"},"errors":{"oneOf":[{"type":"object","description":"Detalles adicionales del error. Puede ser `null` si no hay información específica.\n","example":null,"uniqueKey":"data.error.errors.oneOf.0","typeLabel":"object"},{"type":"null","description":"Detalles adicionales del error. Puede ser `null` si no hay información específica.\n","example":null,"uniqueKey":"data.error.errors.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.error.errors","typeLabel":"object | null"},"details":{"oneOf":[{"type":"object","enum":[null],"description":"Siempre es `null` en esta respuesta. La API-KEY se rechaza antes de asignar el identificador de la solicitud.","example":null,"uniqueKey":"data.error.details.oneOf.0","typeLabel":"object"},{"type":"null","enum":[null],"description":"Siempre es `null` en esta respuesta. La API-KEY se rechaza antes de asignar el identificador de la solicitud.","example":null,"uniqueKey":"data.error.details.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.error.details","typeLabel":"object | null"}},"uniqueKey":"data.error","typeLabel":"object"}},"uniqueKey":"data","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"data":{"error":{"message":"No client with API-KEY '5tVySMGJOpq8HfMgIX28Qz6kF0dFOoq37x55PLZcWsGeGeYkNgJyAcRTlFJ5NbVoDRm8qtCywEoiN3A9JkBanMBXYmxiqR3BItxgxx' was found.","errors":null,"details":null}}}}},"exampleType":"generated"}},"exampleType":"generated"},"ffb9e29b-671e-40f3-8a95-c50140f43dd5":{"description":"Errores de validación.\n\nUna subsanación con `correction_key = S` y `previous_rejection_key = X` devuelve el error en `invoices.\u003cn>.previous_rejection_key` si en KubiFACTU ya existe el alta de la misma factura registrada en la AEAT o pendiente de envío. Consulta en la descripción del campo `previous_rejection_key` qué valor corresponde en cada caso.\n","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"error":{"type":"object","properties":{"message":{"type":"string","description":"Mensaje general del error.","example":"The given data was invalid.","uniqueKey":"data.error.message","typeLabel":"string"},"errors":{"type":"object","additionalProperties":{"type":"array","items":{"type":"string","uniqueKey":"data.error.errors.additionalProperties.items.[INDEX]","typeLabel":"string"},"uniqueKey":"data.error.errors.additionalProperties","typeLabel":"string[]"},"description":"Lista de errores de validación organizados por campo.\nCada clave es el nombre del campo asociado al error y contiene un array de mensajes.\n","example":{"invoice_exists":["An invoice already exists with the indicated invoice number and fiscal for the provided SIF. Existing invoice ID: [9db6bb78-6799-4abb-b9a0-22d127c543ed]."],"incorrect_total_quota":["The total quota of the invoice does not match the total tax quota and equalization_tax_quota of the tax breakdown. Calculated total quota: [26.25]."],"incorrect_total_amount":["The total amount of the invoice does not match the total tax base of the tax breakdown. Calculated total amount: [151.25]."]},"uniqueKey":"data.error.errors","typeLabel":"object"},"details":{"type":"object","properties":{"request_id":{"type":"string","format":"uuid","description":"Identificador único de la solicitud para rastreo.","example":"9ded9e2c-d59e-4432-a926-652cbcfac365","uniqueKey":"data.error.details.request_id","typeLabel":"string\u003cuuid>"}},"uniqueKey":"data.error.details","typeLabel":"object"}},"uniqueKey":"data.error","typeLabel":"object"}},"uniqueKey":"data","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"registered_original":{"title":"registered_original","value":{"data":{"error":{"message":"The given data was invalid.","errors":{"invoices.0.previous_rejection_key":["AEAT already holds this invoice, so previous_rejection_key cannot be X. To correct the registered record, send the correction with previous_rejection_key N. Existing invoice ID: [9db6bb78-6799-4abb-b9a0-22d127c543ed]."]},"details":{"request_id":"9ded9e2c-d59e-4432-a926-652cbcfac365"}}}}},"pending_original":{"title":"pending_original","value":{"data":{"error":{"message":"The given data was invalid.","errors":{"invoices.0.previous_rejection_key":["The original record of this invoice is still pending submission to AEAT, so it cannot be corrected with previous_rejection_key X yet. Wait for its submission result. Existing invoice ID: [9db6bb78-6799-4abb-b9a0-22d127c543ed]."]},"details":{"request_id":"9ded9e2c-d59e-4432-a926-652cbcfac365"}}}}}},"exampleType":"examples"}},"exampleType":"examples"},"1fb03f00-269d-4b68-853c-62324b340114":{"description":"Error interno del servidor.","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}}},"security":{"6e52b4ec-098c-474e-8522-21a666a9978b":{"client_api_key":{"type":"apiKey","name":"X-Qbikode-ClientApiKey","in":"header","description":"API-KEY de la empresa que hace la petición. Este dato se puede consultar en el panel web, accediendo a la sección _Empresas_ y accediendo a la ficha de la empresa en.\n","scopes":[],"schemeName":"client_api_key"}}},"servers":{"303ac0a5-79a3-4351-acb8-8f25fe88f3ee":{"url":"https://api.kubifactu.com","description":"Servidor de producción"},"c6f56d55-3c61-4255-bb06-871019b322ea":{"url":"https://devapi.kubifactu.com","description":"Servidor de pruebas"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"apiKey","name":"X-Qbikode-ClientApiKey","in":"header","description":"API-KEY de la empresa que hace la petición. Este dato se puede consultar en el panel web, accediendo a la sección _Empresas_ y accediendo a la ficha de la empresa en.\n","scopes":[],"schemeName":"client_api_key"},"schema":{"title":"X-Qbikode-ClientApiKey","type":"string","description":"API-KEY de la empresa que hace la petición. Este dato se puede consultar en el panel web, accediendo a la sección _Empresas_ y accediendo a la ficha de la empresa en.\n","isRequired":true,"typeLabel":"string","deprecated":false},"schemeName":"client_api_key","name":"X-Qbikode-ClientApiKey"}],"title":"client_api_key"}]},"originalFileLocation":"api-reference/openapi/openapi.yaml"},"subdomain":"kubicode","siteName":"KubiFactu Docs","title":"Enviar registros de facturación en lote - KubiFactu Docs","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-27T22:36:06.295Z","originalFileLocation":"openapi-reference/enviar-registros-de-facturación-en-lote.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Registra entre 1 y 500 registros de facturación que serán procesados en diferido. La respuesta confirma la recepción del lote, pero no incluye los identificadores ni el resultado individual de los registros. Tampoco confirma su aceptación por Veri*Factu. El resultado de cada registro se obtiene posteriormente mediante la URL indicada en su campo callback_url o consultando el registro de facturación. Si algún registro no supera la validación, la respuesta contiene los errores indexados según su posición en el array, por ejemplo, invoices.0.sif_id. ### Resultado mediante callback El campo callback_url se configura individualmente en cada elemento de invoices. Cuando los registros han sido procesados, KubiFACTU agrupa los resultados de una misma empresa cliente y URL de callback, y realiza una petición POST con contenido application/json. El cuerpo del callback siempre es un array y puede contener uno o varios registros. Un callback no tiene por qué corresponder exactamente con el lote original, por lo que la integración debe correlacionar cada resultado mediante id o client_invoice_id, sin depender de su posición en el array. Un mismo registro puede llegar en más de un callback, así que procesa cada resultado de forma idempotente. recovery va relleno en los elementos de los registros que sigue la recuperación automática, y los reintentos automáticos generan callbacks adicionales del mismo registro: cada nuevo retry, el paso a attention y el final de la recuperación (resolved). recovery.status = resolved no significa que la AEAT haya aceptado el registro: el resultado está en vf_record_registration_status. Ejemplo de callback de un registro en recuperación automática: json [ { \u0026quot;id\u0026quot;: \u0026quot;7d76c4a6-6603-4fc6-946a-8b9ffcc93480\u0026quot;, \u0026quot;client_invoice_id\u0026quot;: \u0026quot;FACTURA-2026-0042\u0026quot;, \u0026quot;record_type\u0026quot;: \u0026quot;creation\u0026quot;, \u0026quot;sif_id\u0026quot;: \u0026quot;0995c42c-6708-44fb-bfbf-b363a5fe873e\u0026quot;, \u0026quot;sender_company_name\u0026quot;: \u0026quot;Ferretería Ejemplo, S.L.\u0026quot;, \u0026quot;sender_tax_id_number\u0026quot;: \u0026quot;B12345678\u0026quot;, \u0026quot;fiscal_year\u0026quot;: 2026, \u0026quot;full_invoice_number\u0026quot;: \u0026quot;F-2026-0042\u0026quot;, \u0026quot;fingerprint\u0026quot;: \u0026quot;8f3d7aa5530f5f6c3a96a5c8a9516a7fd9ce90b9bf3b60375682d8b45ca72867\u0026quot;, \u0026quot;csv\u0026quot;: \u0026quot;CSV-DE-EJEMPLO\u0026quot;, \u0026quot;vf_post_status\u0026quot;: \u0026quot;success\u0026quot;, \u0026quot;vf_record_registration_status\u0026quot;: \u0026quot;success\u0026quot;, \u0026quot;has_warnings\u0026quot;: false, \u0026quot;vf_error_descriptions\u0026quot;: null, \u0026quot;vf_response_body\u0026quot;: \u0026quot;PHhtbD5SZXNwdWVzdGEgZGUgZWplbXBsbzwveG1sPg==\u0026quot;, \u0026quot;qr_value\u0026quot;: \u0026quot;https://www2.agenciatributaria.gob.es/wlpl/TIKE-CONT/ValidarQR?nif=B12345678\u0026amp;numserie=F-2026-0042\u0026amp;fecha=01-09-2026\u0026amp;importe=121.00\u0026quot;, \u0026quot;qr_image_url\u0026quot;: \u0026quot;https://devapi.kubifactu.com/api/invoices/7d76c4a6-6603-4fc6-946a-8b9ffcc93480/qr-image\u0026quot;, \u0026quot;xml_url\u0026quot;: \u0026quot;https://devapi.kubifactu.com/api/invoices/7d76c4a6-6603-4fc6-946a-8b9ffcc93480/xml\u0026quot;, \u0026quot;recovery\u0026quot;: { \u0026quot;status\u0026quot;: \u0026quot;resolved\u0026quot;, \u0026quot;reason_code\u0026quot;: null, \u0026quot;message\u0026quot;: \u0026quot;Automatic recovery has finished. Check the registration status for the result.\u0026quot;, \u0026quot;attempts\u0026quot;: 1, \u0026quot;next_attempt_at\u0026quot;: null } } ] El contrato completo de cada elemento se detalla en el campo callback_url de la petición. Este callback es independiente de la respuesta HTTP inmediata del endpoint.\">\u003cmeta data-mint-head name=\"application-name\" content=\"KubiFactu Docs\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/kubicode/1A_Cda9BuxxW99b3/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/kubicode/1A_Cda9BuxxW99b3/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/kubicode/1A_Cda9BuxxW99b3/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/kubicode/1A_Cda9BuxxW99b3/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/kubicode/1A_Cda9BuxxW99b3/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/kubicode/1A_Cda9BuxxW99b3/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/kubicode/1A_Cda9BuxxW99b3/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/kubicode/1A_Cda9BuxxW99b3/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/kubicode/1A_Cda9BuxxW99b3/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Enviar registros de facturación en lote - KubiFactu Docs\">\u003cmeta data-mint-head property=\"og:description\" content=\"Registra entre 1 y 500 registros de facturación que serán procesados en diferido. La respuesta confirma la recepción del lote, pero no incluye los identificadores ni el resultado individual de los registros. Tampoco confirma su aceptación por Veri*Factu. El resultado de cada registro se obtiene posteriormente mediante la URL indicada en su campo callback_url o consultando el registro de facturación. Si algún registro no supera la validación, la respuesta contiene los errores indexados según su posición en el array, por ejemplo, invoices.0.sif_id. ### Resultado mediante callback El campo callback_url se configura individualmente en cada elemento de invoices. Cuando los registros han sido procesados, KubiFACTU agrupa los resultados de una misma empresa cliente y URL de callback, y realiza una petición POST con contenido application/json. El cuerpo del callback siempre es un array y puede contener uno o varios registros. Un callback no tiene por qué corresponder exactamente con el lote original, por lo que la integración debe correlacionar cada resultado mediante id o client_invoice_id, sin depender de su posición en el array. Un mismo registro puede llegar en más de un callback, así que procesa cada resultado de forma idempotente. recovery va relleno en los elementos de los registros que sigue la recuperación automática, y los reintentos automáticos generan callbacks adicionales del mismo registro: cada nuevo retry, el paso a attention y el final de la recuperación (resolved). recovery.status = resolved no significa que la AEAT haya aceptado el registro: el resultado está en vf_record_registration_status. Ejemplo de callback de un registro en recuperación automática: json [ { \u0026quot;id\u0026quot;: \u0026quot;7d76c4a6-6603-4fc6-946a-8b9ffcc93480\u0026quot;, \u0026quot;client_invoice_id\u0026quot;: \u0026quot;FACTURA-2026-0042\u0026quot;, \u0026quot;record_type\u0026quot;: \u0026quot;creation\u0026quot;, \u0026quot;sif_id\u0026quot;: \u0026quot;0995c42c-6708-44fb-bfbf-b363a5fe873e\u0026quot;, \u0026quot;sender_company_name\u0026quot;: \u0026quot;Ferretería Ejemplo, S.L.\u0026quot;, \u0026quot;sender_tax_id_number\u0026quot;: \u0026quot;B12345678\u0026quot;, \u0026quot;fiscal_year\u0026quot;: 2026, \u0026quot;full_invoice_number\u0026quot;: \u0026quot;F-2026-0042\u0026quot;, \u0026quot;fingerprint\u0026quot;: \u0026quot;8f3d7aa5530f5f6c3a96a5c8a9516a7fd9ce90b9bf3b60375682d8b45ca72867\u0026quot;, \u0026quot;csv\u0026quot;: \u0026quot;CSV-DE-EJEMPLO\u0026quot;, \u0026quot;vf_post_status\u0026quot;: \u0026quot;success\u0026quot;, \u0026quot;vf_record_registration_status\u0026quot;: \u0026quot;success\u0026quot;, \u0026quot;has_warnings\u0026quot;: false, \u0026quot;vf_error_descriptions\u0026quot;: null, \u0026quot;vf_response_body\u0026quot;: \u0026quot;PHhtbD5SZXNwdWVzdGEgZGUgZWplbXBsbzwveG1sPg==\u0026quot;, \u0026quot;qr_value\u0026quot;: \u0026quot;https://www2.agenciatributaria.gob.es/wlpl/TIKE-CONT/ValidarQR?nif=B12345678\u0026amp;numserie=F-2026-0042\u0026amp;fecha=01-09-2026\u0026amp;importe=121.00\u0026quot;, \u0026quot;qr_image_url\u0026quot;: \u0026quot;https://devapi.kubifactu.com/api/invoices/7d76c4a6-6603-4fc6-946a-8b9ffcc93480/qr-image\u0026quot;, \u0026quot;xml_url\u0026quot;: \u0026quot;https://devapi.kubifactu.com/api/invoices/7d76c4a6-6603-4fc6-946a-8b9ffcc93480/xml\u0026quot;, \u0026quot;recovery\u0026quot;: { \u0026quot;status\u0026quot;: \u0026quot;resolved\u0026quot;, \u0026quot;reason_code\u0026quot;: null, \u0026quot;message\u0026quot;: \u0026quot;Automatic recovery has finished. Check the registration status for the result.\u0026quot;, \u0026quot;attempts\u0026quot;: 1, \u0026quot;next_attempt_at\u0026quot;: null } } ] El contrato completo de cada elemento se detalla en el campo callback_url de la petición. Este callback es independiente de la respuesta HTTP inmediata del endpoint.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"KubiFactu Docs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://apidocs.kubifactu.com/openapi-reference/enviar-registros-de-facturación-en-lote\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://kubicode.mintlify.app/_mintlify/api/og/v2?division=API+Reference\u0026amp;title=Enviar+registros+de+facturaci%C3%B3n+en+lote\u0026amp;description=Registra+entre+1+y+500+registros+de+facturaci%C3%B3n+que+**ser%C3%A1n+procesados+en+diferido**.%0A%0ALa+respuesta+confirma+la+recepci%C3%B3n+del+lote%2C+pero+no+incluye+los+identifi\u0026amp;theme=01d1c3eb4c7167906a629986\u0026amp;signature=f23097bcd2fcc4c6c2419e35734ce17c74ea449e268bca89904b138a4d6fa361\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Enviar registros de facturación en lote - KubiFactu Docs\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Registra entre 1 y 500 registros de facturación que serán procesados en diferido. La respuesta confirma la recepción del lote, pero no incluye los identificadores ni el resultado individual de los registros. Tampoco confirma su aceptación por Veri*Factu. El resultado de cada registro se obtiene posteriormente mediante la URL indicada en su campo callback_url o consultando el registro de facturación. Si algún registro no supera la validación, la respuesta contiene los errores indexados según su posición en el array, por ejemplo, invoices.0.sif_id. ### Resultado mediante callback El campo callback_url se configura individualmente en cada elemento de invoices. Cuando los registros han sido procesados, KubiFACTU agrupa los resultados de una misma empresa cliente y URL de callback, y realiza una petición POST con contenido application/json. El cuerpo del callback siempre es un array y puede contener uno o varios registros. Un callback no tiene por qué corresponder exactamente con el lote original, por lo que la integración debe correlacionar cada resultado mediante id o client_invoice_id, sin depender de su posición en el array. Un mismo registro puede llegar en más de un callback, así que procesa cada resultado de forma idempotente. recovery va relleno en los elementos de los registros que sigue la recuperación automática, y los reintentos automáticos generan callbacks adicionales del mismo registro: cada nuevo retry, el paso a attention y el final de la recuperación (resolved). recovery.status = resolved no significa que la AEAT haya aceptado el registro: el resultado está en vf_record_registration_status. Ejemplo de callback de un registro en recuperación automática: json [ { \u0026quot;id\u0026quot;: \u0026quot;7d76c4a6-6603-4fc6-946a-8b9ffcc93480\u0026quot;, \u0026quot;client_invoice_id\u0026quot;: \u0026quot;FACTURA-2026-0042\u0026quot;, \u0026quot;record_type\u0026quot;: \u0026quot;creation\u0026quot;, \u0026quot;sif_id\u0026quot;: \u0026quot;0995c42c-6708-44fb-bfbf-b363a5fe873e\u0026quot;, \u0026quot;sender_company_name\u0026quot;: \u0026quot;Ferretería Ejemplo, S.L.\u0026quot;, \u0026quot;sender_tax_id_number\u0026quot;: \u0026quot;B12345678\u0026quot;, \u0026quot;fiscal_year\u0026quot;: 2026, \u0026quot;full_invoice_number\u0026quot;: \u0026quot;F-2026-0042\u0026quot;, \u0026quot;fingerprint\u0026quot;: \u0026quot;8f3d7aa5530f5f6c3a96a5c8a9516a7fd9ce90b9bf3b60375682d8b45ca72867\u0026quot;, \u0026quot;csv\u0026quot;: \u0026quot;CSV-DE-EJEMPLO\u0026quot;, \u0026quot;vf_post_status\u0026quot;: \u0026quot;success\u0026quot;, \u0026quot;vf_record_registration_status\u0026quot;: \u0026quot;success\u0026quot;, \u0026quot;has_warnings\u0026quot;: false, \u0026quot;vf_error_descriptions\u0026quot;: null, \u0026quot;vf_response_body\u0026quot;: \u0026quot;PHhtbD5SZXNwdWVzdGEgZGUgZWplbXBsbzwveG1sPg==\u0026quot;, \u0026quot;qr_value\u0026quot;: \u0026quot;https://www2.agenciatributaria.gob.es/wlpl/TIKE-CONT/ValidarQR?nif=B12345678\u0026amp;numserie=F-2026-0042\u0026amp;fecha=01-09-2026\u0026amp;importe=121.00\u0026quot;, \u0026quot;qr_image_url\u0026quot;: \u0026quot;https://devapi.kubifactu.com/api/invoices/7d76c4a6-6603-4fc6-946a-8b9ffcc93480/qr-image\u0026quot;, \u0026quot;xml_url\u0026quot;: \u0026quot;https://devapi.kubifactu.com/api/invoices/7d76c4a6-6603-4fc6-946a-8b9ffcc93480/xml\u0026quot;, \u0026quot;recovery\u0026quot;: { \u0026quot;status\u0026quot;: \u0026quot;resolved\u0026quot;, \u0026quot;reason_code\u0026quot;: null, \u0026quot;message\u0026quot;: \u0026quot;Automatic recovery has finished. Check the registration status for the result.\u0026quot;, \u0026quot;attempts\u0026quot;: 1, \u0026quot;next_attempt_at\u0026quot;: null } } ] El contrato completo de cada elemento se detalla en el campo callback_url de la petición. Este callback es independiente de la respuesta HTTP inmediata del endpoint.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://kubicode.mintlify.app/_mintlify/api/og/v2?division=API+Reference\u0026amp;title=Enviar+registros+de+facturaci%C3%B3n+en+lote\u0026amp;description=Registra+entre+1+y+500+registros+de+facturaci%C3%B3n+que+**ser%C3%A1n+procesados+en+diferido**.%0A%0ALa+respuesta+confirma+la+recepci%C3%B3n+del+lote%2C+pero+no+incluye+los+identifi\u0026amp;theme=01d1c3eb4c7167906a629986\u0026amp;signature=f23097bcd2fcc4c6c2419e35734ce17c74ea449e268bca89904b138a4d6fa361\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/kubicode/1A_Cda9BuxxW99b3/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"KubiFactu Docs\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#0D9373\">\u003clink data-mint-head rel=\"canonical\" href=\"https://apidocs.kubifactu.com/openapi-reference/enviar-registros-de-facturación-en-lote\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/openapi-reference/enviar-registros-de-facturaci%C3%B3n-en-lote.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://apidocs.kubifactu.com/#organization\",\"name\":\"KubiFactu Docs\",\"url\":\"https://apidocs.kubifactu.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/kubicode/c_MnoHUxTdI5_O4j/logo/light.svg?fit=max\u0026auto=format\u0026n=c_MnoHUxTdI5_O4j\u0026q=85\u0026s=ed19f7b6d4dbf284f34781b6b320ac48\"}},{\"@type\":\"WebSite\",\"@id\":\"https://apidocs.kubifactu.com#website\",\"name\":\"KubiFactu Docs\",\"url\":\"https://apidocs.kubifactu.com\",\"publisher\":{\"@id\":\"https://apidocs.kubifactu.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://apidocs.kubifactu.com/openapi-reference/enviar-registros-de-facturaci%C3%B3n-en-lote#webpage\",\"url\":\"https://apidocs.kubifactu.com/openapi-reference/enviar-registros-de-facturaci%C3%B3n-en-lote\",\"name\":\"Enviar registros de facturación en lote\",\"description\":\"Registra entre 1 y 500 registros de facturación que serán procesados en diferido. La respuesta confirma la recepción del lote, pero no incluye los identificadores ni el resultado individual de los registros. Tampoco confirma su aceptación por Veri*Factu. El resultado de cada registro se obtiene posteriormente mediante la URL indicada en su campo callback_url o consultando el registro de facturación. Si algún registro no supera la validación, la respuesta contiene los errores indexados según su posición en el array, por ejemplo, invoices.0.sif_id. ### Resultado mediante callback El campo callback_url se configura individualmente en cada elemento de invoices. Cuando los registros han sido procesados, KubiFACTU agrupa los resultados de una misma empresa cliente y URL de callback, y realiza una petición POST con contenido application/json. El cuerpo del callback siempre es un array y puede contener uno o varios registros. Un callback no tiene por qué corresponder exactamente con el lote original, por lo que la integración debe correlacionar cada resultado mediante id o client_invoice_id, sin depender de su posición en el array. Un mismo registro puede llegar en más de un callback, así que procesa cada resultado de forma idempotente. recovery va relleno en los elementos de los registros que sigue la recuperación automática, y los reintentos automáticos generan callbacks adicionales del mismo registro: cada nuevo retry, el paso a attention y el final de la recuperación (resolved). recovery.status = resolved no significa que la AEAT haya aceptado el registro: el resultado está en vf_record_registration_status. Ejemplo de callback de un registro en recuperación automática: json [ { \\\"id\\\": \\\"7d76c4a6-6603-4fc6-946a-8b9ffcc93480\\\", \\\"client_invoice_id\\\": \\\"FACTURA-2026-0042\\\", \\\"record_type\\\": \\\"creation\\\", \\\"sif_id\\\": \\\"0995c42c-6708-44fb-bfbf-b363a5fe873e\\\", \\\"sender_company_name\\\": \\\"Ferretería Ejemplo, S.L.\\\", \\\"sender_tax_id_number\\\": \\\"B12345678\\\", \\\"fiscal_year\\\": 2026, \\\"full_invoice_number\\\": \\\"F-2026-0042\\\", \\\"fingerprint\\\": \\\"8f3d7aa5530f5f6c3a96a5c8a9516a7fd9ce90b9bf3b60375682d8b45ca72867\\\", \\\"csv\\\": \\\"CSV-DE-EJEMPLO\\\", \\\"vf_post_status\\\": \\\"success\\\", \\\"vf_record_registration_status\\\": \\\"success\\\", \\\"has_warnings\\\": false, \\\"vf_error_descriptions\\\": null, \\\"vf_response_body\\\": \\\"PHhtbD5SZXNwdWVzdGEgZGUgZWplbXBsbzwveG1sPg==\\\", \\\"qr_value\\\": \\\"https://www2.agenciatributaria.gob.es/wlpl/TIKE-CONT/ValidarQR?nif=B12345678\u0026numserie=F-2026-0042\u0026fecha=01-09-2026\u0026importe=121.00\\\", \\\"qr_image_url\\\": \\\"https://devapi.kubifactu.com/api/invoices/7d76c4a6-6603-4fc6-946a-8b9ffcc93480/qr-image\\\", \\\"xml_url\\\": \\\"https://devapi.kubifactu.com/api/invoices/7d76c4a6-6603-4fc6-946a-8b9ffcc93480/xml\\\", \\\"recovery\\\": { \\\"status\\\": \\\"resolved\\\", \\\"reason_code\\\": null, \\\"message\\\": \\\"Automatic recovery has finished. Check the registration status for the result.\\\", \\\"attempts\\\": 1, \\\"next_attempt_at\\\": null } } ] El contrato completo de cada elemento se detalla en el campo callback_url de la petición. Este callback es independiente de la respuesta HTTP inmediata del endpoint.\",\"dateModified\":\"2026-10-27T22:36:06.295Z\",\"isPartOf\":{\"@id\":\"https://apidocs.kubifactu.com#website\"},\"breadcrumb\":{\"@id\":\"https://apidocs.kubifactu.com/openapi-reference/enviar-registros-de-facturaci%C3%B3n-en-lote#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://apidocs.kubifactu.com/openapi-reference/enviar-registros-de-facturaci%C3%B3n-en-lote#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"API Reference\",\"item\":\"https://apidocs.kubifactu.com/openapi-reference/listar-registros-de-facturaci%C3%B3n-con-filtros\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Enviar registros de facturación en lote\",\"item\":\"https://apidocs.kubifactu.com/openapi-reference/enviar-registros-de-facturaci%C3%B3n-en-lote\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://apidocs.kubifactu.com/openapi-reference/enviar-registros-de-facturaci%C3%B3n-en-lote#apireference\",\"headline\":\"Enviar registros de facturación en lote\",\"name\":\"Enviar registros de facturación en lote\",\"description\":\"Registra entre 1 y 500 registros de facturación que serán procesados en diferido. La respuesta confirma la recepción del lote, pero no incluye los identificadores ni el resultado individual de los registros. Tampoco confirma su aceptación por Veri*Factu. El resultado de cada registro se obtiene posteriormente mediante la URL indicada en su campo callback_url o consultando el registro de facturación. Si algún registro no supera la validación, la respuesta contiene los errores indexados según su posición en el array, por ejemplo, invoices.0.sif_id. ### Resultado mediante callback El campo callback_url se configura individualmente en cada elemento de invoices. Cuando los registros han sido procesados, KubiFACTU agrupa los resultados de una misma empresa cliente y URL de callback, y realiza una petición POST con contenido application/json. El cuerpo del callback siempre es un array y puede contener uno o varios registros. Un callback no tiene por qué corresponder exactamente con el lote original, por lo que la integración debe correlacionar cada resultado mediante id o client_invoice_id, sin depender de su posición en el array. Un mismo registro puede llegar en más de un callback, así que procesa cada resultado de forma idempotente. recovery va relleno en los elementos de los registros que sigue la recuperación automática, y los reintentos automáticos generan callbacks adicionales del mismo registro: cada nuevo retry, el paso a attention y el final de la recuperación (resolved). recovery.status = resolved no significa que la AEAT haya aceptado el registro: el resultado está en vf_record_registration_status. Ejemplo de callback de un registro en recuperación automática: json [ { \\\"id\\\": \\\"7d76c4a6-6603-4fc6-946a-8b9ffcc93480\\\", \\\"client_invoice_id\\\": \\\"FACTURA-2026-0042\\\", \\\"record_type\\\": \\\"creation\\\", \\\"sif_id\\\": \\\"0995c42c-6708-44fb-bfbf-b363a5fe873e\\\", \\\"sender_company_name\\\": \\\"Ferretería Ejemplo, S.L.\\\", \\\"sender_tax_id_number\\\": \\\"B12345678\\\", \\\"fiscal_year\\\": 2026, \\\"full_invoice_number\\\": \\\"F-2026-0042\\\", \\\"fingerprint\\\": \\\"8f3d7aa5530f5f6c3a96a5c8a9516a7fd9ce90b9bf3b60375682d8b45ca72867\\\", \\\"csv\\\": \\\"CSV-DE-EJEMPLO\\\", \\\"vf_post_status\\\": \\\"success\\\", \\\"vf_record_registration_status\\\": \\\"success\\\", \\\"has_warnings\\\": false, \\\"vf_error_descriptions\\\": null, \\\"vf_response_body\\\": \\\"PHhtbD5SZXNwdWVzdGEgZGUgZWplbXBsbzwveG1sPg==\\\", \\\"qr_value\\\": \\\"https://www2.agenciatributaria.gob.es/wlpl/TIKE-CONT/ValidarQR?nif=B12345678\u0026numserie=F-2026-0042\u0026fecha=01-09-2026\u0026importe=121.00\\\", \\\"qr_image_url\\\": \\\"https://devapi.kubifactu.com/api/invoices/7d76c4a6-6603-4fc6-946a-8b9ffcc93480/qr-image\\\", \\\"xml_url\\\": \\\"https://devapi.kubifactu.com/api/invoices/7d76c4a6-6603-4fc6-946a-8b9ffcc93480/xml\\\", \\\"recovery\\\": { \\\"status\\\": \\\"resolved\\\", \\\"reason_code\\\": null, \\\"message\\\": \\\"Automatic recovery has finished. Check the registration status for the result.\\\", \\\"attempts\\\": 1, \\\"next_attempt_at\\\": null } } ] El contrato completo de cada elemento se detalla en el campo callback_url de la petición. Este callback es independiente de la respuesta HTTP inmediata del endpoint.\",\"url\":\"https://apidocs.kubifactu.com/openapi-reference/enviar-registros-de-facturaci%C3%B3n-en-lote\",\"mainEntityOfPage\":{\"@id\":\"https://apidocs.kubifactu.com/openapi-reference/enviar-registros-de-facturaci%C3%B3n-en-lote#webpage\"},\"dateModified\":\"2026-10-27T22:36:06.295Z\",\"publisher\":{\"@id\":\"https://apidocs.kubifactu.com/#organization\"},\"isPartOf\":{\"@id\":\"https://apidocs.kubifactu.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"KubiFactu Docs\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"KubiFactu Docs","nav":{"global":null,"tabs":[{"tab":"Inicio","pages":[{"title":"Inicio","href":"/changelog"}]},{"tab":"Referencia de la API","groups":[{"group":"API Reference","pages":[{"title":"Listar registros de facturación con filtros","deprecated":null,"version":null,"openapi":"/api-reference/openapi/openapi.yaml get /api/invoices","href":"/openapi-reference/listar-registros-de-facturación-con-filtros"},{"title":"Enviar registro de facturación","deprecated":null,"version":null,"openapi":"/api-reference/openapi/openapi.yaml post /api/invoices","href":"/openapi-reference/enviar-registro-de-facturación"},{"title":"Enviar registro de facturación diferido","description":"Generación de un nuevo registro de facturación diferido.","deprecated":null,"version":null,"openapi":"/api-reference/openapi/openapi.yaml post /api/invoices/deferred","href":"/openapi-reference/enviar-registro-de-facturación-diferido"},{"title":"Enviar registros de facturación en lote","deprecated":null,"version":null,"openapi":"/api-reference/openapi/openapi.yaml post /api/invoices/batch","href":"/openapi-reference/enviar-registros-de-facturación-en-lote"},{"title":"Obtener registro de facturación","description":"Obtener información sobre un registro de facturación.\n> Este endpoint **no hace consulta a Veri*Factu**; los datos se devuelven directamente desde nuestra base de datos.\n","deprecated":null,"version":null,"openapi":"/api-reference/openapi/openapi.yaml get /api/invoices/{invoiceId}","href":"/openapi-reference/obtener-registro-de-facturación"},{"title":"Descargar XML del registro de facturación","deprecated":null,"version":null,"openapi":"/api-reference/openapi/openapi.yaml get /api/invoices/{invoiceId}/xml","href":"/openapi-reference/descargar-xml-del-registro-de-facturación"},{"title":"Descargar imagen QR del registro de facturación","deprecated":null,"version":null,"openapi":"/api-reference/openapi/openapi.yaml get /api/invoices/{invoiceId}/qr-image","href":"/openapi-reference/descargar-imagen-qr-del-registro-de-facturación"},{"title":"Consultar registro de facturación con Veri*Factu","deprecated":null,"version":null,"openapi":"/api-reference/openapi/openapi.yaml get /api/invoices/{invoiceId}/query","href":"/openapi-reference/consultar-registro-de-facturación-con-veri*factu"},{"title":"Reenviar registro de facturación","deprecated":null,"version":null,"openapi":"/api-reference/openapi/openapi.yaml get /api/invoices/{invoiceId}/resubmit","href":"/openapi-reference/reenviar-registro-de-facturación"},{"title":"Anular registro de facturación","deprecated":null,"version":null,"openapi":"/api-reference/openapi/openapi.yaml post /api/invoices/{invoiceId}/cancel","href":"/openapi-reference/anular-registro-de-facturación"},{"title":"Anular registro de facturación en diferido","deprecated":null,"version":null,"openapi":"/api-reference/openapi/openapi.yaml post /api/invoices/{invoiceId}/deferredcancel","href":"/openapi-reference/anular-registro-de-facturación-en-diferido"},{"title":"Obtener lista de empresas","deprecated":null,"version":null,"openapi":"/api-reference/openapi/openapi.yaml get /api/clientcompanies","href":"/openapi-reference/obtener-lista-de-empresas"},{"title":"Crear una nueva empresa","deprecated":null,"version":null,"openapi":"/api-reference/openapi/openapi.yaml post /api/clientcompanies","href":"/openapi-reference/crear-una-nueva-empresa"},{"title":"Obtener datos de empresa","deprecated":null,"version":null,"openapi":"/api-reference/openapi/openapi.yaml get /api/clientcompanies/{companyId}","href":"/openapi-reference/obtener-datos-de-empresa"},{"title":"Editar empresa","deprecated":null,"version":null,"openapi":"/api-reference/openapi/openapi.yaml post /api/clientcompanies/{companyId}","href":"/openapi-reference/editar-empresa"},{"title":"Obtener operaciones de una empresa","deprecated":null,"version":null,"openapi":"/api-reference/openapi/openapi.yaml get /api/clientcompanies/{companyId}/requests","href":"/openapi-reference/obtener-operaciones-de-una-empresa"},{"title":"Obtener SIFs de empresa","deprecated":null,"version":null,"openapi":"/api-reference/openapi/openapi.yaml get /api/clientcompanies/{companyId}/sifs","href":"/openapi-reference/obtener-sifs-de-empresa"},{"title":"Nuevo SIF de empresa","deprecated":null,"version":null,"openapi":"/api-reference/openapi/openapi.yaml post /api/clientcompanies/{companyId}/sifs","href":"/openapi-reference/nuevo-sif-de-empresa"},{"title":"Subir documentos de autorización","deprecated":null,"version":null,"openapi":"/api-reference/openapi/openapi.yaml post /api/clientcompanies/{companyId}/authorization-documents","href":"/openapi-reference/subir-documentos-de-autorización"},{"title":"Estado del servicio Veri*Factu","deprecated":null,"version":null,"openapi":"/api-reference/openapi/openapi.yaml get /api/verifactu/health","href":"/openapi-reference/estado-del-servicio-veri*factu"},{"title":"Eliminar SIF","deprecated":null,"version":null,"openapi":"/api-reference/openapi/openapi.yaml delete /api/sifs/{sifId}","href":"/openapi-reference/eliminar-sif"}]}]},{"tab":"Endpoints de KubiBAI","pages":[{"title":"Endpoints de KubiBAI","href":"/openapi-kubibai-reference/enviar-registro-de-facturación"}]},{"tab":"Otros endpoints","pages":[{"title":"Otros endpoints","href":"/openapi-common/buscar-registros-de-facturación"}]},{"tab":"Ejemplos","pages":[{"title":"Ejemplos","href":"/api-reference/facturas/examples/basic"}]}]},"basePath":"","title":"Enviar registros de facturación en lote - KubiFactu Docs","buildId":"dpl_36EDyZCDfRuoUD9af5CH4M1bqY2h","deploymentId":"dpl_36EDyZCDfRuoUD9af5CH4M1bqY2h","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-DCDCdBVX.js","utils-ME8dDnLe.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-0e84ACsd.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-wgRBj-ia.js","snippetPresets-C11Sgb-o.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-C0lapOpP.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-ZeRQV8fF.js","shallow-BupWh095.js","getApiPlaygroundDisplay-BnYQO2Ss.js","CodeSnippet-RKKOc8c_.js","CodeSnippets-Drf_m8wS.js","Page-Bevw23-4.js","getPastedJson-u6QiPzNZ.js","icon-Bb-CBSxO.js","MethodPill-F7l5AI7V.js","DuplicateIcon-IiAXkdSg.js","createIcon-FliI8EBc.js","DynamicMarkdown-B62XqCSI.js","SectionHeading-Dj31pT03.js","axios-vUo_bRtp.js","Markdown-BOgQCTwD.js","clsx-BIWXJmsZ.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-DKZWslLH.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-UDqbR6xh.js"]}