Generate a job offer letter template from candidate and salary details
A start date of 2026-09-14 becomes September 14, 2026 in a job offer letter with employment, compensation, reporting and acceptance sections. Enter five details; the employer name and signatures stay as placeholders for your review. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Runs in your browser. Free, unlimited — your data never leaves this page.
Create a clear starting point for an employment offer using the five facts that belong at the center of the letter: the candidate's name, job title, intended start date, annual salary, and reporting manager. The generator validates those details, organizes them into consistent sections, and returns both structured data and editable Markdown. It deliberately leaves employer-specific and legal terms for human review, helping hiring teams prepare a dependable draft without pretending that one generic template can replace an approved employment agreement.
Enter accurate offer details before generating the draft
Begin with the candidate's full name and the job title exactly as they should appear in formal correspondence. Enter the intended start date in the ISO format YYYY-MM-DD; the generator checks that it is a real calendar date and converts it to a readable English date inside the letter. Supply the annual salary as a positive number greater than zero, without commas or a currency symbol in the numeric field.
Because no currency is requested, the template describes the amount as being in the currency agreed with the employer instead of guessing dollars, euros, or another unit. Finally, provide the reporting manager's name as it should be presented to the candidate. Review spelling, capitalization, and the underlying approval for every value before using the result.
The generator normalizes unnecessary whitespace but does not correct names, determine compensation policy, or verify that the person named as manager has authority to make the offer. Accurate source details remain the hiring team's responsibility.
Understand what the generated template includes
The result separates the offer into employment, compensation, reporting relationship, and acceptance sections. It also returns normalized fields and a structured list of sections, which lets software render the same information in another document format without extracting it from prose. The Markdown version is immediately editable and includes placeholders for the authorized representative, employer name, candidate signature, and acceptance date.
Those placeholders are intentional: the five supplied inputs do not identify the employer or signer, so inventing either would create a misleading business document. The compensation paragraph presents the annual salary with grouping separators and notes that ordinary deductions and payroll practices may apply, but it does not add a pay frequency, bonus, equity, commission, or benefits. Similarly, the acceptance section asks for review and completion rather than declaring an acceptance deadline.
This restrained structure makes the output useful as a drafting aid while keeping unsupported terms visible as work that still needs to be completed.
Review and complete the letter before sending it
Treat the generated document as a template, not as legal advice or a finished employment contract. Add the employer's legal name, address, authorized signatory, salary currency, payroll schedule, work location, employment classification, benefits, contingencies, probation terms, confidentiality language, termination terms, and any deadline only when those items are accurate and approved for the relevant jurisdiction. Have the responsible human resources or legal reviewer confirm that the letter matches company policy and local law.
The capability makes no network calls, uses no model, and inserts no facts beyond the supplied values and neutral template wording, so repeated requests with the same inputs produce the same output. Before delivery, export the reviewed Markdown into the organization's official letterhead or document system and obtain the required internal authorization.
What you can do with it
Prepare a recruiting draft
Turn approved candidate, role, start date, salary, and manager details into a consistent first draft for human resources review.
Standardize hiring operations
Generate predictable structured sections from an applicant tracking workflow without copying an old employee's letter.
Create an editable handoff
Give a manager or legal reviewer clean Markdown with visible placeholders for employer-specific terms and signatures.
FAQ
Does the generator add a currency symbol?
No. Currency is not one of the supplied fields, so the template does not guess one. Add the approved currency during review.
Is this a legally complete employment contract?
No. It is a drafting template and must be reviewed and completed for the employer, role, policy, and applicable jurisdiction.
Which start-date format should I use?
Use YYYY-MM-DD. The date must be a real Gregorian calendar date, such as 2026-09-14.
What output formats are returned?
The result includes normalized offer details, structured letter sections, and an editable Markdown template.
What details do I need for a job offer letter?
Five: the candidate's name, the job title, the start date, the annual salary and the reporting manager. The generator arranges them into employment, compensation, reporting and acceptance sections you can edit.
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/doc/employee-offer-letter \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"candidate_name":"Jordan Lee","job_title":"Senior Product Designer","start_date":"2026-09-14","salary":125000,"reporting_manager":"Morgan Patel"}'const res = await fetch("https://api.kit.forhosting.com/doc/employee-offer-letter", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"candidate_name": "Jordan Lee",
"job_title": "Senior Product Designer",
"start_date": "2026-09-14",
"salary": 125000,
"reporting_manager": "Morgan Patel"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/doc/employee-offer-letter",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"candidate_name": "Jordan Lee",
"job_title": "Senior Product Designer",
"start_date": "2026-09-14",
"salary": 125000,
"reporting_manager": "Morgan Patel"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/doc/employee-offer-letter", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"candidate_name":"Jordan Lee","job_title":"Senior Product Designer","start_date":"2026-09-14","salary":125000,"reporting_manager":"Morgan Patel"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"candidate_name":"Jordan Lee","job_title":"Senior Product Designer","start_date":"2026-09-14","salary":125000,"reporting_manager":"Morgan Patel"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/doc/employee-offer-letter", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"candidate_name": "Jordan Lee",
"job_title": "Senior Product Designer",
"start_date": "2026-09-14",
"salary": 125000,
"reporting_manager": "Morgan Patel"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "doc.employee_offer_letter",
"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. |
Technical notes
Review and complete the letter before sending it
It is free to run in the browser for an individual draft, while API generation costs $0.002 per request for hiring workflows that prepare letters from approved applicant records.
Technical questions
What happens if the salary is zero or negative?
The request returns an invalid_input error because salary must be a finite number greater than zero.
How much does generation cost?
It is free to run in your browser, or $0.002 per request through the API.