Skip to main content

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#

FlowEndpointWhen to use it
Purchase V2 · RecommendedPOST /v2/merchants/orders/purchaseSend the inline order, payer, and tokenized payment source together. DEUNA creates the order as part of the payment request.
Create order first · OptionalPOST /merchants/orders, then POST /v2/merchants/orders/purchaseCreate 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 typeRequired objectBase contract behavior
DEUNA_CHECKOUTorder.itemsRequired. When supplied, the fulfillment type accepts only dine_in, pickup, or delivery.
SUBSCRIPTIONSorder.itemsRequired. Mark the applicable lines with included_in_subscription.
AIRLINE_ORDERorder.airline_informationRequired. The items array remains optional at the base-contract level.
DEUNA_NOWNoneThe items array is not required by the base contract. Include it when downstream processing needs product detail.
PAYMENT_LINKNoneThe 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:

JSON
{
  "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:

PurposeSupported fields
Merchant item identityid, sku, upc, isbn
Customer-facing item detailname, description, image_url, details_url
Quantity and pricing detailquantity, uom, unit_price, total_amount, tax_amount, taxable, discounts
Catalog and variant detailbrand, manufacturer, category, sub_category, color, size, weight
Fulfillment and additional contextoptions, type, item_details, included_in_subscription, shipping_options
FieldDocumented values
typephysical, 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 ruleRequirement
order_idRequired for every order.
currencyRequired for every order.
total_amountMust 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_amountEnforced 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.

VerticalOrder typePrimary field setHow to use it
QSRDEUNA_CHECKOUTitems[].id, items[].sku, options, shipping_options, scheduled_at, user_instructionsIdentify menu lines and modifiers, the service mode and store, the preparation time, and handoff instructions. The items array is required.
AirlinesAIRLINE_ORDERairline_information.booking_items, pnr, ticket_number, passenger, legs, ancillariesSend booking, ticket, agency, passenger, itinerary, and paid-service detail. Airline information is required; the items array is optional at the base-contract level.
CinemaDEUNA_CHECKOUTitems, type, options, shipping_options.details, expires_atModel 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.
BankingDEUNA_CHECKOUTitems, type, description, statement_descriptor, initiator_type, channel_type, metadataModel 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.
RetailDEUNA_CHECKOUTitems, discounts, shipping_address, shipping_method, shipping_optionsSend 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.

Complete request

QSR

Process the payment in one request by sending the order, payer, and tokenized payment source inline.

POST/v2/merchants/orders/purchase

Menu, modifiers, service mode, location, schedule, and customer instructions in one restaurant order.

itemsshipping_optionsscheduled_atuser_instructions
Request bodyJSON
{
  "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, and currency identify the merchant business context.
  • Amounts are integers in minor currency units and must reconcile with item, tax, discount, and shipping details.
  • items describe what the customer is buying or paying for.
  • payer_info, channel_type, and initiator_type clarify who initiated the flow and where.
  • callback_urls and the returned order_token connect the synchronous request to its final outcome.
  • metadata carries merchant-defined references; supported typed fields should be preferred whenever they exist.

Continue the integration#