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.
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 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]",
// …
}
}'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 hourimport 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"])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.
{
"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."
}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.
{
"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"
}
}
}