Job Post Parser — Structured Jobs & Skills (AI) avatar

Job Post Parser — Structured Jobs & Skills (AI)

Pricing

from $100.00 / 1,000 job parseds

Go to Apify Store
Job Post Parser — Structured Jobs & Skills (AI)

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

Fredrik Hansson

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 hours ago

Last modified

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 job
job posting URL ──────────► got-scraping → cheerio ──► title · seniority · skills
or raw description text → OpenAI (grounded) salary · tech stack · clarity
  1. 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.
  2. AI parses each job (OpenAI gpt-4o-mini, a fast, low-cost model), grounded strictly in the supplied text. Anything not stated comes back null; every field is written in English even if the source isn't.
  3. 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:

  1. Title & level — jobTitle, normalizedTitle (a clean canonical title like "Senior Backend Engineer"), seniority (intern / junior / mid / senior / lead / manager / director / exec), department, employmentType.
  2. Company & location — companyName, location, remotePolicy (onsite / hybrid / remote).
  3. Compensation — salaryMin, salaryMax, salaryCurrency, salaryPeriod (year / month / hour) — only when disclosed.
  4. Skills & stack — skills (normalized skill names) and techStack (languages, frameworks, tools, platforms).
  5. The fine print — requirements, responsibilities, niceToHaves, yearsExperienceMin.
  6. Quality signal — clarityScore (0–100: how clear, complete and candidate-friendly the posting is), clarityNotes (one sentence), and redFlags (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

FieldTypeNotes
jobUrlsarrayJob posting URLs to fetch and parse. One per line.
jobTextsarrayAlternative/addition to URLs — paste raw job description text directly, one job per entry.
maxResultsintegerCap how many jobs to process across URLs + texts. Default 200.
maxConcurrencyintegerJobs processed in parallel. Default 5.
modelstringOverride 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:

EventCharged whenPrice
job-parsedOnce 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.json
export 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.


  • 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.