Template gallery / quote
quote
Letter-size quote / estimate for trades: scope narrative, labor and material split per line, allowances, exclusions, deposit and a signature block.
chromium default PDF 18 top-level fields 1 unit 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 |
|---|---|---|---|
| quote_number | string | required | Your estimate reference. |
| issued_on | string (date) | required | |
| valid_until | string (date) | optional | Date the pricing expires. |
| currency | string | optional | |
| accent | string | optional | Accent colour for the rule and badge. |
| scope_summary | string | optional | One paragraph describing the job in plain language. |
| terms | string | optional | |
| contractor | object { name, address, phone, email, … } | required | The company issuing the estimate. |
| client | object { name, address, phone, email } | required | |
| project | object { name, address, start_window, duration } | optional | |
| line_items | array of object { description, detail, labor, material, … } | required | Scope lines. Give `labor` and `material` to show the split, or `amount` for a lump sum. |
| allowances | array of object { description, amount } | optional | Budget placeholders the homeowner will select against. |
| inclusions | array of string | optional | |
| exclusions | array of string | optional | |
| payment_schedule | array of object { milestone, amount, percent } | optional | |
| tax_rate | number | optional | Decimal rate, e.g. 0.07 for 7%. |
| deposit_rate | number | optional | |
| deposit_amount | number | optional | Fixed deposit; overrides deposit_rate. |
Default render options
Applied unless you override them. Options are part of the cache key.
| page_size | "Letter" |
| margin | "0.5in" |
| 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.
{
"quote_number": "EST-2041",
"issued_on": "2026-09-16",
"valid_until": "2026-10-16",
"currency": "USD",
"scope_summary": "Full gut and rebuild of the hall bathroom: new tub and tile surround, relocated vanity, upgraded GFCI circuit, and a new exhaust fan vented through the roof. Existing window and door openings stay where they are.",
"contractor": {
"name": "Halyard Remodeling LLC",
"address": "18 Dock St, Fernandina Beach, FL 32034",
"phone": "(904) 555-0142",
"email": "office@halyardremodel.test",
"license_number": "CBC1259847",
"license_state": "FL"
},
"client": {
"name": "Dana and Marcus Reyes",
"address": "412 Ash Street, Fernandina Beach, FL 32034",
"phone": "(904) 555-0188",
"email": "dana.reyes@example.test"
},
"project": {
"name": "Hall bathroom remodel",
"address": "412 Ash Street, Fernandina Beach, FL 32034",
"start_window": "Week of Oct 6, 2026",
"duration": "18 working days"
},
"line_items": [
{
"description": "Demolition and haul-off",
"detail": "Tub, tile, vanity, and subfloor down to joists. 15-yard dumpster included.",
"labor": 1850,
"material": 420
},
{
"description": "Rough plumbing",
"detail": "Relocate supply and drain for vanity; new tub valve and trim rough.",
"labor": 2200,
"material": 960
},
{
"description": "Electrical",
"detail": "Dedicated GFCI circuit, two sconces, fan/light combo vented to roof.",
"labor": 1450,
"material": 610
},
{
"description": "Framing, drywall and paint",
"detail": "Repair joist bay, new cement board, level-4 finish, two coats.",
"labor": 3100,
"material": 1180
},
{
"description": "Tile setting",
"detail": "Floor plus full-height tub surround with schluter edge.",
"labor": 3650,
"material": 0
},
{
"description": "Finish carpentry and install",
"detail": "Vanity, top, mirror, hardware, trim and door casing.",
"labor": 1900,
"material": 340
}
],
"allowances": [
{
"description": "Tile and trim selections",
"amount": 2400
},
{
"description": "Vanity, top and plumbing fixtures",
"amount": 3200
}
],
"inclusions": [
"Permit fees and inspections",
"Daily cleanup and floor protection on the path of travel",
"One-year workmanship warranty",
"Final cleaning before walkthrough"
],
"exclusions": [
"Unknown conditions behind existing walls or under the subfloor",
"Mold or asbestos abatement",
"Structural changes to the exterior wall",
"Window replacement"
],
"payment_schedule": [
{
"milestone": "Deposit at signing",
"amount": 7500
},
{
"milestone": "Start of rough-in",
"amount": 8000
},
{
"milestone": "Tile complete",
"amount": 6000
},
{
"milestone": "Final walkthrough",
"percent": 0.1
}
],
"tax_rate": 0.07,
"deposit_rate": 0.3,
"terms": "Pricing holds for 30 days from the issue date. Work is performed under our standard residential remodeling agreement. Any change to the scope above is priced as a written change order and must be signed before that work proceeds."
} Render it
curl -sS https://api.galleyrender.com/v1/render \
-H "Authorization: Bearer $GALLEY_API_KEY" \
-H 'content-type: application/json' \
-d '{
"template": "quote@1",
"format": "pdf",
"data": "… the example payload above …"
}' # 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",
"format": "pdf",
"data": { … see the example payload above … }
}
}
}'
Pin the version — quote@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 (18 top-level properties)
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "Quote / estimate",
"type": "object",
"required": [
"quote_number",
"issued_on",
"contractor",
"client",
"line_items"
],
"additionalProperties": true,
"properties": {
"quote_number": {
"type": "string",
"description": "Your estimate reference.",
"examples": [
"EST-2041"
]
},
"issued_on": {
"type": "string",
"format": "date",
"examples": [
"2026-09-16"
]
},
"valid_until": {
"type": "string",
"format": "date",
"description": "Date the pricing expires.",
"examples": [
"2026-10-16"
]
},
"currency": {
"type": "string",
"default": "USD",
"examples": [
"USD"
]
},
"accent": {
"type": "string",
"description": "Accent colour for the rule and badge.",
"examples": [
"#0f766e"
]
},
"scope_summary": {
"type": "string",
"description": "One paragraph describing the job in plain language.",
"examples": [
"Full gut and rebuild of the hall bath, including new tub, tile surround, vanity, and relocated GFCI circuit."
]
},
"terms": {
"type": "string",
"examples": [
"Pricing holds for 30 days. Work is performed under our standard residential remodeling agreement. Change orders are billed separately and must be signed before work proceeds."
]
},
"contractor": {
"type": "object",
"required": [
"name"
],
"description": "The company issuing the estimate.",
"properties": {
"name": {
"type": "string",
"examples": [
"Halyard Remodeling LLC"
]
},
"address": {
"type": "string",
"examples": [
"18 Dock St, Fernandina Beach, FL 32034"
]
},
"phone": {
"type": "string",
"examples": [
"(904) 555-0142"
]
},
"email": {
"type": "string",
"format": "email",
"examples": [
"office@halyardremodel.test"
]
},
"license_number": {
"type": "string",
"description": "Contractor licence printed under the company block.",
"examples": [
"CBC1259847"
]
},
"license_state": {
"type": "string",
"examples": [
"FL"
]
},
"logo_url": {
"type": "string",
"format": "uri",
"examples": [
"https://example.com/logo.png"
]
}
}
},
"client": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"examples": [
"Dana and Marcus Reyes"
]
},
"address": {
"type": "string",
"examples": [
"412 Ash Street, Fernandina Beach, FL 32034"
]
},
"phone": {
"type": "string",
"examples": [
"(904) 555-0188"
]
},
"email": {
"type": "string",
"format": "email",
"examples": [
"dana.reyes@example.test"
]
}
}
},
"project": {
"type": "object",
"properties": {
"name": {
"type": "string",
"examples": [
"Hall bathroom remodel"
]
},
"address": {
"type": "string",
"examples": [
"412 Ash Street, Fernandina Beach, FL 32034"
]
},
"start_window": {
"type": "string",
"examples": [
"Week of Oct 6, 2026"
]
},
"duration": {
"type": "string",
"examples": [
"18 working days"
]
}
}
},
"line_items": {
"type": "array",
"minItems": 1,
"description": "Scope lines. Give `labor` and `material` to show the split, or `amount` for a lump sum.",
"items": {
"type": "object",
"required": [
"description"
],
"properties": {
"description": {
"type": "string",
"examples": [
"Demolition and haul-off"
]
},
"detail": {
"type": "string",
"description": "Second line under the item.",
"examples": [
"Tub, tile, vanity, subfloor to joists. Dumpster included."
]
},
"labor": {
"type": "number",
"minimum": 0,
"examples": [
1850
]
},
"material": {
"type": "number",
"minimum": 0,
"examples": [
420
]
},
"amount": {
"type": "number",
"minimum": 0,
"description": "Lump-sum total for the line; overrides labor + material.",
"examples": [
2270
]
}
}
}
},
"allowances": {
"type": "array",
"description": "Budget placeholders the homeowner will select against.",
"items": {
"type": "object",
"required": [
"description",
"amount"
],
"properties": {
"description": {
"type": "string",
"examples": [
"Tile and trim selections"
]
},
"amount": {
"type": "number",
"minimum": 0,
"examples": [
2400
]
}
}
}
},
"inclusions": {
"type": "array",
"items": {
"type": "string",
"examples": [
"Permit fees and inspections"
]
},
"examples": [
[
"Permit fees and inspections"
]
]
},
"exclusions": {
"type": "array",
"items": {
"type": "string",
"examples": [
"Unknown conditions behind existing walls"
]
},
"examples": [
[
"Unknown conditions behind existing walls"
]
]
},
"payment_schedule": {
"type": "array",
"items": {
"type": "object",
"required": [
"milestone"
],
"properties": {
"milestone": {
"type": "string",
"examples": [
"Deposit at signing"
]
},
"amount": {
"type": "number",
"minimum": 0,
"examples": [
4200
]
},
"percent": {
"type": "number",
"minimum": 0,
"maximum": 1,
"examples": [
0.3
]
}
}
}
},
"tax_rate": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Decimal rate, e.g. 0.07 for 7%.",
"examples": [
0.07
]
},
"deposit_rate": {
"type": "number",
"minimum": 0,
"maximum": 1,
"examples": [
0.3
]
},
"deposit_amount": {
"type": "number",
"minimum": 0,
"description": "Fixed deposit; overrides deposit_rate.",
"examples": [
5000
]
}
}
}