Sales template

Quote

Sales quote with serif-headline proposal aesthetic, live validity countdown banner that recolors as the expiry approaches, status pill, project cover-letter block, structured numbered terms, deposit / payment terms card, and Accept / Decline call-to-action buttons. Date and discount fields each accept multiple aliases for SDK / legacy compatibility.

Free on every planLanguage: en
slug: quoteRendered with sample data
01

Quick start

Reference the template by its slug and pass your data. The same call works from any language; pick whichever fits your stack. Replace $KAMY_API_KEY with a key from the dashboard.

curl
curl https://kamy.dev/api/v1/render \
  -H "Authorization: Bearer $KAMY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "templateSlug": "quote",
    "data": {
      "quoteNumber": "Q-2026-014",
      "issueDate": "2026-04-10",
      "validUntil": "2026-05-10",
      "status": "sent",
      "currency": "USD",
      "locale": "en-US",
      "reference": "RFP-2026-Q2-077",
      "preparedBy": "Jordan Lee",
      "projectName": "Customer Portal Redesign",
      "introduction": "Thank you for the opportunity to partner with Initech on the next chapter of your customer portal. The scope below covers a five-week engagement spanning discovery, design, and engineering support — built to ship a measurable lift in self-serve resolution within the first quarter post-launch.",
      "from": {
        "name": "Acme Studio",
        "address": [
          "1234 Market Street",
          "San Francisco, CA 94103"
        ],
        "email": "[email protected]",
        "phone": "+1 (415) 555-0142",
        "taxId": "EIN 84-2987143"
      },
      "to": {
        "name": "Initech LLC",
        "address": [
          "77 Federal Plaza",
          "Austin, TX 78701"
        ],
        "email": "[email protected]",
      // …
    }
  }'
node.js
import { Kamy } from "@kamydev/sdk";

const kamy = new Kamy({ apiKey: process.env.KAMY_API_KEY! });

const { url } = await kamy.render({
  templateSlug: "quote",
  data: {
    "quoteNumber": "Q-2026-014",
    "issueDate": "2026-04-10",
    "validUntil": "2026-05-10",
    "status": "sent",
    "currency": "USD",
    "locale": "en-US",
    "reference": "RFP-2026-Q2-077",
    "preparedBy": "Jordan Lee",
    "projectName": "Customer Portal Redesign",
    "introduction": "Thank you for the opportunity to partner with Initech on the next chapter of your customer portal. The scope below covers a five-week engagement spanning discovery, design, and engineering support — built to ship a measurable lift in self-serve resolution within the first quarter post-launch.",
    "from": {
      "name": "Acme Studio",
      "address": [
        "1234 Market Street",
        "San Francisco, CA 94103"
      ],
      "email": "[email protected]",
      "phone": "+1 (415) 555-0142",
      "taxId": "EIN 84-2987143"
    },
    "to": {
      "name": "Initech LLC",
      "address": [
        "77 Federal Plaza",
        "Austin, TX 78701"
      ],
      "email": "[email protected]",
    // …
  },
});

console.log(url); // signed URL, valid for 1 hour
python
import os, requests

resp = requests.post(
    "https://kamy.dev/api/v1/render",
    headers={"Authorization": f"Bearer {os.environ['KAMY_API_KEY']}"},
    json={
        "templateSlug": "quote",
        "data": {
          "quoteNumber": "Q-2026-014",
          "issueDate": "2026-04-10",
          "validUntil": "2026-05-10",
          "status": "sent",
          "currency": "USD",
          "locale": "en-US",
          "reference": "RFP-2026-Q2-077",
          "preparedBy": "Jordan Lee",
          "projectName": "Customer Portal Redesign",
          "introduction": "Thank you for the opportunity to partner with Initech on the next chapter of your customer portal. The scope below covers a five-week engagement spanning discovery, design, and engineering support — built to ship a measurable lift in self-serve resolution within the first quarter post-launch.",
          "from": {
            "name": "Acme Studio",
            "address": [
              "1234 Market Street",
              "San Francisco, CA 94103"
            ],
            "email": "[email protected]",
            "phone": "+1 (415) 555-0142",
            "taxId": "EIN 84-2987143"
          },
          "to": {
            "name": "Initech LLC",
            "address": [
              "77 Federal Plaza",
              "Austin, TX 78701"
            ],
            "email": "[email protected]",
          // …
        },
    },
)
resp.raise_for_status()
print(resp.json()["url"])
02

Sample payload

The full sample data the live preview above renders from. Use it as a starting point for your own integration — every field is optional except those marked required in the schema below.

json
{
  "quoteNumber": "Q-2026-014",
  "issueDate": "2026-04-10",
  "validUntil": "2026-05-10",
  "status": "sent",
  "currency": "USD",
  "locale": "en-US",
  "reference": "RFP-2026-Q2-077",
  "preparedBy": "Jordan Lee",
  "projectName": "Customer Portal Redesign",
  "introduction": "Thank you for the opportunity to partner with Initech on the next chapter of your customer portal. The scope below covers a five-week engagement spanning discovery, design, and engineering support — built to ship a measurable lift in self-serve resolution within the first quarter post-launch.",
  "from": {
    "name": "Acme Studio",
    "address": [
      "1234 Market Street",
      "San Francisco, CA 94103"
    ],
    "email": "[email protected]",
    "phone": "+1 (415) 555-0142",
    "taxId": "EIN 84-2987143"
  },
  "to": {
    "name": "Initech LLC",
    "address": [
      "77 Federal Plaza",
      "Austin, TX 78701"
    ],
    "email": "[email protected]",
    "phone": "+1 (512) 555-0188"
  },
  "lineItems": [
    {
      "sku": "DSC-01",
      "description": "Discovery & strategy workshop",
      "subDescription": "Two on-site days, six stakeholder interviews, prioritised opportunity map",
      "quantity": 1,
      "unitPrice": 3500,
      "amount": 3500
    },
    {
      "sku": "UX-04W",
      "description": "UI/UX design — 4 weeks",
      "subDescription": "End-to-end flows, design system, hi-fi prototypes, two review cycles",
      "quantity": 4,
      "unitPrice": 4200,
      "amount": 16800
    },
    {
      "sku": "ENG-HR",
      "description": "Implementation support (hrs)",
      "subDescription": "Pair-programming, spec hand-off, QA review during build phase",
      "quantity": 20,
      "unitPrice": 175,
      "amount": 3500
    }
  ],
  "subtotal": 23800,
  "discount": 1190,
  "discountRate": 5,
  "taxRate": 8.25,
  "taxAmount": 1865.33,
  "total": 24475.33,
  "payment": {
    "method": "Bank transfer (ACH or wire)",
    "depositPercent": 30,
    "dueOn": "Net 30 from project kick-off",
    "terms": "Two milestone invoices: 30% on acceptance, 70% on delivery acceptance.",
    "instructions": "Wire details and ACH credentials provided in a separate follow-up after this quote is accepted."
  },
  "termsList": [
    "Quote pricing is fixed for the engagement window above; out-of-scope work is billed at the implementation-support hourly rate.",
    "Travel, third-party tooling, and hosting passthroughs are billed at cost with prior written approval.",
    "Either party may terminate with seven days' written notice; completed work to date remains payable.",
    "Acme Studio retains the right to feature the engagement in its portfolio after the launch date, subject to brand-asset review.",
    "Confidentiality and IP assignment terms follow the master services agreement signed Q1 2026."
  ],
  "acceptUrl": "https://acme.studio/quotes/Q-2026-014/accept",
  "declineUrl": "https://acme.studio/quotes/Q-2026-014/decline",
  "notes": "Pricing assumes a project kick-off on or before the validity date above; later starts may shift the timeline by a corresponding window."
}
03

JSON Schema

The render endpoint validates your payload against this JSON Schema before queuing the render. Validation errors come back with HTTP 400 and a VALIDATION_FAILED code listing every offending path.

json
{
  "type": "object",
  "required": [
    "quoteNumber",
    "from",
    "to",
    "lineItems",
    "total",
    "currency"
  ],
  "properties": {
    "quoteNumber": {
      "type": "string",
      "minLength": 1
    },
    "issueDate": {
      "type": "string"
    },
    "quoteDate": {
      "type": "string"
    },
    "date": {
      "type": "string"
    },
    "validUntil": {
      "type": "string"
    },
    "expiresAt": {
      "type": "string"
    },
    "from": {
      "type": "object",
      "required": [
        "name"
      ],
      "properties": {
        "name": {
          "type": "string",
          "minLength": 1
        },
        "email": {
          "type": "string",
          "format": "email"
        },
        "phone": {
          "type": "string"
        },
        "address": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "logoUrl": {
          "type": "string",
          "format": "uri"
        },
        "taxId": {
          "type": "string"
        }
      }
    },
    "to": {
      "type": "object",
      "required": [
        "name"
      ],
      "properties": {
        "name": {
          "type": "string",
          "minLength": 1
        },
        "email": {
          "type": "string",
          "format": "email"
        },
        "phone": {
          "type": "string"
        },
        "address": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "logoUrl": {
          "type": "string",
          "format": "uri"
        },
        "taxId": {
          "type": "string"
        }
      }
    },
    "lineItems": {
      "type": "array",
      "minItems": 1,
      "items": {
        "type": "object",
        "required": [
          "description",
          "quantity",
          "unitPrice",
          "amount"
        ],
        "properties": {
          "description": {
            "type": "string",
            "minLength": 1
          },
          "quantity": {
            "type": "number",
            "minimum": 0
          },
          "unitPrice": {
            "type": "number"
          },
          "amount": {
            "type": "number"
          },
          "sku": {
            "type": "string"
          },
          "subDescription": {
            "type": "string"
          }
        }
      }
    },
    "subtotal": {
      "type": "number"
    },
    "taxAmount": {
      "type": "number"
    },
    "taxRate": {
      "type": "number"
    },
    "discount": {
      "type": "number"
    },
    "discountAmount": {
      "type": "number"
    },
    "discountRate": {
      "type": "number"
    },
    "total": {
      "type": "number"
    },
    "currency": {
      "type": "string",
      "minLength": 1
    },
    "status": {
      "type": "string",
      "enum": [
        "draft",
        "sent",
        "accepted",
        "declined",
        "expired"
      ]
    },
    "projectName": {
      "type": "string"
    },
    "introduction": {
      "type": "string"
    },
    "summary": {
      "type": "string"
    },
    "reference": {
      "type": "string"
    },
    "preparedBy": {
      "type": "string"
    },
    "terms": {
      "type": "string"
    },
    "termsList": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "payment": {
      "type": "object",
      "properties": {
        "method": {
          "type": "string"
        },
        "terms": {
          "type": "string"
        },
        "depositAmount": {
          "type": "number"
        },
        "depositPercent": {
          "type": "number"
        },
        "dueOn": {
          "type": "string"
        },
        "instructions": {
          "type": "string"
        }
      }
    },
    "acceptUrl": {
      "type": "string",
      "format": "uri"
    },
    "declineUrl": {
      "type": "string",
      "format": "uri"
    },
    "signature": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string"
        },
        "title": {
          "type": "string"
        },
        "imageUrl": {
          "type": "string",
          "format": "uri"
        },
        "date": {
          "type": "string"
        }
      }
    },
    "notes": {
      "type": "string"
    },
    "locale": {
      "type": "string"
    }
  }
}
Quote template — Kamy PDF API — Kamy