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.
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 station (table) ordering active.
STATION availability gates table ordering only.
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 STATION, 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 station or order. See orderContext.
checkpointstringOptionalThe latest POS-side state checkpoint OpenApp holds. For table-session contexts, this is the updatedAt from the most
recent tableOrderSnapshot; the POS uses it to decide whether to return ORDER_CHANGED. Omitted for stateless flows
such as Scan & Pay where OpenApp holds no prior state. ISO 8601 timestamp.
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.
billobjectRequiredSee bill.
tipRecipientIdstringOptionalIdentifier of the tip recipient for this station. Returned when the POS can identify who should receive the tip. OpenApp uses this to attribute tips. When the customer scanned a receipt QR with a tip recipient embedded (see Scan & Pay - Building the receipt QR), that value takes precedence and this field is ignored.
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.bill.
billingDetailsobjectOptionalInvoice data. See billingDetails.
BillPaymentFailed
Sent only when OpenApp payment fails after a successful BillPreparationResult.
posBillIdstringRequiredPOS-assigned identifier returned in BillPreparationResult.bill.
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.
- Station
- Pickup
- Delivery
typestringRequiredSTATION. Station order context - covers both table and kiosk stations.
stationIdstringRequiredPOS station identifier resolved by OpenApp from the station QR.
stationKindstringRequiredStation kind. TABLE for a table station; KIOSK for a kiosk station.
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.
linesarrayOptionalBill lines as frozen by the POS. Optional - the POS may return a total-only bill when itemized line data is unavailable or not required. TBD
totalsobjectRequiredBill totals. TBD
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.
TipRecipient
A tip-recipient record as stored on the OpenApp side. Returned by GET /tip-recipients, GET /tip-recipients/:id, and PUT /tip-recipients/:id.
tipRecipientIdstringRequiredStable POS-side identifier for this tip recipient. Matches the tipRecipientId carried in the receipt QR and
BillPreparationResult.
displayNamestringRequiredHuman-readable name of the tip recipient as shown to staff.
statusstringRequiredCurrent linking state. See Link status.
expiresAtstringOptionalISO 8601 timestamp after which a pending submission is silently discarded. Present only when status is PENDING.
Tip-recipient linking messages
PutTipRecipientRequest
Request body for PUT /tip-recipients/:id. Upserts the tip-recipient record and initiates account linking in a single call.
phoneNumberstringRequiredOpenApp phone number of the staff member, in E.164 format (for example +48123456789). The staff member may already
have an OpenApp account or may not yet - both are valid.
displayNamestringRequiredHuman-readable name of the tip recipient. Creates or updates the record's display name.
LinkTipRecipientResponse
Returned by OpenApp in response to LinkTipRecipient.
- Success
- Failure
successbooleanRequiredtrue. The submission was accepted and the association is pending confirmation.
statusstringRequiredPENDING. The association has been stored and OpenApp is handling the confirmation flow.
expiresAtstringRequiredISO 8601 timestamp after which a pending submission is silently discarded.
successbooleanRequiredfalse.
reasonCodestringRequiredEnums
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 |
|---|---|
NO_OPEN_BILL | No open or payable bill exists for the scanned station. For kiosk stations, OpenApp may offer the self-order (K2) path in response. |
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 |
|---|---|
STATION | Station order context (table or kiosk). |
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. |
Link status
Used by TipRecipient.status.
| Value | Meaning |
|---|---|
PENDING | A linking submission was accepted; the staff member has not yet confirmed or completed KYC. |
ACTIVE | The staff member confirmed the link and their KYC is active. Tips attributed to this tipRecipientId are routed to their OpenApp wallet. |
Linking rejection reasons
Used by LinkTipRecipientResponse.reasonCode.
| Reason | Meaning |
|---|---|
PHONE_FORMAT_INVALID | The phone number is not in valid E.164 format. |
PHONE_ALREADY_LINKED | The phone number is already linked to a different tipRecipientId for this location. |