DOCUMENTATION
One clean API for perfectly tailored resumes.
Kongresume turns a job posting — a LinkedIn URL, an Indeed URL, or pasted job text — into an ATS-ready, tailored resume PDF. Use it straight from Claude and other AI agents via our MCP connector, or call the REST API directly. One request in, one PDF out.
USE WITH CLAUDE
Generate resumes from Claude (MCP)
Kongresume ships a Model Context Protocol server, so Claude Desktop, Claude Code, Cursor and other agents can generate resumes for you directly — no code. Connect it once with your Kongresume account, then just say "generate a resume for this LinkedIn job" and Claude hands you the PDF.
Simplest path — Settings → Connectors → Add custom connector, then paste this URL (swap in your email and password):
https://mcp-server-mocha-eta.vercel.app/mcp?email=YOU@EXAMPLE.COM&password=YOUR_PASSWORD
Add this to claude_desktop_config.json (Settings → Developer → Edit config), then restart Claude:
{
"mcpServers": {
"kongresume": {
"command": "npx",
"args": [
"-y", "mcp-remote",
"https://mcp-server-mocha-eta.vercel.app/mcp",
"--header", "X-Kongresume-Email:${KONGRESUME_EMAIL}",
"--header", "X-Kongresume-Password:${KONGRESUME_PASSWORD}"
],
"env": {
"KONGRESUME_EMAIL": "you@example.com",
"KONGRESUME_PASSWORD": "your-password"
}
}
}
}
One command in your terminal:
claude mcp add --transport http kongresume \
"https://mcp-server-mocha-eta.vercel.app/mcp?email=you@example.com&password=your-password"
Then just ask Claude
- By URL
- "Generate a resume for https://www.linkedin.com/jobs/view/4416743017/"
- By text
- "Here's a job description — tailor my resume to it: …"
- Manage
- "List my recent resumes" · "How many credits do I have left?"
Good to know
- Profile
- The resume is built from your stored Kongresume profile — finish onboarding first at app.kongresume.com.
- Credits
- Each generated resume uses one credit, same as the app.
- Security
- Your login is sent to the connector over HTTPS to sign in on your behalf. Keep your config private.
SECURITY
Authentication
Every request needs a developer API key sent as a Bearer token. Keys are generated from the developer section of the Kongresume profile and map to a single user account — the profile, credits, and history behind each request. Keep the key server-side; never ship it in client code.
Required headers
- Authorization
Bearer kr_live_xxx- Content-Type
application/jsonon POST requests.- Accept
application/json, orapplication/pdfwhen downloading files.
curl https://api.kongresume.com/v1/me \
-H "Authorization: Bearer kr_live_your_api_key"
START
Quickstart
-
01
Create an API key
Sign in at app.kongresume.com, finish onboarding (career niche + LinkedIn profile or CV), then generate a key from Profile → Developer.
-
02
Send a job
POST a
linkedin_job_url, anindeed_job_url, or a rawjob_descriptionto/v1/resumes/generate. -
03
Save the PDF
The response body is the compiled PDF. The
X-Generation-Idheader links it to history for later downloads.
curl https://api.kongresume.com/v1/resumes/generate \
-X POST \
-H "Authorization: Bearer kr_live_your_api_key" \
-H "Content-Type: application/json" \
--output resume.pdf \
-d '{ "linkedin_job_url": "https://www.linkedin.com/jobs/view/4416743017/" }'
REFERENCE
Endpoints
/v1/meProfile, plan, and remaining credits.
GET/v1/templatesAvailable resume templates.
GET/v1/resumesAll resumes generated by the user.
GET/v1/resumes/{id}A single generation with its metadata.
GET/v1/resumes/{id}/pdfRe-download a stored resume PDF.
POST/v1/resumes/generateGenerate a tailored resume PDF from a job.
/v1/me
Returns the account behind the API key — useful for showing remaining credits before generating.
curl https://api.kongresume.com/v1/me \
-H "Authorization: Bearer kr_live_your_api_key"
{
"user_id": "5f7c…",
"email": "jane@example.com",
"name": "Jane Doe",
"career_niche": ["Product Design"],
"plan": "standard",
"credits_remaining": 187,
"plan_renews_at": "2026-08-01T00:00:00Z"
}
/v1/templates
Lists the resume layouts. Pass a template id to /v1/resumes/generate; template1 is the default.
{
"templates": [
{ "id": "template1", "name": "Template 1 — classic single column" },
{ "id": "template2", "name": "Template 2 — compact two column" },
{ "id": "template3", "name": "Template 3 — modern accent header" }
]
}
/v1/resumes
Returns the user's generated resumes, newest first. Use it for history views or to find an id to re-download.
Query parameters
- limit
- Optional integer. Default
25, max100. - cursor
- Optional pagination cursor from a previous response.
curl "https://api.kongresume.com/v1/resumes?limit=25" \
-H "Authorization: Bearer kr_live_your_api_key"
{
"items": [
{
"id": "gen_01JZP7G5YW8V0EJ9D2V8N7A2K4",
"title": "Senior Product Designer at Figma",
"template_id": "template1",
"source_type": "linkedin_url",
"status": "completed",
"created_at": "2026-07-04T09:30:00Z",
"download_url": "https://api.kongresume.com/v1/resumes/gen_01JZ…/pdf"
}
],
"next_cursor": null
}
/v1/resumes/{id}
Fetches one generation, including the job it was tailored to and the compile status.
{
"id": "gen_01JZP7G5YW8V0EJ9D2V8N7A2K4",
"title": "Senior Product Designer at Figma",
"status": "completed",
"template_id": "template1",
"source_type": "linkedin_url",
"job_url": "https://www.linkedin.com/jobs/view/4416743017/",
"job_details": { "job_title": "Senior Product Designer", "company_name": "Figma", "skills": ["Figma", "Design systems"] },
"created_at": "2026-07-04T09:30:00Z"
}
/v1/resumes/{id}/pdf
Streams the stored PDF for a completed generation. If only LaTeX was stored, the server recompiles it on the fly.
curl https://api.kongresume.com/v1/resumes/gen_01JZP7G5YW8V0EJ9D2V8N7A2K4/pdf \
-H "Authorization: Bearer kr_live_your_api_key" \
--output resume.pdf
/v1/resumes/generate
Generates a new tailored resume and returns the compiled PDF. Send exactly one job
source: linkedin_job_url, indeed_job_url, or
job_description. LinkedIn and Indeed URLs are scraped into structured
job details; pasted text is used as-is. One credit is consumed per successful generation.
Request body
- linkedin_job_url
- String. A specific LinkedIn job, e.g.
https://www.linkedin.com/jobs/view/4416743017/. - indeed_job_url
- String. An Indeed job page with a
vjkorjkkey, e.g.https://pk.indeed.com/viewjob?jk=a828a7195e7d65f3. Regional domains are supported. - job_description
- String. The full pasted job text (at least a few sentences).
- template_id
- Optional.
template1(default),template2, ortemplate3.
curl https://api.kongresume.com/v1/resumes/generate \
-X POST \
-H "Authorization: Bearer kr_live_your_api_key" \
-H "Content-Type: application/json" \
--output resume.pdf \
-d '{
"linkedin_job_url": "https://www.linkedin.com/jobs/view/4416743017/",
"template_id": "template1"
}'
curl https://api.kongresume.com/v1/resumes/generate \
-X POST \
-H "Authorization: Bearer kr_live_your_api_key" \
-H "Content-Type: application/json" \
--output resume.pdf \
-d '{
"indeed_job_url": "https://pk.indeed.com/viewjob?jk=a828a7195e7d65f3",
"template_id": "template1"
}'
curl https://api.kongresume.com/v1/resumes/generate \
-X POST \
-H "Authorization: Bearer kr_live_your_api_key" \
-H "Content-Type: application/json" \
--output resume.pdf \
-d '{
"job_description": "We are hiring a Senior Data Analyst with SQL, Python, dashboarding, stakeholder management, and experimentation experience.",
"template_id": "template2"
}'
PDF response
- Status
200 OK- Content-Type
application/pdf- X-Generation-Id
- Generation id for
/v1/resumes/{id}and re-downloads. - Content-Disposition
- Attachment filename built from the role and company.
CONCEPTS
How generation works
- 1
Validate the key
The API key resolves the user and the plan's remaining credits before any work starts.
- 2
Load the profile
The stored profile — career niche, extracted CV or LinkedIn data — is fetched from the database.
- 3
Resolve the job
LinkedIn and Indeed URLs are scraped into structured job details; pasted text is normalized directly.
- 4
Write the resume
The AI merges profile and job requirements into the selected LaTeX template — grounded in the profile, never invented.
- 5
Compile & return
A single-pass Tectonic compile produces the PDF; the record is stored, one credit is consumed, and the file streams back.
CONCEPTS
Credits & plans
Each successful generation consumes one credit. When credits run out the API returns
402 Payment Required until the plan renews or is upgraded at
app.kongresume.com.
5 resume generations to get started
200 resume generations per month
Unlimited resume generations
CONCEPTS
Retries, limits & concurrency
Concurrency
Generations for different jobs run in parallel — fire multiple requests at once. Requests for the same job should be serialized on your side; use Idempotency-Key if a request might be retried.
Timing
A generation typically completes in ~15–25 seconds (scrape + AI + compile). Set client timeouts to at least 60 seconds and treat 5xx as retryable with backoff.
RELIABILITY
Errors
Errors are JSON with a single detail message: { "detail": "Your plan has no resume credits left." }
| Code | Meaning | What to do |
|---|---|---|
400 | No job source, or an invalid job URL / template. | Send one of the three job fields with a valid value. |
401 | Missing or invalid API key. | Regenerate the key from Profile → Developer. |
402 | No generation credits left. | Upgrade the plan or wait for the monthly renewal. |
422 | Request body failed validation. | Check the JSON shape and field names. |
429 | Too many requests. | Back off and retry after the indicated delay. |
502 | The job page could not be scraped. | Verify the URL opens publicly, or send the text instead. |
500 | Generation or compile failure. | Retry with the same Idempotency-Key. |