Skip to content

Errors

What each error means and what to do.

What does the 401 error 'You don't have the authority to send for this vat numbers' mean, and how do I fix it?

The API key is correct, but the issuer's VAT number (ΑΦΜ, issuer.vatNumber) is not activated on your account, so the document is not sent and not charged. In the sandbox, only the VAT number you registered with is activated automatically. In production, each client VAT number is activated after onboarding (provisioning.status = COMPLETED). Check that you are sending the correct issuer VAT number and, if it should be active, contact Novus.

See: Environments & API key

When SendInvoices returns statusCode = Offline, do I need to resend the document, and how do I get the MARK, Authentication Code and QR later?

No, do not resend it: the document has been issued with a UID, and the certified e-invoicing provider will send it to AADE automatically once AADE is back. At first you get invoiceMark = 0, an empty authenticationCode and a PDF with the notice "Απώλεια Διασύνδεσης Παρόχου - ΑΑΔΕ" (loss of connection between Provider and AADE). You get the final MARK, the Authentication Code and the new PDF with RequestTransmittedDocs, filtering by uid (no webhook is documented for this). If you need to reference the document before it gets a MARK (e.g. to close a table), use the UID.

See: Offline & retries

How do I check whether an Offline document was finally transmitted to AADE?

With RequestTransmittedDocs and uid=<invoiceUid>. Until it is transmitted, there is one record with mark 0. Once it is transmitted, a second record with AADE's MARK appears. While AADE is not responding, only the provider's checks run, so a document with a data error may not be accepted once it is transmitted. If after 24 hours there is still only the record with mark 0, contact us with the invoiceUid.

See: Offline & retries

Why is a services invoice to a foreign customer rejected with the message 'Classification type E3_561_001 is forbidden ...'?

The code E3_561_001 is for wholesale sales to domestic businesses, and AADE does not accept it on a foreign-customer document such as 2.2. Change the classificationType according to the recipient's country: E3_561_005 for a customer in an EU country (type 2.2, category category1_3), or E3_561_006 for a customer in a non-EU country, where the correct type is usually 2.3. Change the classification both on the lines and in invoiceSummary.

See: Income / expense classifications

Why is my self-billing invoice rejected when I send selfPricing with the value true in quotes?

selfPricing is a boolean and is sent as a JSON boolean (true), without quotes. With a quoted value (a string), the document is rejected and not issued. The same applies to all boolean fields, e.g. isDeliveryNote and fuelInvoice.

See: SendInvoices

Why do I get AADE errors 207, 208 and 312 when the amounts look correct?

Errors 207, 208 and 312 mean that the line sums (net value, gross value, classifications) do not match the totals in invoiceSummary. Rounding is usually the cause: even a difference of a few cents, e.g. €0.03, is rejected. Calculate the totals by adding up the already rounded line values (2 decimals), so that totalNetValue, totalGrossValue and the classification amounts match exactly.

See: AADE error codes

What does error 202 'Invalid Greek VAT number' mean, when the client insists the VAT number is correct?

The error is returned by AADE (myDATA), not by the Provider, and it means that the VAT number is not a valid Greek VAT number. Check for a typo or a wrong check digit, e.g. by looking up the VAT number in a registry. The Provider forwards the data as it receives it and does not correct VAT numbers.

See: AADE error codes

What does HTTP 400 'The invoicesDocRequest field is required' or 'The JSON value could not be converted to …' mean when I send a document?

The request body cannot be read (deserialized) with the API schema, so the Provider rejects it with HTTP 400 and the document does not reach AADE. The most common cause is a field that must be an array but was sent as a single object or left empty: invoice, invoiceDetails, paymentMethods and incomeClassification / expensesClassification always go inside [ ], even with one item. The same happens with a code value that is not recognized or is empty (e.g. in the classification). The Path in the message (e.g. $.invoice[0].invoiceDetails) shows which field is wrong. Fix it and resend with the same series/number (aa), since the document was not issued.

See: SendInvoices

What do I do on HTTP 5xx, a timeout or a connection failure, when I don't know if the document was received, so that it is not issued twice?

Treat the status as unknown. First check with RequestTransmittedDocs (e.g. by series/number or UID) whether the document exists and has a MARK. If it does not, resend exactly the same payload (same series, number and date). If the first submission went through, AADE returns error 228 with the original MARK and Authentication Code, which you keep as "already issued". Do not retry immediately: allow a reasonable delay (e.g. exponential backoff), because two requests a few milliseconds apart can bypass AADE's duplicate check. If the Provider stays unreachable, issue locally and send within 1 day with transmissionFailure: 1.

See: Offline & retries

Why do I get HTTP 401 Unauthorized on SendInvoices in production, when the same API key works on another installation? Do I need a key per client?

You do not need a key per client: one API key serves all your activated VAT numbers, and the client is identified by issuer.vatNumber. A 401 without an errors message means that the API-KEY header is missing or not arriving correctly, that the key is wrong or inactive, or that you are sending a sandbox key to production (or the other way round). If the issuer's VAT number is not activated, the 401 comes with errors "You don't have the authority to send for this vat numbers ...". Check the configuration of that specific installation (header, environment URL, spaces or hidden characters in the key). If the problem persists, send Novus the JSON of the request and the response.

See: Environments & API key