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

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

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

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": "quote@1",
  "format": "pdf",
  "data": "… the example payload above …"
}'
With no API key, over MCPshell
# 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 →

Try a free tool

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