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

Rendered preview of the violation-letter 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 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.

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

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": "violation-letter@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": "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 →

Try a free tool

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