Template gallery / statement

statement

Multi-page account statement: opening balance, dated activity with a running balance, aging buckets, and a detachable remittance slip. Table headers repeat on every page.

chromium default PDF 16 top-level fields 1 unit per page

Rendered preview of the statement 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
statement_number string required
account_number string required
period_start string (date) required
period_end string (date) required
due_on string (date) optional
currency string optional
accent string optional
opening_balance number optional Balance carried forward into the period.
closing_balance number optional Optional. Left out, it is computed from the opening balance and the activity rows.
remit_to string optional
payment_instructions string optional
notes string optional
company object { name, address, email, phone, … } required
customer object { name, attention, address, email } required
aging object { current, days_30, days_60, days_90, … } optional Aging buckets across the top. Leave the object out to hide the row.
activity array of object { date, description, reference, charge, … } required Dated rows in order. Each row is a charge or a credit; the running balance is computed.

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
{
  "statement_number": "STM-2026-09",
  "account_number": "ACME-0041",
  "period_start": "2026-08-01",
  "period_end": "2026-08-31",
  "due_on": "2026-09-30",
  "currency": "USD",
  "opening_balance": 1240.5,
  "remit_to": "Galley Render, PO Box 1188, Fernandina Beach, FL 32035",
  "payment_instructions": "ACH: routing 063100277, account 1900042318. Reference the account number above. Card payments at galleyrender.com/pay.",
  "notes": "Balances over 30 days accrue a 1.5% monthly service charge. Questions about a line on this statement should reach ar@galleyrender.com within 15 days.",
  "company": {
    "name": "Galley Render",
    "address": "2727 Jean Lafitte Dr, Fernandina Beach, FL 32034",
    "email": "ar@galleyrender.com",
    "phone": "(904) 555-0110"
  },
  "customer": {
    "name": "Acme Robotics",
    "attention": "Accounts Payable",
    "address": "100 Market St, Austin, TX 78701",
    "email": "ap@acme.test"
  },
  "aging": {
    "current": 838.97,
    "days_30": 924.01,
    "days_60": 250,
    "days_90": 0,
    "days_over_90": 0
  },
  "activity": [
    {
      "date": "2026-08-03",
      "description": "Invoice INV-1038 — Starter plan, August",
      "reference": "INV-1038",
      "charge": 404.6
    },
    {
      "date": "2026-08-05",
      "description": "Payment received — ACH",
      "reference": "ACH-77120",
      "credit": 1240.5
    },
    {
      "date": "2026-08-08",
      "description": "Invoice INV-1039 — Overage, 41,200 renders",
      "reference": "INV-1039",
      "charge": 164.8
    },
    {
      "date": "2026-08-11",
      "description": "Invoice INV-1040 — Priority render queue",
      "reference": "INV-1040",
      "charge": 250
    },
    {
      "date": "2026-08-14",
      "description": "Credit memo — duplicate charge on INV-1039",
      "reference": "CM-0311",
      "credit": 42
    },
    {
      "date": "2026-08-17",
      "description": "Invoice INV-1041 — Seat add-on (3 seats)",
      "reference": "INV-1041",
      "charge": 147
    },
    {
      "date": "2026-08-19",
      "description": "Payment received — Visa ···· 4242",
      "reference": "ch_3QjP1a",
      "credit": 404.6
    },
    {
      "date": "2026-08-21",
      "description": "Invoice INV-1042 — Overage, 96,400 renders",
      "reference": "INV-1042",
      "charge": 385.6
    },
    {
      "date": "2026-08-22",
      "description": "Service charge — balance over 30 days",
      "reference": "FIN-0088",
      "charge": 18.61
    },
    {
      "date": "2026-08-24",
      "description": "Invoice INV-1043 — Template migration, 6 hrs",
      "reference": "INV-1043",
      "charge": 900
    },
    {
      "date": "2026-08-26",
      "description": "Credit memo — goodwill adjustment",
      "reference": "CM-0312",
      "credit": 150
    },
    {
      "date": "2026-08-27",
      "description": "Invoice INV-1044 — Dedicated Chromium pool",
      "reference": "INV-1044",
      "charge": 600
    },
    {
      "date": "2026-08-28",
      "description": "Payment received — ACH",
      "reference": "ACH-77455",
      "credit": 500
    },
    {
      "date": "2026-08-29",
      "description": "Invoice INV-1045 — Sandbox environment",
      "reference": "INV-1045",
      "charge": 125
    },
    {
      "date": "2026-08-30",
      "description": "Invoice INV-1046 — Overage, 22,900 renders",
      "reference": "INV-1046",
      "charge": 91.6
    },
    {
      "date": "2026-08-31",
      "description": "Service charge — balance over 30 days",
      "reference": "FIN-0091",
      "charge": 22.37
    }
  ]
}

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": "statement@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": "statement",
        "format": "pdf",
        "data": { … see the example payload above … }
      }
    }
  }'

Pin the version — statement@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 (16 top-level properties)
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "Account statement",
  "type": "object",
  "required": [
    "statement_number",
    "account_number",
    "period_start",
    "period_end",
    "company",
    "customer",
    "activity"
  ],
  "additionalProperties": true,
  "properties": {
    "statement_number": {
      "type": "string",
      "examples": [
        "STM-2026-09"
      ]
    },
    "account_number": {
      "type": "string",
      "examples": [
        "ACME-0041"
      ]
    },
    "period_start": {
      "type": "string",
      "format": "date",
      "examples": [
        "2026-08-01"
      ]
    },
    "period_end": {
      "type": "string",
      "format": "date",
      "examples": [
        "2026-08-31"
      ]
    },
    "due_on": {
      "type": "string",
      "format": "date",
      "examples": [
        "2026-09-30"
      ]
    },
    "currency": {
      "type": "string",
      "default": "USD",
      "examples": [
        "USD"
      ]
    },
    "accent": {
      "type": "string",
      "examples": [
        "#1e3a5f"
      ]
    },
    "opening_balance": {
      "type": "number",
      "description": "Balance carried forward into the period.",
      "examples": [
        1240.5
      ]
    },
    "closing_balance": {
      "type": "number",
      "description": "Optional. Left out, it is computed from the opening balance and the activity rows.",
      "examples": [
        2116.98
      ]
    },
    "remit_to": {
      "type": "string",
      "examples": [
        "Galley Render, PO Box 1188, Fernandina Beach, FL 32035"
      ]
    },
    "payment_instructions": {
      "type": "string",
      "examples": [
        "ACH: routing 063100277, account 1900042318. Reference the account number above."
      ]
    },
    "notes": {
      "type": "string",
      "examples": [
        "Balances over 30 days accrue a 1.5% monthly service charge."
      ]
    },
    "company": {
      "type": "object",
      "required": [
        "name"
      ],
      "properties": {
        "name": {
          "type": "string",
          "examples": [
            "Galley Render"
          ]
        },
        "address": {
          "type": "string",
          "examples": [
            "2727 Jean Lafitte Dr, Fernandina Beach, FL 32034"
          ]
        },
        "email": {
          "type": "string",
          "format": "email",
          "examples": [
            "ar@galleyrender.com"
          ]
        },
        "phone": {
          "type": "string",
          "examples": [
            "(904) 555-0110"
          ]
        },
        "logo_url": {
          "type": "string",
          "format": "uri",
          "examples": [
            "https://example.com/logo.png"
          ]
        }
      }
    },
    "customer": {
      "type": "object",
      "required": [
        "name"
      ],
      "properties": {
        "name": {
          "type": "string",
          "examples": [
            "Acme Robotics"
          ]
        },
        "attention": {
          "type": "string",
          "examples": [
            "Accounts Payable"
          ]
        },
        "address": {
          "type": "string",
          "examples": [
            "100 Market St, Austin, TX 78701"
          ]
        },
        "email": {
          "type": "string",
          "format": "email",
          "examples": [
            "ap@acme.test"
          ]
        }
      }
    },
    "aging": {
      "type": "object",
      "description": "Aging buckets across the top. Leave the object out to hide the row.",
      "properties": {
        "current": {
          "type": "number",
          "examples": [
            876.48
          ]
        },
        "days_30": {
          "type": "number",
          "examples": [
            740.5
          ]
        },
        "days_60": {
          "type": "number",
          "examples": [
            500
          ]
        },
        "days_90": {
          "type": "number",
          "examples": [
            0
          ]
        },
        "days_over_90": {
          "type": "number",
          "examples": [
            0
          ]
        }
      }
    },
    "activity": {
      "type": "array",
      "minItems": 1,
      "description": "Dated rows in order. Each row is a charge or a credit; the running balance is computed.",
      "items": {
        "type": "object",
        "required": [
          "date",
          "description"
        ],
        "properties": {
          "date": {
            "type": "string",
            "format": "date",
            "examples": [
              "2026-08-03"
            ]
          },
          "description": {
            "type": "string",
            "examples": [
              "Invoice INV-1038 — Starter plan, August"
            ]
          },
          "reference": {
            "type": "string",
            "examples": [
              "INV-1038"
            ]
          },
          "charge": {
            "type": "number",
            "minimum": 0,
            "examples": [
              404.6
            ]
          },
          "credit": {
            "type": "number",
            "minimum": 0,
            "examples": [
              1240.5
            ]
          }
        }
      }
    }
  }
}