Order payload examples by industry
Copy complete DEUNA order payloads for QSR, airlines, cinema, banking, and retail.
These examples show complete request bodies for POST /merchants/orders. Choose an industry, inspect every field, and copy the JSON or cURL request. The examples follow the public Create Order contract; amounts are expressed in minor currency units.
What fields are required in order.items when creating an order?#
The short answer is that the base Create Order request validator does not define a universally required property inside each item. It validates whether the items array is present for a particular order type, not the contents of each item.
| Order type | Required object | Base contract behavior |
|---|---|---|
DEUNA_CHECKOUT | order.items | Required. When supplied, the fulfillment type accepts only dine_in, pickup, or delivery. |
SUBSCRIPTIONS | order.items | Required. Mark the applicable lines with included_in_subscription. |
AIRLINE_ORDER | order.airline_information | Required. The items array remains optional at the base-contract level. |
DEUNA_NOW | None | The items array is not required by the base contract. Include it when downstream processing needs product detail. |
PAYMENT_LINK | None | The items array is not required by the base contract. Include it when the hosted experience or downstream processing needs product detail. |
An empty item is not a useful integration target. Payment providers, fraud checks, tax handling, reporting, and your own reconciliation may need more detail. Unless a provider guide states a stricter requirement, use this portable baseline for every item:
{
"id": "merchant-item-001",
"sku": "SKU-001",
"name": "Product name",
"quantity": 1,
"unit_price": {
"amount": 2500,
"currency": "USD"
},
"total_amount": {
"amount": 2500,
"original_amount": 2500,
"total_discount": 0,
"currency": "USD"
},
"tax_amount": {
"amount": 0,
"currency": "USD"
},
"category": "products",
"type": "physical",
"taxable": false
}The item model supports the following field groups:
| Purpose | Supported fields |
|---|---|
| Merchant item identity | id, sku, upc, isbn |
| Customer-facing item detail | name, description, image_url, details_url |
| Quantity and pricing detail | quantity, uom, unit_price, total_amount, tax_amount, taxable, discounts |
| Catalog and variant detail | brand, manufacturer, category, sub_category, color, size, weight |
| Fulfillment and additional context | options, type, item_details, included_in_subscription, shipping_options |
| Field | Documented values |
|---|---|
type | physical, digital, event, service |
Keep item and order currencies aligned and calculate amounts in minor currency units.
Required order-level fields and amount rule
| Field or rule | Requirement |
|---|---|
order_id | Required for every order. |
currency | Required for every order. |
total_amount | Must be greater than zero for normal purchase orders. A zero-value first-use recurrence is the documented card-verification exception. |
sub_total + total_tax_amount = total_amount | Enforced whenever a subtotal or total tax amount is supplied. |
Vertical field guide#
QSR, cinema, banking, and retail are documentation patterns based on the standard checkout order type. They are not separate order-type values. Airlines use the dedicated airline order contract.
| Vertical | Order type | Primary field set | How to use it |
|---|---|---|---|
| QSR | DEUNA_CHECKOUT | items[].id, items[].sku, options, shipping_options, scheduled_at, user_instructions | Identify menu lines and modifiers, the service mode and store, the preparation time, and handoff instructions. The items array is required. |
| Airlines | AIRLINE_ORDER | airline_information.booking_items, pnr, ticket_number, passenger, legs, ancillaries | Send booking, ticket, agency, passenger, itinerary, and paid-service detail. Airline information is required; the items array is optional at the base-contract level. |
| Cinema | DEUNA_CHECKOUT | items, type, options, shipping_options.details, expires_at | Model tickets and concessions as separate lines, identify event tickets, and attach screening time, seats, venue, recipient, and the seat-hold deadline. The items array is required. |
| Banking | DEUNA_CHECKOUT | items, type, description, statement_descriptor, initiator_type, channel_type, metadata | Model the payment as a service and send masked or tokenized business references. The items array is required. Never put full account numbers or credentials in metadata. |
| Retail | DEUNA_CHECKOUT | items, discounts, shipping_address, shipping_method, shipping_options | Send product and variant identity, promotions, destination, delivery method, and fulfillment context. The items array is required. Keep item discount references aligned with the order-level discount array. |
Complete examples#
QSR
Menu, modifiers, service mode, location, schedule, and customer instructions in one restaurant order.
itemsshipping_optionsscheduled_atuser_instructions{
"order_type": "DEUNA_CHECKOUT",
"order": {
"order_id": "qsr-2048",
"store_code": "mad-gran-via-01",
"currency": "EUR",
"items_total_amount": 2890,
"sub_total": 2890,
"total_tax_amount": 286,
"total_amount": 3176,
"items": [
{
"id": "meal-smash-01",
"sku": "SMASH-COMBO",
"name": "Smash burger combo",
"description": "Burger, fries, and drink",
"options": "medium; no onions; sparkling water",
"quantity": 1,
"category": "combos",
"taxable": true,
"unit_price": {
"amount": 1890,
"currency": "EUR",
"currency_symbol": "€"
},
"total_amount": {
"amount": 1890,
"original_amount": 1890,
"currency": "EUR",
"currency_symbol": "€",
"total_discount": 0
},
"tax_amount": {
"amount": 172,
"currency": "EUR",
"currency_symbol": "€"
}
},
{
"id": "side-wings-06",
"sku": "WINGS-6",
"name": "Six hot wings",
"options": "chipotle sauce",
"quantity": 1,
"category": "sides",
"taxable": true,
"unit_price": {
"amount": 1000,
"currency": "EUR",
"currency_symbol": "€"
},
"total_amount": {
"amount": 1000,
"original_amount": 1000,
"currency": "EUR",
"currency_symbol": "€",
"total_discount": 0
},
"tax_amount": {
"amount": 114,
"currency": "EUR",
"currency_symbol": "€"
}
}
],
"shipping_options": {
"type": "pickup",
"method": "counter",
"requires_shipping": false,
"details": {
"store_id": "mad-gran-via-01",
"store_name": "Gran Vía",
"address": "Calle Gran Vía 42, Madrid",
"address_coordinates": {
"lat": 40.4201,
"lng": -3.7058
},
"contact": {
"name": "Gran Vía team",
"phone": "+34910000000"
},
"additional_details": {
"pickup_time": "2026-10-03T18:30:00Z",
"stock_location": "Front counter"
}
}
},
"scheduled_at": "2026-10-03T18:30:00Z",
"user_instructions": "Label the order for Alex. Include napkins.",
"payer_info": {
"email": "alex@example.com",
"external_registration_date": "2024-02-10T12:00:00Z"
},
"channel_type": "mobile_app_ios",
"metadata": {
"vertical": "qsr",
"service_mode": "pickup",
"loyalty_member_id": "LOY-88201"
},
"callback_urls": {
"on_success": "https://merchant.example.com/payments/success",
"on_pending": "https://merchant.example.com/payments/pending",
"on_reject": "https://merchant.example.com/payments/rejected",
"on_canceled": "https://merchant.example.com/payments/canceled",
"on_failed": "https://merchant.example.com/payments/failed"
}
}
}What stays common#
Every industry uses the same core contract:
order_id,store_code, andcurrencyidentify the merchant business context.- Amounts are integers in minor currency units and must reconcile with item, tax, discount, and shipping details.
itemsdescribe what the customer is buying or paying for.payer_info,channel_type, andinitiator_typeclarify who initiated the flow and where.callback_urlsand the returnedorder_tokenconnect the synchronous request to its final outcome.metadatacarries merchant-defined references; supported typed fields should be preferred whenever they exist.