Job Post Parser — Structured Jobs & Skills (AI)
Pricing
from $100.00 / 1,000 job parseds
Job Post Parser — Structured Jobs & Skills (AI)
Turn any job posting URL or pasted text into clean structured data: title, seniority, skills, requirements, responsibilities, salary, location, remote policy and tech stack — plus an AI clarity score. For recruiters, job boards and talent-market analytics.
Pricing
from $100.00 / 1,000 job parseds
Rating
0.0
(0)
Developer
Fredrik Hansson
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 hours ago
Last modified
Categories
Share
Turns any job posting into clean, structured data your systems can actually use. Hand it a job posting URL or paste the raw job description text, and this Actor returns one tidy JSON record per job: normalized title, seniority, department, employment type, company, location, remote policy, salary range, skills, tech stack, requirements, responsibilities, nice-to-haves, years of experience — plus an AI clarity score and a list of red flags.
You bring job URLs or text. It hands back structured jobs ready for your ATS, job board, or analytics warehouse.
The flow
1. Give a job URL or paste text 2. Fetch + clean + AI parse 3. Get a structured jobjob posting URL ──────────► got-scraping → cheerio ──► title · seniority · skillsor raw description text → OpenAI (grounded) salary · tech stack · clarity
- Give it job posting URLs (
jobUrls) — the Actor fetches each page and strips it to clean text — or paste raw job description text (jobTexts) when you already have the copy. Mix both in one run. - AI parses each job (OpenAI
gpt-4o-mini, a fast, low-cost model), grounded strictly in the supplied text. Anything not stated comes backnull; every field is written in English even if the source isn't. - Get one structured record per job, charged once via a single pay-per-event — ready to push straight into a database, spreadsheet or pipeline.
What you get per job
For every job posting, the Actor extracts:
- Title & level —
jobTitle,normalizedTitle(a clean canonical title like "Senior Backend Engineer"),seniority(intern/junior/mid/senior/lead/manager/director/exec),department,employmentType. - Company & location —
companyName,location,remotePolicy(onsite/hybrid/remote). - Compensation —
salaryMin,salaryMax,salaryCurrency,salaryPeriod(year/month/hour) — only when disclosed. - Skills & stack —
skills(normalized skill names) andtechStack(languages, frameworks, tools, platforms). - The fine print —
requirements,responsibilities,niceToHaves,yearsExperienceMin. - Quality signal —
clarityScore(0–100: how clear, complete and candidate-friendly the posting is),clarityNotes(one sentence), andredFlags(e.g. "no salary disclosed", "vague responsibilities", "unrealistic requirements").
Every field is grounded only in the posting — no invented facts, null when not stated.
Three ways people use it
- Recruiting ops & ATS enrichment — normalize messy inbound job descriptions into a consistent schema, auto-tag seniority, department and skills, and flag low-clarity postings before they go live. Enrich every req in your applicant tracking system with structured skills and salary bands.
- Job board normalization — ingest listings from dozens of sources and parse job descriptions into one clean schema, so filters by title, seniority, remote policy, location and tech stack all work across your whole catalogue.
- Talent-market & skills analytics — turn thousands of postings into a structured dataset for skills-demand trends, salary benchmarking data, hiring-signal tracking, and competitive talent intelligence. Perfect feedstock for dashboards and data warehouses.
Input
| Field | Type | Notes |
|---|---|---|
jobUrls | array | Job posting URLs to fetch and parse. One per line. |
jobTexts | array | Alternative/addition to URLs — paste raw job description text directly, one job per entry. |
maxResults | integer | Cap how many jobs to process across URLs + texts. Default 200. |
maxConcurrency | integer | Jobs processed in parallel. Default 5. |
model | string | Override the OpenAI model. Default gpt-4o-mini. |
Provide at least one of jobUrls or jobTexts.
Minimal input example
{"jobUrls": ["https://example.com/careers/senior-backend-engineer"],"jobTexts": ["Senior Backend Engineer (Remote, US). 5+ years in Go and PostgreSQL to build our payments platform. Requirements: Go, PostgreSQL, Kubernetes, AWS. Salary: $160,000 - $200,000 per year."]}
Output example
{"source": "text","url": null,"jobTitle": "Senior Backend Engineer","normalizedTitle": "Senior Backend Engineer","seniority": "senior","department": "Engineering","employmentType": "full-time","companyName": null,"location": "United States","remotePolicy": "remote","salaryMin": 160000,"salaryMax": 200000,"salaryCurrency": "USD","salaryPeriod": "year","skills": ["Go", "PostgreSQL", "Kubernetes", "AWS", "API design", "Mentoring"],"techStack": ["Go", "PostgreSQL", "Kubernetes", "AWS"],"requirements": ["5+ years backend experience", "Go", "PostgreSQL", "Kubernetes", "AWS"],"responsibilities": ["Design APIs", "Build the payments platform", "Mentor junior engineers"],"niceToHaves": ["Stripe experience"],"yearsExperienceMin": 5,"clarityScore": 82,"clarityNotes": "Clear role, stack and salary, though the company name and benefits are not stated.","redFlags": []}
Records that come from a URL have "source": "url" and the fetched url. Jobs that could not be fetched or parsed come back with success: false and an error message.
Pay-per-event pricing
This Actor uses pay-per-event billing with a single event:
| Event | Charged when | Price |
|---|---|---|
job-parsed | Once per job posting parsed into structured fields — title, seniority, skills, salary, tech stack and an AI clarity score. | $0.10 |
The Actor logs its OpenAI token usage and the estimated AI cost per job at the end of every run, so the event price always stays safely above the model cost (typically a fraction of a cent per job).
Setup
The AI layer calls the OpenAI API. Set the environment variable / secret OPENAI_API_KEY on the Actor. Without it, the run fails fast with a clear message.
Use it from an AI agent (Apify MCP server)
This Actor is available through the Apify MCP server, so AI agents (Claude, ChatGPT, or anything that speaks MCP) can call it as a tool — hand it jobUrls or jobTexts, and read back fully structured jobs — with no custom integration code.
Run it locally
npm install# put your input in storage/key_value_stores/default/INPUT.jsonexport OPENAI_API_KEY=sk-...apify run -p
Chain it
This Actor is a building block in the No Niner B2B suite. Wire it to the next step with no code in the Integrations tab (trigger: Run succeeded → start the next Actor), or run them in sequence.
- ⬆️ Upstream: Career Site Jobs API and B2B Hiring Signal Tracker — pull the postings, then parse each into structured fields.
- 🔁 Use with: B2B Talent Sourcing Brief — turn parsed roles into recruiter account intel.
Related actors
- Career Site Jobs API — Pull every open role from a company's ATS (Greenhouse, Lever, Workday and more) into one clean job schema.
- B2B Hiring Signal Tracker — Track which companies are hiring and for what, turning job-posting activity into buying/growth signals.
- B2B Talent Sourcing Brief — Turn a role into a sourcing brief: target companies, skills and outreach angles for recruiters.
- GitHub Candidate Scorer — Score and rank GitHub developers against a role for technical sourcing.
Part of the No Niner toolkit — no-code web scraping, enrichment & AI data tools, all pay-per-use. Browse the full set at noniner.io.