# Retrieve Orders

The **Omnichannel Order** object is the central entity of the Innovorder platform. It aggregates data from all sales channels (POS, Kiosk, Web, Aggregators). Use these endpoints to retrieve historical data, generate reports, or display order history to users.

### Endpoints

### `GET /v1/orders` - List Orders

Search and filter orders. Returns a paginated list wrapped in a data object. Requires exactly one scope parameter among: brandId, customerId, restaurantId, restaurantIds, or brandIds.

#### Parameters

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| brandId | string | No | Filter by brand ID (mutually exclusive with other scope params). |
| customerId | string | No | Filter by customer ID. |
| restaurantId | string | No | Filter by restaurant ID. |
| restaurantIds | string | No | Comma-separated list of restaurant IDs. |
| brandIds | string | No | Comma-separated list of brand IDs. |
| startDate | string | No | Filter orders after this date (ISO 8601). |
| endDate | string | No | Filter orders before this date (ISO 8601). |
| channelIds | string | No | Filter by channel (1=Kiosk, 2=Web, 5=POS, etc.). |
| consumptionModeIds | string | No | Comma-separated consumption mode IDs (1=Delivery, 2=TakeAway, 3=SitIn, 4=Drive). |
| status | string | No | Filter by comma-separated statuses: VALIDATED, PAID, CANCELLED, PAID\_CANCELLED, CONTRA\_ENTRY. |
| customerName | string | No | Filter by customer name. |
| badgeNumber | string | No | Filter by badge number. |
| phoneNumber | string | No | Filter by phone number. |
| restaurantName | string | No | Filter by restaurant name. |
| ticketNumber | string | No | Filter by ticket number. |
| pricingRule | string | No | Filter by pricing rule code. |
| ticketStartDate | string | No | Filter by lastUpdateDate from this ISO 8601 date-time. |
| ticketEndDate | string | No | Filter by lastUpdateDate up to this ISO 8601 date-time; must be greater than or equal to ticketStartDate. |
| totalPriceMin | number | No | Minimum total price filter. |
| totalPriceMax | number | No | Maximum total price filter. |
| turnoverMin | number | No | Minimum turnover filter. |
| turnoverMax | number | No | Maximum turnover filter. |
| itemsTag | string | No | Filter by item tag. |
| search | string | No | Free-text search. |
| order | string | No | Sort field, prefix with - for descending (e.g. -startDate). Sortable: customerId, restaurantId, brandId, dailyOrderId, startDate, seller, deviceId, deviceName, channelId, omnichannelOrderId, status, lastUpdateDate, ticketNumber, turnover. |
| limit | integer | No | Pagination limit (Default 10). |
| offset | string | No | Pagination offset. |

#### Response

```json
{
  "status": 200,
  "code": "omnichannel_orders_succeed",
  "message": "Omnichannel orders successfully retrieved.",
  "data": {
    "count": 1,
    "omnichannelOrders": [
      {
        "omnichannelOrderId": "12345678",
        "reportOrderId": 123456789,
        "orderUuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
        "brandId": 100,
        "restaurantId": 200,
        "customerId": 5001,
        "userId": null,
        "dailyOrderId": 42,
        "status": "PAID",
        "channelId": "2",
        "consumptionModeId": 1,
        "deviceId": "WEB-001",
        "deviceName": "Web Ordering",
        "seller": null,
        "ticketNumber": "A042",
        "tableName": null,
        "comment": null,
        "numberOfGuests": 1,
        "currency": "EUR",
        "startDate": "2026-03-25T12:30:00.000Z",
        "lastUpdateDate": "2026-03-25T12:32:00.000Z",
        "businessYear": 2026,
        "businessMonth": 3,
        "businessDay": 25,
        "service": 0,
        "shift": {
          "name": "Lunch"
        },
        "totalPriceWithTaxIncluded": 1850,
        "totalPriceWithTaxExcluded": 1542,
        "totalPriceDiscountedWithTaxIncluded": 1550,
        "totalPriceDiscountedWithTaxExcluded": 1292,
        "totalTax": 258,
        "totalDiscount": 300,
        "turnover": 1550,
        "totalAmountFree": 0,
        "totalItemFree": 0,
        "totalAmountCancelled": 0,
        "totalItemCancelled": 0,
        "items": [
          {
            "itemId": 5001,
            "parentItemId": null,
            "name": "Classic Burger",
            "type": "PRODUCT",
            "status": "VALIDATED",
            "quantity": 1000,
            "totalPriceWithTaxIncluded": 1200,
            "originalUnitPrice": 1200,
            "itemType": "STANDARD",
            "vatValue": 1000,
            "skuValue": "BUR-001",
            "free": false,
            "tags": [
              {
                "value": "Burger"
              }
            ],
            "categories": [
              {
                "value": "Main Course"
              }
            ],
            "purchasePrice": null,
            "billingCode": null,
            "discounted": false,
            "reduced": false,
            "service": 0,
            "totalItemDiscounted": 0,
            "totalPriceDiscounted": 0,
            "cancelReason": null,
            "deviceName": "Web Ordering",
            "deviceId": "WEB-001",
            "measurementUnit": "UNIT",
            "measuredQuantity": 1
          }
        ],
        "payments": [
          {
            "type": "Card",
            "label": "Visa",
            "quantity": 1,
            "value": 1550,
            "luncheonCode": null,
            "transactionId": null
          }
        ],
        "taxes": [
          {
            "taxRate": 1000,
            "totalTax": 258,
            "totalInclTax": 1550,
            "totalExclTax": 1292
          }
        ],
        "discounts": [
          {
            "name": "SUMMER10",
            "value": 300
          }
        ],
        "fees": [
          {
            "name": "Delivery Fee",
            "taxRate": 2000,
            "quantity": 1,
            "amount": 350,
            "type": "Delivery"
          }
        ],
        "grants": [
          {
            "labelTicket": "SUBV REPAS",
            "amount": 50,
            "quantity": 1,
            "taxBreakdowns": [
              {
                "taxRate": 1000,
                "totalInclTax": 30,
                "totalExclTax": 27,
                "totalTax": 3,
                "discountableType": "PRODUCT",
                "feeType": null
              },
              {
                "taxRate": 10,
                "totalInclTax": 18,
                "totalExclTax": 18,
                "totalTax": 0,
                "discountableType": "FEE",
                "feeType": "AdmissionFee"
              },
              {
                "taxRate": 10,
                "totalInclTax": 2,
                "totalExclTax": 2,
                "totalTax": 0,
                "discountableType": "FEE",
                "feeType": "RoyaltyFee"
              }
            ]
          }
        ],
        "entranceFees": [],
        "loyaltyPrograms": [],
        "pricingRule": null,
        "customer": {
          "phone": "+33612345678",
          "email": "jean.dupont@example.com",
          "firstName": "Jean",
          "lastName": "Dupont",
          "badgeNumber": null,
          "disabledAt": null,
          "student": null
        },
        "restaurant": {
          "name": "Chez Yann",
          "contactPhone": "0147689047",
          "externalId": "SITE01_REST01",
          "address": {
            "streetNumber": "12",
            "route": "Rue de la Paix",
            "postalCode": "75002",
            "locality": "Paris"
          }
        },
        "deliveryAddress": {
          "phone": "+33612345678",
          "route": "45 Avenue des Champs-Élysées",
          "postalCode": "75008",
          "locality": "Paris",
          "streetNumber": "45",
          "additionalInfo": "3rd floor",
          "digicode": "4521",
          "apartmentNumber": "12B"
        },
        "photos": [],
        "isCancellable": true,
        "isRefundable": true,
        "cancellationReason": null,
        "cancellationReasonDescription": null,
        "metadata": null
      }
    ]
  }
}
```

##### Response Properties

Every field in the example is listed below. Explicit requiredness is shown when the endpoint contract defines it.

| Property | Type | Example | Description |
| --- | --- | --- | --- |
| status | integer | 200 | HTTP status code returned by the API. |
| code | string | "omnichannel\_orders\_succeed" | Machine-readable application code for the result. |
| message | string | "Omnichannel orders successfully retrieved." | Human-readable result message. Do not use this value for program logic. |
| data | object | {…} | Endpoint-specific response payload. |
| data.count | integer | 1 | Total number of matching records. |
| data.omnichannelOrders | array | \[…\] | List of omnichannel orders entries. |
| data.omnichannelOrders\[\] | object | {…} | Object containing omnichannel orders fields. |
| data.omnichannelOrders\[\].omnichannelOrderId | string | "12345678" | Identifier of the associated omnichannel order. |
| data.omnichannelOrders\[\].reportOrderId | integer | 123456789 | Identifier of the associated report order. |
| data.omnichannelOrders\[\].orderUuid | string | "a1b2c3d4-e5f6-7890-abcd-ef1234567890" | The order uuid value. |
| data.omnichannelOrders\[\].brandId | integer | 100 | Identifier of the brand. |
| data.omnichannelOrders\[\].restaurantId | integer | 200 | Identifier of the restaurant. |
| data.omnichannelOrders\[\].customerId | integer | 5001 | Identifier of the customer. |
| data.omnichannelOrders\[\].userId | null | null | Identifier of the user. |
| data.omnichannelOrders\[\].dailyOrderId | integer | 42 | Identifier of the associated daily order. |
| data.omnichannelOrders\[\].status | string | "PAID" | HTTP status code returned by the API. |
| data.omnichannelOrders\[\].channelId | string | "2" | Identifier of the associated channel. |
| data.omnichannelOrders\[\].consumptionModeId | integer | 1 | Identifier of the associated consumption mode. |
| data.omnichannelOrders\[\].deviceId | string | "WEB-001" | Identifier of the associated device. |
| data.omnichannelOrders\[\].deviceName | string | "Web Ordering" | The device name value. |
| data.omnichannelOrders\[\].seller | null | null | The seller value. |
| data.omnichannelOrders\[\].ticketNumber | string | "A042" | The ticket number value. |
| data.omnichannelOrders\[\].tableName | null | null | The table name value. |
| data.omnichannelOrders\[\].comment | null | null | The comment value. |
| data.omnichannelOrders\[\].numberOfGuests | integer | 1 | The number of guests value. |
| data.omnichannelOrders\[\].currency | string | "EUR" | ISO 4217 currency code. |
| data.omnichannelOrders\[\].startDate | string | "2026-03-25T12:30:00.000Z" | Date or timestamp for start. |
| data.omnichannelOrders\[\].lastUpdateDate | string | "2026-03-25T12:32:00.000Z" | Date or timestamp for last update. |
| data.omnichannelOrders\[\].businessYear | integer | 2026 | The business year value. |
| data.omnichannelOrders\[\].businessMonth | integer | 3 | The business month value. |
| data.omnichannelOrders\[\].businessDay | integer | 25 | The business day value. |
| data.omnichannelOrders\[\].service | integer | 0 | The service value. |
| data.omnichannelOrders\[\].shift | object | {…} | Object containing shift fields. |
| data.omnichannelOrders\[\].shift.name | string | "Lunch" | The name value. |
| data.omnichannelOrders\[\].totalPriceWithTaxIncluded | integer | 1850 | The total price with tax included value. |
| data.omnichannelOrders\[\].totalPriceWithTaxExcluded | integer | 1542 | The total price with tax excluded value. |
| data.omnichannelOrders\[\].totalPriceDiscountedWithTaxIncluded | integer | 1550 | The total price discounted with tax included value. |
| data.omnichannelOrders\[\].totalPriceDiscountedWithTaxExcluded | integer | 1292 | The total price discounted with tax excluded value. |
| data.omnichannelOrders\[\].totalTax | integer | 258 | The total tax value. |
| data.omnichannelOrders\[\].totalDiscount | integer | 300 | The total discount value. |
| data.omnichannelOrders\[\].turnover | integer | 1550 | The turnover value. |
| data.omnichannelOrders\[\].totalAmountFree | integer | 0 | The total amount free value. |
| data.omnichannelOrders\[\].totalItemFree | integer | 0 | The total item free value. |
| data.omnichannelOrders\[\].totalAmountCancelled | integer | 0 | The total amount cancelled value. |
| data.omnichannelOrders\[\].totalItemCancelled | integer | 0 | The total item cancelled value. |
| data.omnichannelOrders\[\].items | array | \[…\] | List of items entries. |
| data.omnichannelOrders\[\].items\[\] | object | {…} | Object containing items fields. |
| data.omnichannelOrders\[\].items\[\].itemId | integer | 5001 | Identifier of the associated item. |
| data.omnichannelOrders\[\].items\[\].parentItemId | null | null | Identifier of the associated parent item. |
| data.omnichannelOrders\[\].items\[\].name | string | "Classic Burger" | The name value. |
| data.omnichannelOrders\[\].items\[\].type | string | "PRODUCT" | The type value. |
| data.omnichannelOrders\[\].items\[\].status | string | "VALIDATED" | HTTP status code returned by the API. |
| data.omnichannelOrders\[\].items\[\].quantity | integer | 1000 | The quantity value. |
| data.omnichannelOrders\[\].items\[\].totalPriceWithTaxIncluded | integer | 1200 | The total price with tax included value. |
| data.omnichannelOrders\[\].items\[\].originalUnitPrice | integer | 1200 | The original unit price value. |
| data.omnichannelOrders\[\].items\[\].itemType | string | "STANDARD" | The item type value. |
| data.omnichannelOrders\[\].items\[\].vatValue | integer | 1000 | The vat value value. |
| data.omnichannelOrders\[\].items\[\].skuValue | string | "BUR-001" | The sku value value. |
| data.omnichannelOrders\[\].items\[\].free | boolean | false | The free value. |
| data.omnichannelOrders\[\].items\[\].tags | array | \[…\] | List of tags entries. |
| data.omnichannelOrders\[\].items\[\].tags\[\] | object | {…} | Object containing tags fields. |
| data.omnichannelOrders\[\].items\[\].tags\[\].value | string | "Burger" | The value value. |
| data.omnichannelOrders\[\].items\[\].categories | array | \[…\] | List of categories entries. |
| data.omnichannelOrders\[\].items\[\].categories\[\] | object | {…} | Object containing categories fields. |
| data.omnichannelOrders\[\].items\[\].categories\[\].value | string | "Main Course" | The value value. |
| data.omnichannelOrders\[\].items\[\].purchasePrice | null | null | The purchase price value. |
| data.omnichannelOrders\[\].items\[\].billingCode | null | null | The billing code value. |
| data.omnichannelOrders\[\].items\[\].discounted | boolean | false | The discounted value. |
| data.omnichannelOrders\[\].items\[\].reduced | boolean | false | The reduced value. |
| data.omnichannelOrders\[\].items\[\].service | integer | 0 | The service value. |
| data.omnichannelOrders\[\].items\[\].totalItemDiscounted | integer | 0 | The total item discounted value. |
| data.omnichannelOrders\[\].items\[\].totalPriceDiscounted | integer | 0 | The total price discounted value. |
| data.omnichannelOrders\[\].items\[\].cancelReason | null | null | The cancel reason value. |
| data.omnichannelOrders\[\].items\[\].deviceName | string | "Web Ordering" | The device name value. |
| data.omnichannelOrders\[\].items\[\].deviceId | string | "WEB-001" | Identifier of the associated device. |
| data.omnichannelOrders\[\].items\[\].measurementUnit | string | "UNIT" | The measurement unit value. |
| data.omnichannelOrders\[\].items\[\].measuredQuantity | integer | 1 | The measured quantity value. |
| data.omnichannelOrders\[\].payments | array | \[…\] | List of payments entries. |
| data.omnichannelOrders\[\].payments\[\] | object | {…} | Object containing payments fields. |
| data.omnichannelOrders\[\].payments\[\].type | string | "Card" | The type value. |
| data.omnichannelOrders\[\].payments\[\].label | string | "Visa" | The label value. |
| data.omnichannelOrders\[\].payments\[\].quantity | integer | 1 | The quantity value. |
| data.omnichannelOrders\[\].payments\[\].value | integer | 1550 | The value value. |
| data.omnichannelOrders\[\].payments\[\].luncheonCode | null | null | The luncheon code value. |
| data.omnichannelOrders\[\].payments\[\].transactionId | null | null | Identifier of the transaction. |
| data.omnichannelOrders\[\].taxes | array | \[…\] | List of taxes entries. |
| data.omnichannelOrders\[\].taxes\[\] | object | {…} | Object containing taxes fields. |
| data.omnichannelOrders\[\].taxes\[\].taxRate | integer | 1000 | The tax rate value. |
| data.omnichannelOrders\[\].taxes\[\].totalTax | integer | 258 | The total tax value. |
| data.omnichannelOrders\[\].taxes\[\].totalInclTax | integer | 1550 | The total incl tax value. |
| data.omnichannelOrders\[\].taxes\[\].totalExclTax | integer | 1292 | The total excl tax value. |
| data.omnichannelOrders\[\].discounts | array | \[…\] | List of discounts entries. |
| data.omnichannelOrders\[\].discounts\[\] | object | {…} | Object containing discounts fields. |
| data.omnichannelOrders\[\].discounts\[\].name | string | "SUMMER10" | The name value. |
| data.omnichannelOrders\[\].discounts\[\].value | integer | 300 | The value value. |
| data.omnichannelOrders\[\].fees | array | \[…\] | List of fees entries. |
| data.omnichannelOrders\[\].fees\[\] | object | {…} | Object containing fees fields. |
| data.omnichannelOrders\[\].fees\[\].name | string | "Delivery Fee" | The name value. |
| data.omnichannelOrders\[\].fees\[\].taxRate | integer | 2000 | The tax rate value. |
| data.omnichannelOrders\[\].fees\[\].quantity | integer | 1 | The quantity value. |
| data.omnichannelOrders\[\].fees\[\].amount | integer | 350 | The amount value. |
| data.omnichannelOrders\[\].fees\[\].type | string | "Delivery" | The type value. |
| data.omnichannelOrders\[\].grants | array | \[…\] | List of grants entries. |
| data.omnichannelOrders\[\].grants\[\] | object | {…} | Object containing grants fields. |
| data.omnichannelOrders\[\].grants\[\].labelTicket | string | "SUBV REPAS" | The label ticket value. |
| data.omnichannelOrders\[\].grants\[\].amount | integer | 50 | The amount value. |
| data.omnichannelOrders\[\].grants\[\].quantity | integer | 1 | The quantity value. |
| data.omnichannelOrders\[\].grants\[\].taxBreakdowns | array | \[…\] | List of tax breakdowns entries. |
| data.omnichannelOrders\[\].grants\[\].taxBreakdowns\[\] | object | {…} | Object containing tax breakdowns fields. |
| data.omnichannelOrders\[\].grants\[\].taxBreakdowns\[\].taxRate | integer | 1000 | The tax rate value. |
| data.omnichannelOrders\[\].grants\[\].taxBreakdowns\[\].totalInclTax | integer | 30 | The total incl tax value. |
| data.omnichannelOrders\[\].grants\[\].taxBreakdowns\[\].totalExclTax | integer | 27 | The total excl tax value. |
| data.omnichannelOrders\[\].grants\[\].taxBreakdowns\[\].totalTax | integer | 3 | The total tax value. |
| data.omnichannelOrders\[\].grants\[\].taxBreakdowns\[\].discountableType | string | "PRODUCT" | The discountable type value. |
| data.omnichannelOrders\[\].grants\[\].taxBreakdowns\[\].feeType | null | null | The fee type value. |
| data.omnichannelOrders\[\].entranceFees | array | \[\] | List of entrance fees entries. |
| data.omnichannelOrders\[\].loyaltyPrograms | array | \[\] | List of loyalty programs entries. |
| data.omnichannelOrders\[\].pricingRule | null | null | The pricing rule value. |
| data.omnichannelOrders\[\].customer | object | {…} | Object containing customer fields. |
| data.omnichannelOrders\[\].customer.phone | string | "+33612345678" | Phone number. |
| data.omnichannelOrders\[\].customer.email | string | "jean.dupont@example.com" | Email address. |
| data.omnichannelOrders\[\].customer.firstName | string | "Jean" | The first name value. |
| data.omnichannelOrders\[\].customer.lastName | string | "Dupont" | The last name value. |
| data.omnichannelOrders\[\].customer.badgeNumber | null | null | The badge number value. |
| data.omnichannelOrders\[\].customer.disabledAt | null | null | Date or timestamp for disabled. |
| data.omnichannelOrders\[\].customer.student | null | null | The student value. |
| data.omnichannelOrders\[\].restaurant | object | {…} | Object containing restaurant fields. |
| data.omnichannelOrders\[\].restaurant.name | string | "Chez Yann" | The name value. |
| data.omnichannelOrders\[\].restaurant.contactPhone | string | "0147689047" | The contact phone value. |
| data.omnichannelOrders\[\].restaurant.externalId | string | "SITE01\_REST01" | Identifier in the connected external system. |
| data.omnichannelOrders\[\].restaurant.address | object | {…} | Object containing address fields. |
| data.omnichannelOrders\[\].restaurant.address.streetNumber | string | "12" | The street number value. |
| data.omnichannelOrders\[\].restaurant.address.route | string | "Rue de la Paix" | The route value. |
| data.omnichannelOrders\[\].restaurant.address.postalCode | string | "75002" | The postal code value. |
| data.omnichannelOrders\[\].restaurant.address.locality | string | "Paris" | The locality value. |
| data.omnichannelOrders\[\].deliveryAddress | object | {…} | Object containing delivery address fields. |
| data.omnichannelOrders\[\].deliveryAddress.phone | string | "+33612345678" | Phone number. |
| data.omnichannelOrders\[\].deliveryAddress.route | string | "45 Avenue des Champs-Élysées" | The route value. |
| data.omnichannelOrders\[\].deliveryAddress.postalCode | string | "75008" | The postal code value. |
| data.omnichannelOrders\[\].deliveryAddress.locality | string | "Paris" | The locality value. |
| data.omnichannelOrders\[\].deliveryAddress.streetNumber | string | "45" | The street number value. |
| data.omnichannelOrders\[\].deliveryAddress.additionalInfo | string | "3rd floor" | The additional info value. |
| data.omnichannelOrders\[\].deliveryAddress.digicode | string | "4521" | The digicode value. |
| data.omnichannelOrders\[\].deliveryAddress.apartmentNumber | string | "12B" | The apartment number value. |
| data.omnichannelOrders\[\].photos | array | \[\] | List of photos entries. |
| data.omnichannelOrders\[\].isCancellable | boolean | true | Whether cancellable is enabled or applies. |
| data.omnichannelOrders\[\].isRefundable | boolean | true | Whether refundable is enabled or applies. |
| data.omnichannelOrders\[\].cancellationReason | null | null | The cancellation reason value. |
| data.omnichannelOrders\[\].cancellationReasonDescription | null | null | The cancellation reason description value. |
| data.omnichannelOrders\[\].metadata | null | null | Additional metadata supplied with the response. |

### `GET /v1/orders/{orderId}` - Get Order Details

Retrieve the full details of a specific order using its Omnichannel ID.

#### Parameters

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| orderId | string | Yes | The unique Omnichannel Order ID (UUID or numeric string). |

#### Response

```json
{
  "status": 200,
  "code": "omnichannel_order_found",
  "message": "Omnichannel order successfully retrieved.",
  "data": {
    "omnichannelOrderId": "12345678",
    "reportOrderId": 123456789,
    "orderUuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "brandId": 100,
    "restaurantId": 200,
    "customerId": 5001,
    "userId": null,
    "dailyOrderId": 42,
    "status": "PAID",
    "channelId": "2",
    "consumptionModeId": 1,
    "deviceId": "WEB-001",
    "deviceName": "Web Ordering",
    "seller": null,
    "ticketNumber": "A042",
    "tableName": null,
    "comment": null,
    "numberOfGuests": 1,
    "currency": "EUR",
    "startDate": "2026-03-25T12:30:00.000Z",
    "lastUpdateDate": "2026-03-25T12:32:00.000Z",
    "businessYear": 2026,
    "businessMonth": 3,
    "businessDay": 25,
    "service": 0,
    "shift": {
      "name": "Lunch"
    },
    "totalPriceWithTaxIncluded": 1850,
    "totalPriceWithTaxExcluded": 1542,
    "totalPriceDiscountedWithTaxIncluded": 1550,
    "totalPriceDiscountedWithTaxExcluded": 1292,
    "totalTax": 258,
    "totalDiscount": 300,
    "turnover": 1550,
    "totalAmountFree": 0,
    "totalItemFree": 0,
    "totalAmountCancelled": 0,
    "totalItemCancelled": 0,
    "items": [
      {
        "itemId": 5001,
        "parentItemId": null,
        "name": "Classic Burger",
        "type": "PRODUCT",
        "status": "VALIDATED",
        "quantity": 1000,
        "totalPriceWithTaxIncluded": 1200,
        "originalUnitPrice": 1200,
        "itemType": "STANDARD",
        "vatValue": 1000,
        "skuValue": "BUR-001",
        "free": false,
        "tags": [
          {
            "value": "Burger"
          }
        ],
        "categories": [
          {
            "value": "Main Course"
          }
        ],
        "purchasePrice": null,
        "billingCode": null,
        "discounted": false,
        "reduced": false,
        "service": 0,
        "totalItemDiscounted": 0,
        "totalPriceDiscounted": 0,
        "cancelReason": null,
        "deviceName": "Web Ordering",
        "deviceId": "WEB-001",
        "measurementUnit": "UNIT",
        "measuredQuantity": 1
      }
    ],
    "payments": [
      {
        "type": "Card",
        "label": "Visa",
        "quantity": 1,
        "value": 1550,
        "luncheonCode": null,
        "transactionId": null
      }
    ],
    "taxes": [
      {
        "taxRate": 1000,
        "totalTax": 258,
        "totalInclTax": 1550,
        "totalExclTax": 1292
      }
    ],
    "discounts": [
      {
        "name": "SUMMER10",
        "value": 300
      }
    ],
    "fees": [
      {
        "name": "Delivery Fee",
        "taxRate": 2000,
        "quantity": 1,
        "amount": 350,
        "type": "Delivery"
      }
    ],
    "grants": [
      {
        "labelTicket": "SUBV REPAS",
        "amount": 50,
        "quantity": 1,
        "taxBreakdowns": [
          {
            "taxRate": 1000,
            "totalInclTax": 30,
            "totalExclTax": 27,
            "totalTax": 3,
            "discountableType": "PRODUCT",
            "feeType": null
          },
          {
            "taxRate": 10,
            "totalInclTax": 18,
            "totalExclTax": 18,
            "totalTax": 0,
            "discountableType": "FEE",
            "feeType": "AdmissionFee"
          },
          {
            "taxRate": 10,
            "totalInclTax": 2,
            "totalExclTax": 2,
            "totalTax": 0,
            "discountableType": "FEE",
            "feeType": "RoyaltyFee"
          }
        ]
      }
    ],
    "entranceFees": [],
    "loyaltyPrograms": [],
    "pricingRule": null,
    "customer": {
      "phone": "+33612345678",
      "email": "jean.dupont@example.com",
      "firstName": "Jean",
      "lastName": "Dupont",
      "badgeNumber": null,
      "disabledAt": null,
      "student": null
    },
    "restaurant": {
      "name": "Chez Yann",
      "contactPhone": "0147689047",
      "externalId": "SITE01_REST01",
      "address": {
        "streetNumber": "12",
        "route": "Rue de la Paix",
        "postalCode": "75002",
        "locality": "Paris"
      }
    },
    "deliveryAddress": {
      "phone": "+33612345678",
      "route": "45 Avenue des Champs-Élysées",
      "postalCode": "75008",
      "locality": "Paris",
      "streetNumber": "45",
      "additionalInfo": "3rd floor",
      "digicode": "4521",
      "apartmentNumber": "12B"
    },
    "photos": [],
    "isCancellable": true,
    "isRefundable": true,
    "cancellationReason": null,
    "cancellationReasonDescription": null,
    "metadata": null
  }
}
```

##### Response Properties

Every field in the example is listed below. Explicit requiredness is shown when the endpoint contract defines it.

| Property | Type | Example | Description |
| --- | --- | --- | --- |
| status | integer | 200 | HTTP status code returned by the API. |
| code | string | "omnichannel\_order\_found" | Machine-readable application code for the result. |
| message | string | "Omnichannel order successfully retrieved." | Human-readable result message. Do not use this value for program logic. |
| data | object | {…} | Endpoint-specific response payload. |
| data.omnichannelOrderId | string | "12345678" | Identifier of the associated omnichannel order. |
| data.reportOrderId | integer | 123456789 | Identifier of the associated report order. |
| data.orderUuid | string | "a1b2c3d4-e5f6-7890-abcd-ef1234567890" | The order uuid value. |
| data.brandId | integer | 100 | Identifier of the brand. |
| data.restaurantId | integer | 200 | Identifier of the restaurant. |
| data.customerId | integer | 5001 | Identifier of the customer. |
| data.userId | null | null | Identifier of the user. |
| data.dailyOrderId | integer | 42 | Identifier of the associated daily order. |
| data.status | string | "PAID" | HTTP status code returned by the API. |
| data.channelId | string | "2" | Identifier of the associated channel. |
| data.consumptionModeId | integer | 1 | Identifier of the associated consumption mode. |
| data.deviceId | string | "WEB-001" | Identifier of the associated device. |
| data.deviceName | string | "Web Ordering" | The device name value. |
| data.seller | null | null | The seller value. |
| data.ticketNumber | string | "A042" | The ticket number value. |
| data.tableName | null | null | The table name value. |
| data.comment | null | null | The comment value. |
| data.numberOfGuests | integer | 1 | The number of guests value. |
| data.currency | string | "EUR" | ISO 4217 currency code. |
| data.startDate | string | "2026-03-25T12:30:00.000Z" | Date or timestamp for start. |
| data.lastUpdateDate | string | "2026-03-25T12:32:00.000Z" | Date or timestamp for last update. |
| data.businessYear | integer | 2026 | The business year value. |
| data.businessMonth | integer | 3 | The business month value. |
| data.businessDay | integer | 25 | The business day value. |
| data.service | integer | 0 | The service value. |
| data.shift | object | {…} | Object containing shift fields. |
| data.shift.name | string | "Lunch" | The name value. |
| data.totalPriceWithTaxIncluded | integer | 1850 | The total price with tax included value. |
| data.totalPriceWithTaxExcluded | integer | 1542 | The total price with tax excluded value. |
| data.totalPriceDiscountedWithTaxIncluded | integer | 1550 | The total price discounted with tax included value. |
| data.totalPriceDiscountedWithTaxExcluded | integer | 1292 | The total price discounted with tax excluded value. |
| data.totalTax | integer | 258 | The total tax value. |
| data.totalDiscount | integer | 300 | The total discount value. |
| data.turnover | integer | 1550 | The turnover value. |
| data.totalAmountFree | integer | 0 | The total amount free value. |
| data.totalItemFree | integer | 0 | The total item free value. |
| data.totalAmountCancelled | integer | 0 | The total amount cancelled value. |
| data.totalItemCancelled | integer | 0 | The total item cancelled value. |
| data.items | array | \[…\] | List of items entries. |
| data.items\[\] | object | {…} | Object containing items fields. |
| data.items\[\].itemId | integer | 5001 | Identifier of the associated item. |
| data.items\[\].parentItemId | null | null | Identifier of the associated parent item. |
| data.items\[\].name | string | "Classic Burger" | The name value. |
| data.items\[\].type | string | "PRODUCT" | The type value. |
| data.items\[\].status | string | "VALIDATED" | HTTP status code returned by the API. |
| data.items\[\].quantity | integer | 1000 | The quantity value. |
| data.items\[\].totalPriceWithTaxIncluded | integer | 1200 | The total price with tax included value. |
| data.items\[\].originalUnitPrice | integer | 1200 | The original unit price value. |
| data.items\[\].itemType | string | "STANDARD" | The item type value. |
| data.items\[\].vatValue | integer | 1000 | The vat value value. |
| data.items\[\].skuValue | string | "BUR-001" | The sku value value. |
| data.items\[\].free | boolean | false | The free value. |
| data.items\[\].tags | array | \[…\] | List of tags entries. |
| data.items\[\].tags\[\] | object | {…} | Object containing tags fields. |
| data.items\[\].tags\[\].value | string | "Burger" | The value value. |
| data.items\[\].categories | array | \[…\] | List of categories entries. |
| data.items\[\].categories\[\] | object | {…} | Object containing categories fields. |
| data.items\[\].categories\[\].value | string | "Main Course" | The value value. |
| data.items\[\].purchasePrice | null | null | The purchase price value. |
| data.items\[\].billingCode | null | null | The billing code value. |
| data.items\[\].discounted | boolean | false | The discounted value. |
| data.items\[\].reduced | boolean | false | The reduced value. |
| data.items\[\].service | integer | 0 | The service value. |
| data.items\[\].totalItemDiscounted | integer | 0 | The total item discounted value. |
| data.items\[\].totalPriceDiscounted | integer | 0 | The total price discounted value. |
| data.items\[\].cancelReason | null | null | The cancel reason value. |
| data.items\[\].deviceName | string | "Web Ordering" | The device name value. |
| data.items\[\].deviceId | string | "WEB-001" | Identifier of the associated device. |
| data.items\[\].measurementUnit | string | "UNIT" | The measurement unit value. |
| data.items\[\].measuredQuantity | integer | 1 | The measured quantity value. |
| data.payments | array | \[…\] | List of payments entries. |
| data.payments\[\] | object | {…} | Object containing payments fields. |
| data.payments\[\].type | string | "Card" | The type value. |
| data.payments\[\].label | string | "Visa" | The label value. |
| data.payments\[\].quantity | integer | 1 | The quantity value. |
| data.payments\[\].value | integer | 1550 | The value value. |
| data.payments\[\].luncheonCode | null | null | The luncheon code value. |
| data.payments\[\].transactionId | null | null | Identifier of the transaction. |
| data.taxes | array | \[…\] | List of taxes entries. |
| data.taxes\[\] | object | {…} | Object containing taxes fields. |
| data.taxes\[\].taxRate | integer | 1000 | The tax rate value. |
| data.taxes\[\].totalTax | integer | 258 | The total tax value. |
| data.taxes\[\].totalInclTax | integer | 1550 | The total incl tax value. |
| data.taxes\[\].totalExclTax | integer | 1292 | The total excl tax value. |
| data.discounts | array | \[…\] | List of discounts entries. |
| data.discounts\[\] | object | {…} | Object containing discounts fields. |
| data.discounts\[\].name | string | "SUMMER10" | The name value. |
| data.discounts\[\].value | integer | 300 | The value value. |
| data.fees | array | \[…\] | List of fees entries. |
| data.fees\[\] | object | {…} | Object containing fees fields. |
| data.fees\[\].name | string | "Delivery Fee" | The name value. |
| data.fees\[\].taxRate | integer | 2000 | The tax rate value. |
| data.fees\[\].quantity | integer | 1 | The quantity value. |
| data.fees\[\].amount | integer | 350 | The amount value. |
| data.fees\[\].type | string | "Delivery" | The type value. |
| data.grants | array | \[…\] | List of grants entries. |
| data.grants\[\] | object | {…} | Object containing grants fields. |
| data.grants\[\].labelTicket | string | "SUBV REPAS" | The label ticket value. |
| data.grants\[\].amount | integer | 50 | The amount value. |
| data.grants\[\].quantity | integer | 1 | The quantity value. |
| data.grants\[\].taxBreakdowns | array | \[…\] | List of tax breakdowns entries. |
| data.grants\[\].taxBreakdowns\[\] | object | {…} | Object containing tax breakdowns fields. |
| data.grants\[\].taxBreakdowns\[\].taxRate | integer | 1000 | The tax rate value. |
| data.grants\[\].taxBreakdowns\[\].totalInclTax | integer | 30 | The total incl tax value. |
| data.grants\[\].taxBreakdowns\[\].totalExclTax | integer | 27 | The total excl tax value. |
| data.grants\[\].taxBreakdowns\[\].totalTax | integer | 3 | The total tax value. |
| data.grants\[\].taxBreakdowns\[\].discountableType | string | "PRODUCT" | The discountable type value. |
| data.grants\[\].taxBreakdowns\[\].feeType | null | null | The fee type value. |
| data.entranceFees | array | \[\] | List of entrance fees entries. |
| data.loyaltyPrograms | array | \[\] | List of loyalty programs entries. |
| data.pricingRule | null | null | The pricing rule value. |
| data.customer | object | {…} | Object containing customer fields. |
| data.customer.phone | string | "+33612345678" | Phone number. |
| data.customer.email | string | "jean.dupont@example.com" | Email address. |
| data.customer.firstName | string | "Jean" | The first name value. |
| data.customer.lastName | string | "Dupont" | The last name value. |
| data.customer.badgeNumber | null | null | The badge number value. |
| data.customer.disabledAt | null | null | Date or timestamp for disabled. |
| data.customer.student | null | null | The student value. |
| data.restaurant | object | {…} | Object containing restaurant fields. |
| data.restaurant.name | string | "Chez Yann" | The name value. |
| data.restaurant.contactPhone | string | "0147689047" | The contact phone value. |
| data.restaurant.externalId | string | "SITE01\_REST01" | Identifier in the connected external system. |
| data.restaurant.address | object | {…} | Object containing address fields. |
| data.restaurant.address.streetNumber | string | "12" | The street number value. |
| data.restaurant.address.route | string | "Rue de la Paix" | The route value. |
| data.restaurant.address.postalCode | string | "75002" | The postal code value. |
| data.restaurant.address.locality | string | "Paris" | The locality value. |
| data.deliveryAddress | object | {…} | Object containing delivery address fields. |
| data.deliveryAddress.phone | string | "+33612345678" | Phone number. |
| data.deliveryAddress.route | string | "45 Avenue des Champs-Élysées" | The route value. |
| data.deliveryAddress.postalCode | string | "75008" | The postal code value. |
| data.deliveryAddress.locality | string | "Paris" | The locality value. |
| data.deliveryAddress.streetNumber | string | "45" | The street number value. |
| data.deliveryAddress.additionalInfo | string | "3rd floor" | The additional info value. |
| data.deliveryAddress.digicode | string | "4521" | The digicode value. |
| data.deliveryAddress.apartmentNumber | string | "12B" | The apartment number value. |
| data.photos | array | \[\] | List of photos entries. |
| data.isCancellable | boolean | true | Whether cancellable is enabled or applies. |
| data.isRefundable | boolean | true | Whether refundable is enabled or applies. |
| data.cancellationReason | null | null | The cancellation reason value. |
| data.cancellationReasonDescription | null | null | The cancellation reason description value. |
| data.metadata | null | null | Additional metadata supplied with the response. |

### OmnichannelOrder Field Reference

Complete reference for the OmnichannelOrder object returned by GET /v1/orders endpoints and used in webhook payloads.

#### Core Identifiers

| Field | Type | Description |
| --- | --- | --- |
| omnichannelOrderId | String | Unique order identifier |
| reportOrderId | Number | Numeric order identifier for reporting |
| orderUuid | String\|null | UUID of the order (may be null for legacy orders) |
| brandId | Number | Brand identifier |
| restaurantId | Number | Restaurant identifier |
| customerId | Number\|null | Customer identifier (null for anonymous orders) |
| userId | Number\|null | User identifier (null for guest orders) |
| dailyOrderId | Number | Sequential order number for the day |
| channelId | String | Sales channel (1=Kiosk, 2=Web, 5=POS) |
| consumptionModeId | Number | Consumption mode (1=Delivery, 2=TakeAway, 3=SitIn, 4=Drive) |
| deviceId | String | Device identifier |
| deviceName | String | Device display name |
| seller | String\|null | Seller name (POS orders) |
| ticketNumber | String\|null | Ticket number displayed to customer |
| tableName | String\|null | Table name (SitIn orders) |
| comment | String\|null | Order comment from customer |
| numberOfGuests | Number | Number of guests for the order |
| currency | String | ISO 4217 currency code (e.g. EUR) |

#### Timestamps & Business Date

| Field | Type | Description |
| --- | --- | --- |
| startDate | ISO Date | Order creation timestamp |
| lastUpdateDate | ISO Date | Last modification timestamp |
| businessYear | Number | Business year of the order |
| businessMonth | Number | Business month of the order |
| businessDay | Number | Business day of the order |
| service | Number | Service number within the business day |
| shift | { name: String } | Shift information (e.g. Lunch, Dinner) |

#### Status

| Field | Type | Description |
| --- | --- | --- |
| status | String | Order status: PAID, CANCELLED, VALIDATED, OPEN, CLOSED |
| isCancellable | Boolean\|undefined | Whether the order can be cancelled |
| isRefundable | Boolean\|undefined | Whether the order can be refunded |
| cancellationReason | String\|null | Reason for cancellation |
| cancellationReasonDescription | String\|null | Detailed cancellation reason description |
| metadata | String\|null | JSON-encoded metadata of the originating Web/Kiosk order (null when the order has no Web/Kiosk counterpart, e.g. a POS sale). Carries the reserved `kioskPaymentState` key set to `NOT_PAID_AT_KIOSK` when a kiosk guest ordered to pay at the counter - this can happen while `status` already reads `PAID`, see [Create Orders](https://developers.innovorder.io/docs/orders/orders-create.md) |

#### Pricing & Amounts (all values in cents)

| Field | Type | Description |
| --- | --- | --- |
| totalPriceWithTaxIncluded | Number | Total price including tax before discounts |
| totalPriceWithTaxExcluded | Number | Total price excluding tax before discounts |
| totalPriceDiscountedWithTaxIncluded | Number | Total price including tax after discounts |
| totalPriceDiscountedWithTaxExcluded | Number | Total price excluding tax after discounts |
| totalTax | Number | Total tax amount |
| totalDiscount | Number | Total discount amount |
| turnover | Number | Net turnover (revenue after discounts) |
| totalAmountFree | Number | Total amount of free items |
| totalItemFree | Number | Count of free items |
| totalAmountCancelled | Number | Total amount of cancelled items |
| totalItemCancelled | Number | Count of cancelled items |

#### Items (Array&lt;Item&gt;)

| Field | Type | Description |
| --- | --- | --- |
| itemId | Number | Unique item identifier |
| parentItemId | Number\|null | Parent item ID for sub-items (null for top-level items) |
| name | String | Item display name |
| type | String | Item type: PRODUCT, URSSAFCOMPENSATORYPRODUCT |
| status | String | Item status |
| quantity | Number | Quantity in thousandths (1000 = 1 unit) |
| totalPriceWithTaxIncluded | Number | Total price including tax (cents) |
| originalUnitPrice | Number\|null | Original unit price before discounts |
| itemType | String | Item classification type |
| vatValue | Number | VAT rate in basis points (1000 = 10%) |
| skuValue | String\|null | SKU identifier |
| free | Boolean | Whether the item is free |
| tags | Array&lt;{value:String}&gt; | Item tags |
| categories | Array&lt;{value:String}&gt; | Item categories |
| purchasePrice | Number\|null | Purchase/cost price |
| billingCode | String\|null | Billing code for accounting |
| discounted | Boolean | Whether a discount was applied |
| reduced | Boolean | Whether a price reduction was applied |
| service | Number | Service number |
| totalItemDiscounted | Number | Number of discounted items |
| totalPriceDiscounted | Number | Total discounted price |
| cancelReason | String\|null | Reason for item cancellation |
| deviceName | String | Device that added the item |
| deviceId | String | Device identifier |
| measurementUnit | String | Unit of measurement (e.g. UNIT) |
| measuredQuantity | Number | Measured quantity in the given unit |

#### Payments (Array&lt;Payment&gt;)

| Field | Type | Description |
| --- | --- | --- |
| type | String | Payment type: Cash, Card, EWallet, Change |
| label | String\|undefined | Payment label (e.g. Visa, Mastercard) |
| quantity | Number | Number of payment transactions |
| value | Number | Payment amount in cents |
| luncheonCode | String\|null | Luncheon voucher code |
| transactionId | Number\|null | Payment transaction identifier |

#### Taxes (Array&lt;Tax&gt;)

| Field | Type | Description |
| --- | --- | --- |
| taxRate | Number | Tax rate in basis points (1000 = 10%) |
| totalTax | Number | Total tax amount |
| totalInclTax | Number | Total amount including tax |
| totalExclTax | Number | Total amount excluding tax |

#### Fees (Array&lt;Fee&gt;)

| Field | Type | Description |
| --- | --- | --- |
| name | String | Fee name |
| taxRate | Number | Tax rate in basis points |
| quantity | Number | Number of fees applied |
| amount | Number | Fee amount in cents |
| type | String | Fee type: Delivery, Service |

#### Discounts (Array&lt;Discount&gt;)

| Field | Type | Description |
| --- | --- | --- |
| name | String | Discount name or code |
| value | Number | Discount amount in cents |

#### Grants (Array&lt;Grant&gt;)

| Field | Type | Description |
| --- | --- | --- |
| labelTicket | String | Label displayed on the ticket |
| amount | Number | Grant amount |
| quantity | Number | Number of grants applied |
| totalAmount | Number\|undefined | Total grant amount |
| taxBreakdowns | Array&lt;GrantTaxBreakdown&gt;\|undefined | Per-VAT-rate breakdown of how the grant is split across discountable products and fees. See `GrantTaxBreakdown` below. |

#### Grant Tax Breakdown (Array&lt;GrantTaxBreakdown&gt;)

Ventilation of a grant's amount across the VAT rates of the items and fees it was applied to. The sum of all `totalInclTax` values equals the grant `amount`. Useful for VAT reporting and URSSAF compliance. All monetary values are in cents.

| Field | Type | Description |
| --- | --- | --- |
| taxRate | Number | VAT rate this portion of the grant applies to (e.g. `1000` for 10%, `10` for legacy encoding). Mirrors the rate of the underlying product/fee. |
| totalInclTax | Number | Grant amount allocated to this rate, tax included (cents). |
| totalExclTax | Number | Grant amount allocated to this rate, tax excluded (cents). |
| totalTax | Number | Tax portion of the allocated grant amount (cents). Equals `totalInclTax - totalExclTax`. |
| discountableType | String\|null | What the grant portion was applied to: `PRODUCT` or `FEE`. |
| feeType | String\|null | When `discountableType` is `FEE`, the fee category (e.g. `AdmissionFee`, `RoyaltyFee`). `null` for products. |

#### Entrance Fees (Array&lt;EntranceFee&gt;)

| Field | Type | Description |
| --- | --- | --- |
| labelTicket | String | Label displayed on the ticket |
| amount | Number | Entrance fee amount |
| vat | Number | VAT rate |
| type | String | Entrance fee type |
| totalTaxEntranceFee | Number | Total tax on entrance fee |
| quantity | Number | Number of entrance fees |
| totalAmount | Number\|undefined | Total entrance fee amount |

#### Loyalty

| Field | Type | Description |
| --- | --- | --- |
| loyaltyPrograms | Array&lt;{name:String, amount:Number}&gt; | Loyalty programs applied to the order |
| pricingRule | Object\|null | Pricing rule applied: {code:String, applyScope:String} or null |

#### Customer (Object|null)

| Field | Type | Description |
| --- | --- | --- |
| phone | String\|null | Customer phone number |
| email | String\|null | Customer email address |
| firstName | String | Customer first name |
| lastName | String | Customer last name |
| badgeNumber | String\|null | Customer badge number |
| disabledAt | Date\|null | Date when customer was disabled (null if active) |
| student | Object\|null | Student info: {class, section, subSection, studentNumber} or null |
| balanceInformation | Object\|undefined | E-wallet balance: {ewalletBalanceBeforeOrder, ewalletBalanceAfterOrder} |

#### Restaurant (Object|null)

| Field | Type | Description |
| --- | --- | --- |
| name | String | Restaurant name |
| contactPhone | String | Restaurant contact phone number |
| externalId | String | External identifier for the restaurant |
| address | Object | Address: {streetNumber, route, postalCode, locality, country} |
| legal | Object\|undefined | Legal information for the restaurant |

#### Delivery Address (Object|undefined)

| Field | Type | Description |
| --- | --- | --- |
| phone | String\|null | Delivery contact phone |
| additionalInfo | String\|null | Additional delivery information |
| digicode | String\|null | Building access code |
| apartmentNumber | String\|null | Apartment number |
| locality | String\|null | City or locality |
| route | String\|null | Street name |
| postalCode | String\|null | Postal code |
| streetNumber | String\|null | Street number |

**Note:** This OmnichannelOrder object is the same structure used in `orders.paid` and `orders.cancelled` webhook event payloads. See [Order Events](https://developers.innovorder.io/docs/webhooks/webhooks-orders.md) for webhook-specific documentation.

### Customer Order History

Retrieve the full order history for a specific customer. This is useful for "My Orders" sections in apps or websites. This is the **List Orders** endpoint above, called with `customerId` as the single scope parameter (do not combine it with `brandId`). See the parameter table above for the full contract.

**GET /v1/orders?customerId=510&limit=10&order=-startDate**

```bash
{
    "status": 200,
    "code": "omnichannel_orders_succeed",
    "data": {
        "count": 8,
        "omnichannelOrders": [
            {
                "reportOrderId": 239190,
                "customerId": 510,
                "restaurantId": 255,
                "brandId": 10,
                "status": "PAID",
                "dailyOrderId": 5,
                "startDate": "2023-05-05T14:41:36.000Z",
                "omnichannelOrderId": "286911",
                "totalPriceDiscountedWithTaxIncluded": 300000,
                "currency": "EUR",
                "items": [
                    {
                        "itemId": 1086408,
                        "name": "Eau Nestlé",
                        "quantity": 1000,
                        "totalPriceWithTaxIncluded": 300000
                    }
                ],
                "restaurant": {
                    "name": "Chez Yann",
                    "contactPhone": "0647689047"
                }
            }
        ]
    }
}
```

### Search Orders (Cursor-based)

Search orders using cursor-based pagination. More efficient than offset-based pagination for large datasets, with stable results when data changes between pages. Returns a **lightweight payload** optimized for list views.

This endpoint returns a lightweight response without items, taxes, grants, entrance fees, photos, or shift data. To retrieve the full details of a specific order, use `GET /v1/orders/{orderId}`.

### `GET /v1/orders/search` - Search Omnichannel Orders

Search and filter orders using cursor-based pagination. Requires startDate and endDate, and exactly one scope parameter among: brandId, customerId, restaurantId, restaurantIds, or brandIds. Returns a lightweight payload without items, taxes, grants, entrance fees, photos, shift, or ticket HTML. The order metadata is not loaded either: metadata is always null here, even on an order that has one. Read it with GET /v1/orders, GET /v1/orders/{orderId} or GET /v1/orders/uuid/{orderUuid}.

#### Parameters

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| brandId | integer | No | Filter by brand ID (mutually exclusive with other scope params). |
| customerId | integer | No | Filter by customer ID. |
| restaurantId | integer | No | Filter by restaurant ID. |
| restaurantIds | string | No | Comma-separated list of restaurant IDs. |
| brandIds | string | No | Comma-separated list of brand IDs. |
| startDate | ISO date | Yes | Start of the date range (required). |
| endDate | ISO date | Yes | End of the date range (required, must be &gt;= startDate). |
| cursor | string | No | Opaque cursor for the next page (from nextCursor in previous response). |
| limit | integer | No | Number of results per page (1-100, default 20). |
| channelIds | string | No | Comma-separated channel IDs. |
| consumptionModeIds | string | No | Comma-separated consumption mode IDs. |
| status | string | No | Comma-separated statuses: PAID, VALIDATED, CANCELLED, PAID\_CANCELLED, CONTRA\_ENTRY. |
| search | string | No | Free-text search on order ID. |
| customerName | string | No | Filter by customer name. |
| badgeNumber | string | No | Filter by badge number. |
| pricingRule | string | No | Filter by pricing rule code. |
| phoneNumber | string | No | Filter by phone number. |
| restaurantName | string | No | Filter by restaurant name. |
| ticketNumber | string | No | Filter by ticket number or daily order ID. |
| ticketStartDate | ISO date | No | Filter by ticket date (lastUpdateDate) range start. |
| ticketEndDate | ISO date | No | Filter by ticket date range end. |
| totalPriceMin | integer | No | Minimum total price (in cents). |
| totalPriceMax | integer | No | Maximum total price (in cents). |
| turnoverMin | integer | No | Minimum turnover (in cents). |
| turnoverMax | integer | No | Maximum turnover (in cents). |
| itemsTag | string | No | Filter by item tag. |
| order | string | No | Sort field. Prefix with - for descending (e.g. -startDate). Supported: startDate, status, lastUpdateDate, ticketNumber, consumptionMode, turnover, totalPriceDiscountedWithTaxIncluded, customerName, phoneNumber, badgeNumber, pricingRule, restaurantName, channelId, omnichannelOrderId, and more. |

#### Response

```json
{
  "status": 200,
  "code": "omnichannel_orders_search_succeed",
  "message": "Omnichannel orders search successfully retrieved.",
  "data": {
    "orders": [
      {
        "omnichannelOrderId": "12345678",
        "brandId": 100,
        "restaurantId": 200,
        "customerId": 300,
        "status": "PAID",
        "dailyOrderId": 42,
        "ticketNumber": "T-042",
        "startDate": "2025-12-03T13:09:05.000Z",
        "lastUpdateDate": "2025-12-03T13:09:10.000Z",
        "consumptionModeId": 1,
        "channelId": "5",
        "totalPriceDiscountedWithTaxIncluded": 1500,
        "turnover": 1500,
        "payments": [
          {
            "type": "CREDIT_CARD",
            "value": 1500
          }
        ],
        "customer": {
          "firstName": "John",
          "lastName": "Doe",
          "email": "john@example.com",
          "phone": "+33600000000",
          "badgeNumber": "B001"
        },
        "restaurant": {
          "name": "Le Bistrot"
        },
        "pricingRule": {
          "code": "STANDARD",
          "applyScope": "ALL"
        },
        "items": [],
        "photos": [],
        "grants": [],
        "entranceFees": [],
        "metadata": null
      }
    ],
    "nextCursor": "eyJ2IjoiMjAyNS0xMi0wM1QxMzowOTowNS4wMDBaIiwiaWQiOjEyMzQ1fQ==",
    "hasMore": true
  }
}
```

##### Response Properties

Every field in the example is listed below. Explicit requiredness is shown when the endpoint contract defines it.

| Property | Type | Example | Description |
| --- | --- | --- | --- |
| status | integer | 200 | HTTP status code returned by the API. |
| code | string | "omnichannel\_orders\_search\_succeed" | Machine-readable application code for the result. |
| message | string | "Omnichannel orders search successfully retrieved." | Human-readable result message. Do not use this value for program logic. |
| data | object | {…} | Endpoint-specific response payload. |
| data.orders | array | \[…\] | List of orders entries. |
| data.orders\[\] | object | {…} | Object containing orders fields. |
| data.orders\[\].omnichannelOrderId | string | "12345678" | Identifier of the associated omnichannel order. |
| data.orders\[\].brandId | integer | 100 | Identifier of the brand. |
| data.orders\[\].restaurantId | integer | 200 | Identifier of the restaurant. |
| data.orders\[\].customerId | integer | 300 | Identifier of the customer. |
| data.orders\[\].status | string | "PAID" | HTTP status code returned by the API. |
| data.orders\[\].dailyOrderId | integer | 42 | Identifier of the associated daily order. |
| data.orders\[\].ticketNumber | string | "T-042" | The ticket number value. |
| data.orders\[\].startDate | string | "2025-12-03T13:09:05.000Z" | Date or timestamp for start. |
| data.orders\[\].lastUpdateDate | string | "2025-12-03T13:09:10.000Z" | Date or timestamp for last update. |
| data.orders\[\].consumptionModeId | integer | 1 | Identifier of the associated consumption mode. |
| data.orders\[\].channelId | string | "5" | Identifier of the associated channel. |
| data.orders\[\].totalPriceDiscountedWithTaxIncluded | integer | 1500 | The total price discounted with tax included value. |
| data.orders\[\].turnover | integer | 1500 | The turnover value. |
| data.orders\[\].payments | array | \[…\] | List of payments entries. |
| data.orders\[\].payments\[\] | object | {…} | Object containing payments fields. |
| data.orders\[\].payments\[\].type | string | "CREDIT\_CARD" | The type value. |
| data.orders\[\].payments\[\].value | integer | 1500 | The value value. |
| data.orders\[\].customer | object | {…} | Object containing customer fields. |
| data.orders\[\].customer.firstName | string | "John" | The first name value. |
| data.orders\[\].customer.lastName | string | "Doe" | The last name value. |
| data.orders\[\].customer.email | string | "john@example.com" | Email address. |
| data.orders\[\].customer.phone | string | "+33600000000" | Phone number. |
| data.orders\[\].customer.badgeNumber | string | "B001" | The badge number value. |
| data.orders\[\].restaurant | object | {…} | Object containing restaurant fields. |
| data.orders\[\].restaurant.name | string | "Le Bistrot" | The name value. |
| data.orders\[\].pricingRule | object | {…} | Object containing pricing rule fields. |
| data.orders\[\].pricingRule.code | string | "STANDARD" | Machine-readable application code for the result. |
| data.orders\[\].pricingRule.applyScope | string | "ALL" | The apply scope value. |
| data.orders\[\].items | array | \[\] | List of items entries. |
| data.orders\[\].photos | array | \[\] | List of photos entries. |
| data.orders\[\].grants | array | \[\] | List of grants entries. |
| data.orders\[\].entranceFees | array | \[\] | List of entrance fees entries. |
| data.orders\[\].metadata | null | null | Additional metadata supplied with the response. |
| data.nextCursor | string | "eyJ2IjoiMjAyNS0xMi0wM1QxMzowOTowNS4wMDBaIiwiaWQiOjEyMzQ1fQ==" | Cursor to use when retrieving the next page. |
| data.hasMore | boolean | true | Whether more is enabled or applies. |

### Order History

Retrieve the chronological history of status changes for a specific order. Useful for tracking the lifecycle of an order from creation through fulfillment.

### `GET /v1/orders/{orderId}/history` - Get Order History

Returns the full status history timeline for a given Omnichannel Order ID.

#### Parameters

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| orderId | string | Yes | The unique Omnichannel Order ID. |

#### Response

```json
{
  "status": 200,
  "code": "omnichannel_orders_succeed",
  "data": [
    {
      "status": "CREATED",
      "date": "2025-12-03T15:50:00.000Z"
    },
    {
      "status": "VALIDATED",
      "date": "2025-12-03T15:50:02.000Z"
    },
    {
      "status": "PAID",
      "date": "2025-12-03T15:50:05.000Z"
    }
  ]
}
```

##### Response Properties

Every field in the example is listed below. Explicit requiredness is shown when the endpoint contract defines it.

| Property | Type | Example | Description |
| --- | --- | --- | --- |
| status | integer | 200 | HTTP status code returned by the API. |
| code | string | "omnichannel\_orders\_succeed" | Machine-readable application code for the result. |
| data | array | \[…\] | Endpoint-specific response payload. |
| data\[\] | object | {…} | Endpoint-specific response payload. |
| data\[\].status | string | "CREATED" | HTTP status code returned by the API. |
| data\[\].date | string | "2025-12-03T15:50:00.000Z" | The date value. |

### Get Order by UUID

Retrieve an order using its UUID. This is particularly useful for anonymous orders or when the numeric order ID is not available.

### `GET /v1/orders/uuid/{orderUuid}` - Get Order by UUID

Retrieve the full details of a specific order using its UUID. Supports anonymous order lookup when restaurantId and channelId query parameters are provided.

#### Parameters

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| orderUuid | string | Yes | The order UUID. |
| restaurantId | string | No | Restaurant ID (needed for anonymous order lookup). |
| channelId | integer | No | Channel ID, must be 2 (WEB) for anonymous orders. |

#### Response

```json
{
  "status": 200,
  "code": "omnichannel_order_found",
  "message": "Omnichannel order successfully retrieved.",
  "data": {
    "omnichannelOrderId": "12345678",
    "orderUuid": "c4d2261e-2779-4eb6-beb0-cb41235c751e",
    "status": "PAID",
    "totalPriceWithTaxIncluded": 1500,
    "restaurantId": 2285,
    "brandId": 100,
    "metadata": null
  }
}
```

##### Response Properties

Every field in the example is listed below. Explicit requiredness is shown when the endpoint contract defines it.

| Property | Type | Example | Description |
| --- | --- | --- | --- |
| status | integer | 200 | HTTP status code returned by the API. |
| code | string | "omnichannel\_order\_found" | Machine-readable application code for the result. |
| message | string | "Omnichannel order successfully retrieved." | Human-readable result message. Do not use this value for program logic. |
| data | object | {…} | Endpoint-specific response payload. |
| data.omnichannelOrderId | string | "12345678" | Identifier of the associated omnichannel order. |
| data.orderUuid | string | "c4d2261e-2779-4eb6-beb0-cb41235c751e" | The order uuid value. |
| data.status | string | "PAID" | HTTP status code returned by the API. |
| data.totalPriceWithTaxIncluded | integer | 1500 | The total price with tax included value. |
| data.restaurantId | integer | 2285 | Identifier of the restaurant. |
| data.brandId | integer | 100 | Identifier of the brand. |
| data.metadata | null | null | Additional metadata supplied with the response. |

### Statistics & Attendance

Endpoints for retrieving order counts, attendance data, and footfall statistics. Useful for capacity planning, slot availability, and operational reporting.

### Attendance

#### Key Concepts

Business Day

The business sales day of a restaurant. Takes deferred closing into account (not necessarily calendar day).

Attendance Count

Count of covers/customers for the business day, aggregated by channel. Calculated as `max(quantité admission)`.

Example: If a ticket has 1 Main, 2 Admission A, and 3 Admission B, the attendance recorded is 3.

#### Channels

Standardized codes representing the source of orders:

-    1  Kiosk 
-    2  Web 
-    5  POS 

### `GET /restaurants/{restaurantId}/attendance` - Get Restaurant Attendance

Retrieve real-time attendance counts for a specific restaurant and business day.

#### Parameters

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| restaurantId | integer | Yes | The unique identifier of the restaurant. |
| businessDay | YYYY-MM-DD | No | The target business day. Defaults to the current day in the restaurant time zone. |

#### Response

```json
{
  "status": 200,
  "code": "success",
  "message": "Success",
  "data": {
    "restaurantId": 4105,
    "businessDay": "2025-07-16",
    "attendance": {
      "total": 2630,
      "channels": [
        {
          "code": "5",
          "label": "POS",
          "isEnabled": true,
          "total": 261
        },
        {
          "code": "1",
          "label": "KIOSK",
          "isEnabled": true,
          "total": 0
        },
        {
          "code": "2",
          "label": "WEB",
          "isEnabled": true,
          "total": 2369
        }
      ]
    }
  },
  "metadata": {
    "generatedAt": "2025-07-16T15:14:00.000Z"
  }
}
```

##### Response Properties

Every field in the example is listed below. Explicit requiredness is shown when the endpoint contract defines it.

| Property | Type | Example | Description |
| --- | --- | --- | --- |
| status | integer | 200 | HTTP status code returned by the API. |
| code | string | "success" | Machine-readable application code for the result. |
| message | string | "Success" | Human-readable result message. Do not use this value for program logic. |
| data | object | {…} | Endpoint-specific response payload. |
| data.restaurantId | integer | 4105 | Identifier of the restaurant. |
| data.businessDay | string | "2025-07-16" | The business day value. |
| data.attendance | object | {…} | Object containing attendance fields. |
| data.attendance.total | integer | 2630 | Total number of matching records. |
| data.attendance.channels | array | \[…\] | List of channels entries. |
| data.attendance.channels\[\] | object | {…} | Object containing channels fields. |
| data.attendance.channels\[\].code | string | "5" | Machine-readable application code for the result. |
| data.attendance.channels\[\].label | string | "POS" | The label value. |
| data.attendance.channels\[\].isEnabled | boolean | true | Whether this feature is enabled. |
| data.attendance.channels\[\].total | integer | 261 | Total number of matching records. |
| metadata | object | {…} | Additional metadata supplied with the response. |
| metadata.generatedAt | string | "2025-07-16T15:14:00.000Z" | Date or timestamp for generated. |

### Order Counts

### `GET /orders/count_by_interval` - Count Orders by Interval

Returns order counts grouped by a time interval (in minutes) within a date range. The date range must not exceed one month.

#### Parameters

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| startDate | ISO date | Yes | Start of the date range (ISO 8601). |
| endDate | ISO date | Yes | End of the date range (ISO 8601). Must be &gt;= startDate and within 1 month. |
| interval | integer | Yes | Interval in minutes (must be &gt; 0). |
| brandId | integer | No | Filter by brand. Defaults to authenticated user brand. |
| restaurantId | integer | No | Filter by restaurant. |

#### Response

```json
{
  "status": 200,
  "code": "count_order_success",
  "message": "Order counts retrieved.",
  "data": [
    {
      "date": "2025-12-03T12:00:00.000Z",
      "count": 14
    },
    {
      "date": "2025-12-03T12:30:00.000Z",
      "count": 22
    },
    {
      "date": "2025-12-03T13:00:00.000Z",
      "count": 8
    }
  ]
}
```

##### Response Properties

Every field in the example is listed below. Explicit requiredness is shown when the endpoint contract defines it.

| Property | Type | Example | Description |
| --- | --- | --- | --- |
| status | integer | 200 | HTTP status code returned by the API. |
| code | string | "count\_order\_success" | Machine-readable application code for the result. |
| message | string | "Order counts retrieved." | Human-readable result message. Do not use this value for program logic. |
| data | array | \[…\] | Endpoint-specific response payload. |
| data\[\] | object | {…} | Endpoint-specific response payload. |
| data\[\].date | string | "2025-12-03T12:00:00.000Z" | The date value. |
| data\[\].count | integer | 14 | Total number of matching records. |

### `GET /orders/schedule_availability` - Schedule Slot Availability

Returns availability for every configured schedule window of a restaurant and consumption mode: the current order count and the configured ordering quota per window. A window is full when count &gt;= orderingQuota (a quota of 0 means the window is closed to ordering). Windows are keyed by day + minute-of-day (the same clock window can recur on several weekdays). No authentication required.

#### Parameters

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| restaurantId | integer | Yes | The restaurant ID. |
| consumptionMode | integer | Yes | Consumption mode number (1=SIT\_IN, 2=TAKE\_AWAY, 3=DELIVERY, 4=DRIVE). |
| areaUuid | string | No | Optional delivery area UUID. |

#### Response

```json
{
  "status": 200,
  "code": "count_order_success",
  "message": "Order counts retrieved.",
  "data": [
    {
      "day": "MON",
      "start": 720,
      "end": 735,
      "count": 12,
      "orderingQuota": 10
    },
    {
      "day": "MON",
      "start": 735,
      "end": 750,
      "count": 3,
      "orderingQuota": 10
    },
    {
      "day": "MON",
      "start": 750,
      "end": 765,
      "count": 0,
      "orderingQuota": 0
    }
  ]
}
```

##### Response Properties

Every field in the example is listed below. Explicit requiredness is shown when the endpoint contract defines it.

| Property | Type | Example | Description |
| --- | --- | --- | --- |
| status | integer | 200 | HTTP status code returned by the API. |
| code | string | "count\_order\_success" | Machine-readable application code for the result. |
| message | string | "Order counts retrieved." | Human-readable result message. Do not use this value for program logic. |
| data | array | \[…\] | Endpoint-specific response payload. |
| data\[\] | object | {…} | Endpoint-specific response payload. |
| data\[\].day | string | "MON" | The day value. |
| data\[\].start | integer | 720 | The start value. |
| data\[\].end | integer | 735 | The end value. |
| data\[\].count | integer | 12 | Total number of matching records. |
| data\[\].orderingQuota | integer | 10 | The ordering quota value. |

### `GET /orders/areas/{areaUuid}/count_by_schedules` - Count Orders by Schedule for a Delivery Area

Returns order counts grouped by schedule time slots for a specific delivery area. Requires authentication and rights over the restaurant.

#### Parameters

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| areaUuid | string (UUID) | Yes | The delivery area UUID. |
| restaurantId | integer | Yes | The restaurant ID. |
| consumptionMode | integer | Yes | Consumption mode number. |

#### Response

```json
{
  "status": 200,
  "code": "count_order_success",
  "message": "Order counts retrieved.",
  "data": [
    {
      "startTime": "18:00",
      "endTime": "18:30",
      "count": 3
    },
    {
      "startTime": "18:30",
      "endTime": "19:00",
      "count": 7
    }
  ]
}
```

##### Response Properties

Every field in the example is listed below. Explicit requiredness is shown when the endpoint contract defines it.

| Property | Type | Example | Description |
| --- | --- | --- | --- |
| status | integer | 200 | HTTP status code returned by the API. |
| code | string | "count\_order\_success" | Machine-readable application code for the result. |
| message | string | "Order counts retrieved." | Human-readable result message. Do not use this value for program logic. |
| data | array | \[…\] | Endpoint-specific response payload. |
| data\[\] | object | {…} | Endpoint-specific response payload. |
| data\[\].startTime | string | "18:00" | The start time value. |
| data\[\].endTime | string | "18:30" | The end time value. |
| data\[\].count | integer | 3 | Total number of matching records. |
