Skip to main content

Introduction

VERI*FACTU is a fiscal initiative by the Spanish Tax Agency (AEAT) that requires businesses to report invoices through certified software. The system generates unique identifiers for each invoice and creates digitally signed XML files that are submitted to the tax authorities.
VERI*FACTU will be mandatory for companies from January 1st, 2026. The rest of tax payers from 1 July 2026. Companies reporting with SII or TicketBAI are exempt from reporting with VERI*FACTU.

Prerequisites

To issue your first VERI*FACTU invoice, you must have had registered at least one supplier. Make sure you read and implemented the VERI*FACTU supplier registration guide before continuing with this guide.

Setup

Add a new workflow to your workspace for issuing invoices. You can start with the template below. Keep the Workflow ID at hand, you’ll use it later.
VERI*FACTU allows for document modifications after submission. If a document is rejected or contains errors, update the GOBL details and resubmit to the same workflow.

Issue an Invoice

1

Upload an Invoice

Use the Create an entry endpoint to upload the invoice details. Include an invoice object in the data field with these required fields:
  • regime: ES
  • Add the es-verifactu-v1 addon
  • supplier: Use the details of the supplier you’ve registered before.
You can copy one of the example invoices below as a reference.
Simplified invoices are used for B2C transactions when the customer is not a business. The transaction amount should be under €400 (VAT included) with some exceptions in which this threshold is increased to €3,000.To create a simplified VERI*FACTU invoice, include the simplified tag in your GOBL document with the es-verifactu-v1 addon.
We recommend issuing simplified invoices without a customer field. Any data in this object will trigger validations by the tax authority so a valid NIF and name will be required.
VERI*FACTU B2C Invoice
{
    "$schema": "https://gobl.org/draft-0/bill/invoice",
    "$regime": "ES",
    "$addons": [
        "es-verifactu-v1"
    ],
    "$tags": [
        "simplified"
    ],
    "uuid": "3aea7b56-59d8-4beb-90bd-f8f280d852a0",
    "type": "standard",
    "series": "SAMPLE",
    "issue_date": "2024-11-13",
    "currency": "EUR",
    "tax": {
        "ext": {
            "es-verifactu-doc-type": "F2"
        }
    },
    "supplier": {
        "name": "Invopop S.L.",
        "tax_id": {
            "country": "ES",
            "code": "B85905495"
        },
        "addresses": [
            {
                "num": "42",
                "street": "Calle Pradillo",
                "locality": "Madrid",
                "region": "Madrid",
                "code": "28002",
                "country": "ES"
            }
        ],
        "emails": [
            {
                "addr": "billing@example.com"
            }
        ]
    },
    "lines": [
        {
            "i": 1,
            "quantity": "20",
            "item": {
                "name": "Development services",
                "price": "90.00",
                "unit": "h"
            },
            "sum": "1800.00",
            "taxes": [
                {
                    "cat": "VAT",
                    "key": "standard",
                    "rate": "general",
                    "percent": "21.0%",
                    "ext": {
                        "es-verifactu-op-class": "S1",
                        "es-verifactu-regime": "01"
                    }
                }
            ],
            "total": "1800.00"
        }
    ],
    "totals": {
        "sum": "1800.00",
        "total": "1800.00",
        "taxes": {
            "categories": [
                {
                    "code": "VAT",
                    "rates": [
                        {
                            "key": "standard",
                            "ext": {
                                "es-verifactu-op-class": "S1",
                                "es-verifactu-regime": "01"
                            },
                            "base": "1800.00",
                            "percent": "21.0%",
                            "amount": "378.00"
                        }
                    ],
                    "amount": "378.00"
                }
            ],
            "sum": "378.00"
        },
        "tax": "378.00",
        "total_with_tax": "2178.00",
        "payable": "2178.00"
    },
    "notes": [
        {
            "key": "general",
            "text": "This is a sample invoice with a standard tax"
        }
    ]
}
Regular invoices are used for B2B transactions. Regular invoices must be issued when:
  • The customer is a registered business (has a tax identification number).
  • The transaction amount is €400 VAT included or above, or the customer requires a full invoice.
  • The customer needs a complete invoice with all tax details for accounting or tax purposes.
To create a regular VERI*FACTU invoice, include the es-verifactu-v1 addon and ensure the customer field contains valid tax identification details. The addon will automatically set the document type to F1 when the silo entry is built (which happens automatically when saving a silo entry through the API or console).
The supplier must be previsouly registered with the tax authority and the customer NIF or VAT ID must be valid.
VERI*FACTU B2B Invoice
{
    "$schema": "https://gobl.org/draft-0/bill/invoice",
    "$regime": "ES",
    "$addons": [
        "es-verifactu-v1"
    ],
    "uuid": "3aea7b56-59d8-4beb-90bd-f8f280d852a0",
    "type": "standard",
    "series": "SAMPLE",
    "code": "004",
    "issue_date": "2024-11-13",
    "currency": "EUR",
    "tax": {
        "ext": {
            "es-verifactu-doc-type": "F1"
        }
    },
    "supplier": {
        "name": "Invopop S.L.",
        "tax_id": {
            "country": "ES",
            "code": "B85905495"
        },
        "addresses": [
            {
                "num": "42",
                "street": "Calle Pradillo",
                "locality": "Madrid",
                "region": "Madrid",
                "code": "28002",
                "country": "ES"
            }
        ],
        "emails": [
            {
                "addr": "billing@example.com"
            }
        ]
    },
    "customer": {
        "name": "Sample Consumer",
        "tax_id": {
            "country": "ES",
            "code": "B63272603"
        }
    },
    "lines": [
        {
            "i": 1,
            "quantity": "20",
            "item": {
                "name": "Development services",
                "price": "90.00",
                "unit": "h"
            },
            "sum": "1800.00",
            "taxes": [
                {
                    "cat": "VAT",
                    "key": "standard",
                    "rate": "general",
                    "percent": "21.0%",
                    "ext": {
                        "es-verifactu-op-class": "S1",
                        "es-verifactu-regime": "01"
                    }
                }
            ],
            "total": "1800.00"
        }
    ],
    "totals": {
        "sum": "1800.00",
        "total": "1800.00",
        "taxes": {
            "categories": [
                {
                    "code": "VAT",
                    "rates": [
                        {
                            "key": "standard",
                            "ext": {
                                "es-verifactu-op-class": "S1",
                                "es-verifactu-regime": "01"
                            },
                            "base": "1800.00",
                            "percent": "21.0%",
                            "amount": "378.00"
                        }
                    ],
                    "amount": "378.00"
                }
            ],
            "sum": "378.00"
        },
        "tax": "378.00",
        "total_with_tax": "2178.00",
        "payable": "2178.00"
    },
    "notes": [
        {
            "key": "general",
            "text": "This is a sample invoice with a exempt tax"
        }
    ]
}
Reverse charge invoices are used for B2B services provided to customers in other EU member states. Reverse charge must be applied when:
  • The customer is a registered business in another EU member state (has a valid EU VAT ID).
  • The service is provided to a business customer (B2B), not a consumer.
  • The service is subject to VAT but the customer accounts for the VAT in their own country.
To create a reverse charge VERI*FACTU invoice, use the tax key reverse-charge in your invoice lines. The es-verifactu-v1 addon will automatically set the operation class to S2 (Subject and Not Exempt - With reverse charge) when the silo entry is built.
With reverse charge, no VAT is charged by the supplier. The customer accounts for VAT in their own country. The supplier must be previously registered with the tax authority and the customer VAT ID must be valid and registered in the EU VIES system.
VERI*FACTU B2B Invoice Services (EU)
{
    "$schema": "https://gobl.org/draft-0/bill/invoice",
    "$regime": "ES",
    "$addons": [
        "es-verifactu-v1"
    ],
    "uuid": "3aea7b56-59d8-4beb-90bd-f8f280d852a0",
    "type": "standard",
    "series": "SAMPLE",
    "code": "sett/000001",
    "issue_date": "2024-11-13",
    "currency": "EUR",
    "tax": {
        "ext": {
            "es-verifactu-doc-type": "F1"
        }
    },
    "supplier": {
        "name": "Invopop S.L.",
        "tax_id": {
            "country": "ES",
            "code": "B85905495"
        },
        "addresses": [
            {
                "num": "42",
                "street": "Calle Pradillo",
                "locality": "Madrid",
                "region": "Madrid",
                "code": "28002",
                "country": "ES"
            }
        ],
        "emails": [
            {
                "addr": "billing@example.com"
            }
        ]
    },
    "customer": {
        "name": "Sample Consumer",
        "tax_id": {
            "country": "DE",
            "code": "111111125"
        }
    },
    "lines": [
        {
            "i": 1,
            "quantity": "20",
            "item": {
                "name": "Development services",
                "price": "90.00",
                "unit": "h"
            },
            "sum": "1800.00",
            "taxes": [
                {
                    "cat": "VAT",
                    "key": "reverse-charge",
                    "ext": {
                        "es-verifactu-op-class": "S2",
                        "es-verifactu-regime": "01"
                    }
                }
            ],
            "total": "1800.00"
        }
    ],
    "totals": {
        "sum": "1800.00",
        "total": "1800.00",
        "taxes": {
            "categories": [
                {
                    "code": "VAT",
                    "rates": [
                        {
                            "key": "reverse-charge",
                            "ext": {
                                "es-verifactu-op-class": "S2",
                                "es-verifactu-regime": "01"
                            },
                            "base": "1800.00",
                            "amount": "0.00"
                        }
                    ],
                    "amount": "0.00"
                }
            ],
            "sum": "0.00"
        },
        "tax": "0.00",
        "total_with_tax": "1800.00",
        "payable": "1800.00"
    },
    "notes": [
        {
            "key": "general",
            "text": "This is a sample invoice with reverse charge"
        }
    ]
}
Intra-community supply invoices are used for B2B goods delivered to customers in other EU member states. Intra-community supplies must be applied when:
  • The customer is a registered business in another EU member state (has a valid EU VAT ID).
  • Goods are physically delivered to another EU member state.
  • The supply is exempt from VAT in the origin country (Spain) and subject to VAT in the destination country.
To create an intra-community supply VERI*FACTU invoice, use the tax key intra-community in your invoice lines. The es-verifactu-v1 addon will automatically set the exemption code to E5 (Artículo 25 Ley de IVA) when the silo entry is built.
With intra-community supplies, no VAT is charged in Spain. The customer accounts for VAT in their destination country. The supplier must be previously registered with the tax authority and the customer VAT ID must be valid and registered in the EU VIES system.
VERI*FACTU B2B Invoice Goods (EU)
{
    "$schema": "https://gobl.org/draft-0/bill/invoice",
    "$regime": "ES",
    "$addons": [
        "es-verifactu-v1"
    ],
    "uuid": "3aea7b56-59d8-4beb-90bd-f8f280d852a0",
    "type": "standard",
    "series": "SAMPLE",
    "code": "sett/000003",
    "issue_date": "2024-11-13",
    "currency": "EUR",
    "tax": {
        "ext": {
            "es-verifactu-doc-type": "F1"
        }
    },
    "supplier": {
        "name": "Invopop S.L.",
        "tax_id": {
            "country": "ES",
            "code": "B85905495"
        },
        "addresses": [
            {
                "num": "42",
                "street": "Calle Pradillo",
                "locality": "Madrid",
                "region": "Madrid",
                "code": "28002",
                "country": "ES"
            }
        ],
        "emails": [
            {
                "addr": "billing@example.com"
            }
        ]
    },
    "customer": {
        "name": "Sample Consumer",
        "tax_id": {
            "country": "DE",
            "code": "111111125"
        }
    },
    "lines": [
        {
            "i": 1,
            "quantity": "20",
            "item": {
                "name": "Goods",
                "price": "90.00"
            },
            "sum": "1800.00",
            "taxes": [
                {
                    "cat": "VAT",
                    "key": "intra-community",
                    "ext": {
                        "es-verifactu-exempt": "E5",
                        "es-verifactu-regime": "02"
                    }
                }
            ],
            "total": "1800.00"
        }
    ],
    "totals": {
        "sum": "1800.00",
        "total": "1800.00",
        "taxes": {
            "categories": [
                {
                    "code": "VAT",
                    "rates": [
                        {
                            "key": "intra-community",
                            "ext": {
                                "es-verifactu-exempt": "E5",
                                "es-verifactu-regime": "01"
                            },
                            "base": "1800.00",
                            "amount": "0.00"
                        }
                    ],
                    "amount": "0.00"
                }
            ],
            "sum": "0.00"
        },
        "tax": "0.00",
        "total_with_tax": "1800.00",
        "payable": "1800.00"
    },
    "notes": [
        {
            "key": "general",
            "text": "This is a sample invoice with a intra-community"
        }
    ]
}
Outside scope invoices are used for B2B services provided to customers outside the EU.To create an outside scope VERI*FACTU invoice, use the tax key outside-scope in your invoice lines. The es-verifactu-v1 addon will automatically set the operation class to N2 (Not Subject - Due to location rules) when the silo entry is built.
Services provided to non-EU customers are generally outside the scope of Spanish VAT. The supplier must be previously registered with the tax authority. Customer tax identification is optional but recommended for record-keeping purposes.
VERI*FACTU B2B Invoice Services (No EU)
{
    "$schema": "https://gobl.org/draft-0/bill/invoice",
    "$regime": "ES",
    "$addons": [
        "es-verifactu-v1"
    ],
    "uuid": "019a9196-c775-7000-9772-f881d830c39b",
    "type": "standard",
    "series": "SAMPLE",
    "code": "sett/000002",
    "issue_date": "2025-11-17",
    "currency": "EUR",
    "tax": {
        "ext": {
            "es-verifactu-doc-type": "F1"
        }
    },
    "supplier": {
        "name": "Invopop S.L.",
        "tax_id": {
            "country": "ES",
            "code": "B85905495"
        },
        "addresses": [
            {
                "num": "42",
                "street": "Calle Pradillo",
                "locality": "Madrid",
                "region": "Madrid",
                "code": "28002",
                "country": "ES"
            }
        ],
        "emails": [
            {
                "addr": "billing@example.com"
            }
        ]
    },
    "customer": {
        "name": "Sample Consumer",
        "tax_id": {
            "country": "SG",
            "code": "201312345A"
        }
    },
    "lines": [
        {
            "i": 1,
            "quantity": "20",
            "item": {
                "name": "Development services",
                "price": "90.00",
                "unit": "h"
            },
            "sum": "1800.00",
            "taxes": [
                {
                    "cat": "VAT",
                    "key": "outside-scope",
                    "ext": {
                        "es-verifactu-op-class": "N2",
                        "es-verifactu-regime": "01"
                    }
                }
            ],
            "total": "1800.00"
        }
    ],
    "totals": {
        "sum": "1800.00",
        "total": "1800.00",
        "taxes": {
            "categories": [
                {
                    "code": "VAT",
                    "rates": [
                        {
                            "key": "outside-scope",
                            "ext": {
                                "es-verifactu-op-class": "N2",
                                "es-verifactu-regime": "01"
                            },
                            "base": "1800.00",
                            "amount": "0.00"
                        }
                    ],
                    "amount": "0.00"
                }
            ],
            "sum": "0.00"
        },
        "tax": "0.00",
        "total_with_tax": "1800.00",
        "payable": "1800.00"
    },
    "notes": [
        {
            "key": "general",
            "text": "This is a sample invoice with a outside-scope tax"
        }
    ]
}
Export invoices are used for B2B goods delivered to customers outside the EU.To create an export VERI*FACTU invoice, use the tax key export in your invoice lines. The es-verifactu-v1 addon will automatically set the exemption code to E2 (Artículo 21 Ley de IVA) and regime code to 02 (Export) when the silo entry is built.
Exported goods are exempt from Spanish VAT. The supplier must be previously registered with the tax authority. Customer tax identification is optional but recommended for record-keeping purposes.
VERI*FACTU B2B Invoice Services (No EU)
{
    "$schema": "https://gobl.org/draft-0/bill/invoice",
    "$regime": "ES",
    "$addons": [
        "es-verifactu-v1"
    ],
    "uuid": "019a919f-dcd5-7000-848e-8dd85daafbe0",
    "type": "standard",
    "series": "SAMPLE",
    "code": "sett/000004",
    "issue_date": "2025-11-17",
    "currency": "EUR",
    "tax": {
        "ext": {
            "es-verifactu-doc-type": "F1"
        }
    },
    "supplier": {
        "name": "Invopop S.L.",
        "tax_id": {
            "country": "ES",
            "code": "B85905495"
        },
        "addresses": [
            {
                "num": "42",
                "street": "Calle Pradillo",
                "locality": "Madrid",
                "region": "Madrid",
                "code": "28002",
                "country": "ES"
            }
        ],
        "emails": [
            {
                "addr": "billing@example.com"
            }
        ]
    },
    "customer": {
        "name": "Sample Consumer",
        "tax_id": {
            "country": "SG",
            "code": "201312345A"
        }
    },
    "lines": [
        {
            "i": 1,
            "quantity": "20",
            "item": {
                "name": "Goods",
                "price": "90.00"
            },
            "sum": "1800.00",
            "taxes": [
                {
                    "cat": "VAT",
                    "key": "export",
                    "ext": {
                        "es-verifactu-exempt": "E2",
                        "es-verifactu-regime": "02"
                    }
                }
            ],
            "total": "1800.00"
        }
    ],
    "totals": {
        "sum": "1800.00",
        "total": "1800.00",
        "taxes": {
            "categories": [
                {
                    "code": "VAT",
                    "rates": [
                        {
                            "key": "export",
                            "ext": {
                                "es-verifactu-exempt": "E2",
                                "es-verifactu-regime": "02"
                            },
                            "base": "1800.00",
                            "amount": "0.00"
                        }
                    ],
                    "amount": "0.00"
                }
            ],
            "sum": "0.00"
        },
        "tax": "0.00",
        "total_with_tax": "1800.00",
        "payable": "1800.00"
    },
    "notes": [
        {
            "key": "general",
            "text": "This is a sample invoice with a export"
        }
    ]
}
Exempt E1 invoices are used for B2B transactions that are exempt from VAT pursuant (Artículo 20 Ley de IVA), which covers exemptions in internal operations.To create an exempt E1 VERI*FACTU invoice, use the tax key exempt in your invoice lines. The es-verifactu-v1 addon will automatically set the exemption code to E1 when the silo entry is built.
Exempt operations are not subject to VAT but must still be reported. The supplier must be previously registered with the tax authority and the customer NIF must be valid.
VERI*FACTU B2B Exempt E1 Invoice
{
    "$schema": "https://gobl.org/draft-0/bill/invoice",
    "$regime": "ES",
    "$addons": [
        "es-verifactu-v1"
    ],
    "uuid": "3aea7b56-59d8-4beb-90bd-f8f280d852a0",
    "type": "standard",
    "series": "SAMPLE",
    "code": "004",
    "issue_date": "2024-11-13",
    "currency": "EUR",
    "tax": {
        "ext": {
            "es-verifactu-doc-type": "F1"
        }
    },
    "supplier": {
        "name": "Invopop S.L.",
        "tax_id": {
            "country": "ES",
            "code": "B85905495"
        },
        "addresses": [
            {
                "num": "42",
                "street": "Calle Pradillo",
                "locality": "Madrid",
                "region": "Madrid",
                "code": "28002",
                "country": "ES"
            }
        ],
        "emails": [
            {
                "addr": "billing@example.com"
            }
        ]
    },
    "customer": {
        "name": "Sample Consumer",
        "tax_id": {
            "country": "ES",
            "code": "B63272603"
        }
    },
    "lines": [
        {
            "i": 1,
            "quantity": "20",
            "item": {
                "name": "Development services",
                "price": "90.00",
                "unit": "h"
            },
            "sum": "1800.00",
            "taxes": [
                {
                    "cat": "VAT",
                    "key": "exempt",
                    "ext": {
                        "es-verifactu-exempt": "E1",
                        "es-verifactu-regime": "01"
                    }
                }
            ],
            "total": "1800.00"
        }
    ],
    "totals": {
        "sum": "1800.00",
        "total": "1800.00",
        "taxes": {
            "categories": [
                {
                    "code": "VAT",
                    "rates": [
                        {
                            "key": "exempt",
                            "ext": {
                                "es-verifactu-exempt": "E1",
                                "es-verifactu-regime": "01"
                            },
                            "base": "1800.00",
                            "amount": "0.00"
                        }
                    ],
                    "amount": "0.00"
                }
            ],
            "sum": "0.00"
        },
        "tax": "0.00",
        "total_with_tax": "1800.00",
        "payable": "1800.00"
    },
    "notes": [
        {
            "key": "general",
            "text": "This is a sample invoice with a exempt tax"
        }
    ]
}
One-Stop-Shop (OSS) invoices are used for B2C distance sales of goods and services to consumers in other EU member states when the supplier is registered under the OSS scheme.To create an OSS VERI*FACTU invoice, include the simplified tag in your GOBL document with the es-verifactu-v1 addon. The invoice will be treated as a simplified invoice (document type F2) and VAT is accounted for through the OSS scheme in the destination country.
OSS allows suppliers to register for VAT in one EU member state and account for VAT on all EU distance sales through that single registration. The supplier must be previously registered with the tax authority and enrolled in the OSS scheme.
VERI*FACTU B2C One Stop Shop Invoice
{
		"$schema": "https://gobl.org/draft-0/bill/invoice",
		"$regime": "ES",
		"$addons": [
			"es-verifactu-v1"
		],
    "$tags": [
      "simplified"
    ],
		"uuid": "3aea7b56-59d8-4beb-90bd-f8f280d852a0",
		"type": "standard",
		"series": "SAMPLE",
		"code": "004",
		"issue_date": "2024-11-13",
		"currency": "EUR",
		"tax": {
			"ext": {
				"es-verifactu-doc-type": "F2"
			}
		},
		"supplier": {
			"name": "Invopop S.L.",
			"tax_id": {
				"country": "ES",
				"code": "B85905495"
			},
			"addresses": [
				{
					"num": "42",
					"street": "Calle Pradillo",
					"locality": "Madrid",
					"region": "Madrid",
					"code": "28002",
					"country": "ES"
				}
			],
			"emails": [
				{
					"addr": "billing@example.com"
				}
			]
		},
		"lines": [
			{
				"i": 1,
				"quantity": "20",
				"item": {
					"name": "Development services",
					"price": "90.00",
					"unit": "h"
				},
				"sum": "1800.00",
				"taxes": [
					{
						"cat": "VAT",
						"rate": "standard",
						"percent": "21.0%",
						"ext": {
							"es-verifactu-op-class": "S1",
							"es-verifactu-regime": "01"
						}
					}
				],
				"total": "1800.00"
			}
		],
		"totals": {
			"sum": "1800.00",
			"total": "1800.00",
			"taxes": {
				"categories": [
					{
						"code": "VAT",
						"rates": [
							{
								"key": "standard",
								"ext": {
									"es-verifactu-op-class": "S1",
									"es-verifactu-regime": "01"
								},
								"base": "1800.00",
								"percent": "21.0%",
								"amount": "378.00"
							}
						],
						"amount": "378.00"
					}
				],
				"sum": "378.00"
			},
			"tax": "378.00",
			"total_with_tax": "2178.00",
			"payable": "2178.00"
		},
		"notes": [
			{
				"key": "general",
				"text": "This is a sample invoice with a standard tax"
			}
		]
	}
After uploading you’ll see the document in the Invoices section with status Empty.
Empty invoice

Empty invoice

2

Send the Invoice to the VERI*FACTU invoice workflow

Send the invoice to the VERI*FACTU workflow using the Create a job endpoint. Use:
  • workflow_id: use the Workflow ID of the _VERI*FACTU invoice: workflow we created during setup
  • silo_entry_id: use the Silo Entry ID of the invoice you’ve just uploaded.
The invoice’s status will change to Sent when the workflow completes successfully.
Sent invoice

Sent invoice

You can verify that the PDF was generated by clicking on the invoice and selecting the PDF from the “Files” tab.
Example VERI*FACTU invoice with QR

Example VERI*FACTU invoice with QR

Issue a Credit Note (Rectificativa por Diferencias)

In Spain, one way to correct an invoice is by issuing a credit note, known as a Rectificativa por Diferencias. An alternative method is to issue a Rectificativa por Sustitución, which involves creating a new invoice with the type corrective. The difference between the two is subtle but important:
  • A credit note adjusts the value of the original invoice.
  • A corrective invoice replaces the original invoice entirely.
For example, if you issued an invoice for €100 but later realized it should have been €80, you can either:
  • Issue a credit note for €20, or
  • Issue a corrective invoice for €80.
Unless you have a specific requirement to use a corrective invoice we recommend only using credit notes. They’re more widely supported across countries, while corrective invoices are specific to a few jurisdictions like Spain. Examples where you would need to issue a corrective invoice (Rectificativa por Sustitución) are incorrect supplier or client data, which can’t be corrected through credit or debit notes.
1

Upload a Credit Note

A credit note in Invopop is an invoice of the type credit note. The process is very similar to uploading an invoice, use the Create an entry endpoint to upload a credit note. Include an invoice object in the data, with these required fields:
  • regime: ES
  • Add the es-verifactu-v1 addon
  • supplier: use the same supplier details as in the original invoice
  • type: credit-note
  • preceding: references the original invoice, within it, you must include:
    • uuid: the UUID of the original invoice (optional but recommended)
    • type: type of the original invoice
    • issue_date: the date of the original invoice
    • series: the series of the original invoice
    • code: the code of the original invoice
You can copy the example credit note below as a reference.
VERI*FACTU Credit Note
{
    "$schema": "https://gobl.org/draft-0/bill/invoice",
    "$regime": "ES",
    "$addons": [
        "es-verifactu-v1"
    ],
    "uuid": "01971bb1-1499-7001-81ea-26f51cf396e1",
    "type": "credit-note",
    "series": "CN",
    "issue_date": "2025-05-29",
    "currency": "EUR",
    "preceding": [
        {
            "uuid": "3aea7b56-59d8-4beb-90bd-f8f280d852a0",
            "type": "standard",
            "issue_date": "2024-11-13",
            "series": "SAMPLE",
            "code": "004"
        }
    ],
    "tax": {
        "ext": {
            "es-verifactu-correction-type": "I",
            "es-verifactu-doc-type": "R1"
        }
    },
    "supplier": {
        "name": "Invopop S.L.",
        "tax_id": {
            "country": "ES",
            "code": "B85905495"
        },
        "addresses": [
            {
                "num": "42",
                "street": "Calle Pradillo",
                "locality": "Madrid",
                "region": "Madrid",
                "code": "28002",
                "country": "ES"
            }
        ],
        "emails": [
            {
                "addr": "billing@example.com"
            }
        ]
    },
    "customer": {
        "name": "Sample Consumer",
        "tax_id": {
            "country": "ES",
            "code": "B63272603"
        }
    },
    "lines": [
        {
            "i": 1,
            "quantity": "20",
            "item": {
                "name": "Development services",
                "price": "90.00",
                "unit": "h"
            },
            "sum": "1800.00",
            "taxes": [
                {
                    "cat": "VAT",
                    "rate": "standard",
                    "percent": "21.0%",
                    "ext": {
                        "es-verifactu-op-class": "S1",
                        "es-verifactu-regime": "01"
                    }
                }
            ],
            "total": "1800.00"
        }
    ],
    "totals": {
        "sum": "1800.00",
        "total": "1800.00",
        "taxes": {
            "categories": [
                {
                    "code": "VAT",
                    "rates": [
                        {
                            "key": "standard",
                            "ext": {
                                "es-verifactu-op-class": "S1",
                                "es-verifactu-regime": "01"
                            },
                            "base": "1800.00",
                            "percent": "21.0%",
                            "amount": "378.00"
                        }
                    ],
                    "amount": "378.00"
                }
            ],
            "sum": "378.00"
        },
        "tax": "378.00",
        "total_with_tax": "2178.00",
        "payable": "2178.00"
    },
    "notes": [
        {
            "key": "general",
            "text": "This is a sample invoice with a standard tax"
        }
    ]
}
After successful upload, you’ll see the credit note in the Invoices section with status Empty. If you’ve included the uuid of the invoice in preceding, you’ll see a link to the credit note we’ve just created in the Related tab of the invoice.
Invoice related to a credit note

Link to the credit note

2

Send the Credit Note to the VERI*FACTU invoice workflow

Send the credit note to the VERI*FACTU workflow using the Create a job endpoint. Use:
  • workflow_id: use the Workflow ID of the _VERI*FACTU invoice _workflow we created during setup
  • silo_entry_id: use the The Silo Entry ID of the credit note you’ve just uploaded.
The credit note’s status will change to Sent when the workflow completes successfully.

Issue a Corrective Invoice (Rectificativa por Sustitución)

1

Upload a Corrective Invoice

A corrective invoice in Invopop is an invoice of the type corrective. The process is very similar to uploading an invoice, use the Create an entry endpoint to upload a corrective invoice. Include an invoice object in the data, with these required fields:
  • regime: ES
  • Add the es-verifactu-v1 addon
  • supplier_id: use the same supplier details as in the original invoice
  • type: corrective
  • preceding: references the original invoice, within it, you must include:
    • uuid: the UUID of the original invoice (optional but recommended)
    • type: type of the original invoice
    • issue_date: the date of the original invoice
    • series: the series of the original invoice
    • code: the code of the original invoice
    • tax: the tax section of the original invoice, you can copy it from the original invoice
You can copy the example corrective invoice below as a reference.
VERI*FACTU Corrective Invoice
{
    "$schema": "https://gobl.org/draft-0/bill/invoice",
    "$regime": "ES",
    "$addons": [
        "es-verifactu-v1"
    ],
    "uuid": "01971bcb-dd09-7001-b5c0-95e72f3f1a8c",
    "type": "corrective",
    "series": "CO",
    "issue_date": "2025-05-29",
    "currency": "EUR",
    "preceding": [
        {
            "uuid": "3aea7b56-59d8-4beb-90bd-f8f280d852a0",
            "type": "standard",
            "issue_date": "2024-11-13",
            "series": "SAMPLE",
            "code": "004",
            "tax": {
                "categories": [
                    {
                        "code": "VAT",
                        "rates": [
                            {
                                "key": "standard",
                                "ext": {
                                    "es-verifactu-op-class": "S1",
                                    "es-verifactu-regime": "01"
                                },
                                "base": "1800.00",
                                "percent": "21.0%",
                                "amount": "378.00"
                            }
                        ],
                        "amount": "378.00"
                    }
                ],
                "sum": "378.00"
            }
        }
    ],
    "tax": {
        "ext": {
            "es-verifactu-correction-type": "S",
            "es-verifactu-doc-type": "R1"
        }
    },
    "supplier": {
        "name": "Invopop S.L.",
        "tax_id": {
            "country": "ES",
            "code": "B85905495"
        },
        "addresses": [
            {
                "num": "42",
                "street": "Calle Pradillo",
                "locality": "Madrid",
                "region": "Madrid",
                "code": "28002",
                "country": "ES"
            }
        ],
        "emails": [
            {
                "addr": "billing@example.com"
            }
        ]
    },
    "customer": {
        "name": "Sample Consumer",
        "tax_id": {
            "country": "ES",
            "code": "B63272603"
        }
    },
    "lines": [
        {
            "i": 1,
            "quantity": "20",
            "item": {
                "name": "Development services",
                "price": "90.00",
                "unit": "h"
            },
            "sum": "1800.00",
            "taxes": [
                {
                    "cat": "VAT",
                    "rate": "standard",
                    "percent": "21.0%",
                    "ext": {
                        "es-verifactu-op-class": "S1",
                        "es-verifactu-regime": "01"
                    }
                }
            ],
            "total": "1800.00"
        }
    ],
    "totals": {
        "sum": "1800.00",
        "total": "1800.00",
        "taxes": {
            "categories": [
                {
                    "code": "VAT",
                    "rates": [
                        {
                            "key": "standard",
                            "ext": {
                                "es-verifactu-op-class": "S1",
                                "es-verifactu-regime": "01"
                            },
                            "base": "1800.00",
                            "percent": "21.0%",
                            "amount": "378.00"
                        }
                    ],
                    "amount": "378.00"
                }
            ],
            "sum": "378.00"
        },
        "tax": "378.00",
        "total_with_tax": "2178.00",
        "payable": "2178.00"
    },
    "notes": [
        {
            "key": "general",
            "text": "This is a sample invoice with a standard tax"
        }
    ]
}
After successful upload, you’ll see the corrective invoice in the Invoices section with status Empty. If you’ve included the uuid of the invoice in preceding, you’ll see a link to the corrective invoice we’ve just created in the Related tab of the invoice.
Invoice related to a corrective invoice

Link to the corrective invoice

2

Send the Corrective Invoice to the VERI*FACTU invoice workflow

Send the corrective invoice to the VERI*FACTU workflow using the Create a job endpoint. Use:
  • workflow_id: use the Workflow ID of the VERI*FACTU invoice workflow we created during setup
  • silo_entry_id: use the The Silo Entry ID of the corrective invoice you’ve just uploaded.
The corrective invoice’s status will change to Sent when the workflow completes successfully.

Cancel an Invoice

VERI*FACTU also allows you to cancel an invoice. In general, you should only cancel an invoice if it hasn’t been handed to the customer nor accepted by the tax authority. Different from a credit note or a corrective, canceling an invoice doesn’t produce a second document, which means you don’t have a paper to hand to your customer to show the cancellation. That’s why, if the invoice has been handed to the customer, we recommend issuing a credit note instead.
1

Add a cancel invoice workflow (only once)

To cancel an invoice, you need a workflow with the Cancel invoice step. You can start with the template below.
2

Send to cancellation workflow

To cancel an invoice, simply send it to the VERI*FACTU cancel invoice workflow created earlier using the Create a job endpoint.The invoice’s status will change to Void when the workflow completes successfully.

FAQ

VERI*FACTU will be mandatory for companies from January 1st, 2026. The rest of tax payers (mainly self-employed indidividuals) from 1 July 2026. Companies reporting with SII (large companies) or TicketBAI are exempt from reporting with VERI*FACTU.
There are three ways to correct an invoice:
  1. The recommended approach is to issue a GOBL Invoice with the type credit-note or debit-note, which in VERI*FACTU translates to a “Factura Rectificativa por Diferencias”.
  2. If the above approach does not apply, you can issue an invoice of type corrective, which in VERI*FACTU translates to a “Factura Rectificativa por Sustitución”.
  3. Lastly, you can use the Cancel VERI\*FACTU (Spain) step, which will void the invoice in the tax authority. This should only be used under special circumstances and not as part of a regular workflow.
The response from VERI*FACTU should contain all the details you need to be able to decide what changes need to be made to the GOBL document in order to be processed correctly. Make the changes either via the Invopop API or console directly on the same document, and simply resend to the VERI*FACTU workflow.Invopop will ensure that the correct substitution document is generated by checking previous attempts and including the correct codes in the new request.
VERI*FACTU requires every request to be linked with a fingerprint or hash. During the “Generate VERI*FACTU” and “Cancel VERI*FACTU” actions, Invopop will automatically find the last request made for the same supplier, and incorporate the chained data into the new request.Its important to understand the VERI*FACTU focuses on requests, and not individual documents; a single invoice may have multiple entries in the chain if it has been processed multiple times due to incorrect details, cancellations, or substitutions.Invopop guarantees the chain is never broken using database transactions and retries in the case of collisions.
Yes, VERI*FACTU allows issue dates to be in the past, as long as they are after October 28, 2024. Note that the issue date can’t be set with a date in the future.
The most common errors are related to format issues or invalid extensions, which are already handled in Invopop through the es-verifactu-v1 addon validations. These prevent most of the typical problems before they reach the submission stage.Among the errors that aren’t yet validated on our side, the five most frequent ones are:
  • 4104: Error en la cabecera: el valor del campo NIF del bloque ObligadoEmision no está identificado. → The issuer’s name must match what’s registered for that NIF (tax ID).
  • 4102: El XML no cumple el esquema. Falta informar campo obligatorio. → Usually occurs when a required field is missing in the XML, often within the Desglose (taxes) section.
  • 1110: El NIF no está identificado en el censo de la AEAT. → The provided NIF (tax ID) isn’t found in the AEAT registry (often due to typos or testing data).
  • 3000: Registro de facturación duplicado. → Triggered when issuing the same invoice series/code twice.
  • 2001: El NIF del bloque Destinatarios no está identificado en el censo de la AEAT. → Similar to 1110, but applies to the NIF (tax ID) of the customer.
We do not provide the QR code image itself. The QR code is a visual representation of a URL that you need to generate on your own if you’re creating custom PDFs or need it for any other purpose.The full requirements are in the AEAT VERI*FACTU QR specification PDF document in Spanish. Here you can read that:
The “QR” code must have a size between 30x30 and 40x40 millimeters and follow the specifications of the ISO/IEC 18004:2015 standard. For the generation of the “QR” code, the M (medium) error correction level shall be used.
Generate your own QR code image as follows:
1

Obtain the VERI*FACTU URL

  • API: fetch the entry and get data -> head -> stamps -> verifactu-qr.
  • Console: in the invoice entry click on the kebab ··· menu and select View Headers.
2

Generate the QR image

Use the VERI*FACTU URL in a library capable of generating ISO/IEC 18004:2015 QR images (Invopop uses go-qr)
3

Store or use the image

Store or embed the image in your PDF. You can see how we generate QR images in our open source gobl.html library.