Order and payment request examples by industry
Copy complete Purchase V2 and optional create-order requests for QSR, airlines, cinema, banking, and retail.
These examples show complete order and payment request bodies for each industry. Start with POST /v2/merchants/orders/purchase to create and pay for an inline order in one request. Creating the order separately with POST /merchants/orders is optional.
Choose the request flow#
| Flow | Endpoint | When to use it |
|---|---|---|
| Purchase V2 · Recommended | POST /v2/merchants/orders/purchase | Send the inline order, payer, and tokenized payment source together. DEUNA creates the order as part of the payment request. |
| Create order first · Optional | POST /merchants/orders, then POST /v2/merchants/orders/purchase | Create the order separately only when your integration needs an order_token before payment—for example, to initialize Checkout, reuse the same order across channels, or retrieve it before the payment attempt. |
The examples below support both flows. Choose an industry, switch between the two request types, and copy the JSON or cURL request. Amounts are expressed in minor currency units.
What fields are required in order.items?#
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#
Each example identifies the endpoint it targets. Purchase V2 · Recommended contains the full one-call payment request. Create order first · Optional contains only the request that creates the order; use the returned order_token in the Purchase V2 request.
QSR
Process the payment in one request by sending the order, payer, and tokenized payment source inline.
/v2/merchants/orders/purchaseMenu, modifiers, service mode, location, schedule, and customer instructions in one restaurant order.
itemsshipping_optionsscheduled_atuser_instructions{
"payer_info": {
"email": "alex@example.com",
"external_registration_date": "2024-02-10T12:00:00Z"
},
"payment_source": {
"method_type": "credit_card",
"payment_method": "TOKENIZED_PAYMENT_METHOD"
},
"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.",
"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.