API reference

Invoices

Create and send invoices to the UAE Peppol network. The invoice is built from structured data, validated, converted to XML and dispatched. Requires an access token.

POST/oauth/invoicesAccess token

Push invoice

Create an invoice for one of your entities. Totals are computed from line items when omitted. Set auto_send=false to validate and store only. Conditional rules: payment_account_id (IBAN) is required while payment_means_code is "30" (credit transfer); for registration type "TL" the issuing/authority name is required, for "PAS" the passport country is required instead.

Request body example
{
  "entity_id": "REPLACE_WITH_ENTITY_ID",
  "invoice_number": "INV-1001",
  "date": "2026-06-15",
  "currency": "AED",
  "invoice_type": "Tax Invoice",
  "payment_means_code": "30",
  "payment_account_id": "AE070331234567890123456",
  "seller": {
    "registration_type": "TL",
    "issuing_authority": "Department of Economic Development - Dubai"
  },
  "buyer": {
    "name": "Buyer LLC",
    "trn": "987654321098765",
    "country": "United Arab Emirates",
    "city": "Dubai",
    "email": "ap@buyer.com",
    "legal_registration_type": "TL",
    "legal_registration_id": "CN-1234567",
    "authority_name": "Department of Economic Development - Dubai"
  },
  "line_items": [
    {
      "description": "Consulting service",
      "quantity": 10,
      "unit_amount": 100,
      "tax_amount": 50,
      "tax_rate": 5,
      "tax_category": "S",
      "unit": "EA"
    }
  ],
  "auto_send": true
}

Body parameters

entity_idstringrequiredID of the seller entity to invoice from. Must belong to your app — get it from GET /oauth/entities.
invoice_numberstringrequiredYour unique invoice number. A duplicate number for the same entity is rejected with 409.
datestringrequiredInvoice issue date, formatted YYYY-MM-DD.
currencystringoptionalISO 4217 currency code. Defaults to "AED".
invoice_typestringoptionalDocument type: "Tax Invoice" (default), "Credit Note", or "Commercial Invoice".
due_datestringoptionalPayment due date, YYYY-MM-DD.
referencestringoptionalFree-text note shown on the invoice.
payment_means_codestringoptionalUNCL 4461 payment-means code. Defaults to "30". "30" = credit transfer, "10" = cash, "20" = cheque, "48" = bank card, "49" = direct debit.
payment_account_idstringconditionalSeller IBAN. Required (IBT-084) when payment_means_code is "30" (credit transfer); otherwise optional.
payment_methodstringoptionalLegacy human-readable label (e.g. "Credit Transfer"). Used only when payment_means_code is empty.
exchange_ratenumberoptionalExchange rate to AED. Provide when currency is not AED.
transaction_type_codestringoptionalUAE transaction type code. Defaults to "00000000".
sub_totalnumberoptionalTaxable amount (sum of line net amounts). Computed from line_items when omitted.
total_taxnumberoptionalTotal VAT (sum of line tax amounts). Computed from line_items when omitted.
totalnumberoptionalGrand total (sub_total + total_tax). Computed when omitted.
auto_sendbooleanoptionalWhen true (default) the invoice is dispatched to Peppol. When false it is only validated and stored.
sellerobjectconditionalSeller legal-registration details (BTUAE-15). Required when the seller electronic-ID scheme is "0235". Not stored on the entity, so passed per-invoice.
seller.registration_typestringconditional"TL" = trade license, "PAS" = passport.
seller.issuing_authoritystringconditionalAuthority that issued the trade license. Required when seller.registration_type is "TL".
seller.passport_countrystringconditionalPassport-issuing country. Required when seller.registration_type is "PAS".
buyerobjectrequiredBuyer (customer) details.
buyer.namestringrequiredBuyer legal name.
buyer.trnstringrequiredBuyer Tax Registration Number (15 digits).
buyer.countrystringrequiredBuyer country — name or ISO 3166-1 alpha-2 (e.g. "AE").
buyer.address_line1stringoptionalBuyer street address.
buyer.citystringoptionalBuyer city.
buyer.regionstringoptionalBuyer emirate / state.
buyer.emailstringoptionalBuyer accounts-payable email.
buyer.phonestringoptionalBuyer phone number.
buyer.electronic_addressstringoptionalBuyer Peppol electronic address.
buyer.legal_registration_idstringoptionalBuyer legal registration ID (IBT-047), e.g. trade-license number.
buyer.legal_registration_typestringoptional"TL" = trade license, "PAS" = passport (BTUAE-16).
buyer.authority_namestringconditionalAuthority that issued the registration. Required when buyer.legal_registration_type is "TL".
buyer.passport_country_codestringconditionalPassport-issuing country code. Required when buyer.legal_registration_type is "PAS".
line_itemsarrayrequiredInvoice line items. At least one is required.
line_items[].descriptionstringrequiredLine description.
line_items[].quantitynumberrequiredQuantity.
line_items[].unit_amountnumberrequiredNet unit price (must be > 0).
line_items[].tax_amountnumberrequiredVAT amount for this line.
line_items[].line_amountnumberoptionalNet line amount. Computed as quantity × unit_amount when omitted.
line_items[].tax_ratenumberoptionalVAT percentage, e.g. 5.
line_items[].tax_categorystringoptionalTax category code: S (standard), Z (zero), E (exempt), O (out of scope), AE (reverse charge). Defaults to "S".
line_items[].unitstringoptionalUnit of measure (UN/ECE Rec 20 code or label). Defaults to "EA".
line_items[].discount_percentnumberoptionalLine discount percentage.
line_items[].account_codestringoptionalAccounting code. Defaults to "200".
line_items[].item_namestringoptionalItem name.
line_items[].item_typestringoptionalItem type.
line_items[].hs_codestringoptionalHS commodity code (for goods).
line_items[].service_codestringoptionalService classification code (for services).
POST/oauth/invoices/bulkAccess token

Push multiple invoices

Send multiple invoices in a single request. Each invoice is processed independently — one failure does not block the others. Returns HTTP 207 Multi-Status with a per-item results array containing the invoice_number, status_code, and the same fields as the single-invoice response.

Request body example
{
  "invoices": [
    {
      "entity_id": "REPLACE_WITH_ENTITY_ID",
      "invoice_number": "INV-1001",
      "date": "2026-06-15",
      "currency": "AED",
      "invoice_type": "Tax Invoice",
      "payment_means_code": "30",
      "payment_account_id": "AE070331234567890123456",
      "seller": {
        "registration_type": "TL",
        "issuing_authority": "Department of Economic Development - Dubai"
      },
      "buyer": {
        "name": "Buyer LLC",
        "trn": "987654321098765",
        "country": "United Arab Emirates",
        "city": "Dubai",
        "email": "ap@buyer.com",
        "legal_registration_type": "TL",
        "legal_registration_id": "CN-1234567",
        "authority_name": "Department of Economic Development - Dubai"
      },
      "line_items": [
        {
          "description": "Consulting service",
          "quantity": 10,
          "unit_amount": 100,
          "tax_amount": 50,
          "tax_rate": 5,
          "tax_category": "S",
          "unit": "EA"
        }
      ],
      "auto_send": true
    }
  ]
}

Body parameters

invoicesarrayrequiredList of invoices to send. At least one is required. Each item follows the same schema as POST /oauth/invoices — see Push invoice for the full field reference.
invoices[].entity_idstringrequiredID of the seller entity. Must belong to your app.
invoices[].invoice_numberstringrequiredUnique invoice number per entity. A duplicate is rejected with status_code 409 in the results.
invoices[].datestringrequiredInvoice issue date, YYYY-MM-DD.
invoices[].buyerobjectrequiredBuyer details. See Push invoice for the full buyer field list.
invoices[].line_itemsarrayrequiredInvoice line items. At least one required per invoice.
invoices[].auto_sendbooleanoptionalWhen true (default) the invoice is dispatched to Peppol. When false it is only validated and stored.
GET/oauth/invoices/sentAccess token

List sent invoices

Return invoices SENT by your application. An app can own many users and entities, so narrow the results with entity_id and/or user_id.

Query parameters

entity_idFilter to invoices sent from a single entity (its id from GET /oauth/entities).
user_idFilter to invoices owned by a single user (its id from GET /oauth/users).
pagePage number. Defaults to 1.
limitPage size, 1–100. Defaults to 20.
GET/oauth/invoices/sent/{invoice_id}Access token

Get a sent invoice

Fetch a single sent invoice (including its full status history).

GET/oauth/invoices/receivedAccess token

List received invoices

Return invoices RECEIVED over the Peppol network for your entities (delivered via Billberry). Read-only. An app can own many users and entities, so narrow the results with entity_id and/or user_id.

Query parameters

entity_idFilter to invoices received by a single entity (its id from GET /oauth/entities).
user_idFilter to entities owned by a single user (its id from GET /oauth/users).
pagePage number. Defaults to 1.
limitPage size, 1–100. Defaults to 20.
GET/oauth/invoices/received/{invoice_id}Access token

Get a received invoice

Fetch a single received invoice (including its full status history) by its Billberry id.

Path parameters

invoice_idBillberry invoice id (the `id` field from the received-invoices list).