Template gallery / event-program

Event program template

Multi-page event programme: a type cover whose title fills the sheet over a black fact band, the organiser's welcome with a day-by-day glance, sessions in time order against a monospace time column with track, room and capacity, two-up speaker biographies that never split, sponsors set at a size that follows their tier, and practical information in two columns. A running foot repeats the website, hashtag and Wi-Fi on every sheet.

chromium default PDF 11 top-level fields Billed per page

Rendered preview of the event-program template
Rendered by Galley from the example payload below, at 816px wide , scale 2.

Fields

The full JSON Schema is below. Required fields are marked; anything missing comes back as a 422 naming the path, the expected type and a value that would be accepted.

Field Type Required Description
accent string optional The one spot colour: the rule under the cover title, the track labels and the sponsor tier names. The pack's crimson by default; everything else is black on white. A hex colour or a CSS colour keyword. It is interpolated into the stylesheet, so nothing else is accepted.
running_foot string optional Right-hand side of the foot Chromium repeats on every sheet. Defaults to the website, hashtag and Wi-Fi joined with middots, which is what people look down for during a session.
day_break "auto" | "page" optional `auto` lets the days flow, which keeps every sheet full; `page` starts each day on a fresh one, which is what you want when the booklet is handed out a day at a time and wastes a little paper to get it.
event object { name, tagline, host, dates, … } required
hero object { url, alt } optional Cover image, printed full measure between the title and the fact band. Without `url` nothing is printed and the type takes the whole cover — there is no placeholder box, because a grey rectangle on a cover is worse than no photograph.
welcome object { heading, body, signer, signer_title } optional The note from whoever is running it.
days array of object { title, date, theme, note, … } required The programme itself, one block per day, sessions in time order.
speakers array of object { name, title, bio } optional Two-up biography cards.
sponsors array of object { tier, names, small } optional Grouped by tier, largest first. Type size follows position in this array, so the order is the deal you sold.
info array of object { title, text, items } optional Practical notes, split evenly into two columns in the order given.
colophon string optional Replaces the default closing line.

Default render options

Applied unless you override them. Options are part of the cache key.

page_size "Letter"
margin "0.6in"
print_background true

Example payload

This exact object renders the preview above. It is also what the API echoes back in a validation error, so an agent can repair a payload without a round trip to the docs.

example.jsonjson
{
  "day_break": "auto",
  "event": {
    "name": "Tidewater Type & Letterpress Weekend",
    "tagline": "Two days of presses, punchcutting and very strong coffee, for people who set type by hand on purpose.",
    "host": "Presented by the Tidewater Printers Guild",
    "dates": "Friday 16 – Saturday 17 October 2026",
    "venue": "The Cotton Exchange, 321 N Front Street, Wilmington, North Carolina",
    "edition": "Ninth annual",
    "website": "tidewatertype.example.test",
    "hashtag": "#TidewaterType26",
    "wifi": "ExchangeGuest / press2026"
  },
  "welcome": {
    "heading": "Welcome",
    "body": [
      "Nine years ago this was six people, one Chandler & Price treadle press and a garage in Castle Hayne. This year it is two… [301 characters, shortened for display]",
      "A few things worth knowing before you put your coat down. Everything on the ground floor is hands-on, so wear something … [453 characters, shortened for display]",
      "The workshops are capped, and the caps are real — they are the number of people who can see the bed of the press without… [346 characters, shortened for display]",
      "Saturday afternoon everybody prints. The keepsake was set in metal on Friday by whoever wandered into the Long Room, and… [327 characters, shortened for display]",
      "If this is your first Tidewater, find someone in a red lanyard. They have volunteered, in writing, to be interrupted."
    ],
    "signer": "Harriet Okonjo-Bell",
    "signer_title": "Chair, Tidewater Printers Guild"
  },
  "days": [
    {
      "title": "Day one — Friday",
      "date": "2026-10-16",
      "theme": "Presses and process",
      "note": "Registration opens at 8:30 in the Atrium and stays staffed until six. Everything is in the Main Hall unless a room is named against it.",
      "sessions": [
        {
          "start": "8:30",
          "end": "9:00",
          "title": "Registration, coffee and press check-in",
          "kind": "break",
          "room": "Atrium"
        },
        {
          "start": "9:00",
          "end": "9:15",
          "title": "Welcome and the state of the Guild",
          "speaker": "Harriet Okonjo-Bell",
          "speaker_title": "Chair",
          "room": "Main Hall"
        },
        {
          "start": "9:15",
          "end": "10:15",
          "title": "Punchcutting is not lost, it is just slow",
          "speaker": "Dr. Emine Yalcin",
          "speaker_title": "Curator of Type, Bodleian Libraries",
          "description": "A working demonstration of cutting a single counterpunch, start to finish, with a camera over the bench so the back rows can see the burin. Bring questions; she would rather be interrupted than applauded.",
          "track": "Keynote",
          "room": "Main Hall",
          "kind": "keynote"
        },
        {
          "start": "10:15",
          "end": "10:40",
          "title": "Break",
          "kind": "break",
          "room": "Atrium"
        },
        {
          "start": "10:40",
          "end": "12:00",
          "title": "Make-ready on a Vandercook, properly",
          "speaker": "Ruben Castellanos",
          "speaker_title": "Marsh Wren Press",
          "description": "Packing, impression, roller height, and the four things that are actually wrong when the type prints grey down one side. Hands-on at the press, with everyone else close enough to see the bed.",
          "track": "Workshop",
          "room": "Floor, press 3",
          "capacity": "12 places"
        },
        {
          "start": "10:40",
          "end": "12:00",
          "title": "Paper for letterpress: what damp does",
          "speaker": "Ingrid Solheim",
          "speaker_title": "Osprey Paper Mill",
          "description": "Why the same sheet takes a different impression on Tuesday than it did on Monday, and how to stop arguing with it. Samples of eight stocks to take away.",
          "track": "Talk",
          "room": "Long Room"
        },
        {
          "start": "12:00",
          "end": "13:00",
          "title": "Lunch, included, in the Courtyard",
          "kind": "break",
          "room": "Courtyard"
        },
        {
          "start": "13:00",
          "end": "14:20",
          "title": "Setting a page of metal type without losing an afternoon",
          "speaker": "Tobias Mwangi",
          "speaker_title": "Six Rivers Letterpress",
          "description": "Composing stick technique, spacing, quads, and the discipline of distribution. Aimed squarely at people who have set one line, sworn, and gone back to polymer.",
          "track": "Workshop",
          "room": "Long Room",
          "capacity": "16 places"
        },
        {
          "start": "13:00",
          "end": "14:20",
          "title": "Running a press as a business that pays you",
          "speaker": "Delphine Aubert",
          "speaker_title": "Aubert & Daughters",
          "description": "Pricing, rush work, the client who wants twelve colours for the price of two, and how to say no to a wedding suite in October.",
          "track": "Talk",
          "room": "Mezzanine"
        },
        {
          "start": "14:20",
          "end": "14:45",
          "title": "Break",
          "kind": "break",
          "room": "Atrium"
        },
        {
          "start": "14:45",
          "end": "16:00",
          "title": "Polymer plates and metal type in the same forme",
          "speaker": "Ruben Castellanos and Tobias Mwangi",
          "description": "The type-height argument, settled on the press rather than on the internet. Two plate systems, one forme, one sheet, and a micrometer nobody is allowed to walk off with.",
          "track": "Demonstration",
          "room": "Floor, press 1"
        },
        {
          "start": "14:45",
          "end": "16:00",
          "title": "Reading a specimen book",
          "speaker": "Dr. Emine Yalcin",
          "description": "What a 1923 foundry catalogue is actually telling you about a face, and which of its claims were marketing even then.",
          "track": "Talk",
          "room": "Mezzanine"
        },
        {
          "start": "16:00",
          "end": "17:00",
          "title": "Open floor: bring a problem print",
          "description": "Bring the sheet that went wrong. Six people who have made that exact mistake will tell you why, at length, and disagree with each other.",
          "track": "Clinic",
          "room": "Main Hall"
        },
        {
          "start": "17:30",
          "end": "19:30",
          "title": "Guild reception and the annual swap table",
          "kind": "break",
          "room": "Courtyard"
        }
      ]
    },
    {
      "title": "Day two — Saturday",
      "date": "2026-10-17",
      "theme": "Ink, binding and the small edition",
      "note": "The type cabinets in the Long Room are open all day. Sorts go back in the case they came from.",
      "sessions": [
        {
          "start": "9:00",
          "end": "9:30",
          "title": "Coffee and the day's changes",
          "kind": "break",
          "room": "Atrium"
        },
        {
          "start": "9:30",
          "end": "10:45",
          "title": "Mixing ink by eye and by number",
          "speaker": "Ingrid Solheim",
          "description": "Rubber base against oil, transparent white, the two pigments that will ruin a run, and why the swatch book lies to you about coated stock.",
          "track": "Workshop",
          "room": "Floor, bench 2",
          "capacity": "14 places"
        },
        {
          "start": "9:30",
          "end": "10:45",
          "title": "Binding a short run without a nipping press",
          "speaker": "Marguerite Delacroix-Hunt",
          "speaker_title": "Cape Fear Bindery",
          "description": "Pamphlet, long-stitch and a coptic that lies flat, using clamps and boards you already own. Materials provided; bring a bone folder if you have one you like.",
          "track": "Workshop",
          "room": "Long Room",
          "capacity": "18 places"
        },
        {
          "start": "10:45",
          "end": "11:10",
          "title": "Break",
          "kind": "break",
          "room": "Atrium"
        },
        {
          "start": "11:10",
          "end": "12:15",
          "title": "The edition of forty: pricing, numbering and knowing when to stop",
          "speaker": "Delphine Aubert",
          "description": "Why forty is the number, what to do with the twelve sheets that are nearly right, and how to sign an edition you are not finished being embarrassed by.",
          "track": "Talk",
          "room": "Mezzanine"
        },
        {
          "start": "11:10",
          "end": "12:15",
          "title": "Wood type: rescue, repair and when to leave it alone",
          "speaker": "Anders Lindqvist",
          "speaker_title": "Pelican Press Co.",
          "description": "Cleaning without lifting the grain, replacing a split sort, and the difference between honest wear and damage that will print as damage.",
          "track": "Demonstration",
          "room": "Floor, bench 4"
        },
        {
          "start": "12:15",
          "end": "13:15",
          "title": "Lunch, included, in the Courtyard",
          "kind": "break",
          "room": "Courtyard"
        },
        {
          "start": "13:15",
          "end": "14:30",
          "title": "Restoring a treadle press you found in a barn",
          "speaker": "Ruben Castellanos",
          "description": "What is worth saving, what is a casting nobody has made since 1948, and how to tell the difference standing in the barn before you hand over the money.",
          "track": "Talk",
          "room": "Main Hall"
        },
        {
          "start": "14:30",
          "end": "16:00",
          "title": "Print the keepsake",
          "description": "Everyone pulls one sheet of the 2026 keepsake, set in metal on Friday and printed on Saturday, on all eleven presses at once. Queue by press number; the Guild will call them.",
          "track": "All hands",
          "room": "Floor, all presses"
        },
        {
          "start": "16:00",
          "end": "16:30",
          "title": "Closing, thanks, and where 2027 will be",
          "speaker": "Harriet Okonjo-Bell",
          "room": "Main Hall"
        }
      ]
    }
  ],
  "speakers": [
    {
      "name": "Dr. Emine Yalcin",
      "title": "Curator of Type, Bodleian Libraries",
      "bio": "Has cut punches for eighteen years and written the only book on it a beginner can finish. Travels with her own burins and will not check them into the hold."
    },
    {
      "name": "Ruben Castellanos",
      "title": "Marsh Wren Press, Wilmington",
      "bio": "Restored four Vandercooks and one Heidelberg windmill that should have been left in the barn. Teaches make-ready the way it was taught to him, which is to say bluntly."
    },
    {
      "name": "Ingrid Solheim",
      "title": "Osprey Paper Mill, Beaufort",
      "bio": "Makes cotton rag sheets by hand and can tell you the humidity in a room without looking at anything. Has opinions about sizing that have ended friendships."
    },
    {
      "name": "Tobias Mwangi",
      "title": "Six Rivers Letterpress",
      "bio": "Sets more metal type in a week than most of us do in a year, and keeps his cases in better order than the Guild keeps its own."
    },
    {
      "name": "Delphine Aubert",
      "title": "Aubert & Daughters",
      "bio": "Twenty-two years of paying a mortgage with a press. Her pricing talk has been described as brutal by people who then raised their rates."
    },
    {
      "name": "Marguerite Delacroix-Hunt",
      "title": "Cape Fear Bindery",
      "bio": "Binds for three university collections and teaches a coptic stitch that survives being read, which is more than can be said for most of them."
    },
    {
      "name": "Anders Lindqvist",
      "title": "Pelican Press Co., Southport",
      "bio": "Keeps nine hundred fonts of wood type in a former ice house and knows, without looking, which drawer the missing W is in."
    },
    {
      "name": "Priya Raman",
      "title": "Boxwood Ink Works",
      "bio": "Mills ink in small batches for people who print slowly. Brings the pigment box and lets you put your fingers in it, which is the whole point."
    },
    {
      "name": "Curtis Nakamura",
      "title": "Conservator, Wilmington Public Library",
      "bio": "Looks after the Guild's specimen collection and will let you turn the pages yourself if you wash your hands where he can see you."
    },
    {
      "name": "Simone Eberhardt",
      "title": "Bellwether Bookshop",
      "bio": "Sells the printed result, which gives her the least sentimental and most useful view of an edition in the building."
    }
  ],
  "sponsors": [
    {
      "tier": "Press sponsors",
      "names": [
        "Osprey Paper Mill",
        "Crane & Co."
      ]
    },
    {
      "tier": "Forme sponsors",
      "names": [
        "Marsh Wren Press",
        "Cape Fear Bindery",
        "Six Rivers Letterpress"
      ]
    },
    {
      "tier": "Quoin sponsors",
      "names": [
        "Aubert & Daughters",
        "Boxwood Ink Works",
        "Pelican Press Co.",
        "Front Street Roasters"
      ]
    },
    {
      "tier": "Supporters",
      "small": true,
      "names": [
        "The Cotton Exchange",
        "Wilmington Arts Council",
        "Bellwether Bookshop",
        "Anchor Hardware",
        "The Carolina Type Society",
        "Gullah Paper & Board",
        "Two Sisters Bookery"
      ]
    }
  ],
  "info": [
    {
      "title": "Getting there",
      "text": "The Cotton Exchange car park is $6 for the day and is full by nine. Street parking on Front Street is free after six. The Water Street deck is a five-minute walk and never full."
    },
    {
      "title": "Food and drink",
      "items": [
        "Lunch is included both days, in the Courtyard from noon",
        "Coffee is on all day in the Atrium and is not the good coffee after four",
        "Tell the registration desk about dietary requirements by Thursday and it is handled",
        "Front Street Roasters holds the counter open until seven on Friday for anyone still on the floor"
      ]
    },
    {
      "title": "Workshop places",
      "text": "Caps are the number of people who can see the bed of the press. Sign up at the registration desk on the morning of the s… [243 characters, shortened for display]"
    },
    {
      "title": "Accessibility",
      "text": "The Atrium, Main Hall, Long Room and Courtyard are step-free. The Mezzanine is reached by stairs or by the service lift; ask at the desk and somebody will take you up."
    },
    {
      "title": "On the floor",
      "items": [
        "Closed-toe shoes at the presses, no exceptions, and the Guild will turn you away",
        "Aprons are by the freight door and so is the washing-up station",
        "Do not adjust roller height on a press you did not set up",
        "Sorts go back in the case they came from",
        "Nothing leaves the building that you did not bring into it, including quoins"
      ]
    },
    {
      "title": "Children",
      "text": "Under-16s are welcome with an adult and do not need a ticket. The Saturday keepsake printing is the session they will remember."
    },
    {
      "title": "Lost, found and first aid",
      "text": "Both at the registration desk in the Atrium, staffed 8:30 to 6:00 on Friday and 9:00 to 5:00 on Saturday. The nearest urgent care is Front Street Medical, four blocks north."
    },
    {
      "title": "Photographs",
      "text": "Photograph the presses, the type and the sheets as much as you like. Ask before you photograph a person, and twice before you photograph their hands at another press."
    }
  ],
  "colophon": "Programme correct at the time of printing. Live changes are posted at the registration desk and on the board by the Main Hall door. Set in Familjen Grotesk, Figtree and IBM Plex Mono."
}

Values longer than 240 characters — data URIs, inline SVG — are shortened here so the shape of the payload stays readable, and the replacement says how much was left out. get_template and GET /v1/templates/:ref return them in full.

Render it

With an API keyshell
curl -sS https://api.galleyrender.com/v1/render \
  -H "Authorization: Bearer $GALLEY_API_KEY" \
  -H 'content-type: application/json' \
  -d '{
  "template": "event-program@1",
  "format": "pdf",
  "data": "… the example payload above …"
}'
With no API key, over MCPshell
# No API key. The first call mints a trial of 10 PDF pages or 10 images.
curl -sS https://mcp.galleyrender.com/mcp \
  -H 'content-type: application/json' \
  -H 'accept: application/json, text/event-stream' \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
      "name": "render",
      "arguments": {
        "template": "event-program",
        "format": "pdf",
        "data": { … see the example payload above … }
      }
    }
  }'

Pin the version — event-program@1 — in anything you ship. Publishing a new version never changes an old one. Render endpoint reference →

Try a free tool

Renders the example payload on the production service. No account, no key.

JSON Schema

schema.json (11 top-level properties)
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "Event programme",
  "type": "object",
  "required": [
    "event",
    "days"
  ],
  "additionalProperties": true,
  "properties": {
    "accent": {
      "type": "string",
      "description": "The one spot colour: the rule under the cover title, the track labels and the sponsor tier names. The pack's crimson by default; everything else is black on white. A hex colour or a CSS colour keyword. It is interpolated into the stylesheet, so nothing else is accepted.",
      "examples": [
        "#a4133c"
      ],
      "pattern": "^(#[0-9a-fA-F]{3,8}|[a-zA-Z]{3,20})$"
    },
    "running_foot": {
      "type": "string",
      "description": "Right-hand side of the foot Chromium repeats on every sheet. Defaults to the website, hashtag and Wi-Fi joined with middots, which is what people look down for during a session.",
      "examples": [
        "tidewatertype.example.test · #TidewaterType26 · Wi-Fi ExchangeGuest / press2026"
      ]
    },
    "day_break": {
      "type": "string",
      "description": "`auto` lets the days flow, which keeps every sheet full; `page` starts each day on a fresh one, which is what you want when the booklet is handed out a day at a time and wastes a little paper to get it.",
      "enum": [
        "auto",
        "page"
      ],
      "default": "auto",
      "examples": [
        "auto"
      ]
    },
    "event": {
      "type": "object",
      "required": [
        "name"
      ],
      "properties": {
        "name": {
          "type": "string",
          "description": "Set at 70pt on the cover and repeated small in the running foot. Three lines is the most a Letter sheet takes at that size.",
          "examples": [
            "Tidewater Type & Letterpress Weekend"
          ]
        },
        "tagline": {
          "type": "string",
          "examples": [
            "Two days of presses, punchcutting and very strong coffee, for people who set type by hand on purpose."
          ]
        },
        "host": {
          "type": "string",
          "description": "Tracked line above the keyline at the top of the cover.",
          "examples": [
            "Presented by the Tidewater Printers Guild"
          ]
        },
        "dates": {
          "type": "string",
          "examples": [
            "Friday 16 – Saturday 17 October 2026"
          ]
        },
        "venue": {
          "type": "string",
          "description": "Printed in the cover's black fact band beside the dates.",
          "examples": [
            "The Cotton Exchange, 321 N Front Street, Wilmington, North Carolina"
          ]
        },
        "edition": {
          "type": "string",
          "description": "Set in monospace at the top right of the cover.",
          "examples": [
            "Ninth annual"
          ]
        },
        "website": {
          "type": "string",
          "examples": [
            "tidewatertype.example.test"
          ]
        },
        "hashtag": {
          "type": "string",
          "examples": [
            "#TidewaterType26"
          ]
        },
        "wifi": {
          "type": "string",
          "examples": [
            "ExchangeGuest / press2026"
          ]
        },
        "logo_url": {
          "type": "string",
          "format": "uri",
          "examples": [
            "https://example.com/guild.png"
          ]
        }
      }
    },
    "hero": {
      "type": "object",
      "description": "Cover image, printed full measure between the title and the fact band. Without `url` nothing is printed and the type takes the whole cover — there is no placeholder box, because a grey rectangle on a cover is worse than no photograph.",
      "properties": {
        "url": {
          "type": "string",
          "format": "uri",
          "examples": [
            "https://example.com/press.jpg"
          ]
        },
        "alt": {
          "type": "string",
          "examples": [
            "A Vandercook proof press mid-pull"
          ]
        }
      }
    },
    "welcome": {
      "type": "object",
      "description": "The note from whoever is running it.",
      "properties": {
        "heading": {
          "type": "string",
          "default": "Welcome",
          "examples": [
            "Welcome"
          ]
        },
        "body": {
          "type": "array",
          "items": {
            "type": "string",
            "examples": [
              "Nine years ago this was six people and one press in a garage."
            ]
          },
          "examples": [
            [
              "Nine years ago this was six people and one press in a garage."
            ]
          ]
        },
        "signer": {
          "type": "string",
          "examples": [
            "Harriet Okonjo-Bell"
          ]
        },
        "signer_title": {
          "type": "string",
          "examples": [
            "Chair, Tidewater Printers Guild"
          ]
        }
      }
    },
    "days": {
      "type": "array",
      "minItems": 1,
      "description": "The programme itself, one block per day, sessions in time order.",
      "items": {
        "type": "object",
        "required": [
          "title",
          "sessions"
        ],
        "properties": {
          "title": {
            "type": "string",
            "examples": [
              "Day one — Friday"
            ]
          },
          "date": {
            "type": "string",
            "format": "date",
            "examples": [
              "2026-10-16"
            ]
          },
          "theme": {
            "type": "string",
            "examples": [
              "Presses and process"
            ]
          },
          "note": {
            "type": "string",
            "examples": [
              "Registration opens at 8:30 in the Atrium. Everything on day one is in the main hall unless a room is named."
            ]
          },
          "sessions": {
            "type": "array",
            "minItems": 1,
            "items": {
              "type": "object",
              "required": [
                "start",
                "title"
              ],
              "properties": {
                "start": {
                  "type": "string",
                  "description": "Set in monospace at the head of the time column, with `end` under it in a lighter cut. Any format you like, as long as it is the same everywhere — the column aligns on the characters, not on a parsed time.",
                  "examples": [
                    "9:00"
                  ]
                },
                "end": {
                  "type": "string",
                  "examples": [
                    "9:45"
                  ]
                },
                "title": {
                  "type": "string",
                  "examples": [
                    "Punchcutting is not lost, it is just slow"
                  ]
                },
                "speaker": {
                  "type": "string",
                  "examples": [
                    "Dr. Emine Yalcin"
                  ]
                },
                "speaker_title": {
                  "type": "string",
                  "examples": [
                    "Curator of Type, Bodleian Libraries"
                  ]
                },
                "description": {
                  "type": "string",
                  "examples": [
                    "A working demonstration of cutting a single counterpunch, start to finish, with the audience close enough to see the burin."
                  ]
                },
                "track": {
                  "type": "string",
                  "description": "Set small, tracked and in the accent colour at the top of the right column. Not a pill — a programme with forty pills on it is a web page that has been printed.",
                  "examples": [
                    "Keynote"
                  ]
                },
                "room": {
                  "type": "string",
                  "examples": [
                    "Main Hall"
                  ]
                },
                "capacity": {
                  "type": "string",
                  "description": "How many places a hands-on session has, set in monospace under the room. Leave it out and nothing prints, which is the right answer for a talk.",
                  "examples": [
                    "12 places"
                  ]
                },
                "kind": {
                  "type": "string",
                  "description": "`break` sets the row in monospace small caps and mutes it, so the eye skips it; `keynote` sets the title at 15.5pt. Anything else is an ordinary session.",
                  "enum": [
                    "",
                    "break",
                    "keynote"
                  ],
                  "examples": [
                    "keynote"
                  ]
                }
              }
            }
          }
        }
      }
    },
    "speakers": {
      "type": "array",
      "description": "Two-up biography cards.",
      "items": {
        "type": "object",
        "required": [
          "name"
        ],
        "properties": {
          "name": {
            "type": "string",
            "examples": [
              "Dr. Emine Yalcin"
            ]
          },
          "title": {
            "type": "string",
            "examples": [
              "Curator of Type, Bodleian Libraries"
            ]
          },
          "bio": {
            "type": "string",
            "examples": [
              "Has cut punches for eighteen years and written the only readable book about it."
            ]
          }
        }
      }
    },
    "sponsors": {
      "type": "array",
      "description": "Grouped by tier, largest first. Type size follows position in this array, so the order is the deal you sold.",
      "items": {
        "type": "object",
        "required": [
          "tier",
          "names"
        ],
        "properties": {
          "tier": {
            "type": "string",
            "examples": [
              "Press sponsors"
            ]
          },
          "names": {
            "type": "array",
            "items": {
              "type": "string",
              "examples": [
                "Crane & Co."
              ]
            },
            "examples": [
              [
                "Crane & Co."
              ]
            ]
          },
          "small": {
            "type": "boolean",
            "default": false,
            "description": "Forces the smallest, muted size regardless of position. Without it the size follows the tier's place in the list — first tier at 20pt, then 14pt, then 11pt, then 9.5pt — so a sponsor reads their money back off the page.",
            "examples": [
              true
            ]
          }
        }
      }
    },
    "info": {
      "type": "array",
      "description": "Practical notes, split evenly into two columns in the order given.",
      "items": {
        "type": "object",
        "required": [
          "title"
        ],
        "properties": {
          "title": {
            "type": "string",
            "examples": [
              "Getting there"
            ]
          },
          "text": {
            "type": "string",
            "examples": [
              "The Cotton Exchange car park is $6 for the day and fills by nine."
            ]
          },
          "items": {
            "type": "array",
            "items": {
              "type": "string",
              "examples": [
                "Lunch is included both days"
              ]
            },
            "examples": [
              [
                "Lunch is included both days"
              ]
            ]
          }
        }
      }
    },
    "colophon": {
      "type": "string",
      "description": "Replaces the default closing line.",
      "examples": [
        "Programme correct at the time of printing."
      ]
    }
  }
}