{"openapi":"3.1.0","info":{"title":"Resume Parser + Job Match API","description":"Resume Parser + Job Match API is a hosted REST API that turns a CV or resume (PDF, DOCX or plain text) into structured JSON (contact details, job titles, work history, education and skills) and scores it against a job posting from 0 to 100 with an explainable breakdown. It uses deterministic rules, not an LLM, and it never stores or logs resume content.\n\nUse it to turn uploaded CVs into clean candidate records for an ATS, job board or CRM, and to rank or screen candidates against a job with a score recruiters can read: matched and missing skills, seniority fit, function fit, years of experience and location eligibility. It shares one taxonomy (seniority levels, job functions, skills) with the Job Posting Parser API, so both sides of a match use the same vocabulary.\n\nPrivacy: CVs are processed in memory and discarded when the response is sent. There is no database, nothing is written to disk, and request bodies and extracted fields are never logged (only status and timing), which makes the API easy to use as a GDPR data processor. No OCR: scanned PDFs return a warning. Docs, pricing and FAQ: https://resume-match-api.fly.dev/","contact":{"url":"https://resume-match-api.fly.dev/"},"version":"1.0.0"},"paths":{"/v1/resume/parse":{"post":{"tags":["Resume"],"summary":"Parse a resume / CV (PDF, DOCX or text) into structured JSON","description":"Upload a CV as multipart/form-data (field `file`: PDF with a text layer, DOCX or TXT, max 5 MB, first 10 pages read) or send JSON `{\"text\": \"...\"}`. Returns contact details, summary, current title and company, total years of experience (overlapping jobs merged), seniority and job function with a confidence and reason, work history with dates and bullets, education, normalised skills, certifications, languages and warnings. The file type is detected from its content, not its name. Nothing is stored or logged.","operationId":"parseResume","requestBody":{"content":{"multipart/form-data":{"schema":{"properties":{"file":{"type":"string","format":"binary","description":"The CV file: PDF with a text layer, DOCX or TXT, max 5 MB (scanned PDFs are not OCR'd)"}},"type":"object","required":["file"]}},"application/json":{"schema":{"properties":{"text":{"type":"string","description":"The CV as plain text, up to 100,000 characters","example":"Jordan Rivera\nSenior Software Engineer\njordan@example.com\n\nEXPERIENCE\nSenior Software Engineer, Northwind\nMar 2021 - Present\n- Python, AWS, Kubernetes"}},"type":"object","required":["text"]},"example":{"text":"Jordan Rivera\nSenior Software Engineer\njordan@example.com\n\nEXPERIENCE\nSenior Software Engineer, Northwind\nMar 2021 - Present\n- Python, AWS, Kubernetes"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/match":{"post":{"tags":["Match"],"summary":"Score a resume against a job posting (0-100, with breakdown)","description":"Send `resume` (CV text, or the JSON returned by /v1/resume/parse) and `job` (`title` required; `location`, `description` and `company` optional). Returns a 0-100 `score`, a `breakdown` per component (skills 0.45, seniority 0.20, function 0.15, experience 0.15, location 0.05; components with no data are left out and the rest rescaled), matched / missing / extra skills and one reason per component. Same input, same score.","operationId":"matchResumeToJob","requestBody":{"content":{"application/json":{"schema":{"properties":{"resume":{"oneOf":[{"type":"string"},{"type":"object"}],"description":"The CV as plain text, or the JSON object returned by /v1/resume/parse"},"job":{"properties":{"title":{"type":"string","description":"Job title","example":"Senior Backend Engineer"},"location":{"type":"string","description":"Location or remote policy as written in the posting","example":"Remote - US"},"description":{"type":"string","description":"Job description, plain text or HTML (skills and years of experience are read from it)","example":"5+ years Python, Django, PostgreSQL, AWS."},"company":{"type":"string","description":"Company name, stripped from the title if repeated there","example":"Northwind"}},"type":"object","required":["title"]}},"type":"object","required":["resume","job"]},"example":{"resume":"Jordan Rivera\nSenior Software Engineer\njordan@example.com\n\nEXPERIENCE\nSenior Software Engineer, Northwind\nMar 2021 - Present\n- Python, AWS, Kubernetes","job":{"title":"Senior Backend Engineer","location":"Remote - US","description":"5+ years Python, Django, PostgreSQL, AWS."}}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/taxonomy":{"get":{"tags":["Reference"],"summary":"List seniority levels, job functions and match weights","description":"Returns the seniority levels, job functions, match weights, accepted file types and file size limit used by the parser and the matcher (shared with the Job Posting Parser API).","operationId":"getTaxonomy","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}