Data Models
This page is the reference for all POS integration message payloads, shared base models, and enums.
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.
softwareNamestringRequiredPOS software product name.
softwareVersionstringRequiredPOS 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.
If OpenApp does not receive health checks within the timeout configured on the integration profile, OpenApp marks the POS capability unavailable, stops sending POS-backed ordering commands, and tells customers that the location is currently unavailable.
healthybooleanRequiredCurrent POS health status.
softwareNamestringRequiredPOS software product name.
softwareVersionstringRequiredPOS software version string.
Availability control messages
PosLocationAvailabilityChanged
Pushed by the POS when the location is opened or closed for OpenApp-backed ordering. Closing the location disables new table, pickup, and delivery ordering until the POS opens it again or OpenApp receives an equivalent availability update from another authorized source.
openbooleanRequiredtrue when the location is open for OpenApp-backed ordering; false when closed.
reasonCodestringOptionalMachine-readable reason, for example CLOSED_FOR_DAY, TEMPORARILY_CLOSED, or POS_OPERATOR_ACTION.
messagestringOptionalHuman-readable message that OpenApp may map to customer-facing copy.
effectiveAtstringOptionalISO 8601 timestamp when the state becomes effective. Defaults to receipt time.
PosOrderTypeAvailabilityChanged
Pushed by the POS when it wants to change availability for selected OpenApp-backed order types without closing the location. This supports temporary capacity controls, for example pausing pickup and delivery during rush hours while keeping table ordering active.
changesarray of objectsRequiredList of order-type availability changes. Only the listed order types change; omitted types are left as-is. Each item contains orderType, state, optional reasonCode, and optional effectiveUntil.
Show child parametersHide child parameters4
orderTypeOrderTypeRequiredOrder type to change. See Order types.
stateOrderTypeAvailabilityStateRequiredDesired state for this order type. See Order type availability states.
reasonCodestringOptionalMachine-readable reason for this order-type state, for example KITCHEN_OVERLOADED, NO_DRIVERS.
effectiveUntilstringOptionalISO 8601 timestamp after which OpenApp may clear this order-type state. If omitted, the state remains until changed.
Example:
{
"changes": [
{
"orderType": "PICKUP",
"state": "PAUSED",
"reasonCode": "KITCHEN_OVERLOADED",
"effectiveUntil": "2026-05-29T18:00:00Z"
},
{
"orderType": "DELIVERY",
"state": "PAUSED",
"reasonCode": "NO_DRIVERS",
"effectiveUntil": "2026-05-29T19:00:00Z"
}
]
}
Menu sync messages
ProductListingsSyncRequested
checkpointobject | nullRequiredLast synchronization checkpoint. null requests a full sync. An object 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.
OrderSubmissionRequested
Submits items for a TABLE, PICKUP, or DELIVERY fulfillment context.
When payment is present, OpenApp has already completed the customer payment and the submission is prepaid. When payment is omitted, the submission is unpaid/postpaid and payment is handled later outside this message.
orderContextobjectRequiredSee orderContext.
itemsarrayRequiredItems being submitted to the POS. TBD
paymentobjectOptionalCompleted OpenApp payment for prepaid submissions. Omit for unpaid/postpaid submissions. See payment.
OrderSubmissionResult
Returned by the POS in response to OrderSubmissionRequested. Used by table, pickup, and delivery contexts.
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.
receiptobjectOptionalReceipt or fiscal confirmation for prepaid submissions where OrderSubmissionRequested.payment was present. See receipt.
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
BillPreparationRequested
orderContextobjectRequiredIdentifies the table or order. See orderContext.
checkpointstringRequiredThe latest POS-side state checkpoint OpenApp holds. For table contexts, this is the updatedAt from the most recent
tableOrderSnapshot. 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 order is being paid. References existing POS-side line identifiers
from tableOrderSnapshot.lines. Selector format is TBD alongside the line-identifier
schema on tableOrderSnapshot.lines.
BillPreparationResult
Returned by the POS in response to BillPreparationRequested.
- 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.
BillPaymentCompleted
Used when OpenApp payment happens after the POS has prepared a bill.
paymentobjectRequiredPayment details to record. See payment.
posBillIdstringRequiredPOS-assigned identifier returned in BillPreparationResult.
BillPaymentFailed
Sent only when OpenApp payment fails after a successful BillPreparationResult.
posBillIdstringRequiredPOS-assigned identifier returned in BillPreparationResult.
reasonCodestringRequiredMachine-readable failure reason. The POS releases any prepared or payment-pending state.
BillPaymentResult
Returned by the POS in response to BillPaymentCompleted for later OpenApp payment against a prepared bill.
- Success
- Failure
successbooleanRequiredtrue.
receiptobjectRequiredSee receipt.
successbooleanRequiredfalse. OpenApp refunds the OpenApp payment.
reasonCodestringRequiredMachine-readable rejection reason.
retryablebooleanRequiredWhether OpenApp may retry applying the payment.
Base models
orderContext
Identifies the POS-side fulfillment context that a command applies to.
- Table
- Pickup
- Delivery
typestringRequiredTABLE. Table order context.
tableIdstringRequiredPOS table identifier.
customerNotestringOptionalFree-text note visible to the POS.
typestringRequiredPICKUP. In-person pickup order context.
pickupDetailsobjectRequiredPickup details. TBD
customerNotestringOptionalFree-text note visible to the POS.
typestringRequiredDELIVERY. Delivery order context.
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
Successful OpenApp payment details. 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 after the POS records or 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 OrderSubmissionResult.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. |
Order types
Used by PosOrderTypeAvailabilityChanged.changes[].orderType.
| Value | Meaning |
|---|---|
TABLE | Table order context. |
PICKUP | In-person pickup context. |
DELIVERY | Delivery context. |
Order type availability states
Used by PosOrderTypeAvailabilityChanged.changes[].state.
| Value | Meaning |
|---|---|
ACCEPTING | OpenApp may start new orders of the type. |
PAUSED | OpenApp must not start new orders of the type. |