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.
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.
Evaluate first, license when ready:
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.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.
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.
[email protected] — RC feedback is especially welcome on the response schema and integration ergonomics.
Content type
Image
Digest
sha256:7580aac83…
Size
1.4 GB
Last updated
about 1 month ago
docker pull affinda/job-description-parser