Template gallery / thank-you-letter
Donor thank-you letter template
Donor or volunteer thank-you on letterpress letterhead: a centred masthead, paragraphs that lead with what the gift did, two to four impact figures set in EB Garamond across a ruled band rather than in boxes, one story set as a passage in the display face, a signature that can be set in script or left as a rule, a postscript for the ask, and an anchored foot that points at the tax receipt rather than trying to be one.
chromium default PDF 14 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 one plum spot: the strapline, the impact figures, the P.S. mark and the signature. A hex colour or a CSS colour keyword. It is interpolated into the stylesheet, so nothing else is accepted. |
| letter_date | string (date) | required | |
| organisation | object { name, strapline, address, phone, … } | required | |
| recipient | object { name, salutation, address_line1, address_line2, … } | required | |
| salutation | string | optional | |
| body | array of string | required | The paragraphs before the impact figures. Lead with what the gift did, not with how grateful you are. |
| impact | array of object { value, label } | optional | Two to four figures. Specific beats impressive. |
| story | object { heading, text, attribution } | optional | One person, named or not, in their own words if you have them. |
| body_after | array of string | optional | Paragraphs after the story and before the sign-off. |
| valediction | string | optional | |
| signer | object { name, title, script } | required | |
| postscript | string | optional | The line most people read first. Put the ask or the invitation here. |
| receipt_note | string | optional | Where the tax receipt is. Keep a thank-you letter and a receipt as separate documents; this line points at the other one. |
| tax_status | string | optional |
Default render options
Applied unless you override them. Options are part of the cache key.
| page_size | "Letter" |
| margin | "0.85in" |
| 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.
{
"letter_date": "2027-01-12",
"organisation": {
"name": "Riverlight Community Food Bank, Inc.",
"strapline": "Feeding New Hanover County since 1994",
"address": "2200 Vance Street, Wilmington, NC 28401",
"phone": "(910) 555-0126",
"email": "giving@riverlightfood.example.test",
"website": "riverlightfood.example.test",
"ein": "56-2418907"
},
"recipient": {
"name": "Marguerite and Anselm Achterberg",
"salutation": "Marguerite and Anselm",
"address_line1": "417 Castle Street",
"address_line2": "Apartment 3B",
"city_state_zip": "Wilmington, NC 28401"
},
"body": [
"Your check arrived on November 20, which was the week the heating went out at the Vance Street pantry and we were decidi… [267 characters, shortened for display]",
"The second thing it did is easier to count."
],
"impact": [
{
"value": "3,120",
"label": "meals your giving paid for this year, at $0.48 each"
},
{
"value": "41,600",
"label": "households Riverlight served in 2026"
},
{
"value": "14",
"label": "cases you carried in yourselves in October"
}
],
"story": {
"heading": "What this looked like on a Tuesday",
"text": "A woman came in on a Tuesday in March with two children and a bus transfer that expired in forty minutes. We had eleven … [329 characters, shortened for display]",
"attribution": "Delphine Marchetti, pantry coordinator"
},
"body_after": [
"We are a food bank with four paid staff and a hundred and ten volunteers, and what keeps us upright is not any single large gift. It is two hundred and forty households giving every month.",
"Thank you for being one of them for the fourth year running."
],
"valediction": "With thanks,",
"signer": {
"name": "Imogen Thorsdottir",
"title": "Executive Director, Riverlight Community Food Bank",
"script": "Imogen"
},
"postscript": "The mobile pantry runs on the first Saturday of the month and we are two drivers short for the spring. If either of you has a licence and a free morning, Delphine will call you.",
"receipt_note": "Your 2026 contribution statement is enclosed separately; that is the document to keep for your tax records.",
"tax_status": "Riverlight Community Food Bank, Inc. is exempt from federal income tax under section 501(c)(3). EIN 56-2418907."
}
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": "thank-you-letter@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": "thank-you-letter",
"format": "pdf",
"data": { … see the example payload above … }
}
}
}'
Pin the version — thank-you-letter@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 (14 top-level properties)
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "Thank-you letter",
"type": "object",
"required": [
"organisation",
"recipient",
"letter_date",
"body",
"signer"
],
"additionalProperties": true,
"properties": {
"accent": {
"type": "string",
"description": "The one plum spot: the strapline, the impact figures, the P.S. mark and the signature. 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})$"
},
"letter_date": {
"type": "string",
"format": "date",
"examples": [
"2026-09-16"
]
},
"organisation": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"examples": [
"Riverlight Community Food Bank, Inc."
]
},
"strapline": {
"type": "string",
"examples": [
"Feeding New Hanover County since 1994"
]
},
"address": {
"type": "string",
"examples": [
"2200 Vance Street, Wilmington, NC 28401"
]
},
"phone": {
"type": "string",
"examples": [
"(910) 555-0126"
]
},
"email": {
"type": "string",
"format": "email",
"examples": [
"giving@riverlightfood.example.test"
]
},
"website": {
"type": "string",
"examples": [
"riverlightfood.example.test"
]
},
"ein": {
"type": "string",
"examples": [
"56-2418907"
]
},
"logo_url": {
"type": "string",
"format": "uri",
"examples": [
"https://example.com/riverlight.png"
]
}
}
},
"recipient": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"examples": [
"Marguerite and Anselm Achterberg"
]
},
"salutation": {
"type": "string",
"description": "Used after \"Dear\". Use the name they would want, not the one on the check.",
"examples": [
"Marguerite and Anselm"
]
},
"address_line1": {
"type": "string",
"examples": [
"417 Castle Street"
]
},
"address_line2": {
"type": "string",
"examples": [
"Apartment 3B"
]
},
"city_state_zip": {
"type": "string",
"examples": [
"Wilmington, NC 28401"
]
}
}
},
"salutation": {
"type": "string",
"default": "Dear",
"examples": [
"Dear"
]
},
"body": {
"type": "array",
"minItems": 1,
"description": "The paragraphs before the impact figures. Lead with what the gift did, not with how grateful you are.",
"items": {
"type": "string",
"examples": [
"Your gift arrived in the week we ran out of shelf-stable milk."
]
},
"examples": [
[
"Your gift arrived in the week we ran out of shelf-stable milk."
]
]
},
"impact": {
"type": "array",
"description": "Two to four figures. Specific beats impressive.",
"items": {
"type": "object",
"required": [
"value",
"label"
],
"properties": {
"value": {
"type": "string",
"examples": [
"3,120"
]
},
"label": {
"type": "string",
"examples": [
"meals your gift paid for, at $0.48 each"
]
}
}
}
},
"story": {
"type": "object",
"description": "One person, named or not, in their own words if you have them.",
"properties": {
"heading": {
"type": "string",
"examples": [
"What this looked like on a Tuesday"
]
},
"text": {
"type": "string",
"examples": [
"A woman came to the Vance Street pantry on a Tuesday in March with two children and a bus transfer that expired in forty minutes."
]
},
"attribution": {
"type": "string",
"examples": [
"Delphine Marchetti, pantry coordinator"
]
}
}
},
"body_after": {
"type": "array",
"description": "Paragraphs after the story and before the sign-off.",
"items": {
"type": "string",
"examples": [
"None of this is possible in a month when giving drops."
]
},
"examples": [
[
"None of this is possible in a month when giving drops."
]
]
},
"valediction": {
"type": "string",
"default": "With thanks,",
"examples": [
"With thanks,"
]
},
"signer": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"examples": [
"Imogen Thorsdottir"
]
},
"title": {
"type": "string",
"examples": [
"Executive Director"
]
},
"script": {
"type": "string",
"description": "A signature set in italic serif. Without it, a blank rule prints for a pen.",
"examples": [
"Imogen"
]
}
}
},
"postscript": {
"type": "string",
"description": "The line most people read first. Put the ask or the invitation here.",
"examples": [
"The mobile pantry runs on the first Saturday of the month and we are two drivers short. If you have a driving licence and a free morning, reply to this letter."
]
},
"receipt_note": {
"type": "string",
"description": "Where the tax receipt is. Keep a thank-you letter and a receipt as separate documents; this line points at the other one.",
"examples": [
"Your 2026 contribution statement is enclosed separately and is the document to keep for your tax records."
]
},
"tax_status": {
"type": "string",
"examples": [
"Riverlight Community Food Bank, Inc. is exempt from federal income tax under section 501(c)(3) of the Internal Revenue Code."
]
}
}
}