Generate a demand letter structure template
Three dated facts about an unpaid invoice become a structured letter: the facts first, then your exact request, a 10-day deadline after receipt and your next step. An editable starting point, not legal advice. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Dispute type
- Unpaid invoice
- Requested resolution
- Pay the outstanding balance of $1,250 by bank transfer.
- Deadline days
- 10
- Sender name
- North Street Studio
- Recipient name
- Harbor Retail LLC
- Subject
- Demand concerning unpaid invoice
A useful demand letter is easier to review when its purpose and supporting facts are separated clearly. This generator organizes the information you provide into a neutral template for an unpaid invoice, a security deposit dispute, or a breach of contract. It places the facts first, states the requested resolution, gives a response deadline, and explains the proposed next step. The result is an editable starting point, not legal advice or a determination that any claim, deadline, or remedy is valid.
Start with specific, verifiable facts
A demand letter becomes more useful when another person can follow its history without guessing. Enter each key fact as a separate, concise statement and place events in chronological order when possible. Include exact dates, invoice or agreement references, amounts paid or owed, property addresses, notice dates, and the obligation you believe was not performed.
Describe communications accurately without adding motives you cannot prove. For an unpaid invoice, identify the invoice, due date, balance, and prior reminders. For a security deposit, identify the tenancy, move-out date, deposit amount, deductions or missing statement, and communications with the landlord.
For a contract dispute, identify the agreement, the relevant promise, your own performance, and the conduct you consider a breach. The generator preserves your facts rather than investigating them, so check spelling, arithmetic, names, and supporting records before sending. Avoid including sensitive identifiers that are unnecessary.
Attachments can be listed or provided separately when appropriate, but the letter itself should remain readable and focused on the facts that support the demand.
State one concrete demand and a workable deadline
After the factual background, say exactly what would resolve the dispute. A clear demand might request payment of a stated balance, return of a stated deposit, delivery of promised work, correction of defective performance, or another specific cure. If you leave the requested resolution blank, the generator supplies a broad placeholder suited to the selected dispute type; replace it with accurate details before sending.
The deadline is expressed as a number of calendar days after receipt, which avoids pretending the tool knows when delivery will occur. Choose a period that is lawful and reasonable for the circumstances, and verify whether a contract, statute, court rule, or required pre-suit notice imposes different timing. Do not use the deadline to overstate urgency or threaten action you cannot take.
The assembled section is deliberately direct, but it does not calculate interest, damages, fees, or statutory penalties. If those items matter, verify the basis and calculation independently and describe them transparently. A recipient should be able to understand both the requested action and the time allowed without interpreting vague language.
Describe the next step without making improper threats
The consequence section explains what you intend to consider if the recipient does not comply. Keep it accurate, lawful, and proportionate. Examples may include using a contractually required dispute process, filing an appropriate claim, referring the matter to counsel, or pursuing another remedy that is genuinely available.
The default language is intentionally neutral because available remedies vary by jurisdiction, contract terms, amount, and dispute type. Avoid threats of criminal exposure, public embarrassment, harassment, or unrelated harm as leverage in a private dispute. Before sending, review the complete template for tone and internal consistency, confirm that the named parties are correct, and make sure the demand matches the facts.
Check any notice address, delivery method, signature, attachment, or service requirement that may apply. Keep a copy of the final letter and reliable delivery records. This tool only structures the information supplied; it does not decide whether you have a valid claim, establish that the recipient is liable, or replace advice from a qualified professional familiar with the facts and governing law.
What you can do with it
Request payment of an overdue invoice
Turn invoice dates, the unpaid balance, and reminder history into a direct payment demand with a response period.
Request return of a security deposit
Organize tenancy, move-out, deposit, deduction, and notice facts before asking for return or an itemized statement.
Seek a cure for breach of contract
Set out the agreement, promised performance, alleged breach, requested cure, deadline, and intended lawful next step.
FAQ
Is this legal advice?
No. It is a deterministic writing aid that structures facts you provide. It does not assess liability, select a legal remedy, or determine local notice requirements.
How is the deadline calculated?
The template states the number of calendar days after receipt that you provide. It does not calculate a calendar date or verify whether that period is legally sufficient.
Can the template include my preferred next step?
Yes. Supply a consequence that accurately describes a lawful option you genuinely intend to consider, or use the neutral default wording.
What happens if I leave the requested resolution blank?
The letter gets general wording suited to the dispute type you chose. Replace it with the exact payment or action you want before sending, because a vague demand is harder to answer.
Which facts should I include in a demand letter?
List each key fact as a short, separate statement, in date order where possible: dates, invoice or agreement references, amounts paid or owed, and the obligation you believe was not performed. You can enter up to twenty.
Related tools
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/legal2/demand-letter-structure \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"dispute_type":"unpaid_invoice","key_facts":["Invoice INV-104 for $1,250 was issued on June 2, 2026.","Payment was due on July 2, 2026 and remains unpaid."]}'const res = await fetch("https://api.kit.forhosting.com/legal2/demand-letter-structure", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"dispute_type": "unpaid_invoice",
"key_facts": [
"Invoice INV-104 for $1,250 was issued on June 2, 2026.",
"Payment was due on July 2, 2026 and remains unpaid."
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/legal2/demand-letter-structure",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"dispute_type": "unpaid_invoice",
"key_facts": [
"Invoice INV-104 for $1,250 was issued on June 2, 2026.",
"Payment was due on July 2, 2026 and remains unpaid."
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/legal2/demand-letter-structure", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"dispute_type":"unpaid_invoice","key_facts":["Invoice INV-104 for $1,250 was issued on June 2, 2026.","Payment was due on July 2, 2026 and remains unpaid."]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"dispute_type":"unpaid_invoice","key_facts":["Invoice INV-104 for $1,250 was issued on June 2, 2026.","Payment was due on July 2, 2026 and remains unpaid."]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/legal2/demand-letter-structure", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"dispute_type": "unpaid_invoice",
"key_facts": [
"Invoice INV-104 for $1,250 was issued on June 2, 2026.",
"Payment was due on July 2, 2026 and remains unpaid."
]
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "legal2.demand_letter_structure",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
Technical questions
What happens if I provide no key facts?
The request returns an invalid-input error because at least one non-empty fact is required.
What does an API request cost?
Each API request costs $0.002. The browser version can run the same deterministic assembly locally.