curl --request GET \
--url https://api.kubifactu.com/api/invoices/{invoiceId}/resubmit \
--header 'X-Qbikode-ClientApiKey: <api-key>'import requests
url = "https://api.kubifactu.com/api/invoices/{invoiceId}/resubmit"
headers = {"X-Qbikode-ClientApiKey": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-Qbikode-ClientApiKey': '<api-key>'}};
fetch('https://api.kubifactu.com/api/invoices/{invoiceId}/resubmit', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.kubifactu.com/api/invoices/{invoiceId}/resubmit",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-Qbikode-ClientApiKey: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.kubifactu.com/api/invoices/{invoiceId}/resubmit"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-Qbikode-ClientApiKey", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.kubifactu.com/api/invoices/{invoiceId}/resubmit")
.header("X-Qbikode-ClientApiKey", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.kubifactu.com/api/invoices/{invoiceId}/resubmit")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-Qbikode-ClientApiKey"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"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": "<string>",
"issue_date": "2026-09-15",
"created_at": "2026-09-15T07:35:24.992854Z",
"fingerprint": "<string>",
"csv": "<string>",
"vf_post_status": "success",
"vf_record_registration_status": "success",
"has_warnings": false,
"vf_error_descriptions": "<string>",
"next_request_waiting_time": 123,
"next_request_datetime": "1977-04-22T06:00:00Z",
"qr_value": "<string>",
"qr_image_url": "<string>",
"xml_url": "<string>",
"vf_response_body": "aSDinaTvuI8gbWludGxpZnk="
}
}{
"data": {
"error": {
"code": "E-UNAUTH-APIKEY",
"message": "No client with API-KEY '5tVySMGJOpq8HfMgIX28Qz6kF0dFOoq37x55PLZcWsGeGeYkNgJyAcRTlFJ5NbVoDRm8qtCywEoiN3A9JkBanMBXYmxiqR3BItxgxx' was found.",
"http_code": 403,
"errors": null,
"details": {
"request_id": "2cc8ef846029ec69613711ad1d85f6dfebf16ffb"
}
}
}
}{
"data": {
"error": {
"message": "Client Company with id [0195fa87-a315-710a-8aa2-25e1d690f6tr] not found.",
"errors": null,
"details": {
"request_id": "2cc8ef846029ec69613711ad1d85f6dfebf16ffb"
}
}
}
}{
"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"
}
}
}
}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; por sí solo no activa la conciliación obligatoria.
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. Los duplicados 3000/3001 y las respuestas inutilizables o desconocidas pueden exigir conciliación. 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; los envíos iniciales directos mantienen la consulta inmediata cuando un timeout deja el estado en unknown. Los reintentos automáticos siguen respetando las esperas y el orden de la cadena. 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.
curl --request GET \
--url https://api.kubifactu.com/api/invoices/{invoiceId}/resubmit \
--header 'X-Qbikode-ClientApiKey: <api-key>'import requests
url = "https://api.kubifactu.com/api/invoices/{invoiceId}/resubmit"
headers = {"X-Qbikode-ClientApiKey": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-Qbikode-ClientApiKey': '<api-key>'}};
fetch('https://api.kubifactu.com/api/invoices/{invoiceId}/resubmit', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.kubifactu.com/api/invoices/{invoiceId}/resubmit",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-Qbikode-ClientApiKey: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.kubifactu.com/api/invoices/{invoiceId}/resubmit"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-Qbikode-ClientApiKey", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.kubifactu.com/api/invoices/{invoiceId}/resubmit")
.header("X-Qbikode-ClientApiKey", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.kubifactu.com/api/invoices/{invoiceId}/resubmit")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-Qbikode-ClientApiKey"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"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": "<string>",
"issue_date": "2026-09-15",
"created_at": "2026-09-15T07:35:24.992854Z",
"fingerprint": "<string>",
"csv": "<string>",
"vf_post_status": "success",
"vf_record_registration_status": "success",
"has_warnings": false,
"vf_error_descriptions": "<string>",
"next_request_waiting_time": 123,
"next_request_datetime": "1977-04-22T06:00:00Z",
"qr_value": "<string>",
"qr_image_url": "<string>",
"xml_url": "<string>",
"vf_response_body": "aSDinaTvuI8gbWludGxpZnk="
}
}{
"data": {
"error": {
"code": "E-UNAUTH-APIKEY",
"message": "No client with API-KEY '5tVySMGJOpq8HfMgIX28Qz6kF0dFOoq37x55PLZcWsGeGeYkNgJyAcRTlFJ5NbVoDRm8qtCywEoiN3A9JkBanMBXYmxiqR3BItxgxx' was found.",
"http_code": 403,
"errors": null,
"details": {
"request_id": "2cc8ef846029ec69613711ad1d85f6dfebf16ffb"
}
}
}
}{
"data": {
"error": {
"message": "Client Company with id [0195fa87-a315-710a-8aa2-25e1d690f6tr] not found.",
"errors": null,
"details": {
"request_id": "2cc8ef846029ec69613711ad1d85f6dfebf16ffb"
}
}
}
}{
"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"
}
}
}
}Authorizations
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.
Path Parameters
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.
Response
Registro de facturación reenviado con éxito.
Show child attributes
Show child attributes