Template gallery / event-flyer
Event flyer template
One-page poster-style flyer set like a printed bill rather than a template: an oversized EB Garamond headline you size yourself, a kicker that reads from across a room, a fixed-height hero slot that holds its space when no image is supplied, when/where/who across a ruled band, the pitch beside the price and the highlights, a plum call-to-action band at the foot, and optional tear-off strips for a noticeboard. `title_size`, `hero_height` and `tab_height` are the three dials that decide what else fits.
chromium default PDF 19 top-level fields Billed per page
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 poster's one spot colour: the eyebrow, the section marks and the call-to-action band at the foot. A hex colour or a CSS colour keyword. It is interpolated into the stylesheet, so nothing else is accepted. |
| accent_ink | string | optional | Text colour on the accent band. Set it light or dark to suit your accent. A hex colour or a CSS colour keyword. It is interpolated into the stylesheet, so nothing else is accepted. |
| tint | string | optional | The wash behind the empty hero slot. A shade of the paper rather than of the accent. A hex colour or a CSS colour keyword. It is interpolated into the stylesheet, so nothing else is accepted. |
| ink | string | optional | A hex colour or a CSS colour keyword. It is interpolated into the stylesheet, so nothing else is accepted. |
| paper | string | optional | Page background. Printed flyers on coloured stock look better with this left white. A hex colour or a CSS colour keyword. It is interpolated into the stylesheet, so nothing else is accepted. |
| title_size | string | optional | The headline does not shrink itself. Drop this for a long title, raise it for a short one. |
| hero_height | string | optional | The hero's height, held whether or not an image is supplied. This is the main dial for filling the sheet: raise it when the flyer is short of copy, drop it when the pitch runs long. |
| tab_height | string | optional | Height of the tear-off strip, and also the width the rotated label wraps within. Raise it to fit a longer line. |
| event | object { eyebrow, title, kicker, date, … } | required | |
| hero | object { url, alt, placeholder } | optional | The image. Without `url` a labelled slot of the same height prints instead, so the layout is identical either way. |
| body | array of string | required | The left-hand column. Two or three short paragraphs; nobody reads a flyer standing up for longer than that. |
| price | object { value, note } | optional | |
| highlights_heading | string | optional | |
| highlights | array of string | optional | |
| details_heading | string | optional | |
| details | array of string | optional | |
| cta | object { text, detail } | optional | The band across the bottom. One instruction, not three. |
| credits | string | optional | Sponsors, accessibility and the small print. |
| tabs | object { count, title, contact } | optional | Tear-off strips along the foot, for a flyer going on a noticeboard. Every strip carries the same two lines, rotated. |
Default render options
Applied unless you override them. Options are part of the cache key.
| page_size | "Letter" |
| margin | "0" |
| 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.
{
"accent": "#5b2a5f",
"title_size": "46pt",
"event": {
"eyebrow": "Riverlight Community Food Bank presents",
"title": "The Harvest Table",
"kicker": "One long table down the middle of Front Street, four hundred seats, and every plate paying for a month of the mobile pantry.",
"date": "2026-10-24",
"time": "Doors 5:30 p.m., dinner served at 6:30",
"venue": "Front Street, at the Cotton Exchange",
"address": "321 N Front Street, Wilmington",
"who": "Everyone",
"who_note": "Under 12s free, and there is a kids' table with its own menu"
},
"hero": {
"alt": "Volunteers laying one long table down the middle of Front Street at dusk",
"placeholder": "Photograph of last year's table goes here — supply hero.url and it fills this space at exactly this height, so nothing on the page moves."
},
"body": [
"Once a year we close two blocks of Front Street, put one table down the middle of it, and feed four hundred people at th… [243 characters, shortened for display]",
"Last year the table raised $34,800 in one evening — four months of fuel, driver and stock for the mobile pantry. It is a good night out that happens to be a fundraiser. Come hungry."
],
"price": {
"value": "$45 a seat",
"note": "or $400 for a table of ten. Every seat pays for roughly ninety meals. Nobody is turned away for cost — ask at the door."
},
"highlights_heading": "On the night",
"highlights": [
"Dinner by six New Hanover County kitchens",
"The Brandvold Quartet, 6 until 9"
],
"details_heading": "Good to know",
"details": [
"Step-free access from the Water Street side",
"Vegetarian, vegan and gluten-free plates — tell us by October 17"
],
"cta": {
"text": "Tickets at riverlightfood.example.test/table",
"detail": "Or call (910) 555-0126, weekdays 9 to 5. Sold out eleven days early last year."
},
"credits": "Sponsored by Osprey Paper Mill and Front Street Roasters. Riverlight Community Food Bank, Inc. is a 501(c)(3) organisation, EIN 56-2418907.",
"tabs": {
"count": 9,
"title": "Harvest Table",
"contact": "Oct 24 · (910) 555-0126"
},
"tab_height": "0.95in",
"hero_height": "1.85in"
}
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
curl -sS https://api.galleyrender.com/v1/render \
-H "Authorization: Bearer $GALLEY_API_KEY" \
-H 'content-type: application/json' \
-d '{
"template": "event-flyer@1",
"format": "pdf",
"data": "… the example payload above …"
}' # 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-flyer",
"format": "pdf",
"data": { … see the example payload above … }
}
}
}'
Pin the version — event-flyer@1 — in anything you ship. Publishing a new
version never changes an old one. Render endpoint reference →
Renders the example payload on the production service. No account, no key.
JSON Schema
schema.json (19 top-level properties)
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "Event flyer",
"type": "object",
"required": [
"event",
"body"
],
"additionalProperties": true,
"properties": {
"accent": {
"type": "string",
"description": "The poster's one spot colour: the eyebrow, the section marks and the call-to-action band at the foot. A hex colour or a CSS colour keyword. It is interpolated into the stylesheet, so nothing else is accepted.",
"examples": [
"#5b2a5f"
],
"default": "#5b2a5f",
"pattern": "^(#[0-9a-fA-F]{3,8}|[a-zA-Z]{3,20})$"
},
"accent_ink": {
"type": "string",
"description": "Text colour on the accent band. Set it light or dark to suit your accent. A hex colour or a CSS colour keyword. It is interpolated into the stylesheet, so nothing else is accepted.",
"examples": [
"#fffdf8"
],
"default": "#fffdf8",
"pattern": "^(#[0-9a-fA-F]{3,8}|[a-zA-Z]{3,20})$"
},
"tint": {
"type": "string",
"description": "The wash behind the empty hero slot. A shade of the paper rather than of the accent. A hex colour or a CSS colour keyword. It is interpolated into the stylesheet, so nothing else is accepted.",
"examples": [
"#f4efe6"
],
"default": "#f4efe6",
"pattern": "^(#[0-9a-fA-F]{3,8}|[a-zA-Z]{3,20})$"
},
"ink": {
"type": "string",
"default": "#241c15",
"examples": [
"#241c15"
],
"pattern": "^(#[0-9a-fA-F]{3,8}|[a-zA-Z]{3,20})$",
"description": "A hex colour or a CSS colour keyword. It is interpolated into the stylesheet, so nothing else is accepted."
},
"paper": {
"type": "string",
"description": "Page background. Printed flyers on coloured stock look better with this left white. A hex colour or a CSS colour keyword. It is interpolated into the stylesheet, so nothing else is accepted.",
"examples": [
"#fffdf8"
],
"default": "#fffdf8",
"pattern": "^(#[0-9a-fA-F]{3,8}|[a-zA-Z]{3,20})$"
},
"title_size": {
"type": "string",
"default": "48pt",
"description": "The headline does not shrink itself. Drop this for a long title, raise it for a short one.",
"examples": [
"46pt"
]
},
"hero_height": {
"type": "string",
"default": "2.3in",
"description": "The hero's height, held whether or not an image is supplied. This is the main dial for filling the sheet: raise it when the flyer is short of copy, drop it when the pitch runs long.",
"examples": [
"2.3in"
]
},
"tab_height": {
"type": "string",
"default": "0.9in",
"description": "Height of the tear-off strip, and also the width the rotated label wraps within. Raise it to fit a longer line.",
"examples": [
"0.95in"
]
},
"event": {
"type": "object",
"required": [
"title"
],
"properties": {
"eyebrow": {
"type": "string",
"description": "Small caps above the headline.",
"examples": [
"Riverlight Community Food Bank presents"
]
},
"title": {
"type": "string",
"examples": [
"The Harvest Table"
]
},
"kicker": {
"type": "string",
"description": "One or two lines under the headline. This is the sentence someone reads from six feet away.",
"examples": [
"One long table, four hundred seats, and every plate paying for a month of the mobile pantry."
]
},
"date": {
"type": "string",
"format": "date",
"examples": [
"2026-10-24"
]
},
"time": {
"type": "string",
"examples": [
"Doors 5:30 p.m., dinner served 6:30"
]
},
"venue": {
"type": "string",
"examples": [
"The Cotton Exchange"
]
},
"address": {
"type": "string",
"examples": [
"321 N Front Street, Wilmington"
]
},
"who": {
"type": "string",
"examples": [
"Everyone"
]
},
"who_note": {
"type": "string",
"examples": [
"Children under 12 free, and there is a kids' table"
]
}
}
},
"hero": {
"type": "object",
"description": "The image. Without `url` a labelled slot of the same height prints instead, so the layout is identical either way.",
"properties": {
"url": {
"type": "string",
"format": "uri",
"examples": [
"https://example.com/harvest-table.jpg"
]
},
"alt": {
"type": "string",
"examples": [
"Volunteers laying a long table down the middle of a street"
]
},
"placeholder": {
"type": "string",
"examples": [
"Photograph of last year's table goes here"
]
}
}
},
"body": {
"type": "array",
"minItems": 1,
"description": "The left-hand column. Two or three short paragraphs; nobody reads a flyer standing up for longer than that.",
"items": {
"type": "string",
"examples": [
"Once a year we put one table down the middle of Front Street and feed four hundred people at it."
]
},
"examples": [
[
"Once a year we put one table down the middle of Front Street."
]
]
},
"price": {
"type": "object",
"properties": {
"value": {
"type": "string",
"examples": [
"$45"
]
},
"note": {
"type": "string",
"examples": [
"a seat, or $400 for a table of ten. Every seat pays for about ninety meals."
]
}
}
},
"highlights_heading": {
"type": "string",
"default": "What is on",
"examples": [
"On the night"
]
},
"highlights": {
"type": "array",
"items": {
"type": "string",
"examples": [
"Dinner by six New Hanover County kitchens"
]
},
"examples": [
[
"Dinner by six local kitchens"
]
]
},
"details_heading": {
"type": "string",
"default": "Good to know",
"examples": [
"Good to know"
]
},
"details": {
"type": "array",
"items": {
"type": "string",
"examples": [
"Step-free access from the Water Street side"
]
},
"examples": [
[
"Step-free access from Water Street"
]
]
},
"cta": {
"type": "object",
"description": "The band across the bottom. One instruction, not three.",
"properties": {
"text": {
"type": "string",
"examples": [
"Tickets at riverlightfood.example.test/table"
]
},
"detail": {
"type": "string",
"examples": [
"Or call (910) 555-0126, weekdays. Last year sold out eleven days early."
]
}
}
},
"credits": {
"type": "string",
"description": "Sponsors, accessibility and the small print.",
"examples": [
"Sponsored by Osprey Paper Mill and Front Street Roasters."
]
},
"tabs": {
"type": "object",
"description": "Tear-off strips along the foot, for a flyer going on a noticeboard. Every strip carries the same two lines, rotated.",
"properties": {
"count": {
"type": "integer",
"minimum": 1,
"maximum": 12,
"default": 8,
"examples": [
9
]
},
"title": {
"type": "string",
"examples": [
"Harvest Table · Oct 24"
]
},
"contact": {
"type": "string",
"examples": [
"riverlightfood.example.test/table"
]
}
}
}
}
}