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)

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 ReferenceAdmission GroupsBulk sync table receipts (or search bulk-receipts).

CSV / file shape (for partners)

Standardize exports to columns your integrator maps into JSON:

Column (concept)JSON fieldRequired
Reservation ID (TPRO admission group id)admissionGroupIdOne of id or code per row
POS / table codeposCodeOne of id or code per row
Subtotal (receipt subtotal for this line)subtotalYes
Closed (true / false)closedNo

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)

Use POST /2025-03/venues/{venueId}/admission-groups/bulk-pos-tickets with optional mode:

  • mode: append (default) — new tickets are merged onto existing posTickets.
  • mode: overwrite — each reservation’s posTickets becomes 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, and payments.
  • payments can be included per ticket (for example type, 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-key header). See Getting Started.
  • venueId for the venue you are updating.
  • Reservations must already exist in TPRO as TABLE admission 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 in receipts or posTickets).

Partial success is normal: handle errors and retry or fix bad rows.

Suggested integration flow

  1. Discover reservationsGET /2025-03/venues/{venueId}/admission-groups with dateStart / dateEnd and pagination (skip / limit) to list TABLE rows and read id or posCode.
  2. Batch receipts or tickets — Build the receipts or posTickets array from your POS export; preserve row order if you use closed.
  3. Rate limits — Default is 20 requests per second per API key (Rate Limits).
  4. Real-time changesWebhooks (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 ReferenceAdmission Groupsbulk-receipts and bulk-pos-tickets.