---
title: "Venue Spec"
description: "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."
---

> Documentation Index
> Fetch the complete documentation index at: https://docs.seatlayer.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Venue Spec

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](/start/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`](/schemas/venue-spec-v1.json)
- Worked examples: [theatre](/schemas/venue-spec-examples/theatre.json),
  [wedding](/schemas/venue-spec-examples/wedding.json),
  [club](/schemas/venue-spec-examples/club.json),
  [arena](/schemas/venue-spec-examples/arena.json),
  [expo](/schemas/venue-spec-examples/expo.json) and
  [comedy club](/schemas/venue-spec-examples/comedy.json).
  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](https://app.seatlayer.io/demo/designer), and
in the Designer in your dashboard.

1. **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. **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. **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:

```text title="venue-spec-prompt.txt"
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](/agents/designer-mcp/), the agent can skip the copy and paste.
The server's `build_venue` prompt starts here.

1. **Read the chart**

   `get_chart` returns `meta.updatedAt`, which the save needs. On a workspace
   connection, `create_chart` makes a new draft first.
2. **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.
3. **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.
4. **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.
5. **Validate and look**

   `validate_current_chart`, then `render_preview` on desktop and mobile.

Both tools are in the `build` [toolset](/agents/designer-mcp/#toolsets), 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](#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](#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](#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](#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](#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](#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](#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) |

### 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.

```json title="theatre.json"
{
  "$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](/schemas/venue-spec-examples/wedding.json) | 20 round tables of 10, a dance floor, a bar and restroom icon, one category |
| [club.json](/schemas/venue-spec-examples/club.json) | A 500-person dance floor and VIP tables, each with its own category |
| [arena.json](/schemas/venue-spec-examples/arena.json) | `base` with a four-stand bowl, named stands and a 2,000-person floor |
| [expo.json](/schemas/venue-spec-examples/expo.json) | 40 booths, `stage: false`, a registration desk beside the entrance (`near`) |
| [comedy.json](/schemas/venue-spec-examples/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:

```text title="copied-fixes.txt"
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:

```json title="build_from_venue_spec error"
{
  "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](/agents/connect-claude/)
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](/skills/seatlayer-venue-spec/SKILL.md)
teaches Claude the format, the rules and both paths. Its six examples are in
[examples.md](/skills/seatlayer-venue-spec/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.

```text title="chatgpt-instructions.txt"
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](/agents/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](/agents/designer-mcp/#tracing-a-floor-plan-end-to-end)
  or the Designer's [reference plan import](/designer/reference-plan-import/).

Do these steps in the Designer after the build.

Source: https://docs.seatlayer.io/agents/venue-spec/index.mdx
