Data Models
This page is the canonical reference for all POS integration message payloads, shared base models, and enums. Flow pages link to the anchors here.
Models marked TBD are not yet finalized in the integration contract and may change before general availability.
Activation messages
ActivatePos
Sent by the POS to activate against OpenApp.
merchantTaxIdstringRequiredUniversal merchant tax identifier (for example, Polish NIP).
pinCodestringRequiredShort-lived activation PIN displayed in the merchant panel.
posInstallationIdstringOptionalStable identifier for the POS installation on the merchant side.
softwareVersionstringOptionalPOS software version string.
PosActivationResponse
Returned by OpenApp in response to ActivatePos.
- Success
- Failure
successbooleanRequiredtrue.
merchantIdstringRequiredMerchant identifier resolved from the merchantTaxId.
integrationProfileIdstringRequiredLocation-scoped integration profile the POS is now bound to.
locationIdstringRequiredPhysical location identifier.
posIdstringRequiredOpenApp-assigned POS identifier.
apiConfigurationobjectRequiredObject with credentials (apiKey, secret) used to sign POS-to-OpenApp calls.
queueConfigurationobjectOptionalPresent only when queue delivery is configured. Contains queue URL, region, and AWS credentials scoped to the POS capability queue.
successbooleanRequiredfalse.
failureReasonstringRequiredReportPosHealth
Sent by the POS immediately after activation and at regular heartbeat intervals. OpenApp responds with HTTP 204 No Content.
healthybooleanRequiredCurrent POS health status.
softwareVersionstringOptionalPOS software version string.
Menu sync messages
ProductListingsSyncRequested
checkpointobjectRequiredLast synchronization checkpoint. An empty checkpoint requests a full sync. Contains the timestamp of the last successful retrieval and the last seen POS listing identifier.
ProductListingsSynced
checkpointobjectRequiredNext checkpoint to use for subsequent incremental syncs.
listingsarrayRequiredProduct listings changed after the requested checkpoint. Empty when nothing has changed.
ProductListingsUpdated
listingsarrayRequiredChanged product listing, price, or stock data. Contains only the diff.
Table ordering messages
TableOrderSnapshotRequested
tableIdstringRequiredPOS table identifier resolved by OpenApp from the QR.
checkpointstringOptionalLast POS update timestamp stored by OpenApp for this table. The POS may use it to decide whether to return a snapshot.
TableOrderSnapshotResolutionResult
Returned by the POS in response to TableOrderSnapshotRequested.
- Success
- Failure
successbooleanRequiredtrue.
tableSessionContextobjectRequiredSee tableSessionContext.
tableOrderSnapshotobjectRequiredSee tableOrderSnapshot.
successbooleanRequiredfalse.
reasonCodestringRequiredMachine-readable rejection reason.
retryablebooleanRequiredWhether OpenApp may retry the request.
messagestringOptionalHuman-readable description of the rejection.
currentStatusstringOptionalCurrent table status if known. See Table status.
OrderItemsSubmittedToPos
Used by both table ordering and prepaid pickup/delivery flows.
orderContextobjectRequiredSee orderContext.
itemsarrayRequiredItems being submitted to the POS. TBD
OrderMutationResult
Returned by the POS in response to OrderItemsSubmittedToPos. Used by both table ordering and pickup/delivery flows.
success: false is also used when only some items were rejected.
- Success
- Failure
successbooleanRequiredtrue. All submitted items were accepted.
acceptedItemsarrayRequiredItems the POS accepted. TBD
tableOrderSnapshotobjectOptionalUpdated POS table snapshot. Table flow only. See tableOrderSnapshot.
successbooleanRequiredfalse. At least one item was rejected.
acceptedItemsarrayOptionalItems the POS accepted, if any. TBD
rejectedItemsarrayRequiredItems the POS rejected, each with a reasonCode. See Mutation rejection reasons. TBD
tableOrderSnapshotobjectOptionalUpdated POS table snapshot. Table flow only. See tableOrderSnapshot.
TableOrderSnapshotChanged
Pushed by the POS when the table order state changes on the POS side.
changeTypestringRequiredSee Change types.
diffobjectRequiredChanged order lines, removed line identifiers, and status changes since the previous snapshot. TBD
reasonCodestringOptionalRequired when the change has a business reason. For example out of stock, complaint, or POS-side cancellation.
Bill and payment messages
BillRequested
orderContextobjectRequiredIdentifies the table or order. See orderContext.
checkpointstringRequiredThe updatedAt from the most recent tableOrderSnapshot OpenApp holds for this table. The POS uses it to decide whether to return ORDER_CHANGED because its state has moved on. ISO 8601 timestamp.
billingDetailsobjectOptionalInvoice data if the customer requested an invoice. See billingDetails.
itemsarrayOptionalItems to bill. Present when only a subset of the table is being paid.
BillPreparationResult
Returned by the POS in response to BillRequested.
- Success
- Failure
successbooleanRequiredtrue.
posBillIdstringRequiredPOS-assigned identifier for the prepared bill.
billobjectRequiredSee bill.
successbooleanRequiredfalse.
reasonCodestringRequiredretryablebooleanRequiredWhether OpenApp may retry the request.
currentSnapshotobjectOptionalCurrent POS table snapshot if available. See tableOrderSnapshot.
PaymentCompleted
Used by both table-postpay and prepaid pickup/delivery flows.
paymentobjectRequiredPayment details to record. See payment.
posBillIdstringOptionalPOS-assigned identifier returned in BillPreparationResult. Required for the table flow; absent for prepaid pickup/delivery (no BillPreparationResult was issued).
PaymentFailed
Sent only for the table-postpay flow. Prepaid pickup/delivery never triggers PaymentFailed because OpenApp executes payment before contacting the POS — if it fails, OpenApp does not call the POS at all.
posBillIdstringRequiredPOS-assigned identifier returned in BillPreparationResult.
reasonCodestringRequiredMachine-readable failure reason. The POS releases any prepared or payment-pending state.
PosPaymentResult
Returned by the POS in response to PaymentCompleted. Used by both table-postpay and prepaid pickup/delivery flows.
- Success
- Failure
successbooleanRequiredtrue.
posBillIdstringOptionalPOS-assigned identifier the payment was applied to. Table flow only.
oaPaymentIdstringRequiredThe OpenApp payment identifier from PaymentCompleted.payment.
receiptobjectRequiredSee receipt.
successbooleanRequiredfalse. OpenApp refunds the OpenApp payment.
posBillIdstringOptionalPOS-assigned identifier the payment targeted. Table flow only.
oaPaymentIdstringRequiredThe OpenApp payment identifier from PaymentCompleted.payment.
reasonCodestringRequiredMachine-readable rejection reason.
retryablebooleanRequiredWhether OpenApp may retry applying the payment.
Base models
orderContext
Identifies the POS-side context that a command applies to. PICKUP and DELIVERY are prepaid: OpenApp executes payment before submitting to the POS.
- Table
- Pickup
- Delivery
typestringRequiredTABLE. Table QR order. Payment applied to POS bill.
tableIdstringRequiredPOS table identifier.
customerNotestringOptionalFree-text note visible to the POS.
typestringRequiredPICKUP. Prepaid in-person pickup order.
pickupDetailsobjectRequiredPickup details. TBD
customerNotestringOptionalFree-text note visible to the POS.
typestringRequiredDELIVERY. Prepaid delivery order.
deliveryDetailsobjectRequiredDelivery details (address, contact, courier hint). TBD
customerNotestringOptionalFree-text note visible to the POS.
tableSessionContext
Table session metadata returned alongside table snapshots when the table is resolved.
locationIdstringRequiredPhysical restaurant location.
tableIdstringRequiredPOS table identifier.
tableNumberstringRequiredHuman-readable table number.
statusstringRequiredSee Table status.
openedAtstringRequiredISO 8601 timestamp the table was opened.
closedAtstringOptionalISO 8601 timestamp the table was closed. Present when status is closed or cancelled.
tableOrderSnapshot
The POS remains the source of truth for table/open-check state. OpenApp maps relevant state into customer-facing views.
tableIdstringRequiredPOS table identifier.
statusstringRequiredSee Table status.
linesarrayRequiredPOS order lines. TBD
totalsobjectRequiredBill totals. TBD
paymentsarrayRequiredPOS-applied payments. TBD
updatedAtstringRequiredISO 8601 timestamp of the last POS update. Used by OpenApp as the next sync checkpoint.
billingDetails
Invoice data attached to a bill when the customer requests an invoice. TBD
taxIdstringRequiredTax identifier of the entity being billed (for example, Polish NIP).
companyNamestringRequiredLegal name on the invoice.
addressobjectRequiredPostal address. TBD
bill
Returned by the POS in BillPreparationResult when the bill is prepared. TBD
posBillIdstringRequiredPOS-assigned identifier for the prepared bill.
linesarrayRequiredBill lines as frozen by the POS. TBD
totalsobjectRequiredBill totals. TBD
billingDetailsobjectOptionalSee billingDetails.
preparedAtstringRequiredISO 8601 timestamp the bill was prepared and frozen.
payment
Sent by OpenApp in PaymentCompleted to record a successful OpenApp payment. TBD
oaPaymentIdstringRequiredOpenApp payment identifier.
amountobjectRequiredMoney object with value (integer, minor units) and currency (string). TBD
paidAtstringRequiredISO 8601 timestamp the payment was completed.
receipt
Returned by the POS in PosPaymentResult after the POS applies the OpenApp payment. TBD
receiptNumberstringRequiredPOS-assigned receipt number.
fiscalSignaturestringOptionalFiscalization signature if applicable.
issuedAtstringRequiredISO 8601 timestamp the receipt was issued.
receiptUrlstringOptionalURL where the receipt can be retrieved.
Enums
Table status
Used by tableSessionContext.status and tableOrderSnapshot.status.
| Value | Meaning |
|---|---|
OPEN | Table is open and accepting changes. |
CLOSING | Table is being closed; mutations may be rejected. |
CLOSED | Table is closed. |
CANCELLED | Table was cancelled. |
Mutation rejection reasons
Used by OrderMutationResult.rejectedItems[].reasonCode.
| Reason | Meaning |
|---|---|
OUT_OF_STOCK | Item is no longer available. |
INSUFFICIENT_STOCK | Requested quantity is unavailable. |
DELISTED | Item no longer exists or cannot be sold. |
ORDER_CLOSED | Table or check is closed or closing. |
PRICE_CHANGED | OpenApp must refresh the price or listing snapshot. |
Change types
Used by TableOrderSnapshotChanged.changeType.
| Value | Use Case |
|---|---|
POS_LINE_ADDED | Waiter adds drinks or food directly in the POS. |
LINE_CANCELLED | Kitchen or POS cancels a line, for example out of stock. |
LINE_DELIVERED | Waiter marks drinks or food as delivered. |
LINE_UPDATED | Waiter removes or discounts a line after a complaint. |
ORDER_CLOSED | POS closes the table or open order. |
Bill preparation rejection reasons
Used by BillPreparationResult.reasonCode.
| Reason | Meaning |
|---|---|
ORDER_CHANGED | POS revision changed; OpenApp must refresh and reconfirm with the customer. |
ORDER_CLOSED | Bill or order is already closed. |
PAYMENT_NOT_ALLOWED | POS cannot accept an OpenApp payment for this table or order. |
FISCAL_ERROR | Fiscalization or receipt preparation failed. |
POS_OFFLINE_OR_BUSY | Temporary POS failure. |
Activation failure reasons
Used by PosActivationResponse.failureReason.
| Reason | Meaning |
|---|---|
INVALID_OR_EXPIRED_PIN | PIN does not exist, has expired, was already consumed, or does not match the submitted merchantTaxId. |
ACTIVATION_NOT_ALLOWED | The merchant, integration profile, location, or POS capability is not in a state that allows activation. |