KONGRESUME API

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.

BASE URL api.kongresume.com
AUTH Bearer API key
OUTPUT PDF · ~20 s
SOURCES LinkedIn · Indeed · Text

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.

MCP URL mcp-server-mocha-eta.vercel.app/mcp
TOOLS generate · list · credits
AUTH Your Kongresume login

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/json on POST requests.
Accept
application/json, or application/pdf when downloading files.
curl https://api.kongresume.com/v1/me \
  -H "Authorization: Bearer kr_live_your_api_key"

START

Quickstart

  1. 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.

  2. 02

    Send a job

    POST a linkedin_job_url, an indeed_job_url, or a raw job_description to /v1/resumes/generate.

  3. 03

    Save the PDF

    The response body is the compiled PDF. The X-Generation-Id header 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

GET

/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"
}
GET

/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" }
  ]
}
GET

/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, max 100.
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
}
GET

/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"
}
GET

/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
POST

/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 vjk or jk key, 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, or template3.
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. 1

    Validate the key

    The API key resolves the user and the plan's remaining credits before any work starts.

  2. 2

    Load the profile

    The stored profile — career niche, extracted CV or LinkedIn data — is fetched from the database.

  3. 3

    Resolve the job

    LinkedIn and Indeed URLs are scraped into structured job details; pasted text is normalized directly.

  4. 4

    Write the resume

    The AI merges profile and job requirements into the selected LaTeX template — grounded in the profile, never invented.

  5. 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.

Free$0

5 resume generations to get started

Standard$2 /mo

200 resume generations per month

Elite$29 /mo

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." }

CodeMeaningWhat to do
400No job source, or an invalid job URL / template.Send one of the three job fields with a valid value.
401Missing or invalid API key.Regenerate the key from Profile → Developer.
402No generation credits left.Upgrade the plan or wait for the monthly renewal.
422Request body failed validation.Check the JSON shape and field names.
429Too many requests.Back off and retry after the indicated delay.
502The job page could not be scraped.Verify the URL opens publicly, or send the text instead.
500Generation or compile failure.Retry with the same Idempotency-Key.