DOCUMENTATION
One clean API for perfectly tailored resumes.
The Kongresume API turns a job posting — a LinkedIn URL, an Indeed URL, or pasted job text — into an ATS-ready, tailored resume PDF. The API key resolves the user, loads their stored profile, writes the resume with AI, compiles LaTeX, and returns the finished file. One request in, one PDF out.
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. |