resumereaderapi (Python)
Resume parser client for Python. Hand it a PDF, a DOCX, a scan or raw text and get structured candidate data back as a dictionary.
Needs requests. Python 3.7 and later.
pip install resumereaderapi
Why use a hosted resume parser
Writing regular expressions for CVs is a trap. Layouts vary, languages vary, and half the documents are scans. A hosted resume parser gives you one stable shape no matter what the candidate uploaded.
The service behind this package is the resume parser from Alpha Quantum. It returns 114 fields and marks missing facts as None instead of guessing.
Parse in three lines
from resumereaderapi import ResumeReader
rr = ResumeReader("YOUR_API_KEY")
data = rr.parse_file("cv.pdf")
print(data["resume"]["contact"]["emails"])
print(data["remaining_credits"])
Calls
rr.parse_text(text, field_names=None, exclude_sensitive=False, anonymize=False,
max_pages=None, sections=None, language=None)
rr.parse_file(path, ...same options...)
rr.parse_url(https_url, ...same options...)
rr.normalize_titles(["Sr. SWE II"])
rr.normalize_skills(["K8s", "JS"])
rr.normalize_locations(["NYC"])
Normalizer methods batch in groups of 100 and return {"results": [...], "credits_used": float, "remaining_credits": float}.
Skill normalization in practice
Candidates write the same skill ten ways. JS, Javascript and java script should be one filter value.
raw = ["JS", "Javascript", "Python 3.11", "py", "MS Excel", "n/a"]
out = rr.normalize_skills(raw)
for item in out["results"]:
print(item["input"], "->", item["normalized_skill"], item["skill_type"])
Junk entries such as "n/a" come back with normalized_skill set to None. See the skill normalization page for fifty real examples.
Anonymize before a human sees the CV
data = rr.parse_file(
"cv.docx",
anonymize=True,
exclude_sensitive=True,
)
Names, contact values and sensitive fields become placeholders such as [NAME] and [EMAIL]. This is the base of a blind review process, covered under CV anonymization.
Handle errors
from resumereaderapi import ResumeReaderError
try:
rr.parse_file(path)
except ResumeReaderError as exc:
if exc.status == 402:
print("buy more credits")
elif exc.status in (413, 422):
print("bad document:", exc)
else:
raise
Example: into a DataFrame
import pandas as pd
from pathlib import Path
rows = []
for p in Path("cvs").glob("*.pdf"):
r = rr.parse_file(str(p))["resume"]
rows.append({
"name": r["contact"]["full_name"],
"city": r["contact"]["address"]["city"],
"title": (r["career"]["current_position"] or {}).get("title"),
"years": r["career"]["total_experience_years"],
"skills": ", ".join(r["skills"]["technical"]),
})
pd.DataFrame(rows).to_csv("candidates.csv", index=False)
Example: Flask upload endpoint
from flask import Flask, request, jsonify
import tempfile, os
app = Flask(__name__)
@app.post("/parse")
def parse():
f = request.files["cv"]
with tempfile.NamedTemporaryFile(delete=False, suffix=os.path.splitext(f.filename)[1]) as tmp:
f.save(tmp.name)
try:
return jsonify(rr.parse_file(tmp.name)["resume"])
finally:
os.unlink(tmp.name)
Questions
What file types? PDF, DOCX, TXT, RTF, HTML, ODT, spreadsheets and images including scanned PDFs.
Is there a limit per call? 10 MB, 20 pages and about 30,000 tokens.
Does it work in French? Pass field_names="fr" for French keys. Values keep the language of the resume.
MIT license. Contact: info@alpha-quantum.com
Metadata
Release files for resumereaderapi 1.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| resumereaderapi-1.0.0.tar.gz | 6.2 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| resumereaderapi-1.0.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 12.4 kB
Release files / resumereaderapi-1.0.0.tar.gz
| Download URL | resumereaderapi-1.0.0.tar.gz |
|---|---|
| Size | 6.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
129bb95b2768ccfa780aecac5c0b40fb43461cbc552500b700d7ac4c2e3e2467
|
|
BLAKE2b-256 checksum How to use checksums |
36e1b9f08631381e8eda8090c7d303a69740fbe1c85f4b45d93435ef783a2e75
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.8.10
|
Release files / resumereaderapi-1.0.0-py3-none-any.whl
| Download URL | resumereaderapi-1.0.0-py3-none-any.whl |
|---|---|
| Size | 6.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
fa52cec52883225a5dad135b0d9b3e8b7b0e026a81b60b3f92a23aa63e0eaf89
|
|
BLAKE2b-256 checksum How to use checksums |
245e7dd0117d44a2e351eb71823410ce811dd1639d061cad6268ef936d7a853e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.8.10
|
Security for resumereaderapi 1.0.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.