What the AEAT cannot read
| Code | AEAT text |
|---|---|
| 4103 | Se ha producido un error inesperado al parsear el XML. |
| 4119 | Error al informar caracteres cuya codificación no es UTF-8. |
| 4135 | Esta URL no puede ser utilizada mediante GET. |
| 4136 | No se ha enviado el nodo RegistroAlta o el anterior al nodo RegistroAlta no es correcto. |
| 4137 | No se ha enviado el nodo RegistroAnulacion o el anterior al nodo RegistroAnulacion no es correcto. |
| 4138 | Petició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.

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.

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:
| Code | AEAT text (Spanish) |
|---|---|
| 4103 | Se ha producido un error inesperado al parsear el XML. |
| 4119 | Error al informar caracteres cuya codificación no es UTF-8. |
| 4135 | Esta URL no puede ser utilizada mediante GET. |
| 4136 | No se ha enviado el nodo RegistroAlta o el anterior al nodo RegistroAlta no es correcto. |
| 4137 | No se ha enviado el nodo RegistroAnulacion o el anterior al nodo RegistroAnulacion no es correcto. |
| 4138 | Petición vacía en el XML o encoding incorrecto. |
| 1100 | Valor o tipo incorrecto del campo. |
| 1251 | El valor del campo IdVersion tiene un valor incorrecto |
Schema errors, when a mandatory field is missing, have their own page: error 4102.
Keep reading
Checked in the module's source code (version 20.0) and the linked sources
Sources
- www.agenciatributaria.es/static_files/AEAT_Desarrolladores/EEDD/IVA/VERI-FACTU/Validacione
- Module source code: flexigo_spain_verifactu 20.0 (aa2ea3d2): models/verifactu_aeat_client.py
- Module source code: flexigo_spain_verifactu 20.0 (aa2ea3d2): models/verifactu_cola_envio.py
- Module source code: flexigo_spain_verifactu 20.0 (aa2ea3d2): data/verifactu_error_catalogue.xml
- prewww2.aeat.es/static_files/common/internet/dep/aplicaciones/es/aeat/tikeV1.0/cont/ws/err
