Skip to main content
VeriFactu

VeriFactu errors with the submission format: unreadable XML, UTF-8 and empty requests

Before checking any invoice, the AEAT, the Spanish tax agency, has to be able to read what arrives: well-formed XML, in UTF-8, through the right method and with the nodes it expects. If any of that fails, no invoice counts. These eight codes belong to that first gate, and almost all of them reject the whole request.

FlexigoTech · Editor in charge: Víctor Gómez · Updated 4 November 2026

Key facts

Module
VeriFactu
Versions
Odoo 17, 18, 19 and 20
Checked
in the module's source code, version 20.0 · against the sources linked at the end
Reading time
3 min

What the AEAT cannot read

CodeAEAT text
4103Se ha producido un error inesperado al parsear el XML.
4119Error al informar caracteres cuya codificación no es UTF-8.
4135Esta URL no puede ser utilizada mediante GET.
4136No se ha enviado el nodo RegistroAlta o el anterior al nodo RegistroAlta no es correcto.
4137No se ha enviado el nodo RegistroAnulacion o el anterior al nodo RegistroAnulacion no es correcto.
4138Petición vacía en el XML o encoding incorrecto.

In English: an unexpected error parsing the XML; characters not encoded in UTF-8; the address cannot be used with GET; a missing or misplaced registration or cancellation node; and an empty request or wrong encoding. All six are in the section of the list that rejects the whole submission. The other two codes on this page only reject a record: 1100, Valor o tipo incorrecto del campo., the most generic of the list, and 1251, for a wrong IDVersion.

Card for the VeriFactu submission format codes
In red, the six that reject the entire request; in amber, 1100 and 1251, which reject one record.

How Odoo sends each submission

The module sends every submission as a SOAP 1.1 POST over mutual TLS, with the company's certificate. The body is XML in UTF-8, with its encoding declaration, and the HTTP header announces it as text/xml in UTF-8. Texts are normalised to NFC form, so the same accented letter always arrives with the same bytes. Each record carries IDVersion 1.0, and before leaving it goes through the validation against the official schema the module carries.

Sent that way, the failures on this page should not appear: there is no GET, there are no empty requests and the encoding is always the same.

The GET case

4135 is the only one on this page that shows up often, and it has a very simple explanation: someone opened the address of the AEAT service in a browser. A browser requests pages with GET, and the service only accepts POST. If you see it while trying the address by hand, it says nothing about your submissions: the Odoo queue never uses GET.

AEAT submission queue grouped by status
The submission queue in Odoo grouped by status: full rejections of the request stay in Failed. Odoo 20 screenshot with demo data; the AEAT answers are simulated.

What to do

  • With a 4103, 4119 or 4138 on a submission from the module, keep the answer from the Raw Response field and write to comercial@flexigobe.com: we want to see which invoice was in that submission.
  • With a 4136 or 4137, the same. The module builds those nodes for every registration and every cancellation.
  • With a 1100, the message does not say which field: the full answer usually shows which record it concerns.

Once we know the cause, the submissions in Failed are resent from AEAT Submission › AEAT Errors with Retry Selected. Those with 1100 and 1251 are already retried by the queue, but with the same data.

The codes on this page, with the AEAT's text

Each code with its literal text, in Spanish, as the AEAT's error list gives it:

CodeAEAT text (Spanish)
4103Se ha producido un error inesperado al parsear el XML.
4119Error al informar caracteres cuya codificación no es UTF-8.
4135Esta URL no puede ser utilizada mediante GET.
4136No se ha enviado el nodo RegistroAlta o el anterior al nodo RegistroAlta no es correcto.
4137No se ha enviado el nodo RegistroAnulacion o el anterior al nodo RegistroAnulacion no es correcto.
4138Petición vacía en el XML o encoding incorrecto.
1100Valor o tipo incorrecto del campo.
1251El valor del campo IdVersion tiene un valor incorrecto

Schema errors, when a mandatory field is missing, have their own page: error 4102.

Keep reading

VeriFactu error 4102: «El XML no cumple el esquema. Falta informar campo obligatorio»VeriFactu error 4102 rejects the whole submission: a mandatory field is missing. How Odoo 17 to 20 catches it first and what to do if the AEAT sends it.VeriFactu errors 4113 and 4114: too many records in the same submissionVeriFactu errors 4113 and 4114: too many records in one submission. The limit of 1000 per request, the per-block limits and how Odoo 17, 18, 19 and 20 respects them.VeriFactu technical errors: when the problem is in the AEAT systemsVeriFactu technical errors on the AEAT side (4108, 4110, 4111, 4118, 4128, 3500, 3501, 1129, 1256, 1288): which ones Odoo retries on its own and which ones you resend.
Checked in the module's source code (version 20.0) and the linked sources

Sources