API playground

Every endpoint with its parameters and examples. Press Try it to send a real request to sandbox from your browser.

Download OpenAPI v3.17.1

Unify

Submit a document

Validates one invoice or credit note for a country and document type, then stores it and continues delivery to the tax authority or the Peppol network (purpose: invoicing), checks it without storing it (validate), or saves it as a sample for mapping (mapping). Send several documents at once in an invoices array (see UnifyBatchRequest), or send the request as XML with Content-Type: application/xml. Too many requests in a short time return 429.

POST /api/v3/unify

Authorization

Authorization string header required

Your API key, as Bearer YOUR_API_KEY.

Headers

new-api string header

Selects this request format for a JSON body. Without it, a JSON request is read in the earlier format. Not needed for XML.

Value true

Body

application/json

source must be one of your sources, as name:version. The examples use a sample source and a sample seller: replace them with your own. The minimal example has only the fields a UAE tax invoice needs; the full example adds common optional fields.

country string required

ISO 3166-1 alpha-2 code of the country the document is for.

One of AESAOMMYBEDE

environment string required

Must match your API key: a sandbox key for sandbox, a production key for production.

One of sandboxproduction

purpose string required

invoicing validates, stores and submits the document. validate runs the same checks without storing or submitting anything. mapping saves the payload as a sample to build a mapping from. Required: a request without it is refused with 400.

One of invoicingvalidatemapping

documentType object required

Decides which payload fields are required.

3 child attributes

base string required

For example tax_invoice or credit_note.

modifiers string[] required

Send an empty array when none apply.

variant string

payload object required

The invoice in the shape your source's mapping reads. With the Default GETS Mapping the payload is GETS, described by the GETS JSON Schema at /gets.schema.json and the field reference at /api-reference/gets/fields/. Dates are YYYY-MM-DD; amounts are numbers.

source string

Your source as name:version, split at the last colon. The version is the free text you registered, such as 1.0.0 or v1. Required for invoicing and validate.

The fields inside payload depend on the country and document type. See them in the field reference, or build a payload with .

Responses

200

For invoicing, the document passed validation and was stored. For validate, the checks ran: read valid. For mapping, the sample was saved. For a batch, the batch was read: read each item.

400

The request is malformed, names an unsupported country, has no purpose, or has a missing or malformed source (not name:version). A batch with more items than its limit, or one that mixes validate with other purposes, is refused the same way.

401

The API key is missing, invalid, revoked or expired.

403

The key cannot make this request.

404

The source was not found in your workspace. Check its name and version.

409

More than one source in your workspace has this name and version. Archive or rename the duplicate.

412

The source's mapping cannot take invoices yet. reason says why: no mapping for this source, country and document type, more than one, an inactive mapping, test cases that have not passed, or production that is still locked for this country, document type and request format.

413

An XML body is larger than 8 MiB.

415

An XML request has the wrong Content-Type, or a compressed body.

422

The document failed validation. Each error names the field in GETS and in your payload, and the rule it broke.

429

Too many requests in a short time. Wait for the number of seconds in Retry-After, then send again.

500

Something went wrong on our side. Retry with backoff.

503

A service the request needs is briefly unavailable. Send again after a short wait, then with longer waits.

More detail, with walkthroughs, in the reference page.

Try Submit a document

POST Sandbox

Add your API key to send. Until then, the example responses show what comes back. You can also paste a cURL command to fill in the request.

Add your source to get a real 200; the sample source is not in your workspace.

JSON

source must be one of your sources, as name:version. The examples use a sample source and a sample seller: replace them with your own. The minimal example has only the fields a UAE tax invoice needs; the full example adds common optional fields.

{
  "documentId": "01K5EXAMPLE00000000000142",
  "documentNumber": "INV-2026-000184",
  "message": "Your invoice was validated and is ready for submission.",
  "Base64XML": "PEludm9pY2UgeG1sbnM9InVybjpvYXNpczpuYW1lczpzcGVjaWZpY2F0aW9uOnVibDpzY2hlbWE6eHNkOkludm9pY2UtMiIgeG1sbnM6Y2FjPSJ1cm46b2FzaXM6bmFtZXM6c3BlY2lmaWNhdGlvbjp1Ymw6c2NoZW1hOnhzZDpDb21tb25BZ2dyZWdhdGVDb21wb25lbnRzLTIiIHhtbG5zOmNiYz0idXJuOm9hc2lzOm5hbWVzOnNwZWNpZmljYXRpb246dWJsOnNjaGVtYTp4c2Q6Q29tbW9uQmFzaWNDb21wb25lbnRzLTIiPgo8Y2JjOkN1c3RvbWl6YXRpb25JRD51cm46cGVwcG9sOnBpbnQ6YmlsbGluZy0xQGFlLTE8L2NiYzpDdXN0b21pemF0aW9uSUQ+CjxjYmM6UHJvZmlsZUlEPnVybjpwZXBwb2w6YmlzOmJpbGxpbmc8L2NiYzpQcm9maWxlSUQ+CjxjYmM6UHJvZmlsZUV4ZWN1dGlvbklEPjAwMDAwMDAwPC9jYmM6UHJvZmlsZUV4ZWN1dGlvbklEPgo8Y2JjOklEPklOVi0yMDI2LTAwMDE4NDwvY2JjOklEPgo8Y2JjOlVVSUQ+NmYxYzJhOWUtM2I0ZC00ZThmLTlhN2ItMWMyZDNlNGY1YTZiPC9jYmM6VVVJRD4KPGNiYzpJc3N1ZURhdGU+MjAyNi0wOS0xODwvY2JjOklzc3VlRGF0ZT4KPGNiYzpEdWVEYXRlPjIwMjYtMTAtMTg8L2NiYzpEdWVEYXRlPgo8Y2JjOkludm9pY2VUeXBlQ29kZT4zODA8L2NiYzpJbnZvaWNlVHlwZUNvZGU+CjxjYmM6RG9jdW1lbnRDdXJyZW5jeUNvZGU+QUVEPC9jYmM6RG9jdW1lbnRDdXJyZW5jeUNvZGU+CjxjYWM6QWNjb3VudGluZ1N1cHBsaWVyUGFydHk+PGNhYzpQYXJ0eT48Y2JjOkVuZHBvaW50SUQgc2NoZW1lSUQ9IjAyMzUiPjEwMDAxMjM0NTY8L2NiYzpFbmRwb2ludElEPjxjYWM6UGFydHlOYW1lPjxjYmM6TmFtZT5BY21lIFRyYWRpbmcgTExDPC9jYmM6TmFtZT48L2NhYzpQYXJ0eU5hbWU+PGNhYzpQb3N0YWxBZGRyZXNzPjxjYmM6U3RyZWV0TmFtZT4xMiBIYXJib3VyIFJvYWQ8L2NiYzpTdHJlZXROYW1lPjxjYmM6Q2l0eU5hbWU+RHViYWk8L2NiYzpDaXR5TmFtZT48Y2JjOkNvdW50cnlTdWJlbnRpdHk+RFhCPC9jYmM6Q291bnRyeVN1YmVudGl0eT48Y2FjOkNvdW50cnk+PGNiYzpJZGVudGlmaWNhdGlvbkNvZGU+QUU8L2NiYzpJZGVudGlmaWNhdGlvbkNvZGU+PC9jYWM6Q291bnRyeT48L2NhYzpQb3N0YWxBZGRyZXNzPjxjYWM6UGFydHlUYXhTY2hlbWU+PGNiYzpDb21wYW55SUQ+MTAwMDEyMzQ1NjAwMDAzPC9jYmM6Q29tcGFueUlEPjxjYWM6VGF4U2NoZW1lPjxjYmM6SUQ+VkFUPC9jYmM6SUQ+PC9jYWM6VGF4U2NoZW1lPjwvY2FjOlBhcnR5VGF4U2NoZW1lPjxjYWM6UGFydHlMZWdhbEVudGl0eT48Y2JjOlJlZ2lzdHJhdGlvbk5hbWU+QWNtZSBUcmFkaW5nIExMQzwvY2JjOlJlZ2lzdHJhdGlvbk5hbWU+PGNiYzpDb21wYW55SUQgc2NoZW1lQWdlbmN5SUQ9IlRMIiBzY2hlbWVBZ2VuY3lOYW1lPSJEdWJhaSBEZXBhcnRtZW50IG9mIEVjb25vbXkgYW5kIFRvdXJpc20iPkNOLTEyMzQ1Njc8L2NiYzpDb21wYW55SUQ+PC9jYWM6UGFydHlMZWdhbEVudGl0eT48L2NhYzpQYXJ0eT48L2NhYzpBY2NvdW50aW5nU3VwcGxpZXJQYXJ0eT4KPGNhYzpBY2NvdW50aW5nQ3VzdG9tZXJQYXJ0eT48Y2FjOlBhcnR5PjxjYmM6RW5kcG9pbnRJRCBzY2hlbWVJRD0iMDIzNSI+MTAwMDk4NzY1NDwvY2JjOkVuZHBvaW50SUQ+PGNhYzpQYXJ0eU5hbWU+PGNiYzpOYW1lPkd1bGYgUmV0YWlsIEZaLUxMQzwvY2JjOk5hbWU+PC9jYWM6UGFydHlOYW1lPjxjYWM6UG9zdGFsQWRkcmVzcz48Y2JjOlN0cmVldE5hbWU+NDggTWFya2V0IFN0cmVldDwvY2JjOlN0cmVldE5hbWU+PGNiYzpDaXR5TmFtZT5EdWJhaTwvY2JjOkNpdHlOYW1lPjxjYmM6Q291bnRyeVN1YmVudGl0eT5EWEI8L2NiYzpDb3VudHJ5U3ViZW50aXR5PjxjYWM6Q291bnRyeT48Y2JjOklkZW50aWZpY2F0aW9uQ29kZT5BRTwvY2JjOklkZW50aWZpY2F0aW9uQ29kZT48L2NhYzpDb3VudHJ5PjwvY2FjOlBvc3RhbEFkZHJlc3M+PGNhYzpQYXJ0eVRheFNjaGVtZT48Y2JjOkNvbXBhbnlJRD4xMDAwOTg3NjU0MDAwMDM8L2NiYzpDb21wYW55SUQ+PGNhYzpUYXhTY2hlbWU+PGNiYzpJRD5WQVQ8L2NiYzpJRD48L2NhYzpUYXhTY2hlbWU+PC9jYWM6UGFydHlUYXhTY2hlbWU+PGNhYzpQYXJ0eUxlZ2FsRW50aXR5PjxjYmM6UmVnaXN0cmF0aW9uTmFtZT5HdWxmIFJldGFpbCBGWi1MTEM8L2NiYzpSZWdpc3RyYXRpb25OYW1lPjwvY2FjOlBhcnR5TGVnYWxFbnRpdHk+PC9jYWM6UGFydHk+PC9jYWM6QWNjb3VudGluZ0N1c3RvbWVyUGFydHk+CjxjYWM6UGF5bWVudE1lYW5zPjxjYmM6UGF5bWVudE1lYW5zQ29kZT4zMDwvY2JjOlBheW1lbnRNZWFuc0NvZGU+PGNhYzpQYXllZUZpbmFuY2lhbEFjY291bnQ+PGNiYzpJRCBzY2hlbWVJRD0iSUJBTiI+QUUwNzAzMzEyMzQ1Njc4OTAxMjM0NTY8L2NiYzpJRD48L2NhYzpQYXllZUZpbmFuY2lhbEFjY291bnQ+PC9jYWM6UGF5bWVudE1lYW5zPgo8Y2FjOlRheFRvdGFsPjxjYmM6VGF4QW1vdW50IGN1cnJlbmN5SUQ9IkFFRCI+MTAwPC9jYmM6VGF4QW1vdW50PjxjYWM6VGF4U3VidG90YWw+PGNiYzpUYXhhYmxlQW1vdW50IGN1cnJlbmN5SUQ9IkFFRCI+MjAwMDwvY2JjOlRheGFibGVBbW91bnQ+PGNiYzpUYXhBbW91bnQgY3VycmVuY3lJRD0iQUVEIj4xMDA8L2NiYzpUYXhBbW91bnQ+PGNhYzpUYXhDYXRlZ29yeT48Y2JjOklEPlM8L2NiYzpJRD48Y2JjOlBlcmNlbnQ+NTwvY2JjOlBlcmNlbnQ+PGNhYzpUYXhTY2hlbWU+PGNiYzpJRD5WQVQ8L2NiYzpJRD48L2NhYzpUYXhTY2hlbWU+PC9jYWM6VGF4Q2F0ZWdvcnk+PC9jYWM6VGF4U3VidG90YWw+PC9jYWM6VGF4VG90YWw+CjxjYWM6TGVnYWxNb25ldGFyeVRvdGFsPjxjYmM6TGluZUV4dGVuc2lvbkFtb3VudCBjdXJyZW5jeUlEPSJBRUQiPjIwMDA8L2NiYzpMaW5lRXh0ZW5zaW9uQW1vdW50PjxjYmM6VGF4RXhjbHVzaXZlQW1vdW50IGN1cnJlbmN5SUQ9IkFFRCI+MjAwMDwvY2JjOlRheEV4Y2x1c2l2ZUFtb3VudD48Y2JjOlRheEluY2x1c2l2ZUFtb3VudCBjdXJyZW5jeUlEPSJBRUQiPjIxMDA8L2NiYzpUYXhJbmNsdXNpdmVBbW91bnQ+PGNiYzpQYXlhYmxlQW1vdW50IGN1cnJlbmN5SUQ9IkFFRCI+MjEwMDwvY2JjOlBheWFibGVBbW91bnQ+PC9jYWM6TGVnYWxNb25ldGFyeVRvdGFsPgo8Y2FjOkludm9pY2VMaW5lPjxjYmM6SUQ+MTwvY2JjOklEPjxjYmM6SW52b2ljZWRRdWFudGl0eSB1bml0Q29kZT0iSDg3Ij4yMDwvY2JjOkludm9pY2VkUXVhbnRpdHk+PGNiYzpMaW5lRXh0ZW5zaW9uQW1vdW50IGN1cnJlbmN5SUQ9IkFFRCI+MjAwMDwvY2JjOkxpbmVFeHRlbnNpb25BbW91bnQ+PGNiYzpUYXhQb2ludERhdGU+MjAyNi0wOS0xODwvY2JjOlRheFBvaW50RGF0ZT48Y2FjOkl0ZW0+PGNiYzpEZXNjcmlwdGlvbj5DbG91ZCBzdWJzY3JpcHRpb24g4oCUIEJ1c2luZXNzIHBsYW48L2NiYzpEZXNjcmlwdGlvbj48Y2JjOk5hbWU+Q2xvdWQgc3Vic2NyaXB0aW9uIOKAlCBCdXNpbmVzcyBwbGFuPC9jYmM6TmFtZT48Y2FjOkNsYXNzaWZpZWRUYXhDYXRlZ29yeT48Y2JjOklEPlM8L2NiYzpJRD48Y2JjOlBlcmNlbnQ+NTwvY2JjOlBlcmNlbnQ+PGNhYzpUYXhTY2hlbWU+PGNiYzpJRD5WQVQ8L2NiYzpJRD48L2NhYzpUYXhTY2hlbWU+PC9jYWM6Q2xhc3NpZmllZFRheENhdGVnb3J5PjwvY2FjOkl0ZW0+PGNhYzpQcmljZT48Y2JjOlByaWNlQW1vdW50IGN1cnJlbmN5SUQ9IkFFRCI+MTAwPC9jYmM6UHJpY2VBbW91bnQ+PGNiYzpCYXNlUXVhbnRpdHkgdW5pdENvZGU9Ikg4NyI+MTwvY2JjOkJhc2VRdWFudGl0eT48Y2FjOkFsbG93YW5jZUNoYXJnZT48Y2JjOkNoYXJnZUluZGljYXRvcj5mYWxzZTwvY2JjOkNoYXJnZUluZGljYXRvcj48Y2JjOkFtb3VudCBjdXJyZW5jeUlEPSJBRUQiPjA8L2NiYzpBbW91bnQ+PGNiYzpCYXNlQW1vdW50IGN1cnJlbmN5SUQ9IkFFRCI+MTAwPC9jYmM6QmFzZUFtb3VudD48L2NhYzpBbGxvd2FuY2VDaGFyZ2U+PC9jYWM6UHJpY2U+PGNhYzpJdGVtUHJpY2VFeHRlbnNpb24+PGNiYzpBbW91bnQgY3VycmVuY3lJRD0iQUVEIj4yMTAwPC9jYmM6QW1vdW50PjxjYWM6VGF4VG90YWw+PGNiYzpUYXhBbW91bnQgY3VycmVuY3lJRD0iQUVEIj4xMDA8L2NiYzpUYXhBbW91bnQ+PC9jYWM6VGF4VG90YWw+PC9jYWM6SXRlbVByaWNlRXh0ZW5zaW9uPjwvY2FjOkludm9pY2VMaW5lPgo8L0ludm9pY2U+"
}

Example: Document validated For invoicing, the document passed validation and was stored. For validate, the checks ran: read valid. For mapping, the sample was saved. For a batch, the batch was read: read each item.