Parse a Resume in Python: PDF to JSON in Under 30 Lines   [ResumeParser.pro](https://resumeparser.pro)

 - [Parsing API](https://resumeparser.pro/resume-parsing-api)
- [Match Score API](https://resumeparser.pro/resume-job-match-score-api)
- [Sample JSON](https://resumeparser.pro/resume-to-json)
- [Guides](https://resumeparser.pro/guides)
- [Glossary](https://resumeparser.pro/glossary)
- [Get API key](https://sharpapi.com/en/resume-parsing-api?utm_source=resumeparser.pro&utm_medium=referral&utm_campaign=parse-resume-python&utm_content=nav)

   1. [Home](https://resumeparser.pro)
2. [Guides](https://resumeparser.pro/guides)
3. Parse a Resume to JSON in Python

 Parse a Resume to JSON in Python
================================

No spaCy, no models, no GPU: the extraction happens server-side. Your Python's whole job is uploading a file and reading JSON. Two ways to do it below; both fit in one screen.

Updated 9 August 2026 · by the SharpAPI team

  To parse a resume in Python, POST the file to the SharpAPI parse\_resume endpoint and poll the returned status URL until the job succeeds. The response carries 50+ structured fields. Total code: under 30 lines with requests, under 10 with the official SDK.

Option 1 — the official SDK
---------------------------

Install once, and the polling loop disappears:

  pip install sharpapi ```
from sharpapi import SharpApiService

sharp_api = SharpApiService(api_key='YOUR_SHARP_API_KEY')

status_url = sharp_api.parse_resume(
    file_path='resumes/candidate.pdf',
    language='English',  # optional
)

parsed_resume = sharp_api.fetch_results(status_url)
print(parsed_resume.get_result_json())
```

Option 2 — plain requests, full control
---------------------------------------

 If you would rather see the whole HTTP conversation — or you are wiring this into an existing client — the raw flow is two calls:

  parse\_resume.py — requests only ```
import time
import requests

API_KEY = 'YOUR_SHARP_API_KEY'
HEADERS = {'Authorization': f'Bearer {API_KEY}'}

# 1. Submit the file — returns 202 + a status URL immediately
with open('resumes/candidate.pdf', 'rb') as fh:
    submit = requests.post(
        'https://sharpapi.com/api/v1/hr/parse_resume',
        headers=HEADERS,
        files={'file': ('candidate.pdf', fh, 'application/pdf')},
        data={'language': 'English'},
    )
submit.raise_for_status()
status_url = submit.json()['status_url']

# 2. Poll until the job finishes (typically a few seconds)
while True:
    job = requests.get(status_url, headers=HEADERS).json()
    if job['data']['attributes']['status'] in ('success', 'failed'):
        break
    time.sleep(2)

result = job['data']['attributes']['result']
print(result['candidate_name'])
for position in result['positions']:
    print(f"- {position['position_name']} @ {position['company_name']}")
```

What comes back
---------------

 result is the full deterministic schema — candidate profile, positions\[\] with per-role skills, education\_qualifications\[\] with normalized degrees, plus derived signals like years\_of\_experience. [Explore the complete payload](https://resumeparser.pro/resume-to-json) before you write your models — one Pydantic class covers every response.

Production notes
----------------

- **Skip polling at scale.** Pass a webhook URL with the submission and receive results push-style — essential once you parse in [bulk](https://resumeparser.pro/guides/bulk-resume-parsing).
- **Handle the failed status.** Corrupt files and password-protected PDFs fail cleanly; log the job id and move on.
- **Photos work too.** JPG/PNG/TIFF go through the same call — OCR is server-side, so the code above already handles scanned resumes.

 Parse your first resume today
-----------------------------

Send a PDF, DOCX or photo CV to the SharpAPI Resume Parsing API and get 50+ structured JSON fields back — no models to train, no OCR vendor to add.

 [Start parsing free](https://sharpapi.com/en/resume-parsing-api?utm_source=resumeparser.pro&utm_medium=referral&utm_campaign=parse-resume-python&utm_content=article-end) [Endpoint docs](https://sharpapi.com/documentation?utm_source=resumeparser.pro&utm_medium=referral&utm_campaign=parse-resume-python&utm_content=article-end-docs) 

14-day trial · 100,000 words included · No credit card · 30-day money-back guarantee

 Questions, answered
-------------------

  Is there an official Python SDK for resume parsing?Yes — pip install sharpapi gives you SharpApiService with a parse\_resume(file\_path, language) method and a fetch\_results(status\_url) helper that handles the polling loop for you.

   Do I need any ML or NLP libraries installed?No. The extraction runs server-side; your Python code only uploads a file and reads JSON. The requests library — or the SDK — is the entire dependency footprint.

   How do I handle the asynchronous flow in Python?The POST returns a status URL immediately. Poll it every second or two until status is success, or skip polling entirely by passing a webhook URL and receiving the result push-style.

   Further reading
---------------

- [Parse a Resume in Node.js: Async PDF to JSON Tutorial](https://resumeparser.pro/guides/parse-resume-nodejs) Node.js tutorial for resume parsing: multipart upload with fetch, async job polling, typed access to 50+ candidate fields. Copy-paste ready.
- [Parse a Resume in PHP &amp; Laravel: 2 Packages, 15 Minutes](https://resumeparser.pro/guides/parse-resume-php-laravel) Use the official PHP or Laravel SDK to parse resumes into structured JSON: install, one service call, webhook or polling — full code included.
- [Resume Parsing API — PDF, DOCX &amp; Photo CVs to JSON (80+ Langs)](https://resumeparser.pro/resume-parsing-api) AI resume parsing API: send a PDF, DOCX, RTF, TXT or photo CV, get back 50+ structured JSON fields. 80+ languages, OCR included, async REST, from $50/mo.
- [Resume to JSON — Explore a Real Parsed Output (50+ Fields)](https://resumeparser.pro/resume-to-json) Explore a real resume-to-JSON conversion: every field a production parser extracts, plus a full 20-dimension job match score payload. No signup needed.

    ResumeParser.pro — a free resource on resume parsing and candidate matching, written and maintained by the team behind [SharpAPI](https://sharpapi.com/?utm_source=resumeparser.pro&utm_medium=referral&utm_campaign=parse-resume-python&utm_content=footer). The APIs documented here: [Resume Parsing API](https://sharpapi.com/en/resume-parsing-api?utm_source=resumeparser.pro&utm_medium=referral&utm_campaign=parse-resume-python&utm_content=footer) and [Resume Job Match Score API](https://sharpapi.com/en/resume-job-match-score-api?utm_source=resumeparser.pro&utm_medium=referral&utm_campaign=parse-resume-python&utm_content=footer). SDKs on [GitHub](https://github.com/sharpapi).

 On this site: [What is resume parsing](https://resumeparser.pro/what-is-resume-parsing)·[How parsing works](https://resumeparser.pro/how-does-resume-parsing-work)·[Extracted fields](https://resumeparser.pro/what-fields-does-a-resume-parser-extract)·[Resume to JSON](https://resumeparser.pro/resume-to-json)·[Best parser APIs](https://resumeparser.pro/guides/best-resume-parser-apis)·[All guides](https://resumeparser.pro/guides)·[Glossary](https://resumeparser.pro/glossary)·[About](https://resumeparser.pro/about)

 No cookies, no tracking pixels, no popups. © 2026 [A2Z Web](https://a2zweb.co).

 A Markdown version of this page is available at https://resumeparser.pro/guides/parse-resume-python.md, optimized for AI and LLM tools.
