Sign inSign up

affinda/job-description-parser

By affinda

Updated about 1 month ago

Image
0

370

affinda/job-description-parser repository overview

Affinda Job Description Parser

A self-hosted job description parsing appliance in a single Docker container. Drop in a job description — PDF, DOCX, TXT, or HTML export — and get clean, structured JSON: title, seniority, work arrangement, requirements, responsibilities, skills with taxonomy IDs, compensation, and more. Your documents never leave your infrastructure.

Quick start

docker run --rm -p 8080:8080 affinda/job-description-parser

Open http://localhost:8080 — drag a job description onto the page, or POST it to the API:

curl -F "[email protected]" http://localhost:8080/v1/parse

Full documentation (runbook, API reference, troubleshooting) is served by the container itself at /docs.

Every response is a {data, meta} envelope. data is designed to render without ceremony — one field per fact, null when the posting doesn't say:

{
  "jobTitle": "Staff Software Engineer",
  "workArrangement": "hybrid",
  "seniorityLevel": "senior",
  "experience": { "text": "10+ years'", "minimumYears": 10, "maximumYears": null },
  "compensation": {
    "mentioned": true, "disclosed": false,
    "base": { "text": "Competitive senior-level salary…", "minimum": null,
              "maximum": null, "currency": null, "period": null },
    "additional": []
  },
  "requirements": [ { "text": "10+ years' experience building…", "disposition": null } ],
  "responsibilities": [ "Take technical ownership of new software projects…" ],
  "skill": [ { "text": "full-stack", "name": "Full Stack Development",
               "emsiId": "ES3937EEC3D5D7345412", "escoId": "83b33952-…",
               "disposition": null,
               "sources": [ { "section": "requirements", "position": 1 } ] } ]
}

Skills carry EMSI and ESCO taxonomy IDs and a container-computed link back to the requirement or responsibility that mentions them — no span arithmetic on your side. Provenance for every extracted fact ships in meta.evidence; pass ?include=rawText if you want the parsed text echoed back.

Non-JD documents (resumes, invoices, contracts) are classified rather than mis-parsed: check meta.document.classification.

Licensing — your resume parser licence works here

Evaluate first, license when ready:

  • Evaluation — built in. Pull the image and parse immediately; the container tracks your free-parse allowance locally. No account, no phone-home: parsing and licence verification run fully offline.
  • Licensed — Affinda self-hosted licences are fungible across the resume parser and this container: if you already hold a licence key for affinda/resume-parser, set it here unchanged (-e AFFINDA_LICENSE_TOKEN=...). New keys: https://resume-parser.affinda.com/self-hosted. Verification is offline against keys built into the image, so air-gapped deployments work.

What it handles

English, French, and German job postings; job-board exports with scraper/portal chrome (detected and stripped); multi-page postings; messy real-world formatting. Long plain-text exports are the hardest family — the classification and segmentation telemetry in meta tells you when the parser was uncertain rather than pretending it wasn't.

Performance

Measurements, not SLAs: CPU-only container, ~0.6–0.9 s per typical one-page posting (p50), single worker. Detailed numbers and the replay methodology ship with the release-gate receipts in the image.

Support

[email protected] — RC feedback is especially welcome on the response schema and integration ergonomics.

Tag summary

Content type

Image

Digest

sha256:7580aac83

Size

1.4 GB

Last updated

about 1 month ago

docker pull affinda/job-description-parser