Skip to content

Endpoints

Sales (till receipts), orders, customers, catalog and gift cards, and the keyless public endpoints.

All paths are relative to https://api.unipage.eu/{business id} and need the Core API key in the X-API-Key header.

Method and path Returns
GET /pos-tickets-by-date/{Ymd} the till’s sales receipts of one day
GET /orders/{Y-m-d} webshop, app, kiosk and delivery-platform orders of one day
GET /customers every customer
GET /customers/{id} one customer
POST /customers create a customer
POST /customers/{id} update a customer
GET /linked-businesses the other locations of the same group
GET /generic/categories, GET /generic/products the catalog
GET /giftcards, GET /giftcards/check-code gift cards

Sales: GET /pos-tickets-by-date/{Ymd}

The VAT receipts the till made on one day, for example /pos-tickets-by-date/20261028. The day runs from midnight to midnight in the restaurant’s timezone, by consumption date. Refund receipts are included (is_refund: true).

Query parameter Effect
synced_until Unix seconds: only receipts changed after this moment. Use it to fetch a day again cheaply.
exclude_terminal leave out the receipts of one till (by terminal name)
{
  "tickets": [
    {
      "id": "k3m9a",
      "business_id": "x94d3",
      "order_id": null,
      "customer_id": "p8q2r",
      "ticket_id": "...",
      "type": "VAT",
      "is_refund": false,
      "operator_name": "Eva",
      "terminal_name": "Kassa 1",
      "consumption_date": "2026-10-28 12:41:07",
      "ticket_date": "2026-10-28 12:41:09",
      "ticket_lines": [
        {
          "product": "Broodje kaas",
          "category_reference": "Broodjes",
          "amount": 2,
          "unit_price_with_vat": 4.5,
          "vat_rate": 6,
          "total_price_without_vat": 8.49,
          "total_vat": 0.51,
          "total_price_with_vat": 9
        }
      ],
      "payment_lines": [
        { "payment_method": "CASH", "payment_name": "Cash", "amount": 9, "rounding": 0 }
      ]
    }
  ]
}

The receipt fields

Key Meaning
id, business_id ids
order_id, customer_id the webshop order this receipt settles, and the customer it was booked on, or null
ticket_id, ticket_source, pos_order_id, order_number the till’s own identifiers
type VAT for a sales receipt
is_refund true for a refund receipt
operator_name, terminal_name who made the sale, on which till
consumption_date, ticket_date when it was consumed, when the receipt was made
vat_type_reference, fdm_response, did_award_loyalty_points fiscal and loyalty details as the till sent them
ticket_lines[] id, business_id, type, product, category_reference, notes, price_type, unit_price_with_vat, amount, vat_rate, total_price_without_vat, total_vat, total_price_with_vat, course
discount_lines[] only in the pos.sale webhook: id, ticket_line_id, name, type, vat_rate, total_price_without_vat, total_vat, total_price_with_vat
payment_lines[] id, payment_method, payment_name, amount, rounding

This shape is a contract: keys are added over time, never renamed or removed.

Orders: GET /orders/{Y-m-d}

The orders created on one day, for example /orders/2026-10-28, with a successful status: webshop, app, kiosk and delivery-platform (Uber Eats, Deliveroo) orders. Returned as an array.

The main keys: id, created_at and updated_at (Unix seconds), order_number_for_company, status, order_type, order_source, payment_method, is_paid, total_price, delivery_cost, service_cost, coupon_reduction, coupon_string, wallet_amount, customer fields (user_firstname, user_lastname, user_email, user_phone, user_id), delivery fields, takeout_delivery_timestamp, order_notes, platform fields (display_id, delivery_type, dropoff_notes, unmatched_items), and orderItems[] with their options.

Customers

GET /customers

Every customer of the restaurant’s organization, as {"data": [...]}. Deleted customers are included, with deleted_at set, so you can remove them on your side.

Query parameter Effect
updated_after Unix seconds: only customers changed at or after this moment

The list is cached for 15 seconds. Sync with updated_after instead of downloading every customer each time.

GET /customers/{id}

One customer, as {"data": {...}}.

The customer fields: id, user_id, firstname, lastname, full_name, email, phone, address fields, company_name, vat_number, notes, nfc_uid, profile_picture_url, last_ordered_at, did_give_marketing_consent, created_at, updated_at, memberships, wallet, loyalty_wallet, metadata, deleted_at.

POST /customers and POST /customers/{id}

Create or update a customer. Answers {"success": true, "customer": {...}}.

Field Rule
email required on create, unique in the organization
nfc_uid optional, unique in the organization (a loyalty card or badge)
firstname, lastname, company_name, vat_number, phone optional, at most 255 characters
address_1, address_number, address_number_addition, address_postcode, address_city, address_country optional
did_give_marketing_consent optional boolean, default false
profile_picture_base64 optional, a base64 PNG
curl -X POST https://api.unipage.eu/x94d3/customers \
  -H "X-API-Key: $UNIPAGE_CORE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"email": "eva@example.com", "firstname": "Eva", "lastname": "Peeters"}'

Other locations: GET /linked-businesses

{"businesses": [{"id": "x94d3", "reference": "..."}]}: every location of the group, this one included. Each needs its own key.

Catalog

GET /generic/categories and GET /generic/products return the catalog as the till receives it, with prices, options and translations. GET /generic/products accepts updated_after (Unix seconds) to fetch only the products changed since your last sync, and category_id to limit it to one category.

Gift cards

Endpoint Returns
GET /giftcards {"giftcards": [...]}: the most recent valid gift cards. search filters, limit sets how many (default 6, at most 50).
GET /giftcards/check-code?code=... {"available": true} when no gift card uses that code yet

A gift card has id, code, name, amount, balance, formatted_balance, is_valid, recipient_name, expires_at, redeemed_at and created_at.

Without a key: /public/{domain}

What the public webshop already shows is also available without a key, by the shop’s domain (for example myshop.unipage.eu):

Path Returns
GET /public/{domain} name, address, phone, e-mail and opening hours
GET /public/{domain}/menu the webshop menu (the Accept-Language header, nl, fr, en or de, sets the language)
GET /public/{domain}/categories, GET /public/{domain}/products categories and products with prices and translations

For a custom ordering experience, use the Storefront API instead: it also quotes carts and places orders.

Type to search…

↑↓ navigate↵ selectEsc close