Customer tabs and running bills
Get Adyen payment methods
Returns available Adyen payment methods for the Advanced flow. No purchase is created.
path Parameters
tabIdTab UUID
query Parameters
amountCentsPayment amount in cents. 0 is a valid value: the storefront still hits this endpoint when the cart nets to 0 (voucher fully covers the order) and the handler short-circuits with an empty paymentMethodsResponse so the drawer can route to the complimentary settlement path without a PSP method selection.
currencyCodeISO 4217 currency code (e.g. SEK, EUR)
countryCodeISO 3166-1 alpha-2 country code (e.g. SE, NL)
tabMemberIdOptional tab member UUID. When supplied, the handler resolves the paying user and includes a shopperReference so Adyen returns storedPaymentMethods (saved cards) for the shopper. Omit for guest checkouts.
Get Adyen payment methods › Responses
Payment methods fetched successfully
statusmetaCancel tab payment
Cancel a pending tab payment by purchase intent ID
Permissions: 🟠 tabs.update
Cancel tab payment › Request Body
purchase_intent_idPurchase intent ID to cancel
Cancel tab payment › Responses
Payment canceled successfully
statusmetaCancel all tab payments
Cancel all pending payments for a specific tab
Permissions: 🟠 tabs.update
Cancel all tab payments › Request Body
tab_idTab ID to cancel all payments for
Cancel all tab payments › Responses
All payments canceled successfully
statusmetaPay for tab
Process a payment for a tab using various payment methods
Permissions: 🟠 tabs.update
Pay for tab › Request Body
tab_idUUID of the tab to pay for
payment_methodPayment method to use
tab_member_idID of the tab member making the payment (UUID). Optional - will be auto-resolved from JWT token if not provided.
kitchen_dispatch_itemsArray of kitchen dispatch item IDs to pay for (ITEM mode)
amount_centsAmount to pay in cents (AMOUNT mode or triggers mode switch)
terminal_idTerminal ID (required for terminal payments)
return_urlReturn URL after payment (required for online/swish payments)
tip_amount_centsTip amount in cents
metadataAdditional metadata for the payment
voucher_codesVoucher codes to apply to the payment
recipient_idInvoice recipient UUID (for invoice payments)
gift_card_codeGift card code for gift_card payment method (format: XXXX-XXXX-XXXX)
Adyen payment method data from Drop-in/Components (triggers Advanced flow when present)
cancel_existing_paymentUser confirmed: cancel the in-progress Adyen CS payment and start a new one
save_payment_methodWhen true, persist the card token after Adyen Authorised so the user can re-use it. Default false. Honored when location has the instant_pay_v2 feature flag enabled.
selected_saved_payment_method_idUUID of a previously saved payment method to charge. Forwarded to payment-service alongside the Adyen Advanced PSP payload.
Pay for tab › Responses
Payment initiated successfully
statusmetaSubmit Adyen payment details
Submit additional payment details (3DS, redirect) for an existing Adyen Advanced flow purchase.
Submit Adyen payment details › Request Body
purchase_intent_idPurchase intent ID from the initial /tab/pay response
Adyen payment details object (from onAdditionalDetails callback)
Submit Adyen payment details › Responses
Payment details processed successfully
statusmetaRecalculate tab balance
Recalculate tab balance from source of truth (kitchen dispatch items and purchases). Useful for fixing tabs with incorrect balance values.
Permissions: 🟠 tabs.update
Recalculate tab balance › Request Body
tab_idTab ID to recalculate balance for
Recalculate tab balance › Responses
Tab balance recalculated successfully
statusmetaList tabs
List tabs with optional filtering
Permissions: 🔵 tabs.read
query Parameters
locationIdFilter by location ID
stateFilter by tab state
storefrontQrCodeIdFilter by table/QR code UUID
pagePage number
limitItems per page
List tabs › Responses
Default Response
statusClose a tab
Close a tab by setting its state to closed or aborted. Use force=true to close any tab regardless of state.
Permissions: 🟠 tabs.update
path Parameters
idTab UUID
Close a tab › Request Body
commentOptional comment explaining why the tab is being closed
forceIf true, forces the tab to close (state becomes "aborted"). If false, normal close (state becomes "closed") and only works on non-closed tabs
Close a tab › Responses
Default Response
statusAdvance tab coursing
Advance the coursing order for a tab. If coursingOrder is provided in the body, sets to that specific value. Otherwise, advances to the next available coursing level from the location's coursings. Used for POS coursing feature to control when items from each course can be sent to the kitchen.
Permissions: 🟠 tabs.update
path Parameters
idTab UUID
Advance tab coursing › Request Body
coursingOrderSpecific coursing order to set. If omitted, advances to the next available coursing level.
Advance tab coursing › Responses
Default Response
statusDebug: single tab
Debug endpoint for a specific tab with detailed balance verification, per-item allocation breakdowns, and per-purchase line item details. Useful for diagnosing individual tab balance issues.
Permissions: 🔵 tabs.read
path Parameters
idTab UUID
Debug: single tab › Responses
Detailed debug info for a single tab
statusJoin a tab by its UUID
Join a specific tab directly by UUID — no QR code required.
Used by the direct tab link feature (?tab=UUID in storefront-web). Returns 400 if the tab is closed/settled. Idempotent — safe to call multiple times with the same identifier.
Permissions: 🔵 tabs.read
path Parameters
idTab UUID
Join a tab by its UUID › Responses
Default Response
statusAdd a member to a tab
Add a user as a member to an existing tab. Looks up user by userId (priority 1), email (priority 2), or phone (priority 3). If user is already a member, returns existing member. Useful for POS "Add Loyalty Member" functionality.
Permissions: 🟠 tabs.update
path Parameters
idTab UUID
Add a member to a tab › Request Body
userIdUser ID (Priority 1 - direct lookup)
emailEmail address (Priority 2 - lookup by email)
phonePhone number (Priority 3 - lookup by phone)
Add a member to a tab › Responses
Default Response
statusRemove a tab member
Delete a tab member row. Refuses with 409 MEMBER_HAS_ORDERS when the member is referenced by any kitchen dispatch, settlement, voucher reservation, purchase, or comment (history is never cascade-deleted). Refuses with 409 CANNOT_REMOVE_INITIATOR for the initiator member. Use this from the POS guests tab to remove guests added by mistake.
Permissions: 🟠 tabs.update
path Parameters
idTab UUID
memberUuidTab member UUID to remove
Remove a tab member › Responses
Default Response
statusUpsert guest contact on a tab member
Overwrite email/phone/name on the user row attached to an anonymous tab member. Mirrors the kiosk-commit contact-overwrite semantics so a kiosk pay-upfront flow can record the guest's email before payment (avoiding "no recipient address on file" skips on the receipt-email cloud function). Registered accounts (users.guest=false) are refused — use the identify endpoint for those.
Permissions: 🟠 tabs.update
path Parameters
idTab UUID
memberUuidTab member UUID
Upsert guest contact on a tab member › Request Body
emailGuest email (overwrites existing non-empty value)
phoneGuest phone (overwrites existing non-empty value)
nameGuest name (overwrites existing non-empty value)
Upsert guest contact on a tab member › Responses
Default Response
statusIdentify an anonymous tab member
Link an anonymous tab member to a known user. Looks up user by userId (priority 1), email (priority 2), or phone (priority 3), then updates the tab member record to associate with that user. Useful for POS "Identify Guest" functionality when an anonymous guest needs to be linked to their loyalty account.
Permissions: 🟠 tabs.update
path Parameters
idTab UUID
memberUuidTab member UUID to identify
Identify an anonymous tab member › Request Body
userIdUser ID (Priority 1 - direct lookup)
emailEmail address (Priority 2 - lookup by email)
phonePhone number (Priority 3 - lookup by phone)
Identify an anonymous tab member › Responses
Default Response
statusSettle a fully paid tab
Settle a tab when its remaining balance is 0. This endpoint:
-
Validates the tab can be settled:
- Tab must exist
- Tab must have remaining_balance_cents = 0 (fully paid)
- Tab must not already be closed/settled/aborted
-
Updates the tab state to 'settled'
-
Converts amount payments to proportional item allocations (if any):
- Amount payments (type='amount') get converted to product allocations
- Each payer gets a proportional share of each item based on their pre-discount payment value
- Original amount line items get quantity_cents set to 0 to mark as converted
Use cases:
- When balance reaches 0 via payments
- Manual settlement by staff
- This is the single source of truth for settling tabs
Note: If all payments were for specific items (ITEM mode), no conversion is needed.
Permissions: 🟠 tabs.update
path Parameters
idTab UUID
Settle a fully paid tab › Responses
Default Response
statusGet tab timeline
Get a unified timeline of all events for a specific tab, including state transitions, order events, member joins, and payments. Events are sorted by creation time descending.
Permissions: 🔵 tabs.read
path Parameters
idTab UUID
Get tab timeline › Responses
Tab timeline events
statusGet checkout summary
Get checkout summary for a tab member's locked items. Returns items, totals, VAT breakdown, and kitchenDispatchItems array for payment processing.
path Parameters
tabIdTab UUID
Get checkout summary › Request Body
Tab member identification. Provide at least one identifier. Priority: id > email > phone > identifier
Get checkout summary › Responses
Checkout summary retrieved successfully
statusGet tab discounts
Retrieve all items with discounts or price changes on a tab
path Parameters
tabIdUUID of the tab
query Parameters
changeTypeFilter by type of price change
appliedByFilter by retailer user ID who applied the change
Get tab discounts › Responses
Default Response
statusResponse status
Remove item discount
Remove any discount from an item and restore its base price
path Parameters
tabIdUUID of the tab containing the item
itemIdUUID of the kitchen dispatch item to restore
Remove item discount › Request Body
reasonCodeReason code for removing the discount
notesOptional notes
Remove item discount › Responses
Default Response
statusResponse status
Update item price
Apply a discount or set a new price on a kitchen dispatch item
path Parameters
tabIdUUID of the tab containing the item
itemIdUUID of the kitchen dispatch item to modify
Update item price › Request Body
actionType of action: "discount" for applying discounts, "set_price" for setting arbitrary price
reasonCodeRequired reason code explaining why the price is being adjusted
discountTypeRequired when action is "discount": type of discount to apply
valueRequired when action is "discount": percentage (1-100) or cents for fixed discount
priceInCentsRequired when action is "set_price": new price in cents
notesOptional notes providing additional context for the price adjustment
Update item price › Responses
Default Response
statusResponse status
Get item price history
Retrieve the complete price change history for a kitchen dispatch item
path Parameters
tabIdUUID of the tab
itemIdUUID of the kitchen dispatch item
Get item price history › Responses
Default Response
statusResponse status
Batch claim and unclaim items
Atomically claim and unclaim items for a tab member in a single operation. Emits a single webhook event for the combined change.
path Parameters
tabIdUUID of the tab
Batch claim and unclaim items › Request Body
tabMemberIdUUID of the tab member performing the batch operation
clientIdUUID of the client (from storefront sessions)
claimItem IDs to claim (UUIDs in ITEM mode, virtual IDs like "split-index-N" in AMOUNT mode)
unclaimItem IDs to unclaim (UUIDs in ITEM mode, virtual IDs like "split-index-N" in AMOUNT mode)
modePayment mode for the batch operation
Batch claim and unclaim items › Responses
Default Response
statusBulk update item prices
Apply discounts or set new prices on multiple kitchen dispatch items in a single request. Only sends items that need to be updated.
path Parameters
tabIdUUID of the tab containing the items
Bulk update item prices › Request Body
Array of items to update. Each item should specify exactly one of: newPrice, discountPercent, or removeDiscount
reasonCodeReason code explaining why the prices are being adjusted
notesOptional notes providing additional context for the price adjustments
Bulk update item prices › Responses
Default Response
statusResponse status
Claim items
Claim specific items for a tab member
path Parameters
tabIdUUID of the tab
Claim items › Request Body
tabMemberIdUUID of the tab member claiming the items
clientIdUUID of the client (from storefront sessions) for storage efficiency
itemsArray of item IDs to claim. In ITEM mode: inventory item UUIDs. In AMOUNT mode: virtual IDs like "split-index-0".
modePayment mode: ITEM for individual item claiming, AMOUNT for split claiming
Claim items › Responses
Default Response
statusLock item selections
Lock a tab member's selections for checkout (prevents further modifications)
path Parameters
tabIdUUID of the tab
Lock item selections › Request Body
UUID of the tab member to lock/unlock selections for (nullable)
clientIdUUID of the client (fallback identifier when tabMemberId is not available)
claimAfterUnlockIf true, freed items are re-claimed to the caller after force-unlock of another member.
skipCascadeCancelWhen true, bypass the auto-cancel of any payment_in_progress settlements for the unlocked member. Use only for staff force-unlock flows. Default false.
Decision Table
| Variant | Matching Criteria |
|---|---|
| type = object · requires: tabMemberId | |
| type = object · requires: clientId |
UUID of the tab member to lock/unlock selections for (nullable)
clientIdUUID of the client (fallback identifier when tabMemberId is not available)
claimAfterUnlockIf true, freed items are re-claimed to the caller after force-unlock of another member.
skipCascadeCancelWhen true, bypass the auto-cancel of any payment_in_progress settlements for the unlocked member. Use only for staff force-unlock flows. Default false.
Lock item selections › Responses
Default Response
statusUnclaim items
Unclaim (release) specific items for a tab member
path Parameters
tabIdUUID of the tab
Unclaim items › Request Body
tabMemberIdUUID of the tab member unclaiming the items
itemsArray of item IDs to unclaim. In ITEM mode: inventory item UUIDs. In AMOUNT mode: virtual IDs like "split-index-0".
modePayment mode: ITEM for individual item unclaiming, AMOUNT for split unclaiming
Unclaim items › Responses
Default Response
statusUnlock item selections
Unlock a tab member's selections (allows modifications again)
path Parameters
tabIdUUID of the tab
Unlock item selections › Request Body
UUID of the tab member to lock/unlock selections for (nullable)
clientIdUUID of the client (fallback identifier when tabMemberId is not available)
claimAfterUnlockIf true, freed items are re-claimed to the caller after force-unlock of another member.
skipCascadeCancelWhen true, bypass the auto-cancel of any payment_in_progress settlements for the unlocked member. Use only for staff force-unlock flows. Default false.
Decision Table
| Variant | Matching Criteria |
|---|---|
| type = object · requires: tabMemberId | |
| type = object · requires: clientId |
UUID of the tab member to lock/unlock selections for (nullable)
clientIdUUID of the client (fallback identifier when tabMemberId is not available)
claimAfterUnlockIf true, freed items are re-claimed to the caller after force-unlock of another member.
skipCascadeCancelWhen true, bypass the auto-cancel of any payment_in_progress settlements for the unlocked member. Use only for staff force-unlock flows. Default false.
Unlock item selections › Responses
Default Response
statusMove dispatch to another table
Move an entire kitchen_dispatch from a tab to another table
path Parameters
tabIdSource tab UUID
Move dispatch to another table › Request Body
dispatchIdKitchen dispatch UUID to move
destinationTableIdDestination table (storefront_qr_code) UUID
Move dispatch to another table › Responses
Dispatch moved successfully
statusMove items to another table
Move specific kitchen_dispatch_items from a tab to another table
path Parameters
tabIdSource tab UUID
Move items to another table › Request Body
itemIdsArray of kitchen_dispatch_item UUIDs to move
destinationTableIdDestination table (storefront_qr_code) UUID
Move items to another table › Responses
Items moved successfully
statusMove tab to another table
Move an entire tab to another table. If destination table has an active tab, tabs are merged.
path Parameters
tabIdSource tab UUID
Move tab to another table › Request Body
destinationTableIdDestination table (storefront_qr_code) UUID
Move tab to another table › Responses
Tab moved or merged successfully
statusSet payment split
Set payment split for a tab (switches to AMOUNT mode).
This endpoint allows users to split the entire tab bill evenly among multiple people. When a split is set, the tab switches from ITEM mode to AMOUNT mode.
Constraints:
- Split can only be set when no payments have been made yet
- Split can be changed until someone locks items for checkout
- Split value must be between 2 and 10
- Tab must have items (total_amount_cents > 0)
path Parameters
tabIdThe UUID of the tab
Set payment split › Request Body
payment_splitNumber of ways to split the tab (2-10)
Set payment split › Responses
Default Response
statusClear payment split
Clear payment split for a tab (reverts to ITEM mode).
This endpoint allows users to cancel/clear a previously set payment split. When cleared, the tab switches from AMOUNT mode back to ITEM mode.
Constraints:
- Can only be cleared when no payments have been made yet
- Cannot be cleared while items are locked for checkout
- Tab must currently be in AMOUNT mode (split mode)
Use cases:
- User changed their mind about splitting
- Split was set by mistake
- Group decided to pay individually instead
path Parameters
tabIdThe UUID of the tab
Clear payment split › Responses
Default Response
statusGet purchases for a tab
Get all confirmed purchases for a specific tab, including payer information and totals. Used to display payment history in the POS tab view.
Permissions: 🔵 purchases.read
path Parameters
tabIdTab UUID
query Parameters
locationIdLocation ID
Get purchases for a tab › Responses
Default Response
statusCheck if tab exists for QR code (without joining)
Checks if an active tab exists for a QR code WITHOUT joining the user to it. This is useful for instant-pay flows that want to show a "Join Tab" option but should not auto-join. Returns hasActiveTab: true/false with the tabId if one exists.
Permissions: 🔵 tabs.read
Check if tab exists for QR code (without joining) › Request Body
locationIdRestaurant location ID
qrCodeIdQR code UUID for the table
Check if tab exists for QR code (without joining) › Responses
Default Response
statusDebug: recent tabs
Debug endpoint that returns recent tabs with balance verification, item allocations, and purchase breakdowns. Useful for diagnosing tab balance discrepancies.
Permissions: 🔵 tabs.read
query Parameters
limitNumber of recent tabs to return (max 20)
locationIdFilter by location ID
Debug: recent tabs › Responses
Debug info for recent tabs
statusJoin existing tab for QR code
Returns all active joinable tabs (≤7 days old) for the QR code. When exactly one tab exists, auto-joins the user. When multiple tabs exist, returns the list for user selection without joining (pass tabId in a second request to join a specific tab). Returns hasActiveTab:false if no active tabs exist.
Permissions: 🔵 tabs.read
Join existing tab for QR code › Request Body
locationIdRestaurant location ID
qrCodeIdQR code UUID for the table
User identification using priority system
tabIdSpecific tab UUID to join (when user selects from multiple joinable tabs). Omit to auto-join or get the list.
Join existing tab for QR code › Responses
Default Response
statusList the authenticated guest's active tabs
Returns all non-terminal tabs (latest_state NOT IN closed/settled/aborted) where the Bearer-authenticated guest user is a tab_member. Includes members and a minimal location stub. Identity resolves via the same JWT path as buyer endpoints (HS256 mobile or OIDC RS256 storefront).
List the authenticated guest's active tabs › Responses
Default Response
statusGet a single tab the authenticated guest is a member of
Returns the same tab shape as GET /tabs/:id (members + items + location stub) but gated on tab_members.user_id matching the Bearer-authenticated guest. Returns 404 when the user is not a member of the tab.
path Parameters
idTab UUID
Get a single tab the authenticated guest is a member of › Responses
Default Response
statusReconnect orphaned Adyen payment
Reconnect a payment that was authorized in Adyen but not recorded in Karma (due to terminal timeout). Creates a new purchase using the existing Adyen PSP reference. Karmeleon-only.
Permissions: 🟠 tabs.update
Reconnect orphaned Adyen payment › Request Body
tab_idUUID of the tab to reconnect payment for
psp_referenceAdyen PSP reference from the orphaned authorization
terminal_idTerminal ID (optional, for audit trail)
amount_centsAmount in cents (optional, defaults to remaining balance)
Reconnect orphaned Adyen payment › Responses
Payment reconnected successfully
statusmetaResolve tab for user
Find existing tab or create new tab for a user. Handles QR code tables, user resolution with priority system (id > email > phone > identifier), tab member management, and order channel routing. Perfect for storefront integration before item commits.
Permissions: 🟢 tabs.create
Resolve tab for user › Request Body
locationIdLocation ID for the tab
qrCodeIdQR code UUID (for table orders)
tabTypeType of tab to create
paymentFlowPayment timing (open_tab = pay later, pay_upfront = pay now)
orderChannelOrder channel (ONLINE = web interface, QR = QR code scan, KIOSK = self-service, POS = point of sale)
User identification with priority-based resolution: id > email > phone > identifier
Resolve tab for user › Responses
Default Response
statusWebhook: Tab opened
Fired when a new tab is created (e.g. POST /api/v1/tabs/resolve, or table seating).
This is an outbound webhook event. Karma POSTs this payload to the URL you registered via POST /api/v1/webhooks/subscriptions. Your endpoint should respond 2xx within 30 seconds to acknowledge delivery.
Webhook: Tab opened › Request Body
idUnique webhook delivery ID
eventresourceresourceIdString ID of the affected resource
timestampISO 8601 timestamp when the event was emitted
apiVersionWebhook: Tab opened › Responses
Acknowledged. Karma considers any 2xx response a successful delivery; non-2xx triggers retry with exponential backoff.
Webhook: Tab updated
Fired on any tab modification: items added, payments received, balance updated, etc. changes describes what shifted.
This is an outbound webhook event. Karma POSTs this payload to the URL you registered via POST /api/v1/webhooks/subscriptions. Your endpoint should respond 2xx within 30 seconds to acknowledge delivery.
Webhook: Tab updated › Request Body
idUnique webhook delivery ID
eventresourceresourceIdString ID of the affected resource
timestampISO 8601 timestamp when the event was emitted
apiVersionWebhook: Tab updated › Responses
Acknowledged. Karma considers any 2xx response a successful delivery; non-2xx triggers retry with exponential backoff.
Webhook: Tab closed
Fired when a tab is settled or abandoned. Carries the final total and a state describing why it closed.
This is an outbound webhook event. Karma POSTs this payload to the URL you registered via POST /api/v1/webhooks/subscriptions. Your endpoint should respond 2xx within 30 seconds to acknowledge delivery.
Webhook: Tab closed › Request Body
idUnique webhook delivery ID
eventresourceresourceIdString ID of the affected resource
timestampISO 8601 timestamp when the event was emitted
apiVersionWebhook: Tab closed › Responses
Acknowledged. Karma considers any 2xx response a successful delivery; non-2xx triggers retry with exponential backoff.
Webhook: Tab member added
Fired when a guest joins an existing tab (POST /api/v1/tabs/:id/members).
This is an outbound webhook event. Karma POSTs this payload to the URL you registered via POST /api/v1/webhooks/subscriptions. Your endpoint should respond 2xx within 30 seconds to acknowledge delivery.
Webhook: Tab member added › Request Body
idUnique webhook delivery ID
eventresourceresourceIdString ID of the affected resource
timestampISO 8601 timestamp when the event was emitted
apiVersionWebhook: Tab member added › Responses
Acknowledged. Karma considers any 2xx response a successful delivery; non-2xx triggers retry with exponential backoff.
Webhook: Tab payment initiated
Fired when a payment is initiated (POST /api/v1/tabs/:id/pay). Mode-specific fields (itemCount, itemIds) are present only for ITEM mode.
This is an outbound webhook event. Karma POSTs this payload to the URL you registered via POST /api/v1/webhooks/subscriptions. Your endpoint should respond 2xx within 30 seconds to acknowledge delivery.
Webhook: Tab payment initiated › Request Body
idUnique webhook delivery ID
eventresourceresourceIdString ID of the affected resource
timestampISO 8601 timestamp when the event was emitted
apiVersionWebhook: Tab payment initiated › Responses
Acknowledged. Karma considers any 2xx response a successful delivery; non-2xx triggers retry with exponential backoff.
Webhook: Tab payment progress (terminal)
UI hint emitted as Adyen terminal reports stages (card insertion, PIN, approved, etc.). Fire-and-forget — NOT authoritative; POS waits for tab.payment_completed/failed. Duplicates and out-of-order events are tolerated.
This is an outbound webhook event. Karma POSTs this payload to the URL you registered via POST /api/v1/webhooks/subscriptions. Your endpoint should respond 2xx within 30 seconds to acknowledge delivery.
Webhook: Tab payment progress (terminal) › Request Body
idUnique webhook delivery ID
eventresourceresourceIdString ID of the affected resource
timestampISO 8601 timestamp when the event was emitted
apiVersionWebhook: Tab payment progress (terminal) › Responses
Acknowledged. Karma considers any 2xx response a successful delivery; non-2xx triggers retry with exponential backoff.
Webhook: Tab payment completed
Authoritative success signal for a tab payment. Includes the PSP reference for reconciliation.
This is an outbound webhook event. Karma POSTs this payload to the URL you registered via POST /api/v1/webhooks/subscriptions. Your endpoint should respond 2xx within 30 seconds to acknowledge delivery.
Webhook: Tab payment completed › Request Body
idUnique webhook delivery ID
eventresourceresourceIdString ID of the affected resource
timestampISO 8601 timestamp when the event was emitted
apiVersionWebhook: Tab payment completed › Responses
Acknowledged. Karma considers any 2xx response a successful delivery; non-2xx triggers retry with exponential backoff.
Webhook: Tab payment failed
Authoritative failure signal for a tab payment. Includes error code and message for debugging.
This is an outbound webhook event. Karma POSTs this payload to the URL you registered via POST /api/v1/webhooks/subscriptions. Your endpoint should respond 2xx within 30 seconds to acknowledge delivery.
Webhook: Tab payment failed › Request Body
idUnique webhook delivery ID
eventresourceresourceIdString ID of the affected resource
timestampISO 8601 timestamp when the event was emitted
apiVersionWebhook: Tab payment failed › Responses
Acknowledged. Karma considers any 2xx response a successful delivery; non-2xx triggers retry with exponential backoff.
Webhook: Tab items claimed by member
Fired when a tab member claims items for payment. clientId correlates to the browser session that initiated the claim.
This is an outbound webhook event. Karma POSTs this payload to the URL you registered via POST /api/v1/webhooks/subscriptions. Your endpoint should respond 2xx within 30 seconds to acknowledge delivery.
Webhook: Tab items claimed by member › Request Body
idUnique webhook delivery ID
eventresourceresourceIdString ID of the affected resource
timestampISO 8601 timestamp when the event was emitted
apiVersionWebhook: Tab items claimed by member › Responses
Acknowledged. Karma considers any 2xx response a successful delivery; non-2xx triggers retry with exponential backoff.
Webhook: Tab items released by member
Fired when a tab member unclaims items.
This is an outbound webhook event. Karma POSTs this payload to the URL you registered via POST /api/v1/webhooks/subscriptions. Your endpoint should respond 2xx within 30 seconds to acknowledge delivery.
Webhook: Tab items released by member › Request Body
idUnique webhook delivery ID
eventresourceresourceIdString ID of the affected resource
timestampISO 8601 timestamp when the event was emitted
apiVersionWebhook: Tab items released by member › Responses
Acknowledged. Karma considers any 2xx response a successful delivery; non-2xx triggers retry with exponential backoff.
Webhook: Tab member item selection changed
Single event covering any combination of claims and unclaims in one operation. Note: timestamp field is at, not updatedAt.
This is an outbound webhook event. Karma POSTs this payload to the URL you registered via POST /api/v1/webhooks/subscriptions. Your endpoint should respond 2xx within 30 seconds to acknowledge delivery.
Webhook: Tab member item selection changed › Request Body
idUnique webhook delivery ID
eventresourceresourceIdString ID of the affected resource
timestampISO 8601 timestamp when the event was emitted
apiVersionWebhook: Tab member item selection changed › Responses
Acknowledged. Karma considers any 2xx response a successful delivery; non-2xx triggers retry with exponential backoff.
Webhook: Tab member items locked for checkout
Fired when a member's claimed items are locked for the payment flow.
This is an outbound webhook event. Karma POSTs this payload to the URL you registered via POST /api/v1/webhooks/subscriptions. Your endpoint should respond 2xx within 30 seconds to acknowledge delivery.
Webhook: Tab member items locked for checkout › Request Body
idUnique webhook delivery ID
eventresourceresourceIdString ID of the affected resource
timestampISO 8601 timestamp when the event was emitted
apiVersionWebhook: Tab member items locked for checkout › Responses
Acknowledged. Karma considers any 2xx response a successful delivery; non-2xx triggers retry with exponential backoff.
Webhook: Tab member items unlocked
Fired when locked items are released (e.g. cancelled checkout). cancelledByClientId records who cancelled.
This is an outbound webhook event. Karma POSTs this payload to the URL you registered via POST /api/v1/webhooks/subscriptions. Your endpoint should respond 2xx within 30 seconds to acknowledge delivery.
Webhook: Tab member items unlocked › Request Body
idUnique webhook delivery ID
eventresourceresourceIdString ID of the affected resource
timestampISO 8601 timestamp when the event was emitted
apiVersionWebhook: Tab member items unlocked › Responses
Acknowledged. Karma considers any 2xx response a successful delivery; non-2xx triggers retry with exponential backoff.