Generate a demand letter structure template
A useful demand letter is easier to review when its purpose and supporting facts are separated clearly.
Run — free
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.
What happens if I provide no key facts?
The request returns an invalid-input error because at least one non-empty fact is required.
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 does an API request cost?
Each API request costs $0.002. The browser version can run the same deterministic assembly locally.
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. |