Skip to content

Venue Spec

A short JSON file that says what a venue has and where, in words. Any chat AI can write one; the Designer or the Designer MCP builds the chart from it.

Updated View as Markdown

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:

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:

venue-spec-prompt.txttext
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

  1. List items from the stage outward. Each item is placed beside everything placed before it, behind by default.
  2. Say where in words. Use placement, near and side. There are no coordinates in the format.
  3. One category sells one kind of thing: row seats (rows and curvedRows), table chairs, booths, or standing. If the same price covers tables and rows, make two categories.
  4. Name the category on every sellable item when there is more than one category.
  5. Use base for arenas and several floors, then add items.
  6. Without base, a plain stage is added unless stage is false, 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.

theatre.jsonjson
{
  "$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:

copied-fixes.txttext
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.json

Over MCP, build_from_venue_spec returns the same list:

build_from_venue_spec errorjson
{
  "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.

chatgpt-instructions.txttext
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_gate and add_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.

Navigation

Type to search…

↑↓ navigate↵ selectEsc close