Read an incoming e-invoice

You receive XRechnungen or ZUGFeRD PDFs and want the data in your own system.

Steps

  1. 1

    Send the file base64-encoded to the parse endpoint, together with its filename.

  2. 2

    The format is detected; the response carries the structured data plus diagnostics.

  3. 3

    Before booking, check that amounts and tax rates match your order.

The call

POST /api/v1/invoice/parse

bash
1curl -X POST https://api.invoice-api.xhub.io/api/v1/invoice/parse \
2 -H "X-API-Key: $INVOICE_API_KEY" \
3 -H "Content-Type: application/json" \
4 -d '{
5 "data": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHVibDpJbnZvaWNlIHhtbG5zOnVibD0idXJuOm9hc2lzOm5hbWVzOnNwZWNpZmljYXRpb246dWJsOnNjaGVtYTp4c2Q6SW52b2ljZS0yIiB4bWxuczpjYWM9InVybjpvYXNpczpuYW1lczpzcGVjaWZpY2F0aW9uOnVibDpzY2hlbWE6eHNkOkNvbW1vbkFnZ3JlZ2F0ZUNvbXBvbmVudHMtMiIgeG1sbnM6Y2JjPSJ1cm46b2FzaXM6bmFtZXM6c3BlY2lmaWNhdGlvbjp1Ymw6c2NoZW1hOnhzZDpDb21tb25CYXNpY0NvbXBvbmVudHMtMiI+CiAgPGNiYzpDdXN0b21pemF0aW9uSUQ+dXJuOmNlbi5ldTplbjE2OTMxOjIwMTcjY29tcGxpYW50I3Vybjp4ZWlua2F1Zi5kZTprb3NpdDp4cmVjaG51bmdfMy4wPC9jYmM6Q3VzdG9taXphdGlvbklEPgogIDxjYmM6UHJvZmlsZUlEPnVybjpmZGM6cGVwcG9sLmV1OjIwMTc6cG9hY2M6YmlsbGluZzowMToxLjA8L2NiYzpQcm9maWxlSUQ+CiAgPGNiYzpJRD5SRS0yMDI1LTAwMTwvY2JjOklEPgogIDxjYmM6SXNzdWVEYXRlPjIwMjUtMDEtMTU8L2NiYzpJc3N1ZURhdGU+CiAgPGNiYzpEdWVEYXRlPjIwMjUtMDItMTU8L2NiYzpEdWVEYXRlPgogIDxjYmM6SW52b2ljZVR5cGVDb2RlPjM4MDwvY2JjOkludm9pY2VUeXBlQ29kZT4KICA8Y2JjOkRvY3VtZW50Q3VycmVuY3lDb2RlPkVVUjwvY2JjOkRvY3VtZW50Q3VycmVuY3lDb2RlPgogIDxjYmM6QnV5ZXJSZWZlcmVuY2U+QlVZRVItUkVGLTAwMTwvY2JjOkJ1eWVyUmVmZXJlbmNlPgogIDxjYWM6QWNjb3VudGluZ1N1cHBsaWVyUGFydHk+CiAgICA8Y2FjOlBhcnR5PgogICAgICA8Y2JjOkVuZHBvaW50SUQgc2NoZW1lSUQ9IkVNIj5pbmZvQG11c3Rlci5kZTwvY2JjOkVuZHBvaW50SUQ+CiAgICAgIDxjYWM6UGFydHlOYW1lPjxjYmM6TmFtZT5NdXN0ZXIgR21iSDwvY2JjOk5hbWU+PC9jYWM6UGFydHlOYW1lPgogICAgICA8Y2FjOlBvc3RhbEFkZHJlc3M+CiAgICAgICAgPGNiYzpTdHJlZXROYW1lPk11c3RlcnN0cmHDn2UgMTwvY2JjOlN0cmVldE5hbWU+CiAgICAgICAgPGNiYzpDaXR5TmFtZT5CZXJsaW48L2NiYzpDaXR5TmFtZT4KICAgICAgICA8Y2JjOlBvc3RhbFpvbmU+MTAxMTU8L2NiYzpQb3N0YWxab25lPgogICAgICAgIDxjYWM6Q291bnRyeT48Y2JjOklkZW50aWZpY2F0aW9uQ29kZT5ERTwvY2JjOklkZW50aWZpY2F0aW9uQ29kZT48L2NhYzpDb3VudHJ5PgogICAgICA8L2NhYzpQb3N0YWxBZGRyZXNzPgogICAgICA8Y2FjOlBhcnR5VGF4U2NoZW1lPgogICAgICAgIDxjYmM6Q29tcGFueUlEPkRFODExMTI4MTM1PC9jYmM6Q29tcGFueUlEPgogICAgICAgIDxjYWM6VGF4U2NoZW1lPjxjYmM6SUQ+VkFUPC9jYmM6SUQ+PC9jYWM6VGF4U2NoZW1lPgogICAgICA8L2NhYzpQYXJ0eVRheFNjaGVtZT4KICAgICAgPGNhYzpQYXJ0eUxlZ2FsRW50aXR5PjxjYmM6UmVnaXN0cmF0aW9uTmFtZT5NdXN0ZXIgR21iSDwvY2JjOlJlZ2lzdHJhdGlvbk5hbWU+PC9jYWM6UGFydHlMZWdhbEVudGl0eT4KICAgIDwvY2FjOlBhcnR5PgogIDwvY2FjOkFjY291bnRpbmdTdXBwbGllclBhcnR5PgogIDxjYWM6QWNjb3VudGluZ0N1c3RvbWVyUGFydHk+CiAgICA8Y2FjOlBhcnR5PgogICAgICA8Y2JjOkVuZHBvaW50SUQgc2NoZW1lSUQ9IkVNIj5idWNoaGFsdHVuZ0BiZWlzcGllbC1hZy5kZTwvY2JjOkVuZHBvaW50SUQ+CiAgICAgIDxjYWM6UGFydHlOYW1lPjxjYmM6TmFtZT5CZWlzcGllbCBBRzwvY2JjOk5hbWU+PC9jYWM6UGFydHlOYW1lPgogICAgICA8Y2FjOlBvc3RhbEFkZHJlc3M+CiAgICAgICAgPGNiYzpTdHJlZXROYW1lPkJlaXNwaWVsd2VnIDQyPC9jYmM6U3RyZWV0TmFtZT4KICAgICAgICA8Y2JjOkNpdHlOYW1lPk3DvG5jaGVuPC9jYmM6Q2l0eU5hbWU+CiAgICAgICAgPGNiYzpQb3N0YWxab25lPjgwMzMxPC9jYmM6UG9zdGFsWm9uZT4KICAgICAgICA8Y2FjOkNvdW50cnk+PGNiYzpJZGVudGlmaWNhdGlvbkNvZGU+REU8L2NiYzpJZGVudGlmaWNhdGlvbkNvZGU+PC9jYWM6Q291bnRyeT4KICAgICAgPC9jYWM6UG9zdGFsQWRkcmVzcz4KICAgICAgPGNhYzpQYXJ0eVRheFNjaGVtZT4KICAgICAgICA8Y2JjOkNvbXBhbnlJRD5ERTEzNjY5NTk3NjwvY2JjOkNvbXBhbnlJRD4KICAgICAgICA8Y2FjOlRheFNjaGVtZT48Y2JjOklEPlZBVDwvY2JjOklEPjwvY2FjOlRheFNjaGVtZT4KICAgICAgPC9jYWM6UGFydHlUYXhTY2hlbWU+CiAgICAgIDxjYWM6UGFydHlMZWdhbEVudGl0eT48Y2JjOlJlZ2lzdHJhdGlvbk5hbWU+QmVpc3BpZWwgQUc8L2NiYzpSZWdpc3RyYXRpb25OYW1lPjwvY2FjOlBhcnR5TGVnYWxFbnRpdHk+CiAgICA8L2NhYzpQYXJ0eT4KICA8L2NhYzpBY2NvdW50aW5nQ3VzdG9tZXJQYXJ0eT4KICA8Y2FjOlBheW1lbnRNZWFucz4KICAgIDxjYmM6UGF5bWVudE1lYW5zQ29kZT41ODwvY2JjOlBheW1lbnRNZWFuc0NvZGU+CiAgICA8Y2FjOlBheWVlRmluYW5jaWFsQWNjb3VudD4KICAgICAgPGNiYzpJRD5ERTg5MzcwNDAwNDQwNTMyMDEzMDAwPC9jYmM6SUQ+CiAgICAgIDxjYWM6RmluYW5jaWFsSW5zdGl0dXRpb25CcmFuY2g+PGNiYzpJRD5DT0JBREVGRlhYWDwvY2JjOklEPjwvY2FjOkZpbmFuY2lhbEluc3RpdHV0aW9uQnJhbmNoPgogICAgPC9jYWM6UGF5ZWVGaW5hbmNpYWxBY2NvdW50PgogIDwvY2FjOlBheW1lbnRNZWFucz4KICA8Y2FjOlRheFRvdGFsPgogICAgPGNiYzpUYXhBbW91bnQgY3VycmVuY3lJRD0iRVVSIj4xOTAuMDA8L2NiYzpUYXhBbW91bnQ+CiAgICA8Y2FjOlRheFN1YnRvdGFsPgogICAgICA8Y2JjOlRheGFibGVBbW91bnQgY3VycmVuY3lJRD0iRVVSIj4xMDAwLjAwPC9jYmM6VGF4YWJsZUFtb3VudD4KICAgICAgPGNiYzpUYXhBbW91bnQgY3VycmVuY3lJRD0iRVVSIj4xOTAuMDA8L2NiYzpUYXhBbW91bnQ+CiAgICAgIDxjYWM6VGF4Q2F0ZWdvcnk+CiAgICAgICAgPGNiYzpJRD5TPC9jYmM6SUQ+CiAgICAgICAgPGNiYzpQZXJjZW50PjE5LjAwPC9jYmM6UGVyY2VudD4KICAgICAgICA8Y2FjOlRheFNjaGVtZT48Y2JjOklEPlZBVDwvY2JjOklEPjwvY2FjOlRheFNjaGVtZT4KICAgICAgPC9jYWM6VGF4Q2F0ZWdvcnk+CiAgICA8L2NhYzpUYXhTdWJ0b3RhbD4KICA8L2NhYzpUYXhUb3RhbD4KICA8Y2FjOkxlZ2FsTW9uZXRhcnlUb3RhbD4KICAgIDxjYmM6TGluZUV4dGVuc2lvbkFtb3VudCBjdXJyZW5jeUlEPSJFVVIiPjEwMDAuMDA8L2NiYzpMaW5lRXh0ZW5zaW9uQW1vdW50PgogICAgPGNiYzpUYXhFeGNsdXNpdmVBbW91bnQgY3VycmVuY3lJRD0iRVVSIj4xMDAwLjAwPC9jYmM6VGF4RXhjbHVzaXZlQW1vdW50PgogICAgPGNiYzpUYXhJbmNsdXNpdmVBbW91bnQgY3VycmVuY3lJRD0iRVVSIj4xMTkwLjAwPC9jYmM6VGF4SW5jbHVzaXZlQW1vdW50PgogICAgPGNiYzpQYXlhYmxlQW1vdW50IGN1cnJlbmN5SUQ9IkVVUiI+MTE5MC4wMDwvY2JjOlBheWFibGVBbW91bnQ+CiAgPC9jYWM6TGVnYWxNb25ldGFyeVRvdGFsPgogIDxjYWM6SW52b2ljZUxpbmU+CiAgICA8Y2JjOklEPjE8L2NiYzpJRD4KICAgIDxjYmM6SW52b2ljZWRRdWFudGl0eSB1bml0Q29kZT0iSFVSIj4xMDwvY2JjOkludm9pY2VkUXVhbnRpdHk+CiAgICA8Y2JjOkxpbmVFeHRlbnNpb25BbW91bnQgY3VycmVuY3lJRD0iRVVSIj4xMDAwLjAwPC9jYmM6TGluZUV4dGVuc2lvbkFtb3VudD4KICAgIDxjYWM6SXRlbT4KICAgICAgPGNiYzpEZXNjcmlwdGlvbj5CZXJhdHVuZ3NsZWlzdHVuZzwvY2JjOkRlc2NyaXB0aW9uPgogICAgICA8Y2JjOk5hbWU+QmVyYXR1bmdzbGVpc3R1bmc8L2NiYzpOYW1lPgogICAgICA8Y2FjOkNsYXNzaWZpZWRUYXhDYXRlZ29yeT4KICAgICAgICA8Y2JjOklEPlM8L2NiYzpJRD4KICAgICAgICA8Y2JjOlBlcmNlbnQ+MTkuMDA8L2NiYzpQZXJjZW50PgogICAgICAgIDxjYWM6VGF4U2NoZW1lPjxjYmM6SUQ+VkFUPC9jYmM6SUQ+PC9jYWM6VGF4U2NoZW1lPgogICAgICA8L2NhYzpDbGFzc2lmaWVkVGF4Q2F0ZWdvcnk+CiAgICA8L2NhYzpJdGVtPgogICAgPGNhYzpQcmljZT48Y2JjOlByaWNlQW1vdW50IGN1cnJlbmN5SUQ9IkVVUiI+MTAwLjAwPC9jYmM6UHJpY2VBbW91bnQ+PC9jYWM6UHJpY2U+CiAgPC9jYWM6SW52b2ljZUxpbmU+CjwvdWJsOkludm9pY2U+",
6 "filename": "eingang.xml"
7}'

Where this goes wrong

With ZUGFeRD the truth is in the embedded XML, not in the visible PDF. Reading the PDF with OCR risks taking over the wrong numbers.