Tables & pricing
The floorplan model: tables belong to a floor and (optionally) a
seating area. You can block tables for a window, combine them for
larger parties, let smart tables auto-optimise assignment, and attach
price lists that set a default deposit/min-spend per table. Every endpoint is
under /api/my-venues/:venueId/… and is operator (client role,
venue-scoped) - send an Authorization: Bearer token from the
Authentication flow. All prices are integer
pence.
| Method | Path | Purpose | Auth |
|---|---|---|---|
| GET | /api/my-venues/:venueId/tables |
List tables | operator |
| GET | /api/my-venues/:venueId/tables/:id |
Get a table | operator |
| POST | /api/my-venues/:venueId/tables |
Create a table | operator |
| PUT | /api/my-venues/:venueId/tables/:id |
Update a table | operator |
| DELETE | /api/my-venues/:venueId/tables/:id |
Delete a table | operator |
| POST | /api/my-venues/:venueId/tables/set-type |
Bulk set table type | operator |
| POST | /api/my-venues/:venueId/tables/set-area |
Bulk assign seating area | operator |
| GET | /api/my-venues/:venueId/tables/blocks |
List table blocks | operator |
| POST | /api/my-venues/:venueId/tables/block |
Block tables for a window | operator |
| PATCH | /api/my-venues/:venueId/tables/blocks/:id |
Edit a block | operator |
| DELETE | /api/my-venues/:venueId/tables/blocks/:id |
Delete a block | operator |
| POST | /api/my-venues/:venueId/tables/unblock |
Clear all blocks for tables | operator |
| GET | /api/my-venues/:venueId/tables/combos |
List combinations | operator |
| POST | /api/my-venues/:venueId/tables/combos |
Create a combination | operator |
| DELETE | /api/my-venues/:venueId/tables/combos/:id |
Delete a combination | operator |
| GET | /api/my-venues/:venueId/floors |
List floors | operator |
| GET | /api/my-venues/:venueId/floors/:id |
Get a floor + its tables | operator |
| POST | /api/my-venues/:venueId/floors |
Create a floor | operator |
| PUT | /api/my-venues/:venueId/floors/:id |
Update a floor (canvas) | operator |
| DELETE | /api/my-venues/:venueId/floors/:id |
Delete a floor | operator |
| GET | /api/my-venues/:venueId/seating-areas |
List seating areas | operator |
| POST | /api/my-venues/:venueId/seating-areas |
Create a seating area | operator |
| PUT | /api/my-venues/:venueId/seating-areas/:id |
Rename a seating area | operator |
| DELETE | /api/my-venues/:venueId/seating-areas/:id |
Delete a seating area | operator |
| GET | /api/my-venues/:venueId/smart-tables |
Get smart-table settings | operator |
| PUT | /api/my-venues/:venueId/smart-tables |
Update smart-table settings | operator |
| GET | /api/my-venues/:venueId/pricelists |
List price lists | operator |
| POST | /api/my-venues/:venueId/pricelists |
Create a price list | operator |
| PUT | /api/my-venues/:venueId/pricelists/:id |
Update a price list | operator |
| DELETE | /api/my-venues/:venueId/pricelists/:id |
Delete a price list | operator |
| PUT | /api/my-venues/:venueId/pricelists/:id/tables/:tableId |
Per-table price override | operator |
Create a table
Section titled “Create a table”POST /api/my-venues/:venueId/tables takes table_number (required), capacity
(default 4) and status (default active). Position, shape and type are
synced through the floor canvas (below) or set in bulk with set-type /
set-area.
curl -X POST "https://thesidedoor.co/api/my-venues/VENUE_ID/tables" \ -H "Authorization: Bearer $SIDEDOOR_TOKEN" \ -H "Content-Type: application/json" \ -d '{"table_number":"12","capacity":6,"status":"active"}'const res = await fetch("https://thesidedoor.co/api/my-venues/VENUE_ID/tables", { method: "POST", headers: { Authorization: `Bearer ${process.env.SIDEDOOR_TOKEN}`, "Content-Type": "application/json", }, body: JSON.stringify({ table_number: "12", capacity: 6, status: "active" }),});const data = await res.json();$ch = curl_init("https://thesidedoor.co/api/my-venues/VENUE_ID/tables");curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ "Authorization: Bearer {$token}", "Content-Type: application/json", ], CURLOPT_POSTFIELDS => json_encode([ "table_number" => "12", "capacity" => 6, "status" => "active", ]),]);$data = json_decode(curl_exec($ch), true);{ "success": true, "id": "tbl_12" }Update with PUT /api/my-venues/:venueId/tables/:id (table_number, capacity,
status) and remove with DELETE /api/my-venues/:venueId/tables/:id. GET /api/my-venues/:venueId/tables accepts ?date=&time=&duration= to decorate each
row with is_blocked / is_taken.
Create a floor
Section titled “Create a floor”POST /api/my-venues/:venueId/floors takes name and optional sort_order.
curl -X POST "https://thesidedoor.co/api/my-venues/VENUE_ID/floors" \ -H "Authorization: Bearer $SIDEDOOR_TOKEN" \ -H "Content-Type: application/json" \ -d '{"name":"Ground Floor","sort_order":0}'const res = await fetch("https://thesidedoor.co/api/my-venues/VENUE_ID/floors", { method: "POST", headers: { Authorization: `Bearer ${process.env.SIDEDOOR_TOKEN}`, "Content-Type": "application/json", }, body: JSON.stringify({ name: "Ground Floor", sort_order: 0 }),});const data = await res.json();$ch = curl_init("https://thesidedoor.co/api/my-venues/VENUE_ID/floors");curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ "Authorization: Bearer {$token}", "Content-Type: application/json", ], CURLOPT_POSTFIELDS => json_encode(["name" => "Ground Floor", "sort_order" => 0]),]);$data = json_decode(curl_exec($ch), true);{ "success": true, "id": "flr_1" }curl -X PUT "https://thesidedoor.co/api/my-venues/VENUE_ID/floors/flr_1" \ -H "Authorization: Bearer $SIDEDOOR_TOKEN" \ -H "Content-Type: application/json" \ -d '{"name":"Ground Floor","canvas_data":[{"type":"table","tableNumber":"12","tableType":"booth","minCovers":2,"maxCovers":6,"shape":"rect","size":"large","x":120,"y":80}]}'const res = await fetch( "https://thesidedoor.co/api/my-venues/VENUE_ID/floors/flr_1", { method: "PUT", headers: { Authorization: `Bearer ${process.env.SIDEDOOR_TOKEN}`, "Content-Type": "application/json", }, body: JSON.stringify({ name: "Ground Floor", canvas_data: [ { type: "table", tableNumber: "12", tableType: "booth", minCovers: 2, maxCovers: 6, shape: "rect", size: "large", x: 120, y: 80, }, ], }), },);const data = await res.json();$ch = curl_init("https://thesidedoor.co/api/my-venues/VENUE_ID/floors/flr_1");curl_setopt_array($ch, [ CURLOPT_CUSTOMREQUEST => "PUT", CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ "Authorization: Bearer {$token}", "Content-Type: application/json", ], CURLOPT_POSTFIELDS => json_encode([ "name" => "Ground Floor", "canvas_data" => [[ "type" => "table", "tableNumber" => "12", "tableType" => "booth", "minCovers" => 2, "maxCovers" => 6, "shape" => "rect", "size" => "large", "x" => 120, "y" => 80, ]], ]),]);$data = json_decode(curl_exec($ch), true);{ "success": true }Seating areas
Section titled “Seating areas”POST /api/my-venues/:venueId/seating-areas creates a named area (only name);
PUT renames it and DELETE detaches its tables then removes it. Assign tables
to an area in bulk with POST /api/my-venues/:venueId/tables/set-area
(table_ids, seating_area_id - send null to detach), and set their type with
POST /api/my-venues/:venueId/tables/set-type (table_ids, table_type one of
standard, low, high, booth, bar).
curl -X POST "https://thesidedoor.co/api/my-venues/VENUE_ID/seating-areas" \ -H "Authorization: Bearer $SIDEDOOR_TOKEN" \ -H "Content-Type: application/json" \ -d '{"name":"Garden"}'const res = await fetch( "https://thesidedoor.co/api/my-venues/VENUE_ID/seating-areas", { method: "POST", headers: { Authorization: `Bearer ${process.env.SIDEDOOR_TOKEN}`, "Content-Type": "application/json", }, body: JSON.stringify({ name: "Garden" }), },);const data = await res.json();$ch = curl_init("https://thesidedoor.co/api/my-venues/VENUE_ID/seating-areas");curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ "Authorization: Bearer {$token}", "Content-Type: application/json", ], CURLOPT_POSTFIELDS => json_encode(["name" => "Garden"]),]);$data = json_decode(curl_exec($ch), true);{ "success": true, "id": "area_1", "name": "Garden" }Block tables
Section titled “Block tables”POST /api/my-venues/:venueId/tables/block reserves one or more tables for a
window. table_ids, from and to are required; reason defaults to “Venue
Reserved”. Edit a block with PATCH .../tables/blocks/:id (reason,
blocked_from, blocked_to), delete one with DELETE .../tables/blocks/:id, or
clear every block on given tables with POST .../tables/unblock (table_ids).
curl -X POST "https://thesidedoor.co/api/my-venues/VENUE_ID/tables/block" \ -H "Authorization: Bearer $SIDEDOOR_TOKEN" \ -H "Content-Type: application/json" \ -d '{"table_ids":["tbl_12","tbl_13"],"from":"2026-07-04T18:00:00","to":"2026-07-04T23:00:00","reason":"Private event"}'const res = await fetch( "https://thesidedoor.co/api/my-venues/VENUE_ID/tables/block", { method: "POST", headers: { Authorization: `Bearer ${process.env.SIDEDOOR_TOKEN}`, "Content-Type": "application/json", }, body: JSON.stringify({ table_ids: ["tbl_12", "tbl_13"], from: "2026-07-04T18:00:00", to: "2026-07-04T23:00:00", reason: "Private event", }), },);const data = await res.json();$ch = curl_init("https://thesidedoor.co/api/my-venues/VENUE_ID/tables/block");curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ "Authorization: Bearer {$token}", "Content-Type: application/json", ], CURLOPT_POSTFIELDS => json_encode([ "table_ids" => ["tbl_12", "tbl_13"], "from" => "2026-07-04T18:00:00", "to" => "2026-07-04T23:00:00", "reason" => "Private event", ]),]);$data = json_decode(curl_exec($ch), true);{ "success": true, "ids": ["blk_1", "blk_2"] }Combine tables
Section titled “Combine tables”POST /api/my-venues/:venueId/tables/combos joins two or more tables into one
bookable unit; combined_capacity is computed from the members. Remove one with
DELETE .../tables/combos/:id.
curl -X POST "https://thesidedoor.co/api/my-venues/VENUE_ID/tables/combos" \ -H "Authorization: Bearer $SIDEDOOR_TOKEN" \ -H "Content-Type: application/json" \ -d '{"name":"Booth A+B","table_ids":["tbl_12","tbl_13"]}'const res = await fetch( "https://thesidedoor.co/api/my-venues/VENUE_ID/tables/combos", { method: "POST", headers: { Authorization: `Bearer ${process.env.SIDEDOOR_TOKEN}`, "Content-Type": "application/json", }, body: JSON.stringify({ name: "Booth A+B", table_ids: ["tbl_12", "tbl_13"] }), },);const data = await res.json();$ch = curl_init("https://thesidedoor.co/api/my-venues/VENUE_ID/tables/combos");curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ "Authorization: Bearer {$token}", "Content-Type: application/json", ], CURLOPT_POSTFIELDS => json_encode([ "name" => "Booth A+B", "table_ids" => ["tbl_12", "tbl_13"], ]),]);$data = json_decode(curl_exec($ch), true);{ "success": true, "id": "cmb_1", "combined_capacity": 8 }Smart tables
Section titled “Smart tables”GET /api/my-venues/:venueId/smart-tables returns the auto-assignment settings;
PUT updates them. reassign_enabled runs a daily pass that moves unlocked
reservations to optimal tables at reassign_time; duration_enabled extends the
hold for larger parties. reassign_last_run is cron-managed and read-only.
curl -X PUT "https://thesidedoor.co/api/my-venues/VENUE_ID/smart-tables" \ -H "Authorization: Bearer $SIDEDOOR_TOKEN" \ -H "Content-Type: application/json" \ -d '{"reassign_enabled":true,"reassign_time":"06:30","duration_enabled":true}'const res = await fetch( "https://thesidedoor.co/api/my-venues/VENUE_ID/smart-tables", { method: "PUT", headers: { Authorization: `Bearer ${process.env.SIDEDOOR_TOKEN}`, "Content-Type": "application/json", }, body: JSON.stringify({ reassign_enabled: true, reassign_time: "06:30", duration_enabled: true, }), },);const data = await res.json();$ch = curl_init("https://thesidedoor.co/api/my-venues/VENUE_ID/smart-tables");curl_setopt_array($ch, [ CURLOPT_CUSTOMREQUEST => "PUT", CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ "Authorization: Bearer {$token}", "Content-Type: application/json", ], CURLOPT_POSTFIELDS => json_encode([ "reassign_enabled" => true, "reassign_time" => "06:30", "duration_enabled" => true, ]),]);$data = json_decode(curl_exec($ch), true);{ "success": true, "data": { "reassign_enabled": true, "reassign_time": "06:30", "reassign_last_run": null, "duration_enabled": true }}Price lists
Section titled “Price lists”A price list sets a default_price_pence (the deposit/min-spend) that applies to
every table, plus optional per-table overrides. POST /api/my-venues/:venueId/pricelists creates one (name required); PUT updates
name/default; DELETE clears its overrides and detaches it from any access rules.
curl -X POST "https://thesidedoor.co/api/my-venues/VENUE_ID/pricelists" \ -H "Authorization: Bearer $SIDEDOOR_TOKEN" \ -H "Content-Type: application/json" \ -d '{"name":"Weekend","default_price_pence":5000}'const res = await fetch( "https://thesidedoor.co/api/my-venues/VENUE_ID/pricelists", { method: "POST", headers: { Authorization: `Bearer ${process.env.SIDEDOOR_TOKEN}`, "Content-Type": "application/json", }, body: JSON.stringify({ name: "Weekend", default_price_pence: 5000 }), },);const data = await res.json();$ch = curl_init("https://thesidedoor.co/api/my-venues/VENUE_ID/pricelists");curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ "Authorization: Bearer {$token}", "Content-Type: application/json", ], CURLOPT_POSTFIELDS => json_encode([ "name" => "Weekend", "default_price_pence" => 5000, ]),]);$data = json_decode(curl_exec($ch), true);{ "success": true, "id": "pl_weekend" }Per-table price override
Section titled “Per-table price override”PUT /api/my-venues/:venueId/pricelists/:id/tables/:tableId sets a table’s price
within a list. Send price_pence to set it, or null (or "") to clear the
override so the list default applies again.
curl -X PUT "https://thesidedoor.co/api/my-venues/VENUE_ID/pricelists/pl_weekend/tables/tbl_12" \ -H "Authorization: Bearer $SIDEDOOR_TOKEN" \ -H "Content-Type: application/json" \ -d '{"price_pence":7500}'const res = await fetch( "https://thesidedoor.co/api/my-venues/VENUE_ID/pricelists/pl_weekend/tables/tbl_12", { method: "PUT", headers: { Authorization: `Bearer ${process.env.SIDEDOOR_TOKEN}`, "Content-Type": "application/json", }, body: JSON.stringify({ price_pence: 7500 }), },);const data = await res.json();$ch = curl_init( "https://thesidedoor.co/api/my-venues/VENUE_ID/pricelists/pl_weekend/tables/tbl_12");curl_setopt_array($ch, [ CURLOPT_CUSTOMREQUEST => "PUT", CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ "Authorization: Bearer {$token}", "Content-Type: application/json", ], CURLOPT_POSTFIELDS => json_encode(["price_pence" => 7500]),]);$data = json_decode(curl_exec($ch), true);{ "success": true }