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

Rendered preview of the event-flyer 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 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.

example.jsonjson
{
  "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

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-flyer@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-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 →

Try a free tool

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"
          ]
        }
      }
    }
  }
}