Skip to main content

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)

Source distribution for resumereaderapi 1.0.0
File Size Uploaded Provenance
resumereaderapi-1.0.0.tar.gz 6.2 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for resumereaderapi 1.0.0
File Interpreter ABI Platform
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.

Release history Release notifications | RSS feed

This release

1.0.0 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page