{
"data": {
"error": {
"message": "No client with API-KEY '5tVySMGJOpq8HfMgIX28Qz6kF0dFOoq37x55PLZcWsGeGeYkNgJyAcRTlFJ5NbVoDRm8qtCywEoiN3A9JkBanMBXYmxiqR3BItxgxx' was found.",
"errors": null,
"details": null
}
}
}
{
"data": {
"error": {
"message": "Client Company with id [0195fa87-a315-710a-8aa2-25e1d690f6tr] not found.",
"errors": null,
"details": {
"request_id": "9ded9e2c-d59e-4432-a926-652cbcfac365"
}
}
}
}
{
"data": {
"error": {
"code": "E-INVOICE-SUBMISSION-BLOCKED",
"message": "El resultado de este envío está pendiente de confirmación. Consulta su estado en Veri*Factu antes de reenviarlo.",
"errors": {
"reason": "pending_reconciliation",
"blocking_invoice_id": "9db6bb78-6799-4abb-b9a0-22d127c543ed"
},
"details": null
}
}
}
{
"data": {
"error": {
"message": "The given data was invalid.",
"errors": {
"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]."
]
},
"details": {
"request_id": "9ded9e2c-d59e-4432-a926-652cbcfac365"
}
}
}
}
{
"data": {
"error": {
"code": "E-SERVICE-BUSY",
"message": "Another invoice submission is being processed for this company. Please retry.",
"errors": {
"retry_after": 5
},
"details": null
}
}
}
API Reference
Reenviar registro de facturación
Reenvía un registro de facturación a Veri*Factu sin volver a generarlo. Este endpoint es útil para registros que fallaron por un problema técnico de conexión (timeout, error del servidor o falta de respuesta) en el envío inicial.
Ante un resultado incierto, consulta el estado del mismo registro antes de decidir reenviarlo. Un timeout identificable se guarda como vf_post_status = failure y vf_record_registration_status = unknown y activa la conciliación obligatoria: KubiFACTU consulta el registro en la AEAT por sí mismo.
La conciliación obligatoria bloquea el reenvío con HTTP 409 y motivo pending_reconciliation hasta aclarar el resultado: se aplica a la marca interna recovery_reconciliation_pending y al caso de envío success con registro unknown, incluidos registros históricos. Un timeout identificable la activa; los duplicados 3000/3001 y las respuestas inutilizables o desconocidas pueden exigirla. El UUID de bloqueo puede ser el propio registro; los bloqueos por registros anteriores de la misma empresa cliente y SIF mantienen los motivos pending_submission y unresolved_submission.
El flujo de comprobar el estado y confirmar el reenvío en dos clics corresponde al panel, no a este endpoint. La API conserva sus operaciones y autenticación y no impone la comprobación previa del panel para failure + unknown sin conciliación pendiente. Tras un timeout, los envíos iniciales directos y los reenvíos consultan el registro en el momento, y los envíos diferidos, poco después; si la consulta no obtiene un resultado definitivo, se repite periódicamente con un número limitado de intentos. Leer más en la FAQ.
Si el registro ya tiene un CSV guardado, el reenvío no lo borra cuando la nueva respuesta de la AEAT no incluye uno (por ejemplo, ante un registro duplicado) ni cuando el envío falla sin respuesta. Un CSV nuevo sí sustituye al anterior.
Se llama a la URL de callback del registro si se incluyó en el momento de su alta.
Registros en recuperación automática
KubiFACTU reintenta el registro por su cuenta y no hace falta reenviarlo. El reenvío manual sirve sobre todo para desbloquear un registro en attention después de corregir la causa. Según recovery.status:
retry y attention: se admite el reenvío. Si vuelve a fallar por una causa temporal, KubiFACTU retoma los reintentos automáticos.
pending: se admite solo si el registro ya se envió. Un diferido que todavía espera su primer envío devuelve HTTP 422.
processing y resolved: devuelve HTTP 422.
Mientras la conciliación del registro está pendiente, devuelve HTTP 409 con motivo pending_reconciliation.
GET
/
api
/
invoices
/
{invoiceId}
/
resubmit
Reenviar registro de facturación
curl --request GET \ --url https://api.kubifactu.com/api/invoices/{invoiceId}/resubmit \ --header 'X-Qbikode-ClientApiKey: <api-key>'
{
"data": {
"error": {
"message": "No client with API-KEY '5tVySMGJOpq8HfMgIX28Qz6kF0dFOoq37x55PLZcWsGeGeYkNgJyAcRTlFJ5NbVoDRm8qtCywEoiN3A9JkBanMBXYmxiqR3BItxgxx' was found.",
"errors": null,
"details": null
}
}
}
{
"data": {
"error": {
"message": "Client Company with id [0195fa87-a315-710a-8aa2-25e1d690f6tr] not found.",
"errors": null,
"details": {
"request_id": "9ded9e2c-d59e-4432-a926-652cbcfac365"
}
}
}
}
{
"data": {
"error": {
"code": "E-INVOICE-SUBMISSION-BLOCKED",
"message": "El resultado de este envío está pendiente de confirmación. Consulta su estado en Veri*Factu antes de reenviarlo.",
"errors": {
"reason": "pending_reconciliation",
"blocking_invoice_id": "9db6bb78-6799-4abb-b9a0-22d127c543ed"
},
"details": null
}
}
}
{
"data": {
"error": {
"message": "The given data was invalid.",
"errors": {
"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]."
]
},
"details": {
"request_id": "9ded9e2c-d59e-4432-a926-652cbcfac365"
}
}
}
}
{
"data": {
"error": {
"code": "E-SERVICE-BUSY",
"message": "Another invoice submission is being processed for this company. Please retry.",
"errors": {
"retry_after": 5
},
"details": null
}
}
}
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.
ID de la factura. Este ID se obtiene en la respuesta a las altas de registros de facturación o puede usarse el identificador único de la factura dentro del sistema del cliente si en la creación del registro de facturación se hizo uso del campo client_invoice_id. El ID también se puede obtener desde el panel web, accediendo a la factura en el campo ID DE KUBIFACTU.
{"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/reenviar-registro-de-facturación","slug":"/openapi-reference/reenviar-registro-de-facturación","pageMetadata":{"title":"Reenviar registro de facturación","description":"Reenvía un registro de facturación a Veri*Factu sin volver a generarlo. Este endpoint es útil para registros que fallaron **por un problema técnico de conexión** (timeout, error del servidor o falta de respuesta) en el envío inicial.\n\nAnte un resultado incierto, consulta el estado del mismo registro antes de decidir reenviarlo. Un timeout identificable se guarda como `vf_post_status = failure` y `vf_record_registration_status = unknown` y activa la conciliación obligatoria: KubiFACTU consulta el registro en la AEAT por sí mismo.\n\nLa conciliación obligatoria bloquea el reenvío con HTTP 409 y motivo `pending_reconciliation` hasta aclarar el resultado: se aplica a la marca interna `recovery_reconciliation_pending` y al caso de envío `success` con registro `unknown`, incluidos registros históricos. Un timeout identificable la activa; los duplicados 3000/3001 y las respuestas inutilizables o desconocidas pueden exigirla. El UUID de bloqueo puede ser el propio registro; los bloqueos por registros anteriores de la misma empresa cliente y SIF mantienen los motivos `pending_submission` y `unresolved_submission`.\n\nEl flujo de comprobar el estado y confirmar el reenvío en dos clics corresponde al panel, no a este endpoint. La API conserva sus operaciones y autenticación y no impone la comprobación previa del panel para `failure` + `unknown` sin conciliación pendiente. Tras un timeout, los envíos iniciales directos y los reenvíos consultan el registro en el momento, y los envíos diferidos, poco después; si la consulta no obtiene un resultado definitivo, se repite periódicamente con un número limitado de intentos. [Leer más en la FAQ](/faq).\n\nSi el registro ya tiene un CSV guardado, el reenvío no lo borra cuando la nueva respuesta de la AEAT no incluye uno (por ejemplo, ante un registro duplicado) ni cuando el envío falla sin respuesta. Un CSV nuevo sí sustituye al anterior.\n\nSe llama a la URL de callback del registro si se incluyó en el momento de su alta.\n\n### Registros en recuperación automática\n\nKubiFACTU reintenta el registro por su cuenta y no hace falta reenviarlo. El reenvío manual sirve sobre todo para desbloquear un registro en `attention` después de corregir la causa. Según `recovery.status`:\n\n- `retry` y `attention`: se admite el reenvío. Si vuelve a fallar por una causa temporal, KubiFACTU retoma los reintentos automáticos.\n- `pending`: se admite solo si el registro ya se envió. Un diferido que todavía espera su primer envío devuelve HTTP `422`.\n- `processing` y `resolved`: devuelve HTTP `422`.\n\nMientras la conciliación del registro está pendiente, devuelve HTTP `409` con motivo `pending_reconciliation`.\n","deprecated":null,"version":null,"openapi":"/api-reference/openapi/openapi.yaml get /api/invoices/{invoiceId}/resubmit","href":"/openapi-reference/reenviar-registro-de-facturación","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 a: \"a\",\n code: \"code\",\n h3: \"h3\",\n li: \"li\",\n p: \"p\",\n strong: \"strong\",\n ul: \"ul\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsxs(_components.p, {\n children: [\"Reenvía un registro de facturación a Veri*Factu sin volver a generarlo. Este endpoint es útil para registros que fallaron \", _jsx(_components.strong, {\n children: \"por un problema técnico de conexión\"\n }), \" (timeout, error del servidor o falta de respuesta) en el envío inicial.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Ante un resultado incierto, consulta el estado del mismo registro antes de decidir reenviarlo. Un timeout identificable se guarda como \", _jsx(_components.code, {\n children: \"vf_post_status = failure\"\n }), \" y \", _jsx(_components.code, {\n children: \"vf_record_registration_status = unknown\"\n }), \" y activa la conciliación obligatoria: KubiFACTU consulta el registro en la AEAT por sí mismo.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"La conciliación obligatoria bloquea el reenvío con HTTP 409 y motivo \", _jsx(_components.code, {\n children: \"pending_reconciliation\"\n }), \" hasta aclarar el resultado: se aplica a la marca interna \", _jsx(_components.code, {\n children: \"recovery_reconciliation_pending\"\n }), \" y al caso de envío \", _jsx(_components.code, {\n children: \"success\"\n }), \" con registro \", _jsx(_components.code, {\n children: \"unknown\"\n }), \", incluidos registros históricos. Un timeout identificable la activa; los duplicados 3000/3001 y las respuestas inutilizables o desconocidas pueden exigirla. El UUID de bloqueo puede ser el propio registro; los bloqueos por registros anteriores de la misma empresa cliente y SIF mantienen los motivos \", _jsx(_components.code, {\n children: \"pending_submission\"\n }), \" y \", _jsx(_components.code, {\n children: \"unresolved_submission\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"El flujo de comprobar el estado y confirmar el reenvío en dos clics corresponde al panel, no a este endpoint. La API conserva sus operaciones y autenticación y no impone la comprobación previa del panel para \", _jsx(_components.code, {\n children: \"failure\"\n }), \" + \", _jsx(_components.code, {\n children: \"unknown\"\n }), \" sin conciliación pendiente. Tras un timeout, los envíos iniciales directos y los reenvíos consultan el registro en el momento, y los envíos diferidos, poco después; si la consulta no obtiene un resultado definitivo, se repite periódicamente con un número limitado de intentos. \", _jsx(_components.a, {\n href: \"/faq\",\n children: \"Leer más en la FAQ\"\n }), \".\"]\n }), \"\\n\", _jsx(_components.p, {\n children: \"Si el registro ya tiene un CSV guardado, el reenvío no lo borra cuando la nueva respuesta de la AEAT no incluye uno (por ejemplo, ante un registro duplicado) ni cuando el envío falla sin respuesta. Un CSV nuevo sí sustituye al anterior.\"\n }), \"\\n\", _jsx(_components.p, {\n children: \"Se llama a la URL de callback del registro si se incluyó en el momento de su alta.\"\n }), \"\\n\", _jsx(_components.h3, {\n children: \"Registros en recuperación automática\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"KubiFACTU reintenta el registro por su cuenta y no hace falta reenviarlo. El reenvío manual sirve sobre todo para desbloquear un registro en \", _jsx(_components.code, {\n children: \"attention\"\n }), \" después de corregir la causa. Según \", _jsx(_components.code, {\n children: \"recovery.status\"\n }), \":\"]\n }), \"\\n\", _jsxs(_components.ul, {\n children: [\"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.code, {\n children: \"retry\"\n }), \" y \", _jsx(_components.code, {\n children: \"attention\"\n }), \": se admite el reenvío. Si vuelve a fallar por una causa temporal, KubiFACTU retoma los reintentos automáticos.\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.code, {\n children: \"pending\"\n }), \": se admite solo si el registro ya se envió. Un diferido que todavía espera su primer envío devuelve HTTP \", _jsx(_components.code, {\n children: \"422\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.code, {\n children: \"processing\"\n }), \" y \", _jsx(_components.code, {\n children: \"resolved\"\n }), \": devuelve HTTP \", _jsx(_components.code, {\n children: \"422\"\n }), \".\"]\n }), \"\\n\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Mientras la conciliación del registro está pendiente, devuelve HTTP \", _jsx(_components.code, {\n children: \"409\"\n }), \" con motivo \", _jsx(_components.code, {\n children: \"pending_reconciliation\"\n }), \".\"]\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};\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":"Reenviar registro de facturación","description":"Reenvía un registro de facturación a Veri*Factu sin volver a generarlo. Este endpoint es útil para registros que fallaron **por un problema técnico de conexión** (timeout, error del servidor o falta de respuesta) en el envío inicial.\n\nAnte un resultado incierto, consulta el estado del mismo registro antes de decidir reenviarlo. Un timeout identificable se guarda como `vf_post_status = failure` y `vf_record_registration_status = unknown` y activa la conciliación obligatoria: KubiFACTU consulta el registro en la AEAT por sí mismo.\n\nLa conciliación obligatoria bloquea el reenvío con HTTP 409 y motivo `pending_reconciliation` hasta aclarar el resultado: se aplica a la marca interna `recovery_reconciliation_pending` y al caso de envío `success` con registro `unknown`, incluidos registros históricos. Un timeout identificable la activa; los duplicados 3000/3001 y las respuestas inutilizables o desconocidas pueden exigirla. El UUID de bloqueo puede ser el propio registro; los bloqueos por registros anteriores de la misma empresa cliente y SIF mantienen los motivos `pending_submission` y `unresolved_submission`.\n\nEl flujo de comprobar el estado y confirmar el reenvío en dos clics corresponde al panel, no a este endpoint. La API conserva sus operaciones y autenticación y no impone la comprobación previa del panel para `failure` + `unknown` sin conciliación pendiente. Tras un timeout, los envíos iniciales directos y los reenvíos consultan el registro en el momento, y los envíos diferidos, poco después; si la consulta no obtiene un resultado definitivo, se repite periódicamente con un número limitado de intentos. [Leer más en la FAQ](/faq).\n\nSi el registro ya tiene un CSV guardado, el reenvío no lo borra cuando la nueva respuesta de la AEAT no incluye uno (por ejemplo, ante un registro duplicado) ni cuando el envío falla sin respuesta. Un CSV nuevo sí sustituye al anterior.\n\nSe llama a la URL de callback del registro si se incluyó en el momento de su alta.\n\n### Registros en recuperación automática\n\nKubiFACTU reintenta el registro por su cuenta y no hace falta reenviarlo. El reenvío manual sirve sobre todo para desbloquear un registro en `attention` después de corregir la causa. Según `recovery.status`:\n\n- `retry` y `attention`: se admite el reenvío. Si vuelve a fallar por una causa temporal, KubiFACTU retoma los reintentos automáticos.\n- `pending`: se admite solo si el registro ya se envió. Un diferido que todavía espera su primer envío devuelve HTTP `422`.\n- `processing` y `resolved`: devuelve HTTP `422`.\n\nMientras la conciliación del registro está pendiente, devuelve HTTP `409` con motivo `pending_reconciliation`.\n","deprecated":null,"version":null,"openapi":"/api-reference/openapi/openapi.yaml get /api/invoices/{invoiceId}/resubmit","href":"/openapi-reference/reenviar-registro-de-facturación","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"summary":"Reenviar registro de facturación","description":"Reenvía un registro de facturación a Veri*Factu sin volver a generarlo. Este endpoint es útil para registros que fallaron **por un problema técnico de conexión** (timeout, error del servidor o falta de respuesta) en el envío inicial.\n\nAnte un resultado incierto, consulta el estado del mismo registro antes de decidir reenviarlo. Un timeout identificable se guarda como `vf_post_status = failure` y `vf_record_registration_status = unknown` y activa la conciliación obligatoria: KubiFACTU consulta el registro en la AEAT por sí mismo.\n\nLa conciliación obligatoria bloquea el reenvío con HTTP 409 y motivo `pending_reconciliation` hasta aclarar el resultado: se aplica a la marca interna `recovery_reconciliation_pending` y al caso de envío `success` con registro `unknown`, incluidos registros históricos. Un timeout identificable la activa; los duplicados 3000/3001 y las respuestas inutilizables o desconocidas pueden exigirla. El UUID de bloqueo puede ser el propio registro; los bloqueos por registros anteriores de la misma empresa cliente y SIF mantienen los motivos `pending_submission` y `unresolved_submission`.\n\nEl flujo de comprobar el estado y confirmar el reenvío en dos clics corresponde al panel, no a este endpoint. La API conserva sus operaciones y autenticación y no impone la comprobación previa del panel para `failure` + `unknown` sin conciliación pendiente. Tras un timeout, los envíos iniciales directos y los reenvíos consultan el registro en el momento, y los envíos diferidos, poco después; si la consulta no obtiene un resultado definitivo, se repite periódicamente con un número limitado de intentos. [Leer más en la FAQ](/faq).\n\nSi el registro ya tiene un CSV guardado, el reenvío no lo borra cuando la nueva respuesta de la AEAT no incluye uno (por ejemplo, ante un registro duplicado) ni cuando el envío falla sin respuesta. Un CSV nuevo sí sustituye al anterior.\n\nSe llama a la URL de callback del registro si se incluyó en el momento de su alta.\n\n### Registros en recuperación automática\n\nKubiFACTU reintenta el registro por su cuenta y no hace falta reenviarlo. El reenvío manual sirve sobre todo para desbloquear un registro en `attention` después de corregir la causa. Según `recovery.status`:\n\n- `retry` y `attention`: se admite el reenvío. Si vuelve a fallar por una causa temporal, KubiFACTU retoma los reintentos automáticos.\n- `pending`: se admite solo si el registro ya se envió. Un diferido que todavía espera su primer envío devuelve HTTP `422`.\n- `processing` y `resolved`: devuelve HTTP `422`.\n\nMientras la conciliación del registro está pendiente, devuelve HTTP `409` con motivo `pending_reconciliation`.\n","operationId":"resubmitInvoiceRecord","parameters":["97517134-97cf-4e6a-8738-823e38944586"],"responses":{"200":"4381e76f-d1c5-45fb-9f27-ee92a214a5c6","403":"43b194a6-8284-4b62-af17-6c68f45a2d95","404":"f21a4a44-eae4-4165-b1fc-3c57227fe183","409":"f79de074-08d8-4542-9a82-ab8da4e2f16f","422":"8ad352e9-2b91-4038-901e-4d960ea7bdc5","500":"56b16fc3-4efe-47a8-8247-101c884ab9ac","503":"38bf1993-4456-4b9d-9f31-a9a5add7540c"},"security":["adfda133-c9e8-4abc-8711-0b282f2c7882"],"method":"get","type":"path","servers":["303ac0a5-79a3-4351-acb8-8f25fe88f3ee","c6f56d55-3c61-4255-bb06-871019b322ea"],"path":"/api/invoices/{invoiceId}/resubmit","baseUrlOptions":["https://api.kubifactu.com","https://devapi.kubifactu.com"],"title":"Reenviar registro de facturación","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"97517134-97cf-4e6a-8738-823e38944586":{"name":"invoiceId","in":"path","description":"ID de la factura. Este ID se obtiene en la respuesta a las altas de registros de facturación o puede usarse el identificador único de la factura **dentro del sistema del cliente** si en la creación del registro de facturación se hizo uso del campo `client_invoice_id`. El ID también se puede obtener desde el panel web, accediendo a la factura en el campo **ID DE KUBIFACTU**.\n","required":true,"schema":{"type":"string","isRequired":true,"description":"ID de la factura. Este ID se obtiene en la respuesta a las altas de registros de facturación o puede usarse el identificador único de la factura **dentro del sistema del cliente** si en la creación del registro de facturación se hizo uso del campo `client_invoice_id`. El ID también se puede obtener desde el panel web, accediendo a la factura en el campo **ID DE KUBIFACTU**.\n","uniqueKey":"","typeLabel":"string"}}},"responses":{"4381e76f-d1c5-45fb-9f27-ee92a214a5c6":{"description":"Registro de facturación reenviado con éxito.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Identificador (ID) de la factura en el sistema de **KubiFACTU**. Se utiliza para hacer referencia al registro de facturación desde otros endpoints como, por ejemplo, el de anulación de facturas.\n","uniqueKey":"data.id","typeLabel":"string\u003cuuid>"},"record_type":{"type":"string","description":"Tipo de registro de facturación:\n\n- `creation`: Se trata de un registro de alta.\n- `cancellation`: Se trata de un registro de anulación.\n","enum":["creation","cancellation"],"uniqueKey":"data.record_type","typeLabel":"enum\u003cstring>"},"request_id":{"type":"string","description":"Identificador de la petición como referencia para el soporte técnico.","example":"2cc8ef846029ec69613711ad1d85f6dfebf16ffb","uniqueKey":"data.request_id","typeLabel":"string"},"sif_id":{"type":"string","description":"ID del SIF utilizado para la creación del registro.","format":"uuid","example":"0995C42C-6708-44FB-BFBF-B363A5FE873E","uniqueKey":"data.sif_id","typeLabel":"string\u003cuuid>"},"fiscal_year":{"type":"integer","description":"Año fiscal de la factura.","uniqueKey":"data.fiscal_year","typeLabel":"integer"},"full_invoice_number":{"type":"string","description":"Número de la factura registrada.","uniqueKey":"data.full_invoice_number","typeLabel":"string"},"issue_date":{"type":"string","format":"date","example":"2026-09-15","description":"Fecha de expedición del registro de facturación.","uniqueKey":"data.issue_date","typeLabel":"string\u003cdate>"},"created_at":{"type":"string","format":"date-time","example":"2026-09-15T07:35:24.992854Z","description":"Fecha y hora de creación de la factura en nuestro sistema.","uniqueKey":"data.created_at","typeLabel":"string\u003cdate-time>"},"fingerprint":{"oneOf":[{"type":"string","description":"Huella SHA-256 del registro de facturación registrado.","uniqueKey":"data.fingerprint.oneOf.0","typeLabel":"string"},{"type":"null","description":"Huella SHA-256 del registro de facturación registrado.","uniqueKey":"data.fingerprint.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.fingerprint","typeLabel":"string | null"},"csv":{"oneOf":[{"type":"string","description":"Código Seguro de Verificación (CSV) que la AEAT emite en la respuesta a la remisión. Acredita la remisión, no cada registro individual.\n\n**Un `csv` vacío (`null`) no significa que el registro no esté acreditado.** La AEAT no devuelve el CSV en consultas posteriores, por lo que un registro aceptado puede no tenerlo; por ejemplo, cuando el resultado del envío no llegó (timeout o respuesta ilegible) y se confirmó después con una consulta de estado. Para saber si un registro está acreditado, usa `vf_record_registration_status`, no la presencia del `csv`.\n\nEn los envíos diferidos por lote, todos los registros del mismo envío comparten el mismo CSV, también los rechazados. Solo se omite si la AEAT rechaza todos los registros del envío.\n\nUn reenvío no borra un CSV ya guardado cuando la nueva respuesta no incluye uno. Un CSV nuevo sustituye al anterior. [Leer más en la FAQ](/faq).\n","uniqueKey":"data.csv.oneOf.0","typeLabel":"string"},{"type":"null","description":"Código Seguro de Verificación (CSV) que la AEAT emite en la respuesta a la remisión. Acredita la remisión, no cada registro individual.\n\n**Un `csv` vacío (`null`) no significa que el registro no esté acreditado.** La AEAT no devuelve el CSV en consultas posteriores, por lo que un registro aceptado puede no tenerlo; por ejemplo, cuando el resultado del envío no llegó (timeout o respuesta ilegible) y se confirmó después con una consulta de estado. Para saber si un registro está acreditado, usa `vf_record_registration_status`, no la presencia del `csv`.\n\nEn los envíos diferidos por lote, todos los registros del mismo envío comparten el mismo CSV, también los rechazados. Solo se omite si la AEAT rechaza todos los registros del envío.\n\nUn reenvío no borra un CSV ya guardado cuando la nueva respuesta no incluye uno. Un CSV nuevo sustituye al anterior. [Leer más en la FAQ](/faq).\n","uniqueKey":"data.csv.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.csv","typeLabel":"string | null"},"vf_post_status":{"oneOf":[{"type":"string","description":"Este campo indica si la factura ha sido enviada a Veri*Factu, pero no indica si el registro ha sido aceptado.\nLos valores posibles son:\n\n- `success`: Se ha realizado el envío a Veri*Factu.\n- `failure`: Ha fallado el envío a Veri*Factu o Veri*Factu ha respondido con un error que se resuelve reenviando el mismo registro. Un timeout identificable se combina con `vf_record_registration_status = unknown`: no demuestra que la AEAT no haya recibido el registro y activa la conciliación obligatoria.\n","enum":["success","failure"],"uniqueKey":"data.vf_post_status.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Este campo indica si la factura ha sido enviada a Veri*Factu, pero no indica si el registro ha sido aceptado.\nLos valores posibles son:\n\n- `success`: Se ha realizado el envío a Veri*Factu.\n- `failure`: Ha fallado el envío a Veri*Factu o Veri*Factu ha respondido con un error que se resuelve reenviando el mismo registro. Un timeout identificable se combina con `vf_record_registration_status = unknown`: no demuestra que la AEAT no haya recibido el registro y activa la conciliación obligatoria.\n","enum":["success","failure"],"uniqueKey":"data.vf_post_status.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.vf_post_status","typeLabel":"enum\u003cstring> | null"},"vf_record_registration_status":{"oneOf":[{"type":"string","description":"Valores posibles para el campo `vf_record_registration_status`, que indican el estado del registro en Veri*Factu.\n\n- `success`: El registro ha sido correctamente registrado en Veri*Factu.\n- `accepted_with_errors`: El registro ha sido registrado en Veri*Factu, pero tiene **errores que deben ser subsanados**.\n- `failed`: El registro tiene errores no aceptables y ha sido **rechazado** por Veri*Factu. Incluye los errores SOAP causados por el NIF o el nombre del obligado a emitir o del representante.\n- `not_registered`: No se ha encontrado el registro en Veri*Factu.\n- `cancelled`: El registro está anulado.\n- `unknown`: Se desconoce el estado del registro. Puede acompañar a `vf_post_status = failure` tras un timeout identificable. Tras un timeout o con el envío en `success`, exige conciliación antes del reenvío manual.\n","enum":["success","accepted_with_errors","failed","not_registered","cancelled","unknown"],"uniqueKey":"data.vf_record_registration_status.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Valores posibles para el campo `vf_record_registration_status`, que indican el estado del registro en Veri*Factu.\n\n- `success`: El registro ha sido correctamente registrado en Veri*Factu.\n- `accepted_with_errors`: El registro ha sido registrado en Veri*Factu, pero tiene **errores que deben ser subsanados**.\n- `failed`: El registro tiene errores no aceptables y ha sido **rechazado** por Veri*Factu. Incluye los errores SOAP causados por el NIF o el nombre del obligado a emitir o del representante.\n- `not_registered`: No se ha encontrado el registro en Veri*Factu.\n- `cancelled`: El registro está anulado.\n- `unknown`: Se desconoce el estado del registro. Puede acompañar a `vf_post_status = failure` tras un timeout identificable. Tras un timeout o con el envío en `success`, exige conciliación antes del reenvío manual.\n","enum":["success","accepted_with_errors","failed","not_registered","cancelled","unknown"],"uniqueKey":"data.vf_record_registration_status.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.vf_record_registration_status","typeLabel":"enum\u003cstring> | null"},"has_warnings":{"type":"boolean","description":"Indica si el registro contiene errores que deban ser subsanados.","example":false,"uniqueKey":"data.has_warnings","typeLabel":"boolean"},"vf_error_descriptions":{"oneOf":[{"type":"string","description":"Cadena con la descripción de los errores devueltos por Veri*Factu.","uniqueKey":"data.vf_error_descriptions.oneOf.0","typeLabel":"string"},{"type":"null","description":"Cadena con la descripción de los errores devueltos por Veri*Factu.","uniqueKey":"data.vf_error_descriptions.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.vf_error_descriptions","typeLabel":"string | null"},"next_request_waiting_time":{"type":"integer","description":"Tiempo que se debe esperar en segundos para que la empresa cliente pueda enviar una nueva petición.","uniqueKey":"data.next_request_waiting_time","typeLabel":"integer"},"next_request_datetime":{"type":"string","format":"date-time","example":"1977-04-22T06:00:00Z","description":"Fecha y hora en la que la empresa cliente pueda enviar una nueva petición en formato ISO-8601 (ej.- 1977-04-22T06:00:00Z) con zona horaria UTC.","uniqueKey":"data.next_request_datetime","typeLabel":"string\u003cdate-time>"},"qr_value":{"oneOf":[{"type":"string","format":"uri","description":"URL que debe mostrarse en el QR de las facturas procesadas con Veri*Factu. Esta URL sirve para que el receptor de la factura pueda validar que esta ha sido correctamente enviada a Veri*Factu. Este campo será `null` cuando Veri*Factu rechace el registro de facturación.","uniqueKey":"data.qr_value.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","format":"uri","description":"URL que debe mostrarse en el QR de las facturas procesadas con Veri*Factu. Esta URL sirve para que el receptor de la factura pueda validar que esta ha sido correctamente enviada a Veri*Factu. Este campo será `null` cuando Veri*Factu rechace el registro de facturación.","uniqueKey":"data.qr_value.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.qr_value","typeLabel":"string\u003curi> | null"},"qr_image_url":{"oneOf":[{"type":"string","format":"uri","description":"URL para descargar la imagen PNG del 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). La petición debe incluir el header `X-Qbikode-ClientApiKey`. Este campo será `null` cuando Veri*Factu rechace el registro de facturación o no aplique mostrar QR.","uniqueKey":"data.qr_image_url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","format":"uri","description":"URL para descargar la imagen PNG del 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). La petición debe incluir el header `X-Qbikode-ClientApiKey`. Este campo será `null` cuando Veri*Factu rechace el registro de facturación o no aplique mostrar QR.","uniqueKey":"data.qr_image_url.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.qr_image_url","typeLabel":"string\u003curi> | null"},"xml_url":{"oneOf":[{"type":"string","format":"uri","description":"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). La petición debe incluir el header `X-Qbikode-ClientApiKey`. Este campo será `null` cuando el XML aún no esté disponible, por ejemplo en registros de facturación en diferido pendientes de procesar.","uniqueKey":"data.xml_url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","format":"uri","description":"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). La petición debe incluir el header `X-Qbikode-ClientApiKey`. Este campo será `null` cuando el XML aún no esté disponible, por ejemplo en registros de facturación en diferido pendientes de procesar.","uniqueKey":"data.xml_url.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.xml_url","typeLabel":"string\u003curi> | null"},"vf_response_body":{"oneOf":[{"type":"string","format":"byte","description":"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. Este campo será `null` para facturas en diferido que aún no han sido procesadas o cuando no se haya recibido respuesta de Veri*Factu.","uniqueKey":"data.vf_response_body.oneOf.0","typeLabel":"string\u003cbyte>"},{"type":"null","format":"byte","description":"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. Este campo será `null` para facturas en diferido que aún no han sido procesadas o cuando no se haya recibido respuesta de Veri*Factu.","uniqueKey":"data.vf_response_body.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.vf_response_body","typeLabel":"string\u003cbyte> | null"},"recovery":{"oneOf":[{"type":"object","description":"Estado de la [recuperación automática de envíos](/faq#¿qué-es-la-recuperación-automática-de-envíos) del registro. Siempre está presente. Vale `null` cuando la recuperación automática no sigue el registro, y en ese caso puedes ignorarlo. Va relleno en los registros diferidos desde su creación y en los envíos inmediatos cuyo resultado dejó la cadena esperando. Un envío inmediato aceptado, o rechazado de forma definitiva por la AEAT, lleva `recovery: null`.\n","required":["status","reason_code","message","attempts","next_attempt_at"],"properties":{"status":{"type":"string","description":"Estado de la recuperación:\n\n- `pending`: el registro espera su envío. Si `reason_code` tiene valor, espera detrás de un registro anterior con una incidencia.\n- `processing`: KubiFACTU está enviando o consultando el registro.\n- `retry`: el último intento falló y KubiFACTU lo repetirá en `next_attempt_at`.\n- `resolved`: la recuperación ha terminado. **No significa que la AEAT haya aceptado el registro.** El resultado está en `vf_record_registration_status`. Por ejemplo, un alta que la AEAT rechaza como duplicada (código 3000) porque ya tiene registrada otra alta anterior de la misma factura termina en `resolved` con `vf_record_registration_status = failed`. Si el registro no guardaba la descripción del error de la AEAT, como ocurre en los diferidos y los reenvíos, `vf_error_descriptions` muestra «3000 - La AEAT ya tiene registrada otra alta de esta factura.».\n- `attention`: KubiFACTU ha detenido los reintentos y el registro necesita intervención. Corrige la causa y solicita el [reenvío](/openapi-reference/reenviar-registro-de-facturación).\n\nMientras el estado no es `resolved`, el registro bloquea la cadena: el siguiente envío inmediato de la misma empresa cliente y SIF recibe HTTP `409`.\n","enum":["pending","processing","retry","resolved","attention"],"example":"retry","isRequired":true,"uniqueKey":"data.recovery.oneOf.0.status","typeLabel":"enum\u003cstring>"},"reason_code":{"oneOf":[{"type":"string","description":"Motivo del último fallo, que decide qué hace KubiFACTU. Es `null` en `resolved` y en un registro `pending` sin incidencia delante. En `pending` con valor, es el motivo de la incidencia del registro anterior que bloquea la cadena.\n\n- `temporary_service_error`: conexión sin respuesta, timeout, HTTP 429 o 5xx, una página HTML en lugar de la respuesta SOAP o un código técnico de la AEAT. Se reintenta al cabo de 1, 5 y 15 minutos, y después cada 30 minutos, sin límite.\n- `remote_certificate_verification_error`: la AEAT no puede verificar el certificado presentado (código 4108). Se reintenta con el mismo calendario.\n- `unexpected_error`: un error o un código que KubiFACTU no reconoce. Se reintenta al cabo de 1 y 5 minutos.\n- `unexpected_error_limit_reached`: tercer fallo inesperado consecutivo. Pasa a `attention`.\n- `local_configuration_error`: certificado o configuración local incompleta o no válida. Pasa a `attention`.\n- `invalid_xml`: la AEAT rechaza el XML o un campo de la cabecera que genera KubiFACTU. Pasa a `attention`.\n- `authorization_error`: falta de autorización para remitir (código 4112, HTTP 401 o 403). Pasa a `attention`.\n- `service_suspended`: servicio suspendido (código 4141). Pasa a `attention`.\n","enum":["temporary_service_error","remote_certificate_verification_error","unexpected_error","unexpected_error_limit_reached","local_configuration_error","invalid_xml","authorization_error","service_suspended"],"example":"temporary_service_error","isRequired":true,"uniqueKey":"data.recovery.oneOf.0.reason_code.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Motivo del último fallo, que decide qué hace KubiFACTU. Es `null` en `resolved` y en un registro `pending` sin incidencia delante. En `pending` con valor, es el motivo de la incidencia del registro anterior que bloquea la cadena.\n\n- `temporary_service_error`: conexión sin respuesta, timeout, HTTP 429 o 5xx, una página HTML en lugar de la respuesta SOAP o un código técnico de la AEAT. Se reintenta al cabo de 1, 5 y 15 minutos, y después cada 30 minutos, sin límite.\n- `remote_certificate_verification_error`: la AEAT no puede verificar el certificado presentado (código 4108). Se reintenta con el mismo calendario.\n- `unexpected_error`: un error o un código que KubiFACTU no reconoce. Se reintenta al cabo de 1 y 5 minutos.\n- `unexpected_error_limit_reached`: tercer fallo inesperado consecutivo. Pasa a `attention`.\n- `local_configuration_error`: certificado o configuración local incompleta o no válida. Pasa a `attention`.\n- `invalid_xml`: la AEAT rechaza el XML o un campo de la cabecera que genera KubiFACTU. Pasa a `attention`.\n- `authorization_error`: falta de autorización para remitir (código 4112, HTTP 401 o 403). Pasa a `attention`.\n- `service_suspended`: servicio suspendido (código 4141). Pasa a `attention`.\n","enum":["temporary_service_error","remote_certificate_verification_error","unexpected_error","unexpected_error_limit_reached","local_configuration_error","invalid_xml","authorization_error","service_suspended"],"example":"temporary_service_error","isRequired":true,"uniqueKey":"data.recovery.oneOf.0.reason_code.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.recovery.oneOf.0.reason_code","typeLabel":"enum\u003cstring> | null"},"message":{"type":"string","description":"Descripción del estado, siempre en inglés. Usa `status` y `reason_code` para decidir qué hacer, no este texto.\n\nEn `retry` y `attention`, es el mensaje del motivo:\n\n- `temporary_service_error`: \"A temporary service or communication error prevented submission. KubiFactu will retry automatically.\"\n- `remote_certificate_verification_error`: \"The certificate presented to AEAT could not be verified. KubiFactu will retry automatically.\"\n- `unexpected_error`: \"An unexpected error prevented submission. KubiFactu will retry automatically a limited number of times.\"\n- `unexpected_error_limit_reached`: \"Automatic retries have stopped after three consecutive unexpected failures. This record remains unresolved. Contact KubiFactu support to investigate the issue.\"\n- `local_configuration_error`: \"Submission requires attention because the local configuration is incomplete or invalid. Correct the configuration and retry the record.\"\n- `invalid_xml`: \"Submission requires attention because the generated record is not valid XML for the configured schema. Contact KubiFactu support.\"\n- `authorization_error`: \"Submission requires attention because authorization failed. Review the credentials or certificate and retry the record.\"\n- `service_suspended`: \"Automatic submission is suspended for this service. Restore the service and retry the record.\"\n\nEn los demás casos depende del estado:\n\n- `pending`: \"Submission is pending.\" Si espera detrás de una incidencia anterior: \"Submission is waiting for an earlier incident to be resolved.\"\n- `processing`: \"Submission is being processed.\"\n- `resolved`: \"Automatic recovery has finished. Check the registration status for the result.\"\n- `retry` sin motivo: \"Submission will be retried automatically.\"\n- `attention` sin motivo: \"Submission requires intervention before it can continue.\"\n","example":"A temporary service or communication error prevented submission. KubiFactu will retry automatically.","isRequired":true,"uniqueKey":"data.recovery.oneOf.0.message","typeLabel":"string"},"attempts":{"type":"integer","description":"Número de envíos del registro a la AEAT dentro de la recuperación, incluido el envío inmediato que falló. Las consultas no cuentan. Un registro diferido recién creado tiene `0`.\n","example":1,"isRequired":true,"uniqueKey":"data.recovery.oneOf.0.attempts","typeLabel":"integer"},"next_attempt_at":{"oneOf":[{"type":"string","format":"date-time","description":"En `retry`, fecha y hora del siguiente intento, en formato ISO-8601 con zona horaria UTC. En `pending`, fecha y hora en la que el registro entró en la cola, no una cita para el envío. Es `null` en `processing`, `attention` y `resolved`.\n","example":"2026-10-22T08:30:24+00:00","isRequired":true,"uniqueKey":"data.recovery.oneOf.0.next_attempt_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"En `retry`, fecha y hora del siguiente intento, en formato ISO-8601 con zona horaria UTC. En `pending`, fecha y hora en la que el registro entró en la cola, no una cita para el envío. Es `null` en `processing`, `attention` y `resolved`.\n","example":"2026-10-22T08:30:24+00:00","isRequired":true,"uniqueKey":"data.recovery.oneOf.0.next_attempt_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.recovery.oneOf.0.next_attempt_at","typeLabel":"string\u003cdate-time> | null"}},"uniqueKey":"data.recovery.oneOf.0","typeLabel":"object"},{"type":"null","description":"Estado de la [recuperación automática de envíos](/faq#¿qué-es-la-recuperación-automática-de-envíos) del registro. Siempre está presente. Vale `null` cuando la recuperación automática no sigue el registro, y en ese caso puedes ignorarlo. Va relleno en los registros diferidos desde su creación y en los envíos inmediatos cuyo resultado dejó la cadena esperando. Un envío inmediato aceptado, o rechazado de forma definitiva por la AEAT, lleva `recovery: null`.\n","required":["status","reason_code","message","attempts","next_attempt_at"],"properties":{"status":{"type":"string","description":"Estado de la recuperación:\n\n- `pending`: el registro espera su envío. Si `reason_code` tiene valor, espera detrás de un registro anterior con una incidencia.\n- `processing`: KubiFACTU está enviando o consultando el registro.\n- `retry`: el último intento falló y KubiFACTU lo repetirá en `next_attempt_at`.\n- `resolved`: la recuperación ha terminado. **No significa que la AEAT haya aceptado el registro.** El resultado está en `vf_record_registration_status`. Por ejemplo, un alta que la AEAT rechaza como duplicada (código 3000) porque ya tiene registrada otra alta anterior de la misma factura termina en `resolved` con `vf_record_registration_status = failed`. Si el registro no guardaba la descripción del error de la AEAT, como ocurre en los diferidos y los reenvíos, `vf_error_descriptions` muestra «3000 - La AEAT ya tiene registrada otra alta de esta factura.».\n- `attention`: KubiFACTU ha detenido los reintentos y el registro necesita intervención. Corrige la causa y solicita el [reenvío](/openapi-reference/reenviar-registro-de-facturación).\n\nMientras el estado no es `resolved`, el registro bloquea la cadena: el siguiente envío inmediato de la misma empresa cliente y SIF recibe HTTP `409`.\n","enum":["pending","processing","retry","resolved","attention"],"example":"retry"},"reason_code":{"oneOf":[{"type":"string","description":"Motivo del último fallo, que decide qué hace KubiFACTU. Es `null` en `resolved` y en un registro `pending` sin incidencia delante. En `pending` con valor, es el motivo de la incidencia del registro anterior que bloquea la cadena.\n\n- `temporary_service_error`: conexión sin respuesta, timeout, HTTP 429 o 5xx, una página HTML en lugar de la respuesta SOAP o un código técnico de la AEAT. Se reintenta al cabo de 1, 5 y 15 minutos, y después cada 30 minutos, sin límite.\n- `remote_certificate_verification_error`: la AEAT no puede verificar el certificado presentado (código 4108). Se reintenta con el mismo calendario.\n- `unexpected_error`: un error o un código que KubiFACTU no reconoce. Se reintenta al cabo de 1 y 5 minutos.\n- `unexpected_error_limit_reached`: tercer fallo inesperado consecutivo. Pasa a `attention`.\n- `local_configuration_error`: certificado o configuración local incompleta o no válida. Pasa a `attention`.\n- `invalid_xml`: la AEAT rechaza el XML o un campo de la cabecera que genera KubiFACTU. Pasa a `attention`.\n- `authorization_error`: falta de autorización para remitir (código 4112, HTTP 401 o 403). Pasa a `attention`.\n- `service_suspended`: servicio suspendido (código 4141). Pasa a `attention`.\n","enum":["temporary_service_error","remote_certificate_verification_error","unexpected_error","unexpected_error_limit_reached","local_configuration_error","invalid_xml","authorization_error","service_suspended"],"example":"temporary_service_error"},{"type":"null","description":"Motivo del último fallo, que decide qué hace KubiFACTU. Es `null` en `resolved` y en un registro `pending` sin incidencia delante. En `pending` con valor, es el motivo de la incidencia del registro anterior que bloquea la cadena.\n\n- `temporary_service_error`: conexión sin respuesta, timeout, HTTP 429 o 5xx, una página HTML en lugar de la respuesta SOAP o un código técnico de la AEAT. Se reintenta al cabo de 1, 5 y 15 minutos, y después cada 30 minutos, sin límite.\n- `remote_certificate_verification_error`: la AEAT no puede verificar el certificado presentado (código 4108). Se reintenta con el mismo calendario.\n- `unexpected_error`: un error o un código que KubiFACTU no reconoce. Se reintenta al cabo de 1 y 5 minutos.\n- `unexpected_error_limit_reached`: tercer fallo inesperado consecutivo. Pasa a `attention`.\n- `local_configuration_error`: certificado o configuración local incompleta o no válida. Pasa a `attention`.\n- `invalid_xml`: la AEAT rechaza el XML o un campo de la cabecera que genera KubiFACTU. Pasa a `attention`.\n- `authorization_error`: falta de autorización para remitir (código 4112, HTTP 401 o 403). Pasa a `attention`.\n- `service_suspended`: servicio suspendido (código 4141). Pasa a `attention`.\n","enum":["temporary_service_error","remote_certificate_verification_error","unexpected_error","unexpected_error_limit_reached","local_configuration_error","invalid_xml","authorization_error","service_suspended"],"example":"temporary_service_error"}]},"message":{"type":"string","description":"Descripción del estado, siempre en inglés. Usa `status` y `reason_code` para decidir qué hacer, no este texto.\n\nEn `retry` y `attention`, es el mensaje del motivo:\n\n- `temporary_service_error`: \"A temporary service or communication error prevented submission. KubiFactu will retry automatically.\"\n- `remote_certificate_verification_error`: \"The certificate presented to AEAT could not be verified. KubiFactu will retry automatically.\"\n- `unexpected_error`: \"An unexpected error prevented submission. KubiFactu will retry automatically a limited number of times.\"\n- `unexpected_error_limit_reached`: \"Automatic retries have stopped after three consecutive unexpected failures. This record remains unresolved. Contact KubiFactu support to investigate the issue.\"\n- `local_configuration_error`: \"Submission requires attention because the local configuration is incomplete or invalid. Correct the configuration and retry the record.\"\n- `invalid_xml`: \"Submission requires attention because the generated record is not valid XML for the configured schema. Contact KubiFactu support.\"\n- `authorization_error`: \"Submission requires attention because authorization failed. Review the credentials or certificate and retry the record.\"\n- `service_suspended`: \"Automatic submission is suspended for this service. Restore the service and retry the record.\"\n\nEn los demás casos depende del estado:\n\n- `pending`: \"Submission is pending.\" Si espera detrás de una incidencia anterior: \"Submission is waiting for an earlier incident to be resolved.\"\n- `processing`: \"Submission is being processed.\"\n- `resolved`: \"Automatic recovery has finished. Check the registration status for the result.\"\n- `retry` sin motivo: \"Submission will be retried automatically.\"\n- `attention` sin motivo: \"Submission requires intervention before it can continue.\"\n","example":"A temporary service or communication error prevented submission. KubiFactu will retry automatically."},"attempts":{"type":"integer","description":"Número de envíos del registro a la AEAT dentro de la recuperación, incluido el envío inmediato que falló. Las consultas no cuentan. Un registro diferido recién creado tiene `0`.\n","example":1},"next_attempt_at":{"oneOf":[{"type":"string","format":"date-time","description":"En `retry`, fecha y hora del siguiente intento, en formato ISO-8601 con zona horaria UTC. En `pending`, fecha y hora en la que el registro entró en la cola, no una cita para el envío. Es `null` en `processing`, `attention` y `resolved`.\n","example":"2026-10-22T08:30:24+00:00"},{"type":"null","format":"date-time","description":"En `retry`, fecha y hora del siguiente intento, en formato ISO-8601 con zona horaria UTC. En `pending`, fecha y hora en la que el registro entró en la cola, no una cita para el envío. Es `null` en `processing`, `attention` y `resolved`.\n","example":"2026-10-22T08:30:24+00:00"}]}},"uniqueKey":"data.recovery.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.recovery","typeLabel":"object | null"}},"uniqueKey":"data","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"data":{"id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","record_type":"creation","request_id":"2cc8ef846029ec69613711ad1d85f6dfebf16ffb","sif_id":"0995C42C-6708-44FB-BFBF-B363A5FE873E","fiscal_year":123,"full_invoice_number":"\u003cstring>","issue_date":"2026-09-15","created_at":"2026-09-15T07:35:24.992854Z","fingerprint":"\u003cstring>","csv":"\u003cstring>","vf_post_status":"success","vf_record_registration_status":"success","has_warnings":false,"vf_error_descriptions":"\u003cstring>","next_request_waiting_time":123,"next_request_datetime":"1977-04-22T06:00:00Z","qr_value":"\u003cstring>","qr_image_url":"\u003cstring>","xml_url":"\u003cstring>","vf_response_body":"aSDinaTvuI8gbWludGxpZnk=","recovery":{"status":"retry","reason_code":"temporary_service_error","message":"A temporary service or communication error prevented submission. KubiFactu will retry automatically.","attempts":1,"next_attempt_at":"2026-10-22T08:30:24+00:00"}}}}},"exampleType":"generated"}},"exampleType":"generated"},"43b194a6-8284-4b62-af17-6c68f45a2d95":{"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"},"f21a4a44-eae4-4165-b1fc-3c57227fe183":{"description":"No encontrado. El registro de facturación con el ID indicado no existe.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"error":{"type":"object","properties":{"message":{"type":"string","description":"Mensaje detallado del error.","example":"Client Company with id [0195fa87-a315-710a-8aa2-25e1d690f6tr] not 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":{"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":{"Example":{"title":"Example","value":{"data":{"error":{"message":"Client Company with id [0195fa87-a315-710a-8aa2-25e1d690f6tr] not found.","errors":null,"details":{"request_id":"9ded9e2c-d59e-4432-a926-652cbcfac365"}}}}}},"exampleType":"generated"}},"exampleType":"generated"},"f79de074-08d8-4542-9a82-ab8da4e2f16f":{"description":"Reenvío bloqueado por conciliación pendiente del propio registro o por un registro anterior de la misma empresa cliente y SIF. No se reenvía el registro. Consulta el UUID indicado y resuelve el bloqueo antes de volver a solicitar el reenvío.\n","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message","errors","details"],"properties":{"code":{"type":"string","enum":["E-INVOICE-SUBMISSION-BLOCKED"],"description":"Código de bloqueo del envío por conciliación pendiente del propio registro o por un registro anterior de la cadena.","isRequired":true,"uniqueKey":"data.error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"Mensaje descriptivo del bloqueo.","isRequired":true,"uniqueKey":"data.error.message","typeLabel":"string"},"errors":{"type":"object","required":["reason","blocking_invoice_id"],"properties":{"reason":{"type":"string","enum":["pending_submission","unresolved_submission","pending_reconciliation"],"description":"Motivo del bloqueo:\n- `pending_submission`: el registro anterior está pendiente de envío.\n- `unresolved_submission`: el envío anterior necesita resolverse, por ejemplo tras un timeout, un resultado desconocido o una conciliación pendiente de un reenvío duplicado. También se aplica si se ha confirmado que el registro no está registrado y su envío sigue pendiente de resolver.\n- `pending_reconciliation`: el propio registro solicitado para reenvío necesita confirmar su resultado en la AEAT antes de permitir otro envío manual.\n","isRequired":true,"uniqueKey":"data.error.errors.reason","typeLabel":"enum\u003cstring>"},"blocking_invoice_id":{"type":"string","format":"uuid","description":"UUID en KubiFACTU del propio registro pendiente de conciliación si el motivo es `pending_reconciliation`; para `pending_submission` o `unresolved_submission`, identifica el primer registro anterior que bloquea la cadena de la misma empresa cliente y el mismo SIF.","isRequired":true,"uniqueKey":"data.error.errors.blocking_invoice_id","typeLabel":"string\u003cuuid>"}},"isRequired":true,"uniqueKey":"data.error.errors","typeLabel":"object"},"details":{"oneOf":[{"type":"object","enum":[null],"description":"Siempre es `null` en esta respuesta.","example":null,"isRequired":true,"uniqueKey":"data.error.details.oneOf.0","typeLabel":"object"},{"type":"null","enum":[null],"description":"Siempre es `null` en esta respuesta.","example":null,"isRequired":true,"uniqueKey":"data.error.details.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.error.details","typeLabel":"object | null"}},"isRequired":true,"uniqueKey":"data.error","typeLabel":"object"}},"isRequired":true,"uniqueKey":"data","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"pendingReconciliation":{"title":"pendingReconciliation","value":{"data":{"error":{"code":"E-INVOICE-SUBMISSION-BLOCKED","message":"El resultado de este envío está pendiente de confirmación. Consulta su estado en Veri*Factu antes de reenviarlo.","errors":{"reason":"pending_reconciliation","blocking_invoice_id":"9db6bb78-6799-4abb-b9a0-22d127c543ed"},"details":null}}}}},"exampleType":"examples"}},"exampleType":"examples"},"8ad352e9-2b91-4038-901e-4d960ea7bdc5":{"description":"Errores de validación. Posibles causas:\n- El registro no tiene huella generada (no se ha procesado correctamente).\n- El registro ya está registrado en Veri*Factu y no puede ser reenviado.\n- El registro es un diferido que todavía espera su primer envío.\n- El registro está en recuperación automática con `recovery.status` en `processing` o `resolved`.\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":{"Example":{"title":"Example","value":{"data":{"error":{"message":"The given data was invalid.","errors":{"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]."]},"details":{"request_id":"9ded9e2c-d59e-4432-a926-652cbcfac365"}}}}}},"exampleType":"generated"}},"exampleType":"generated"},"56b16fc3-4efe-47a8-8247-101c884ab9ac":{"description":"Error interno del servidor. Posibles causas:\n- Error de conexión con Veri*Factu.\n- Error al parsear la respuesta XML de Veri*Factu.\n- Error al generar el XML para Veri*Factu.\n","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}},"38bf1993-4456-4b9d-9f31-a9a5add7540c":{"description":"Otro envío de la misma empresa cliente está en curso. No se reenvía el registro. Vuelve a solicitar el reenvío pasados los segundos que indica `data.error.errors.retry_after`.\n","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message","errors","details"],"properties":{"code":{"type":"string","enum":["E-SERVICE-BUSY"],"description":"Otro envío de la misma empresa cliente está en curso.","isRequired":true,"uniqueKey":"data.error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"Mensaje descriptivo del error.","isRequired":true,"uniqueKey":"data.error.message","typeLabel":"string"},"errors":{"type":"object","required":["retry_after"],"properties":{"retry_after":{"type":"integer","description":"Segundos que conviene esperar antes de repetir la petición.","example":5,"isRequired":true,"uniqueKey":"data.error.errors.retry_after","typeLabel":"integer"}},"isRequired":true,"uniqueKey":"data.error.errors","typeLabel":"object"},"details":{"oneOf":[{"type":"object","enum":[null],"description":"Siempre es `null` en esta respuesta.","example":null,"isRequired":true,"uniqueKey":"data.error.details.oneOf.0","typeLabel":"object"},{"type":"null","enum":[null],"description":"Siempre es `null` en esta respuesta.","example":null,"isRequired":true,"uniqueKey":"data.error.details.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.error.details","typeLabel":"object | null"}},"isRequired":true,"uniqueKey":"data.error","typeLabel":"object"}},"isRequired":true,"uniqueKey":"data","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"example":{"data":{"error":{"code":"E-SERVICE-BUSY","message":"Another invoice submission is being processed for this company. Please retry.","errors":{"retry_after":5},"details":null}}},"examples":{"Example":{"title":"Example","value":{"data":{"error":{"code":"E-SERVICE-BUSY","message":"Another invoice submission is being processed for this company. Please retry.","errors":{"retry_after":5},"details":null}}}}},"exampleType":"examples"}},"exampleType":"examples"}},"security":{"adfda133-c9e8-4abc-8711-0b282f2c7882":{"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":"Reenviar registro de facturación - KubiFactu Docs","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-27T22:36:06.356Z","originalFileLocation":"openapi-reference/reenviar-registro-de-facturación.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=\"Reenvía un registro de facturación a Veri*Factu sin volver a generarlo. Este endpoint es útil para registros que fallaron por un problema técnico de conexión (timeout, error del servidor o falta de respuesta) en el envío inicial. Ante un resultado incierto, consulta el estado del mismo registro antes de decidir reenviarlo. Un timeout identificable se guarda como vf_post_status = failure y vf_record_registration_status = unknown y activa la conciliación obligatoria: KubiFACTU consulta el registro en la AEAT por sí mismo. La conciliación obligatoria bloquea el reenvío con HTTP 409 y motivo pending_reconciliation hasta aclarar el resultado: se aplica a la marca interna recovery_reconciliation_pending y al caso de envío success con registro unknown, incluidos registros históricos. Un timeout identificable la activa; los duplicados 3000/3001 y las respuestas inutilizables o desconocidas pueden exigirla. El UUID de bloqueo puede ser el propio registro; los bloqueos por registros anteriores de la misma empresa cliente y SIF mantienen los motivos pending_submission y unresolved_submission. El flujo de comprobar el estado y confirmar el reenvío en dos clics corresponde al panel, no a este endpoint. La API conserva sus operaciones y autenticación y no impone la comprobación previa del panel para failure + unknown sin conciliación pendiente. Tras un timeout, los envíos iniciales directos y los reenvíos consultan el registro en el momento, y los envíos diferidos, poco después; si la consulta no obtiene un resultado definitivo, se repite periódicamente con un número limitado de intentos. Leer más en la FAQ. Si el registro ya tiene un CSV guardado, el reenvío no lo borra cuando la nueva respuesta de la AEAT no incluye uno (por ejemplo, ante un registro duplicado) ni cuando el envío falla sin respuesta. Un CSV nuevo sí sustituye al anterior. Se llama a la URL de callback del registro si se incluyó en el momento de su alta. ### Registros en recuperación automática KubiFACTU reintenta el registro por su cuenta y no hace falta reenviarlo. El reenvío manual sirve sobre todo para desbloquear un registro en attention después de corregir la causa. Según recovery.status: - retry y attention: se admite el reenvío. Si vuelve a fallar por una causa temporal, KubiFACTU retoma los reintentos automáticos. - pending: se admite solo si el registro ya se envió. Un diferido que todavía espera su primer envío devuelve HTTP 422. - processing y resolved: devuelve HTTP 422. Mientras la conciliación del registro está pendiente, devuelve HTTP 409 con motivo pending_reconciliation.\">\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=\"Reenviar registro de facturación - KubiFactu Docs\">\u003cmeta data-mint-head property=\"og:description\" content=\"Reenvía un registro de facturación a Veri*Factu sin volver a generarlo. Este endpoint es útil para registros que fallaron por un problema técnico de conexión (timeout, error del servidor o falta de respuesta) en el envío inicial. Ante un resultado incierto, consulta el estado del mismo registro antes de decidir reenviarlo. Un timeout identificable se guarda como vf_post_status = failure y vf_record_registration_status = unknown y activa la conciliación obligatoria: KubiFACTU consulta el registro en la AEAT por sí mismo. La conciliación obligatoria bloquea el reenvío con HTTP 409 y motivo pending_reconciliation hasta aclarar el resultado: se aplica a la marca interna recovery_reconciliation_pending y al caso de envío success con registro unknown, incluidos registros históricos. Un timeout identificable la activa; los duplicados 3000/3001 y las respuestas inutilizables o desconocidas pueden exigirla. El UUID de bloqueo puede ser el propio registro; los bloqueos por registros anteriores de la misma empresa cliente y SIF mantienen los motivos pending_submission y unresolved_submission. El flujo de comprobar el estado y confirmar el reenvío en dos clics corresponde al panel, no a este endpoint. La API conserva sus operaciones y autenticación y no impone la comprobación previa del panel para failure + unknown sin conciliación pendiente. Tras un timeout, los envíos iniciales directos y los reenvíos consultan el registro en el momento, y los envíos diferidos, poco después; si la consulta no obtiene un resultado definitivo, se repite periódicamente con un número limitado de intentos. Leer más en la FAQ. Si el registro ya tiene un CSV guardado, el reenvío no lo borra cuando la nueva respuesta de la AEAT no incluye uno (por ejemplo, ante un registro duplicado) ni cuando el envío falla sin respuesta. Un CSV nuevo sí sustituye al anterior. Se llama a la URL de callback del registro si se incluyó en el momento de su alta. ### Registros en recuperación automática KubiFACTU reintenta el registro por su cuenta y no hace falta reenviarlo. El reenvío manual sirve sobre todo para desbloquear un registro en attention después de corregir la causa. Según recovery.status: - retry y attention: se admite el reenvío. Si vuelve a fallar por una causa temporal, KubiFACTU retoma los reintentos automáticos. - pending: se admite solo si el registro ya se envió. Un diferido que todavía espera su primer envío devuelve HTTP 422. - processing y resolved: devuelve HTTP 422. Mientras la conciliación del registro está pendiente, devuelve HTTP 409 con motivo pending_reconciliation.\">\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/reenviar-registro-de-facturación\">\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=Reenviar+registro+de+facturaci%C3%B3n\u0026amp;description=Reenv%C3%ADa+un+registro+de+facturaci%C3%B3n+a+Veri*Factu+sin+volver+a+generarlo.+Este+endpoint+es+%C3%BAtil+para+registros+que+fallaron+**por+un+problema+t%C3%A9cnico+de+conexi%C3%B3n*\u0026amp;theme=01d1c3eb4c7167906a629986\u0026amp;signature=7b41b2808f963a02f03c71de76683f51d34cec780c51da4abaa8cad6b7a2bbae\">\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=\"Reenviar registro de facturación - KubiFactu Docs\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Reenvía un registro de facturación a Veri*Factu sin volver a generarlo. Este endpoint es útil para registros que fallaron por un problema técnico de conexión (timeout, error del servidor o falta de respuesta) en el envío inicial. Ante un resultado incierto, consulta el estado del mismo registro antes de decidir reenviarlo. Un timeout identificable se guarda como vf_post_status = failure y vf_record_registration_status = unknown y activa la conciliación obligatoria: KubiFACTU consulta el registro en la AEAT por sí mismo. La conciliación obligatoria bloquea el reenvío con HTTP 409 y motivo pending_reconciliation hasta aclarar el resultado: se aplica a la marca interna recovery_reconciliation_pending y al caso de envío success con registro unknown, incluidos registros históricos. Un timeout identificable la activa; los duplicados 3000/3001 y las respuestas inutilizables o desconocidas pueden exigirla. El UUID de bloqueo puede ser el propio registro; los bloqueos por registros anteriores de la misma empresa cliente y SIF mantienen los motivos pending_submission y unresolved_submission. El flujo de comprobar el estado y confirmar el reenvío en dos clics corresponde al panel, no a este endpoint. La API conserva sus operaciones y autenticación y no impone la comprobación previa del panel para failure + unknown sin conciliación pendiente. Tras un timeout, los envíos iniciales directos y los reenvíos consultan el registro en el momento, y los envíos diferidos, poco después; si la consulta no obtiene un resultado definitivo, se repite periódicamente con un número limitado de intentos. Leer más en la FAQ. Si el registro ya tiene un CSV guardado, el reenvío no lo borra cuando la nueva respuesta de la AEAT no incluye uno (por ejemplo, ante un registro duplicado) ni cuando el envío falla sin respuesta. Un CSV nuevo sí sustituye al anterior. Se llama a la URL de callback del registro si se incluyó en el momento de su alta. ### Registros en recuperación automática KubiFACTU reintenta el registro por su cuenta y no hace falta reenviarlo. El reenvío manual sirve sobre todo para desbloquear un registro en attention después de corregir la causa. Según recovery.status: - retry y attention: se admite el reenvío. Si vuelve a fallar por una causa temporal, KubiFACTU retoma los reintentos automáticos. - pending: se admite solo si el registro ya se envió. Un diferido que todavía espera su primer envío devuelve HTTP 422. - processing y resolved: devuelve HTTP 422. Mientras la conciliación del registro está pendiente, devuelve HTTP 409 con motivo pending_reconciliation.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://kubicode.mintlify.app/_mintlify/api/og/v2?division=API+Reference\u0026amp;title=Reenviar+registro+de+facturaci%C3%B3n\u0026amp;description=Reenv%C3%ADa+un+registro+de+facturaci%C3%B3n+a+Veri*Factu+sin+volver+a+generarlo.+Este+endpoint+es+%C3%BAtil+para+registros+que+fallaron+**por+un+problema+t%C3%A9cnico+de+conexi%C3%B3n*\u0026amp;theme=01d1c3eb4c7167906a629986\u0026amp;signature=7b41b2808f963a02f03c71de76683f51d34cec780c51da4abaa8cad6b7a2bbae\">\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/reenviar-registro-de-facturación\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/openapi-reference/reenviar-registro-de-facturaci%C3%B3n.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/reenviar-registro-de-facturaci%C3%B3n#webpage\",\"url\":\"https://apidocs.kubifactu.com/openapi-reference/reenviar-registro-de-facturaci%C3%B3n\",\"name\":\"Reenviar registro de facturación\",\"description\":\"Reenvía un registro de facturación a Veri*Factu sin volver a generarlo. Este endpoint es útil para registros que fallaron por un problema técnico de conexión (timeout, error del servidor o falta de respuesta) en el envío inicial. Ante un resultado incierto, consulta el estado del mismo registro antes de decidir reenviarlo. Un timeout identificable se guarda como vf_post_status = failure y vf_record_registration_status = unknown y activa la conciliación obligatoria: KubiFACTU consulta el registro en la AEAT por sí mismo. La conciliación obligatoria bloquea el reenvío con HTTP 409 y motivo pending_reconciliation hasta aclarar el resultado: se aplica a la marca interna recovery_reconciliation_pending y al caso de envío success con registro unknown, incluidos registros históricos. Un timeout identificable la activa; los duplicados 3000/3001 y las respuestas inutilizables o desconocidas pueden exigirla. El UUID de bloqueo puede ser el propio registro; los bloqueos por registros anteriores de la misma empresa cliente y SIF mantienen los motivos pending_submission y unresolved_submission. El flujo de comprobar el estado y confirmar el reenvío en dos clics corresponde al panel, no a este endpoint. La API conserva sus operaciones y autenticación y no impone la comprobación previa del panel para failure + unknown sin conciliación pendiente. Tras un timeout, los envíos iniciales directos y los reenvíos consultan el registro en el momento, y los envíos diferidos, poco después; si la consulta no obtiene un resultado definitivo, se repite periódicamente con un número limitado de intentos. Leer más en la FAQ. Si el registro ya tiene un CSV guardado, el reenvío no lo borra cuando la nueva respuesta de la AEAT no incluye uno (por ejemplo, ante un registro duplicado) ni cuando el envío falla sin respuesta. Un CSV nuevo sí sustituye al anterior. Se llama a la URL de callback del registro si se incluyó en el momento de su alta. ### Registros en recuperación automática KubiFACTU reintenta el registro por su cuenta y no hace falta reenviarlo. El reenvío manual sirve sobre todo para desbloquear un registro en attention después de corregir la causa. Según recovery.status: - retry y attention: se admite el reenvío. Si vuelve a fallar por una causa temporal, KubiFACTU retoma los reintentos automáticos. - pending: se admite solo si el registro ya se envió. Un diferido que todavía espera su primer envío devuelve HTTP 422. - processing y resolved: devuelve HTTP 422. Mientras la conciliación del registro está pendiente, devuelve HTTP 409 con motivo pending_reconciliation.\",\"dateModified\":\"2026-10-27T22:36:06.356Z\",\"isPartOf\":{\"@id\":\"https://apidocs.kubifactu.com#website\"},\"breadcrumb\":{\"@id\":\"https://apidocs.kubifactu.com/openapi-reference/reenviar-registro-de-facturaci%C3%B3n#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://apidocs.kubifactu.com/openapi-reference/reenviar-registro-de-facturaci%C3%B3n#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\":\"Reenviar registro de facturación\",\"item\":\"https://apidocs.kubifactu.com/openapi-reference/reenviar-registro-de-facturaci%C3%B3n\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://apidocs.kubifactu.com/openapi-reference/reenviar-registro-de-facturaci%C3%B3n#apireference\",\"headline\":\"Reenviar registro de facturación\",\"name\":\"Reenviar registro de facturación\",\"description\":\"Reenvía un registro de facturación a Veri*Factu sin volver a generarlo. Este endpoint es útil para registros que fallaron por un problema técnico de conexión (timeout, error del servidor o falta de respuesta) en el envío inicial. Ante un resultado incierto, consulta el estado del mismo registro antes de decidir reenviarlo. Un timeout identificable se guarda como vf_post_status = failure y vf_record_registration_status = unknown y activa la conciliación obligatoria: KubiFACTU consulta el registro en la AEAT por sí mismo. La conciliación obligatoria bloquea el reenvío con HTTP 409 y motivo pending_reconciliation hasta aclarar el resultado: se aplica a la marca interna recovery_reconciliation_pending y al caso de envío success con registro unknown, incluidos registros históricos. Un timeout identificable la activa; los duplicados 3000/3001 y las respuestas inutilizables o desconocidas pueden exigirla. El UUID de bloqueo puede ser el propio registro; los bloqueos por registros anteriores de la misma empresa cliente y SIF mantienen los motivos pending_submission y unresolved_submission. El flujo de comprobar el estado y confirmar el reenvío en dos clics corresponde al panel, no a este endpoint. La API conserva sus operaciones y autenticación y no impone la comprobación previa del panel para failure + unknown sin conciliación pendiente. Tras un timeout, los envíos iniciales directos y los reenvíos consultan el registro en el momento, y los envíos diferidos, poco después; si la consulta no obtiene un resultado definitivo, se repite periódicamente con un número limitado de intentos. Leer más en la FAQ. Si el registro ya tiene un CSV guardado, el reenvío no lo borra cuando la nueva respuesta de la AEAT no incluye uno (por ejemplo, ante un registro duplicado) ni cuando el envío falla sin respuesta. Un CSV nuevo sí sustituye al anterior. Se llama a la URL de callback del registro si se incluyó en el momento de su alta. ### Registros en recuperación automática KubiFACTU reintenta el registro por su cuenta y no hace falta reenviarlo. El reenvío manual sirve sobre todo para desbloquear un registro en attention después de corregir la causa. Según recovery.status: - retry y attention: se admite el reenvío. Si vuelve a fallar por una causa temporal, KubiFACTU retoma los reintentos automáticos. - pending: se admite solo si el registro ya se envió. Un diferido que todavía espera su primer envío devuelve HTTP 422. - processing y resolved: devuelve HTTP 422. Mientras la conciliación del registro está pendiente, devuelve HTTP 409 con motivo pending_reconciliation.\",\"url\":\"https://apidocs.kubifactu.com/openapi-reference/reenviar-registro-de-facturaci%C3%B3n\",\"mainEntityOfPage\":{\"@id\":\"https://apidocs.kubifactu.com/openapi-reference/reenviar-registro-de-facturaci%C3%B3n#webpage\"},\"dateModified\":\"2026-10-27T22:36:06.356Z\",\"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","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","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","description":"Obtiene el estado de un registro de facturación haciendo previamente una consulta a Veri*Factu. Se llama a la URL de callback del registro si se incluyó en el momento de su alta. [Ver formato de la llamada de callback](enviar-registro-de-facturación#body-callback-url).\n\nLa consulta sólo actualiza el registro solicitado cuando el resultado permite confirmar su identidad y huella, o confirma que no está registrado mediante un SinDatos válido. Una consulta fallida o inconcluyente no confirma la aceptación ni permite dar por resuelta una conciliación pendiente. Un rechazo confirmado se conserva como rechazo.\n\nLa AEAT no devuelve el CSV en las consultas, así que una consulta nunca lo informa ni lo recupera. Si confirma un registro cuyo resultado de envío no llegó, el registro queda con su estado actualizado y el campo `csv` vacío. Usa `vf_record_registration_status` para saber si el registro está acreditado. [Leer más en la FAQ](/faq).\n\nSi el registro es un diferido que todavía no se ha enviado, el endpoint no consulta a la AEAT y devuelve los datos guardados.\n\nLa consulta de un registro en recuperación solo llama a la URL de callback si cambia el resultado o el estado de `recovery`. Si la consulta confirma que la AEAT tiene el registro, la recuperación termina (`resolved`). Si la AEAT responde que no lo tiene, el registro queda en `retry` y KubiFACTU lo reenvía en el siguiente intento.\n","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","description":"Anulación de un registro de facturación.\n\nSi se considera que \"toda la factura\" en sí misma está mal o no debería haberse emitido, siempre que para solucionarlo no deba emplearse algún procedimiento (de rectificativa u otro) previsto en el Reglamento de Obligaciones de Facturación (ROF), se podrá anular, generando para ello un registro de facturación de anulación.\n\nSi el envío de la anulación falla y deja la cadena esperando, la respuesta incluye `recovery` relleno y KubiFACTU reintenta la anulación por su cuenta.\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":"Reenviar registro de facturación - 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"]}