Template gallery / violation-letter
HOA violation letter template
Covenant enforcement letter: the provision relied on lifted out of the argument and set as a real block quote at a narrower measure, the condition and the enforcement history as dated records, a photograph slot that holds its space when no photo is supplied, the cure-by date in a ruled box in brick red, the adopted fine schedule with a mono money column, and the owner's hearing and appeal rights numbered.
chromium default PDF 26 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 association's navy, used for the notice-level tag in the reference band. The keylines and body stay black ink. A hex colour or a CSS colour keyword. It is interpolated into the stylesheet, so nothing else is accepted. |
| fines_adopted_on | string (date) | optional | When the Board adopted the fine schedule, printed under the table. A schedule the owner cannot date is a schedule the owner can dispute. |
| warn_color | string | optional | The one warning colour on the sheet. It rules the cure-by box and sets the deadline date; nothing else on the page uses it. A hex colour or a CSS colour keyword. It is interpolated into the stylesheet, so nothing else is accepted. |
| currency | string | optional | |
| letter_date | string (date) | required | The date the cure period runs from. |
| case_number | string | optional | |
| delivery_method | string | optional | |
| notice_level | "Courtesy notice" | "Notice of violation" | "Second notice" | "Final notice before hearing" | optional | Printed as the first item in the reference band under the masthead, in navy small caps. |
| subject | string | optional | |
| association | object { name, subtitle, address, phone, … } | required | |
| managing_agent | object { name } | optional | Printed as a "c/o" line above the return address. |
| owner | object { name, salutation, address_line1, address_line2, … } | required | |
| property | object { address, unit } | required | |
| opening | string | optional | Replaces the default opening paragraph. |
| violation | object { observed_on, observed_by, rule_reference, rule_text, … } | required | |
| photo | object { url, caption, taken_on, taken_by } | optional | Photograph of the condition. Without `url` the letter prints a labelled slot at the same size, so the layout is the same whether or not the photo is attached. |
| prior_notices | array of object { date, kind, outcome } | optional | The enforcement history on this matter. |
| cure | object { required_action, steps, days, deadline, … } | required | |
| consequences | string | optional | |
| fines | array of object { step, action, amount } | optional | The adopted fine schedule, so the owner sees the exposure. |
| appeal | object { statement, rights, how, request_by, … } | optional | Hearing and appeal rights. Say what your state and documents actually require. |
| closing_paragraph | string | optional | |
| valediction | string | optional | |
| signer | object { name, title, organization } | required | |
| copies | string | optional | |
| footer | string | optional | Replaces the default disclaimer line. |
Default render options
Applied unless you override them. Options are part of the cache key.
| page_size | "Letter" |
| margin | {"top":"0.75in","right":"0.75in","bottom":"0.95in","left":"0.75in"} |
| 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": "2026-09-16",
"case_number": "CE-2026-0148",
"delivery_method": "Sent by first class mail and email",
"notice_level": "Second notice",
"subject": "Notice of violation — fence stain colour not approved",
"association": {
"name": "Heron Bay Homeowners Association, Inc.",
"subtitle": "Covenants Enforcement",
"address": "PO Box 4127, Wilmington, NC 28406",
"phone": "(910) 555-0177",
"email": "compliance@heronbayhoa.example.test"
},
"managing_agent": {
"name": "Cape Fear Property Management"
},
"owner": {
"name": "Mr. and Mrs. Curtis Nakamura",
"salutation": "Mr. and Mrs. Nakamura",
"address_line1": "1377 Marsh Wren Drive",
"city_state_zip": "Wilmington, NC 28411"
},
"property": {
"address": "1377 Marsh Wren Drive, Wilmington, NC 28411",
"unit": "Lot 114"
},
"violation": {
"observed_on": "2026-09-09",
"observed_by": "Denise Hollowell, community manager",
"rule_reference": "Declaration of Covenants, Article VII, Section 3 (Exterior Colours and Finishes)",
"rule_text": "No exterior surface shall be painted, stained or refinished in a colour other than one approved in writing by the Architectural Review Committee.",
"description": "The rear privacy fence has been stained a dark walnut colour. The Association's approved palette for fence finishes is natural cedar, driftwood grey or clear sealer. No architectural application for this work is on file."
},
"photo": {
"caption": "Rear fence line facing the common area between Lot 114 and the walking trail, stained dark walnut.",
"taken_on": "2026-09-09",
"taken_by": "Denise Hollowell"
},
"prior_notices": [
{
"date": "2026-08-11",
"kind": "Courtesy notice, mailed and emailed",
"outcome": "No response received. The condition was unchanged at re-inspection on August 28, 2026."
}
],
"cure": {
"required_action": "Refinish the fence in one of the three approved colours, or submit an architectural application asking the Committee to approve the colour already applied. Either one closes this file.",
"steps": [
"Download the architectural application from heronbayhoa.example.test/forms, or ask the office to mail you one",
"If you intend to refinish, send the product and colour so we can check it against the palette first",
"Tell us the date the work is scheduled if a contractor is involved"
],
"days": 30,
"deadline": "2026-10-16",
"reinspection_on": "2026-10-19",
"confirm_to": "compliance@heronbayhoa.example.test"
},
"consequences": "If the condition is not corrected by the date above and no hearing has been requested, the matter is referred to the Boa… [257 characters, shortened for display]",
"fines_adopted_on": "2026-03-10",
"fines": [
{
"step": "First hearing",
"action": "Fine levied for the violation",
"amount": 100
},
{
"step": "Continuing",
"action": "Per day, for each day the violation continues after the hearing",
"amount": 25
},
{
"step": "After 60 days",
"action": "Suspension of pool and clubhouse privileges, plus referral to counsel"
},
{
"step": "Costs",
"action": "Reasonable attorney fees and costs of enforcement, if awarded"
}
],
"appeal": {
"statement": "You may request a hearing before the Board's adjudicatory panel before any fine is imposed or privilege suspended. Nothing is levied until that hearing has been held or the time to request one has passed.",
"how": "A request must be in writing, by mail or email. At the hearing you may appear in person, be represented by anyone you choose, and present documents, photographs and witnesses.",
"request_by": "2026-10-01",
"send_to": "Secretary, PO Box 4127, Wilmington NC 28406, or hearings@heronbayhoa.example.test",
"body": "A panel of owners who are not officers, directors or employees of the Association",
"note": "Requesting a hearing does not extend the correction deadline, but no fine is levied until the panel has decided."
},
"closing_paragraph": "Most matters like this are settled with a phone call. If a contractor delay is the reason the work has not been done, tell us the date it is booked and we will note the file.",
"valediction": "Sincerely,",
"signer": {
"name": "Denise Hollowell",
"title": "Community Manager, as agent for the Board of Directors",
"organization": "Cape Fear Property Management"
},
"copies": "Board of Directors; Covenants file, Lot 114"
}
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": "violation-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": "violation-letter",
"format": "pdf",
"data": { … see the example payload above … }
}
}
}'
Pin the version — violation-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 (26 top-level properties)
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "HOA violation letter",
"type": "object",
"required": [
"association",
"owner",
"property",
"violation",
"cure",
"signer",
"letter_date"
],
"additionalProperties": true,
"properties": {
"accent": {
"type": "string",
"description": "The association's navy, used for the notice-level tag in the reference band. The keylines and body stay black ink. A hex colour or a CSS colour keyword. It is interpolated into the stylesheet, so nothing else is accepted.",
"default": "#1c3f60",
"examples": [
"#1c3f60"
],
"pattern": "^(#[0-9a-fA-F]{3,8}|[a-zA-Z]{3,20})$"
},
"fines_adopted_on": {
"type": "string",
"format": "date",
"description": "When the Board adopted the fine schedule, printed under the table. A schedule the owner cannot date is a schedule the owner can dispute.",
"examples": [
"2026-03-10"
]
},
"warn_color": {
"type": "string",
"description": "The one warning colour on the sheet. It rules the cure-by box and sets the deadline date; nothing else on the page uses it. A hex colour or a CSS colour keyword. It is interpolated into the stylesheet, so nothing else is accepted.",
"default": "#8c2f24",
"examples": [
"#8c2f24"
],
"pattern": "^(#[0-9a-fA-F]{3,8}|[a-zA-Z]{3,20})$"
},
"currency": {
"type": "string",
"default": "USD",
"examples": [
"USD"
]
},
"letter_date": {
"type": "string",
"format": "date",
"description": "The date the cure period runs from.",
"examples": [
"2026-09-16"
]
},
"case_number": {
"type": "string",
"examples": [
"CE-2026-0148"
]
},
"delivery_method": {
"type": "string",
"examples": [
"Sent by first class mail and email"
]
},
"notice_level": {
"type": "string",
"description": "Printed as the first item in the reference band under the masthead, in navy small caps.",
"enum": [
"Courtesy notice",
"Notice of violation",
"Second notice",
"Final notice before hearing"
],
"examples": [
"Second notice"
]
},
"subject": {
"type": "string",
"examples": [
"Notice of violation — fence stain colour not approved"
]
},
"association": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"examples": [
"Heron Bay Homeowners Association, Inc."
]
},
"subtitle": {
"type": "string",
"default": "Covenants Enforcement",
"examples": [
"Covenants Enforcement"
]
},
"address": {
"type": "string",
"examples": [
"PO Box 4127, Wilmington, NC 28406"
]
},
"phone": {
"type": "string",
"examples": [
"(910) 555-0177"
]
},
"email": {
"type": "string",
"format": "email",
"examples": [
"compliance@heronbayhoa.example.test"
]
},
"logo_url": {
"type": "string",
"format": "uri",
"examples": [
"https://example.com/heron-bay.png"
]
}
}
},
"managing_agent": {
"type": "object",
"description": "Printed as a \"c/o\" line above the return address.",
"properties": {
"name": {
"type": "string",
"examples": [
"Cape Fear Property Management"
]
}
}
},
"owner": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"examples": [
"Mr. and Mrs. Curtis Nakamura"
]
},
"salutation": {
"type": "string",
"description": "Used after \"Dear\"; defaults to the name.",
"examples": [
"Mr. and Mrs. Nakamura"
]
},
"address_line1": {
"type": "string",
"examples": [
"1377 Marsh Wren Drive"
]
},
"address_line2": {
"type": "string",
"examples": [
"Attn: Curtis Nakamura"
]
},
"city_state_zip": {
"type": "string",
"examples": [
"Wilmington, NC 28411"
]
}
}
},
"property": {
"type": "object",
"required": [
"address"
],
"properties": {
"address": {
"type": "string",
"examples": [
"1377 Marsh Wren Drive, Wilmington, NC 28411"
]
},
"unit": {
"type": "string",
"examples": [
"Lot 114"
]
}
}
},
"opening": {
"type": "string",
"description": "Replaces the default opening paragraph.",
"examples": [
"A routine inspection on September 9 found a condition at your property that does not comply with the recorded covenants."
]
},
"violation": {
"type": "object",
"required": [
"description",
"rule_reference",
"observed_on"
],
"properties": {
"observed_on": {
"type": "string",
"format": "date",
"examples": [
"2026-09-09"
]
},
"observed_by": {
"type": "string",
"examples": [
"Denise Hollowell, community manager"
]
},
"rule_reference": {
"type": "string",
"description": "The article, section or rule number relied on.",
"examples": [
"Declaration of Covenants, Article VII, Section 3 (Exterior Colours and Finishes)"
]
},
"rule_text": {
"type": "string",
"description": "The provision quoted, so the owner does not have to look it up.",
"examples": [
"No exterior surface shall be painted, stained or refinished in a colour other than one approved in writing by the Architectural Review Committee."
]
},
"description": {
"type": "string",
"examples": [
"The rear privacy fence has been stained a dark walnut. The Association's approved palette for fence finishes is natural cedar, driftwood grey or clear sealer. No architectural application was on file for this work."
]
}
}
},
"photo": {
"type": "object",
"description": "Photograph of the condition. Without `url` the letter prints a labelled slot at the same size, so the layout is the same whether or not the photo is attached.",
"properties": {
"url": {
"type": "string",
"format": "uri",
"examples": [
"https://example.com/photos/lot-114-fence.jpg"
]
},
"caption": {
"type": "string",
"examples": [
"Rear fence line facing the common area, stained dark walnut."
]
},
"taken_on": {
"type": "string",
"format": "date",
"examples": [
"2026-09-09"
]
},
"taken_by": {
"type": "string",
"examples": [
"Denise Hollowell"
]
}
}
},
"prior_notices": {
"type": "array",
"description": "The enforcement history on this matter.",
"items": {
"type": "object",
"required": [
"date",
"kind"
],
"properties": {
"date": {
"type": "string",
"format": "date",
"examples": [
"2026-08-11"
]
},
"kind": {
"type": "string",
"examples": [
"Courtesy notice, mailed and emailed"
]
},
"outcome": {
"type": "string",
"examples": [
"No response received; condition unchanged at re-inspection on August 28."
]
}
}
}
},
"cure": {
"type": "object",
"required": [
"deadline",
"days"
],
"properties": {
"required_action": {
"type": "string",
"examples": [
"Refinish the fence in one of the three approved colours, or submit an architectural application asking the Committee to approve the colour already applied."
]
},
"steps": {
"type": "array",
"items": {
"type": "string",
"examples": [
"Submit an architectural application if you wish to keep the current colour"
]
},
"examples": [
[
"Submit an architectural application if you wish to keep the current colour"
]
]
},
"days": {
"type": "integer",
"minimum": 1,
"description": "Length of the cure period, counted from `letter_date`.",
"examples": [
30
]
},
"deadline": {
"type": "string",
"format": "date",
"description": "The date printed in the box. Compute it yourself so it matches your governing documents.",
"examples": [
"2026-10-16"
]
},
"reinspection_on": {
"type": "string",
"format": "date",
"examples": [
"2026-10-19"
]
},
"confirm_to": {
"type": "string",
"examples": [
"compliance@heronbayhoa.example.test"
]
}
}
},
"consequences": {
"type": "string",
"examples": [
"If the condition is not corrected by the date above and no hearing has been requested, the matter goes to the Board's adjudicatory panel, which may levy fines under the adopted fine schedule and suspend common area privileges."
]
},
"fines": {
"type": "array",
"description": "The adopted fine schedule, so the owner sees the exposure.",
"items": {
"type": "object",
"required": [
"step",
"action"
],
"properties": {
"step": {
"type": "string",
"examples": [
"First hearing"
]
},
"action": {
"type": "string",
"examples": [
"Fine levied for the violation"
]
},
"amount": {
"type": "number",
"minimum": 0,
"examples": [
100
]
}
}
}
},
"appeal": {
"type": "object",
"description": "Hearing and appeal rights. Say what your state and documents actually require.",
"properties": {
"statement": {
"type": "string",
"examples": [
"You may request a hearing before the Board's adjudicatory panel before any fine is imposed."
]
},
"rights": {
"type": "array",
"description": "The owner's hearing and appeal rights, printed as a numbered list. Given, it replaces the numbered list built from `statement`, `how` and `note`.",
"items": {
"type": "string",
"examples": [
"You may request a hearing before any fine is imposed."
]
},
"examples": [
[
"You may request a hearing before any fine is imposed."
]
]
},
"how": {
"type": "string",
"examples": [
"A request must be in writing and may be delivered by mail or email. You may appear in person, be represented, and present documents and witnesses."
]
},
"request_by": {
"type": "string",
"format": "date",
"examples": [
"2026-10-01"
]
},
"send_to": {
"type": "string",
"examples": [
"Secretary, Heron Bay HOA, PO Box 4127, Wilmington, NC 28406, or hearings@heronbayhoa.example.test"
]
},
"body": {
"type": "string",
"examples": [
"The adjudicatory panel, whose members are not officers, directors or employees of the Association"
]
},
"note": {
"type": "string",
"examples": [
"Requesting a hearing does not extend the correction deadline, but no fine is levied until the panel has decided."
]
}
}
},
"closing_paragraph": {
"type": "string",
"examples": [
"Most matters like this are settled with a phone call. If a contractor scheduling delay is the reason, tell us the date the work is booked and we will note the file."
]
},
"valediction": {
"type": "string",
"default": "Sincerely,",
"examples": [
"Sincerely,"
]
},
"signer": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"examples": [
"Denise Hollowell"
]
},
"title": {
"type": "string",
"examples": [
"Community Manager, acting as agent for the Board of Directors"
]
},
"organization": {
"type": "string",
"examples": [
"Cape Fear Property Management"
]
}
}
},
"copies": {
"type": "string",
"examples": [
"Board of Directors; Covenants file, Lot 114"
]
},
"footer": {
"type": "string",
"description": "Replaces the default disclaimer line.",
"examples": [
"This letter is a compliance notice under the Association's governing documents."
]
}
}
}