A Venue Spec is a short JSON file that says what a venue has and where it is, in words. It lists ticket categories and prices, a stage, straight and curved rows, tables, standing areas, booths, landmarks, signs and named areas. SeatLayer places everything, so a Venue Spec never carries coordinates and an AI cannot draw overlapping seats.
New to this? Your first chart with AI walks through each route step by step.
The format is public:
- JSON Schema (draft 2020-12):
https://docs.seatlayer.io/schemas/venue-spec-v1.json - Worked examples: theatre, wedding, club, arena, expo and comedy club. Each one is built and checked in SeatLayer’s tests.
Three ways to use it
| You have | What to do | What happens |
|---|---|---|
| Any chat AI: ChatGPT, Claude, Gemini or another | In the Designer, open New from → Paste from an AI…, copy the prompt, describe your venue to your AI, and paste its reply back | The Designer checks the reply as you paste, shows a preview, and builds the chart when you choose Build |
| Claude, ChatGPT or another MCP host connected to SeatLayer | Ask it to build the venue | The agent calls build_from_venue_spec and builds the whole venue in one call |
A .json file |
Open New from → Import venue file (JSON)… | The same dialog opens with the file loaded. A full chart exported from SeatLayer opens there too |
Building from a Venue Spec replaces the current draft. The result is a normal chart you can edit like any other.
Paste from any AI
This works without an account in the free demo Designer at app.seatlayer.io/demo/designer, and in the Designer in your dashboard.
1 · Ask your AI
Open New from → Paste from an AI… and choose Copy prompt for your AI. Paste it into your chat AI and replace the line in brackets with your venue in your own words.
2 · Paste its reply
Paste the whole reply. You do not need to cut out the JSON: SeatLayer takes
the code block, or the outermost braces if there is no code block. You can
also choose Choose file… or drop a .json file on the box.
3 · Check
The check runs as you paste. A good file shows a preview and a Build N-place chart button. A file with mistakes lists every problem by field. Choose Copy fixes for your AI, paste that into the same chat, and paste the corrected reply back.
Building replaces the draft. One Undo brings the old draft back. Chart warnings do not stop the build; the Designer’s chart checks list them afterwards. A venue with more places than your account’s per-chart limit is refused before anything changes.
The prompt to copy
This is the text Copy prompt for your AI puts on your clipboard:
Write a SeatLayer Venue Spec (JSON) for this venue:
[describe your venue: size, layout, prices, bars, entrances]
Rules:
- Follow the JSON Schema at https://docs.seatlayer.io/schemas/venue-spec-v1.json exactly. Start with "seatlayerVenueSpec": 1.
- Give "name", "categories" (ticket types with prices, most expensive first) and "items" listed from the stage outward.
- Item types: rows, curvedRows, tables, standing, booths, landmark, text, area. Say where in words (front, rear, left, right); never give coordinates.
- One category sells one kind of thing: row seats, table chairs, booths or standing.
- Reply with only the JSON, in one code block.A good description names the counts: how many rows and seats per row, how many tables and chairs, standing capacity, booth rows and columns, the prices, and where the bar, entrances and exits are.
Build it over MCP
When Claude, ChatGPT or another host is connected to the
Designer MCP, the agent can skip the copy and paste.
The server’s build_venue prompt starts here.
Read the chart
get_chart returns meta.updatedAt, which the save needs. On a workspace
connection, create_chart makes a new draft first.
Read the format
get_venue_spec_format returns the JSON Schema, the rules, and the six
worked examples. Pass examples: "none" or "one" for a shorter answer.
Check without saving
build_from_venue_spec with spec and checkOnly: true returns a summary
(seats, tables, booths, standing, sections, categories, capacity), notes,
and validation errors and warnings. Nothing is saved.
Build
Fix what the check listed, then call build_from_venue_spec again with
expectedUpdatedAt. It replaces the draft. If the chart changed since it
was read, the call returns conflict; read the chart again and retry.
Validate and look
validate_current_chart, then render_preview on desktop and mobile.
Both tools are in the build toolset, so a
connection made with https://mcp.seatlayer.io/mcp?tools=build has them.
build_from_venue_spec needs a connection that can edit the chart.
get_venue_spec_format only reads. Every call to build_from_venue_spec,
including checkOnly, counts toward 60 venue builds per hour per connection,
shared with build_semantic_venue.
After the build, the agent can keep editing with the usual tools, such as
update_rows, add_landmark or update_chart_categories.
The format
Top-level fields
| Field | Required | Rules |
|---|---|---|
seatlayerVenueSpec |
Yes | Always 1 |
name |
Yes | Venue or chart name, 1 to 160 characters |
categories |
Yes | 1 to 7 ticket types, most expensive first. Every name must be different |
items |
No | Up to 80 items, listed from the stage outward |
stage |
No | Leave out for a plain stage. false for no stage. Not used with base |
base |
No | Start from a ready-made venue, then add items. For arenas and several floors |
$schema |
No | The schema URL |
Each entry in categories:
| Field | Required | Rules |
|---|---|---|
name |
Yes | For example "Premium" or "Standing", up to 80 characters |
price |
No | 0 to 1,000,000, in the event currency. Leave out to set it later |
color |
No | Six-digit hex such as #3b82f6. Leave out for a readable default |
stage, when it is an object (all fields optional):
| Field | Rules |
|---|---|
kind |
rect (default), rounded, arc, thrust, runway, round, or a sports surface: pitch-football, rink-hockey, track-athletics, oval-cricket, pitch-rugby, diamond-baseball, court-basketball, court-tennis, ring-boxing |
label |
Its name, for example "Main Stage" |
widthM, depthM |
Size in metres, 1 to 400 |
Items
Every item has a type. Fields marked required must be present; the rest
have the default shown or can be left out. Names such as label, section
and category are up to 80 characters.
rows: straight rows, optionally split into side-by-side blocks with
aisles between them.
| Field | Rules |
|---|---|
rowCount |
Required. 1 to 100 |
seatsPerRow |
Required. 1 to 300, seats in each whole row, counted across all blocks. 24 with blocks: 2 is two blocks of 12; an odd seat goes to the first block |
blocks |
1 to 8, default 1. 2 gives one centre aisle |
category, placement, section |
See placement and names |
curvedRows: rows that curve around the stage, as in a theatre. They go
behind any seats already placed, so they take no placement.
| Field | Rules |
|---|---|
rowCount |
Required. 1 to 60 |
spreadDegrees |
20 to 360. 100 is a theatre, 180 a semicircle, 360 all the way round. Left out, it is just wide enough for seatsPerRow (or 100 without it). With both set, the rows sit far enough from the stage for the seats to fit |
seatsPerRow |
2 to 300. Leave out to fit seats at the standard spacing, so outer rows get more |
aisles |
none (default), center or two |
firstRowDistanceM |
1 to 200, default 4. Metres from the stage to the first row when nothing is there yet |
category, section |
See placement and names |
tables: a grid of tables with chairs.
| Field | Rules |
|---|---|
tableRows |
Required. 1 to 20 |
tableColumns |
Required. 1 to 20, tables in each row |
seatsPerTable |
1 to 20, default 8 |
shape |
round (default) or rect |
category, placement, section |
See placement and names |
standing: a general admission area sold by capacity.
| Field | Rules |
|---|---|
capacity |
Required. 1 to 100,000 |
label |
Default "General Admission" |
category, placement |
See placement and names |
booths: a grid of expo or market booths, each sold whole.
| Field | Rules |
|---|---|
boothRows |
Required. 1 to 30 |
boothColumns |
Required. 1 to 30, booths in each row |
category, placement, section |
See placement and names |
landmark: something buyers find their way by. Give exactly one of
role or icon.
| Field | Rules |
|---|---|
role |
A drawn landmark: bar, entrance, exit, restroom, screen, sound, concession, coat, wall, rail, suite, obstruction |
icon |
A small wayfinding icon: restroom-men, restroom-women, restroom-accessible, restrooms, first-aid, coat-check, atm, info, lost-found, charging, smoking, no-smoking, food, bar, coffee, water, merch, screen, sound-booth, entrance, exit, emergency-exit, stairs, elevator, parking, wheelchair, hearing, box-office, escalator, ramp, taxi, transit, bike-parking, meeting-point, security, lockers, baby-change, prayer-room, quiet-room, wifi, vip-lounge, accessible-entrance, assistance-dog |
label |
Its name on the map, for example "Main bar" |
placement, near, side |
See placement and names |
text: a sign on the map, such as "Gate C".
| Field | Rules |
|---|---|
text |
Required. Up to 120 characters |
size |
small, medium (default) or large |
showAt |
always, when-it-fits (default) or close-up |
placement, near, side |
See placement and names |
area: a named space nobody books, such as a dance floor, registration
desk, mixing desk or lounge.
| Field | Rules |
|---|---|
label |
Required. Its name on the map |
widthM, depthM |
Required. 0.5 to 400 metres |
shape |
rect (default) or ellipse |
placement, near, side |
See placement and names |
Placement and names
| Field | Used by | Rules |
|---|---|---|
placement |
rows, tables, standing, booths |
front (toward the stage), rear (default), left or right, against everything placed so far. Two rear items stand one behind the other; use near to put one next to another |
placement |
landmark, text, area |
The same, plus center. front puts it between the stage and the seats |
near |
landmark, text, area |
Place it next to something named by an earlier item: a section, landmark, area or standing area, for example "Bar" |
nearSection |
landmark, text, area |
Older name for near, for a section |
side |
landmark, text, area |
Which side of near: front, rear (default), left or right. Only with near |
section |
rows, curvedRows, tables, booths |
Put them in a section with this name, as buyers will see it, for example "Stalls". When the venue has sections, tables and booths without one get a section named after their category: phones open the map on section blocks, so anything outside a section would not show there |
category |
rows, curvedRows, tables, standing, booths |
The name of one entry in categories. Can be left out only when there is one category |
base: a ready-made venue
Use base for an arena bowl or a venue with several floors. It brings its own
stage, so leave stage out and set base.stageKind instead. Categories are
shared across the generated blocks in order. Add more with items.
| Field | Rules |
|---|---|
layout |
Required. rows (theatre), bowl (arena ring of stands), tables (banquet), ushape, booths (expo), nightclub (standing and VIP), runway, restaurant, hybrid (seats and standing) |
rowCount |
1 to 40, rows per block or stand |
seatsPerRow |
Seats in each row: the whole row across all blocks for rows and hybrid (it must split evenly, at most 100 per block), one stand’s row for bowl and runway |
blocks |
1 to 8, side-by-side blocks |
sectionCount |
2 to 16, stands around the ring. Default 4 |
tableRows, tableColumns |
1 to 20 |
boothRows, boothColumns |
1 to 30 |
standingCapacity |
1 to 100,000 |
floors |
1 to 5, default 1 |
stageKind |
rect (default), rounded, arc, thrust, runway, round |
sectionNames |
Names for the generated sections, clockwise from the stage end. For a four-stand bowl: North, East, South, West |
Each layout reads only some fields, and a field the layout does not read is reported as a problem:
| Layout | Reads |
|---|---|
rows |
rowCount, seatsPerRow, blocks, floors |
bowl |
rowCount, seatsPerRow, sectionCount, standingCapacity, floors |
tables, ushape |
tableRows, tableColumns |
booths |
boothRows, boothColumns |
nightclub |
standingCapacity |
runway |
rowCount, seatsPerRow |
restaurant |
nothing extra |
hybrid |
rowCount, seatsPerRow, blocks, standingCapacity |
Every layout also reads layout, stageKind and sectionNames. The
nightclub, runway and restaurant layouts, and a bowl with
standingCapacity, need at least two categories: the last one sells the
standing places (the bar stools, for restaurant).
The rules
- List items from the stage outward. Each item is placed beside everything placed before it, behind by default.
- Say where in words. Use
placement,nearandside. There are no coordinates in the format. - One category sells one kind of thing: row seats (
rowsandcurvedRows), table chairs, booths, or standing. If the same price covers tables and rows, make two categories. - Name the category on every sellable item when there is more than one category.
- Use
basefor arenas and several floors, then add items. - Without
base, a plain stage is added unlessstageisfalse, as in an expo hall.
Example: a 400-seat theatre
Two blocks of stalls with a centre aisle, curved rear stalls with two aisles, two prices, and exits at the sides.
{
"$schema": "https://docs.seatlayer.io/schemas/venue-spec-v1.json",
"seatlayerVenueSpec": 1,
"name": "Riverside Theatre",
"categories": [
{ "name": "Premium", "price": 80 },
{ "name": "Standard", "price": 55 }
],
"stage": { "kind": "arc", "label": "Stage" },
"items": [
{ "type": "rows", "rowCount": 10, "seatsPerRow": 24, "blocks": 2, "category": "Premium", "section": "Stalls" },
{ "type": "curvedRows", "rowCount": 5, "seatsPerRow": 32, "spreadDegrees": 90, "aisles": "two", "category": "Standard", "section": "Rear Stalls" },
{ "type": "landmark", "role": "exit", "label": "Exit", "placement": "left" },
{ "type": "landmark", "role": "exit", "label": "Exit", "placement": "right" },
{ "type": "landmark", "role": "entrance", "label": "Main entrance", "placement": "rear" }
]
}The other examples:
| Example | What it shows |
|---|---|
| wedding.json | 20 round tables of 10, a dance floor, a bar and restroom icon, one category |
| club.json | A 500-person dance floor and VIP tables, each with its own category |
| arena.json | base with a four-stand bowl, named stands and a 2,000-person floor |
| expo.json | 40 booths, stage: false, a registration desk beside the entrance (near) |
| comedy.json | Cabaret tables near the stage and rows behind, in two categories |
When a file has mistakes
The Designer and the MCP server report every problem they find at once, each with the field that needs fixing. The shape of the file is checked first: unknown fields, missing fields, and values out of range. Once the shape is right, category names are checked. A fixed file can therefore show a second, shorter list.
Real messages:
| Field | Message | What it means |
|---|---|---|
items[0].rows |
is not a field here. Did you mean “rowCount”? | The AI used a word the format does not have. The checker suggests the closest field |
items[0].type |
must be one of rows, curvedRows, tables, standing, booths, landmark, text, area, not “row”. Did you mean “rows”? | The item type is misspelled |
items[2].category |
“Gold” is not in categories. Use one of: Premium, Standard, or add it to categories | The item names a category the file does not define |
items[1].category |
“Premium” already sells row seats (items[0]); table chairs need a category of their own. … | Rows and tables share a category. Add a second one, such as “Premium Tables” |
In the Designer, Copy fixes for your AI copies the list as a message the AI can act on:
SeatLayer could not build this venue file yet. Please fix these problems and reply with the whole corrected JSON in one code block:
- items[0].type: must be one of rows, curvedRows, tables, standing, booths, landmark, text, area, not "row". Did you mean "rows"?
The format is at https://docs.seatlayer.io/schemas/venue-spec-v1.jsonOver MCP, build_from_venue_spec returns the same list:
{
"ok": false,
"error": {
"code": "invalid_venue_spec",
"message": "The spec has 2 problems; fix each field listed and try again",
"issues": [
{ "path": "items[1].category", "message": "\"Premium\" already sells row seats (items[0]); table chairs need a category of their own. Add one to categories, for example {\"name\": \"Premium Tables\"}" },
{ "path": "items[2].category", "message": "\"Gold\" is not in categories. Use one of: Premium, Standard, or add it to categories" }
],
"format": "get_venue_spec_format"
}
}Use it from Claude
Claude connected to SeatLayer through the Claude connector builds the venue over MCP. Without the connector, Claude can still write a Venue Spec for you to paste into the Designer.
The SeatLayer Venue Spec skill
teaches Claude the format, the rules and both paths. Its six examples are in
examples.md.
Save both files in a folder named seatlayer-venue-spec. In Claude Code, put
the folder in ~/.claude/skills/ or in your project’s .claude/skills/. In
the Claude apps, add it as a custom skill where your plan supports skills.
Use it from ChatGPT
Paste the text below into a Custom GPT’s Instructions, or into a ChatGPT Project’s instructions. ChatGPT will then answer a venue description with a Venue Spec you can paste into New from → Paste from an AI…. The text is under 8,000 characters.
You write SeatLayer Venue Specs: short JSON files that describe a venue's seating. SeatLayer builds a seating chart from the file.
When the user describes a venue, reply with one Venue Spec in a single json code block. After it, add one line: "In the SeatLayer Designer, choose New from, then Paste from an AI, and paste this whole reply." Ask a question first only if you cannot tell how many seats, tables, booths or standing places there are.
Format (JSON Schema): https://docs.seatlayer.io/schemas/venue-spec-v1.json
Examples: https://docs.seatlayer.io/schemas/venue-spec-examples/theatre.json (also wedding.json, club.json, arena.json, expo.json, comedy.json)
RULES
- Start with "seatlayerVenueSpec": 1. Give "name" and "categories", and usually "items". The only other top-level fields are "$schema", "stage" and "base".
- Never give coordinates or positions as numbers. Say where in words. SeatLayer places everything.
- categories: 1 to 7 ticket types, most expensive first. Each is {"name"}, with an optional "price" (a plain number, no currency symbol) and optional "color" ("#rrggbb"). Names must differ.
- One category sells one kind of thing: row seats (rows, curvedRows), table chairs (tables), booths, or standing. If one price covers two kinds, make two categories.
- With more than one category, every rows, curvedRows, tables, standing and booths item needs "category" set to one of the category names.
- List items from the stage outward. Each item goes against everything placed before it: "placement" is front (toward the stage), rear (the default), left or right. Two rear items stand one behind the other; to put one next to another, give near (a name used earlier) and side.
- stage: leave it out for a plain stage; false for no stage (an expo hall); or {"kind", "label", "widthM", "depthM"}. kind is rect, rounded, arc, thrust, runway, round, or a sports surface: pitch-football, rink-hockey, track-athletics, oval-cricket, pitch-rugby, diamond-baseball, court-basketball, court-tennis, ring-boxing.
- For an arena bowl or several floors, use "base" instead of "stage", then add items.
ITEM TYPES (* = required)
- rows: rowCount* (1-100), seatsPerRow* (1-300, the whole row across all blocks), blocks (1-8; 2 = one centre aisle), category, placement, section. 24 seats with blocks 2 is two blocks of 12.
- curvedRows: rowCount* (1-60), spreadDegrees (20-360; 100 theatre, 180 semicircle, 360 all round), seatsPerRow (2-300; leave out to fit), aisles (none, center, two), firstRowDistanceM (1-200), category, section. Always placed behind the seats already there; no placement.
- tables: tableRows* (1-20), tableColumns* (1-20), seatsPerTable (1-20, default 8), shape (round, rect), category, placement, section.
- standing: capacity* (1-100000), label, category, placement.
- booths: boothRows* (1-30), boothColumns* (1-30), category, placement, section. When the venue has sections, tables and booths without one get a section named after their category, so phones show them.
- landmark: exactly one of role or icon; label; placement; near; side.
role: bar, entrance, exit, restroom, screen, sound, concession, coat, wall, rail, suite, obstruction.
icon: restroom-men, restroom-women, restroom-accessible, restrooms, first-aid, coat-check, atm, info, lost-found, charging, smoking, no-smoking, food, bar, coffee, water, merch, screen, sound-booth, entrance, exit, emergency-exit, stairs, elevator, parking, wheelchair, hearing, box-office, escalator, ramp, taxi, transit, bike-parking, meeting-point, security, lockers, baby-change, prayer-room, quiet-room, wifi, vip-lounge, accessible-entrance, assistance-dog.
- text: text* (up to 120 characters), size (small, medium, large), showAt (always, when-it-fits, close-up), placement, near, side.
- area: label*, widthM* and depthM* (0.5-400 metres), shape (rect, ellipse), placement, near, side. For spaces nobody books: dance floor, registration desk, mixing desk, lounge.
- landmark, text and area also take placement "center". near is the name of something made earlier (a section, landmark, area or standing area); side is then front, rear, left or right of it.
- Names (label, section, category, near) are up to 80 characters.
BASE (instead of stage)
- layout* is one of rows, bowl, tables, ushape, booths, nightclub, runway, restaurant, hybrid.
- Fields each layout reads. rows: rowCount, seatsPerRow, blocks, floors. bowl: rowCount, seatsPerRow, sectionCount, standingCapacity, floors. tables and ushape: tableRows, tableColumns. booths: boothRows, boothColumns. nightclub: standingCapacity. runway: rowCount, seatsPerRow. restaurant: none. hybrid: rowCount, seatsPerRow, blocks, standingCapacity. Every layout: stageKind, sectionNames. Never give a field the layout does not read.
- Limits: rowCount 1-40, seatsPerRow 1-100, blocks 1-8, sectionCount 2-16 (default 4), tableRows and tableColumns 1-20, boothRows and boothColumns 1-30, standingCapacity 1-100000, floors 1-5.
- stageKind: rect, rounded, arc, thrust, runway, round.
- sectionNames name the generated sections clockwise from the stage end, for example North Stand, East Stand, South Stand, West Stand.
- nightclub, runway, restaurant, and bowl with standingCapacity need at least two categories; the last one sells standing (bar stools for restaurant).
FIXING
If the user pastes back a list of problems from SeatLayer, fix every field it names and reply with the whole corrected JSON in one code block.
LIMITS
A Venue Spec cannot set exact positions, draw section outlines, add gates or step-free routes as their own objects, or trace a floor-plan image. Say so plainly and tell the user to do those steps in the SeatLayer Designer.ChatGPT can also build the chart directly when SeatLayer is connected as an MCP app. See connect ChatGPT.
What it cannot do yet
- Put anything at an exact position. Placement is always in words.
- Draw section outlines or other free shapes.
- Add gates or step-free routes. Add them after the build: in the Designer, or
over MCP with
place_gateandadd_step_free_route. - Trace a floor-plan image. Use the trace workflow on the Designer MCP or the Designer’s reference plan import.
Do these steps in the Designer after the build.