POS
Append table receipts and POS tickets (including ticket payments) to existing reservations via public bulk endpoints.
This guide is for POS or venue data integrators who need to record final check subtotals (“receipt paid”) on existing table reservations in TablelistPro (TPRO).
In the API, table reservations are admission groups with type TABLE.
Receipt lines (bulk-receipts)
bulk-receipts)Use POST /2025-03/venues/{venueId}/admission-groups/bulk-receipts with optional mode:
mode:append(default) — add new PUBLIC receipt lines to existing non-internal receipts.mode:overwrite— replace existing non-internal receipts with only the lines in this request (idempotent full sync per reservation). Internal receipts remain preserved.
Spent on the reservation is recalculated from resulting receipts + POS tickets, same as when staff update spend in the app.
- Multiple rows for the same reservation → rows are combined in request order before append/replace.
closed(optional): if you send it on more than one row for the same reservation, the last row in request order wins.
Full request/response schemas: API Reference → Admission Groups → Bulk sync table receipts (or search bulk-receipts).
CSV / file shape (for partners)
Standardize exports to columns your integrator maps into JSON:
| Column (concept) | JSON field | Required |
|---|---|---|
| Reservation ID (TPRO admission group id) | admissionGroupId | One of id or code per row |
| POS / table code | posCode | One of id or code per row |
| Subtotal (receipt subtotal for this line) | subtotal | Yes |
Closed (true / false) | closed | No |
Do not send both admissionGroupId and posCode on the same row.
POST /2025-03/venues/{venueId}/admission-groups/bulk-receipts
Content-Type: application/json
x-tl-api-key: {your-api-key}{
"mode": "append",
"receipts": [
{ "admissionGroupId": "…", "subtotal": 100.5, "closed": true },
{ "posCode": "T12", "subtotal": 42, "date": "2026-03-14T12:00:00.000Z" }
]
}Omitting mode is the same as "append".
{
"mode": "overwrite",
"receipts": [
{ "admissionGroupId": "…", "subtotal": 100.5 },
{ "admissionGroupId": "…", "subtotal": 20 }
]
}POS tickets (bulk-pos-tickets)
bulk-pos-tickets)Use POST /2025-03/venues/{venueId}/admission-groups/bulk-pos-tickets with optional mode:
mode:append(default) — new tickets are merged onto existingposTickets.mode:overwrite— each reservation’sposTicketsbecomes exactly the tickets you send for that reservation (combine multiple rows for the same reservation in request order, then replace the full list). Use this for idempotent nightly or full syncs from POS.
Spent is recalculated after update in both modes.
- Multiple rows for the same reservation → each row is one ticket; tickets are combined in request order before append or replace.
closed(optional): if sent on multiple rows for the same reservation, the last row in request order wins.- Each ticket supports financial and detail fields such as
subtotal,tax,tip,total,items, andpayments. paymentscan be included per ticket (for exampletype,tenderType,amount,tip,last4).
Append (default)
POST /2025-03/venues/{venueId}/admission-groups/bulk-pos-tickets
Content-Type: application/json
x-tl-api-key: {your-api-key}{
"mode": "append",
"posTickets": [
{
"admissionGroupId": "…",
"ticketNumber": 1024,
"subtotal": 120,
"tax": 10.8,
"tip": 24,
"total": 154.8,
"items": [
{
"id": "item-1",
"name": "Bottle Service",
"price": 120,
"quantity": 1
},
{
"id": "item-2",
"name": "Champagne Upgrade",
"price": 20,
"quantity": 1
},
{
"id": "item-3",
"name": "Mixer",
"price": 10,
"quantity": 2
}
],
"payments": [
{
"type": "CARD",
"tenderType": "visa",
"last4": "4242",
"amount": 154.8,
"tip": 24
}
]
}
]
}Omitting mode is the same as "append".
Overwrite (full sync)
{
"mode": "overwrite",
"posTickets": [
{
"admissionGroupId": "…",
"ticketNumber": 1024,
"subtotal": 120,
"total": 140
}
]
}When matching by posCode, optional date disambiguates to the reservation’s calendar day in TPRO.
Prerequisites
- API key with access to the venue (
x-tl-api-keyheader). See Getting Started. venueIdfor the venue you are updating.- Reservations must already exist in TPRO as
TABLEadmission groups. These endpoints update them; they do not create new table reservations.
Response
{
"updated": [],
"errors": [
{ "index": 0, "code": "Error", "message": "…" }
]
}updated— Admission groups successfully updated.errors— Per input line index (0-based inreceiptsorposTickets).
Partial success is normal: handle errors and retry or fix bad rows.
Suggested integration flow
- Discover reservations —
GET /2025-03/venues/{venueId}/admission-groupswithdateStart/dateEndand pagination (skip/limit) to listTABLErows and readidorposCode. - Batch receipts or tickets — Build the
receiptsorposTicketsarray from your POS export; preserve row order if you useclosed. - Rate limits — Default is 20 requests per second per API key (Rate Limits).
- Real-time changes — Webhooks (
ADMISSION_GROUP_UPDATED, etc.) if you need to react to TPRO-side edits.
Guest list bulk import (different endpoint)
Bulk guest list creation uses POST .../admission-groups/bulk-create-guest-list (blob or structured rows). That flow is separate from table receipt imports.
Related
- Getting Started — Base URL and authentication.
- Rate Limits — Throttling and 429 behavior.
- Webhooks — Events when admission groups change.
- API Reference — Admission Groups → bulk-receipts and bulk-pos-tickets.
Updated 18 days ago
