Generate a Reference Letter Template with Achievement Prompts
A persuasive reference letter needs more than warm praise: it needs context, credible evidence, and a clear recommendation.
Run — free
This generator turns the referee's name, the candidate's name, their relationship, and the length of that relationship into a practical letter framework. The result includes a ready-to-edit letter, separately labeled sections, and visible placeholders for achievements, measurable impact, strengths, character evidence, and contact information. It gives referees a confident starting point while leaving every important factual claim for the writer to verify and personalize.
Start with credible relationship context
A reader evaluates a reference partly by asking how well the referee can judge the candidate. Enter the referee and candidate using the names that should appear in the final letter, then describe the relationship precisely. A phrase such as “direct manager,” “doctoral supervisor,” or “volunteer coordinator” is more informative than a vague label such as “colleague.” Add the duration in years as a positive number; decimals are useful when the relationship lasted eighteen months or another partial-year period. The generated opening uses these details to establish the referee's viewpoint without inventing a job title, employer, institution, or date. Review that opening before adding evidence. If the relationship changed over time, replace the short description with a concise sentence explaining the relevant roles. Credibility comes from accurate scope, so do not imply direct supervision when the referee only collaborated occasionally. The template deliberately separates known input from editable placeholders, making it easy to see which claims still need the referee's personal knowledge and confirmation before the letter is shared.
Replace every placeholder with specific evidence
The strongest paragraph usually connects an achievement, the candidate's action, and a meaningful result. Replace the achievement prompt with a real project, responsibility, improvement, award, or challenge that the referee personally observed. Then replace the impact prompt with a number when a reliable number exists, such as time saved, people served, revenue protected, errors reduced, or a deadline met. If no honest metric is available, describe a concrete outcome instead of manufacturing precision. The strength placeholder should explain what the example reveals: judgment, initiative, technical depth, reliability, empathy, leadership, or another quality relevant to the opportunity. A second section prompts for character and working style because one project rarely captures the whole person. Use a short situation that demonstrates the named quality rather than stacking adjectives. Delete any claim the referee cannot support. The generator never researches the people or fills evidence automatically, so the final author remains responsible for accuracy, consent, confidentiality, and an appropriate level of detail.
Adapt the recommendation to its destination
Before sending the letter, replace the role, program, or opportunity placeholder with its exact name and adjust the emphasis to match the selection criteria. An employment reference might foreground dependable delivery and collaboration, while an academic reference may focus on intellectual independence, research habits, and readiness for advanced study. Choose a closing strength that reflects the referee's genuine assessment; “without reservation” is powerful only when it is sincerely meant. Add the referee's correct title, organization, and preferred contact details, and include a date and recipient address if the destination expects formal business-letter formatting. Read the complete letter aloud to catch repeated phrasing and ensure the tone sounds like the referee rather than a generic form. Confirm names, pronouns, dates, figures, and confidential details with care. The structured sections can support a form-based workflow, while the combined letter is convenient for a document editor. Browser use is free, and an automated API request uses the published base price of $0.002.
What you can do with it
Employee recommendation
Give a manager a structured first draft that prompts for an observed project, measurable impact, and job-relevant strengths.
Academic application
Help a supervisor organize evidence about a student's work, character, and readiness for a named course or research program.
Volunteer or community reference
Frame a credible recommendation around service, responsibility, collaboration, and outcomes witnessed by a coordinator.
FAQ
Does the generator invent achievements?
No. It inserts visible placeholders so the referee can add achievements and results they personally know to be accurate.
What does duration mean?
It is the length of time, in years, that the referee has known the candidate in the stated relationship. It must be greater than zero.
Can I enter a partial year?
Yes. Use a positive decimal such as 1.5 for eighteen months, then confirm that the wording accurately reflects the relationship.
Is the output ready to send unchanged?
No. Replace every bracketed placeholder, verify all claims and names, tailor the destination, and add the required letter formatting and contact details.
How much does an API request cost?
The base price is $0.002 per request. The same deterministic generator can run free in the browser.
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/doc/reference-letter-template \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"referee":"Dr. Maya Chen","candidate":"Jordan Lee","relationship":"direct manager","duration":3}'const res = await fetch("https://api.kit.forhosting.com/doc/reference-letter-template", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"referee": "Dr. Maya Chen",
"candidate": "Jordan Lee",
"relationship": "direct manager",
"duration": 3
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/doc/reference-letter-template",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"referee": "Dr. Maya Chen",
"candidate": "Jordan Lee",
"relationship": "direct manager",
"duration": 3
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/doc/reference-letter-template", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"referee":"Dr. Maya Chen","candidate":"Jordan Lee","relationship":"direct manager","duration":3}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"referee":"Dr. Maya Chen","candidate":"Jordan Lee","relationship":"direct manager","duration":3}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/doc/reference-letter-template", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"referee": "Dr. Maya Chen",
"candidate": "Jordan Lee",
"relationship": "direct manager",
"duration": 3
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "doc.reference_letter_template",
"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.
Limits
max_mb | 25 |
max_pages | 200 |
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. |