Template gallery / quote-card
quote-card
1080x1080 social quote card. Renders on the Satori fast path: flexbox subset, inline styles, bundled Inter, no network assets. The author avatar is drawn from initials rather than fetched.
satori default PNG 11 top-level fields 1 unit
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 |
|---|---|---|---|
| quote | string | required | The pull quote. Around 160 characters fits at the default size; drop quote_size for longer text. |
| quote_size | number | optional | Quote font size in px. |
| eyebrow | string | optional | |
| source | string | optional | Where the quote came from. |
| handle | string | optional | |
| background | string | optional | Base background colour. |
| background_2 | string | optional | Second stop of the background gradient. |
| accent | string | optional | |
| text_color | string | optional | |
| muted_color | string | optional | |
| author | object { name, title, initials } | required |
Default render options
Applied unless you override them. Options are part of the cache key.
| width | 1080 |
| height | 1080 |
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.
{
"quote": "The agent found the service, signed itself up, and shipped the integration before anyone on our team opened a browser.",
"eyebrow": "From the field",
"source": "Platform Engineering review, Q3 2026",
"handle": "@galleyrender",
"background": "#0b0f14",
"background_2": "#132029",
"accent": "#2dd4bf",
"author": {
"name": "Lena Ortiz",
"title": "Director of Infrastructure, Acme Robotics",
"initials": "LO"
}
} Render it
curl -sS https://api.galleyrender.com/v1/render \
-H "Authorization: Bearer $GALLEY_API_KEY" \
-H 'content-type: application/json' \
-d '{
"template": "quote-card@1",
"format": "png",
"data": {
"quote": "The agent found the service, signed itself up, and shipped the integration before anyone on our team opened a browser.",
"eyebrow": "From the field",
"source": "Platform Engineering review, Q3 2026",
"handle": "@galleyrender",
"background": "#0b0f14",
"background_2": "#132029",
"accent": "#2dd4bf",
"author": {
"name": "Lena Ortiz",
"title": "Director of Infrastructure, Acme Robotics",
"initials": "LO"
}
}
}' # No API key. The first call mints a 50-render trial.
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": "quote-card",
"format": "png",
"data": {"quote":"The agent found the service, signed itself up, and shipped the integration before anyone on our team opened a browser.","eyebrow":"From the field","source":"Platform Engineering review, Q3 2026","handle":"@galleyrender","background":"#0b0f14","background_2":"#132029","accent":"#2dd4bf","author":{"name":"Lena Ortiz","title":"Director of Infrastructure, Acme Robotics","initials":"LO"}}
}
}
}'
Pin the version — quote-card@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 (11 top-level properties)
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "Social quote card",
"description": "1080x1080 card for the Satori fast path. Render with format png and engine satori; the same markup also renders through Chromium if you need a PDF.",
"type": "object",
"required": [
"quote",
"author"
],
"additionalProperties": true,
"properties": {
"quote": {
"type": "string",
"description": "The pull quote. Around 160 characters fits at the default size; drop quote_size for longer text.",
"examples": [
"The agent found the service, signed itself up, and shipped the integration before anyone on our team opened a browser."
]
},
"quote_size": {
"type": "number",
"minimum": 24,
"maximum": 96,
"default": 58,
"description": "Quote font size in px.",
"examples": [
58
]
},
"eyebrow": {
"type": "string",
"default": "Quote of the week",
"examples": [
"From the field"
]
},
"source": {
"type": "string",
"description": "Where the quote came from.",
"examples": [
"Uneed case study, 2026"
]
},
"handle": {
"type": "string",
"examples": [
"@galleyrender"
]
},
"background": {
"type": "string",
"description": "Base background colour.",
"examples": [
"#0b0f14"
]
},
"background_2": {
"type": "string",
"description": "Second stop of the background gradient.",
"examples": [
"#132029"
]
},
"accent": {
"type": "string",
"examples": [
"#2dd4bf"
]
},
"text_color": {
"type": "string",
"examples": [
"#f4f6f8"
]
},
"muted_color": {
"type": "string",
"examples": [
"#8b97a6"
]
},
"author": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"examples": [
"Lena Ortiz"
]
},
"title": {
"type": "string",
"examples": [
"Director of Infrastructure, Acme Robotics"
]
},
"initials": {
"type": "string",
"maxLength": 3,
"description": "Drawn in the avatar circle. Satori cannot fetch images, so there is no avatar URL.",
"examples": [
"LO"
]
}
}
}
}
}