Job Posting Parser API

Job Posting Parser API is a hosted REST API that turns a job posting (title, location and description as text or HTML) into structured JSON: seniority, job function, remote/hybrid/onsite with the countries and regions allowed, annualized salary, skills and flags such as visa sponsorship. It is rules-based with no LLM, so the same input always gives the same output, and every label comes with a reason.

Get an API key

Quick start

Call POST /v1/parse with a JSON posting. Only title is required; the description (text or HTML) is where salary, skills, experience and flags come from.

curl -X POST "https://job-posting-parser.p.rapidapi.com/v1/parse" \
  -H "Content-Type: application/json" \
  -H "X-RapidAPI-Key: YOUR_KEY" -H "X-RapidAPI-Host: job-posting-parser.p.rapidapi.com" \
  -d '{"title": "Sr. Backend Engineer (Python) - Remote, US", "location": "Remote - US", "description": "Fully remote, open to candidates based in the United States or Canada. Base salary $160,000 - $200,000 per year plus equity. 5+ years of experience with Python, Django and PostgreSQL. We are unable to sponsor visas. Full-time.", "company": "Acme"}'

Response (this is the real output for the request above, trimmed):

{
  "normalized_title": "Senior Backend Engineer (Python)",
  "seniority": {"level": "senior", "confidence": 0.85},
  "function": {"name": "engineering", "confidence": 0.9, "specialty": "backend"},
  "remote": {"type": "remote", "confidence": 0.9, "regions_allowed": ["US", "CA"], "timezones": []},
  "salary": {"min": 160000, "max": 200000, "currency": "USD", "period": "year", "text": "$160,000 - $200,000", "annualized_min": 160000, "annualized_max": 200000},
  "employment_type": "full_time",
  "experience_years": {"min": 5, "max": null},
  "skills": ["Python", "Django", "PostgreSQL"],
  "flags": {"visa_sponsorship": false, "equity_offered": true},
  "reasons": ["title: removed 'Remote, US'", "seniority=senior: title contains 'Senior'", "function=engineering: title contains 'Backend'", "…"]
}

Endpoints

MethodPathWhat it does
POST/v1/parseParses one posting
POST/v1/parse/batchParses 1 to 20 postings: {"postings": [...]}
GET/v1/taxonomyLists every value the parser can return (levels, functions, regions, skills, limits)

Request fields

NameRequiredWhat it does
titleyesJob title as posted, up to 300 characters
locationnoLocation as posted, e.g. "Remote - US" or "Hybrid (London)"
descriptionnoFull description, plain text or HTML, up to 50,000 characters
companynoCompany name, stripped from the title and skills

Response fields

FieldValues
seniority.levelintern, junior, mid, senior, staff, principal, lead, manager, director, exec
function.nameengineering, data, design, product, marketing, sales, support, ops, finance, hr, legal, other, plus specialty for engineering and data (backend, frontend, ml_ai, devops_sre, …)
remotetype (remote, hybrid, onsite, unknown), regions_allowed (ISO country codes and region slugs), timezones
salarymin, max, currency, period (hour, day, week, month, year), annualized_min, annualized_max, or null
employment_typefull_time, part_time, contract, temporary, internship, freelance, unknown
experience_yearsmin and max years, or null
skillsTechnologies and tools found (114 known skills)
flagsvisa_sponsorship (true, false or null), security clearance, equity, relocation, travel, degree and whether required, languages required, talent-pool posting, AI/ML role
reasonsOne human-readable reason per label, e.g. seniority=senior: title contains 'Senior'

Full schema: openapi.json.

Accuracy

Measured on real postings (title and location only), reproducible from the repo's fixtures.

SetnSeniorityFunctionRemote typeRegions
Held-out, labelled blind, before tuning on it4495.5%68.2%97.7%93.2%
Held-out after one round of generic fixes4497.7%93.2%100%95.5%

Pricing

PlanPriceRequestsOver the limit
BASIC (RapidAPI)Free100 / monthHard limit
PRO (RapidAPI)$9.99 / month10,000 / month$0.002 per request
ULTRA (RapidAPI)$29.99 / month60,000 / month$0.0015 per request
MEGA (RapidAPI)$99 / month300,000 / month$0.001 per request
Apify ActorPay per resultUp to 1,000 postings per run$0.002 per posting

How it compares

OptionHow it worksPrice
Job Posting Parser APIHosted REST API, rules-based, a reason for every labelFree 100/month; $9.99 for 10,000; Apify $2 per 1,000
Apify "Job Description Normalizer"Apify Actor for similar fields (skills, seniority, pay, visa, remote type)About $2.57 per 1,000
Textkernel parserEnterprise CV and job parsing suiteFree 500 credits, then from about $99 / month
Affinda job description parserEnterprise document AIAbout $800 for 6,000 credits
Prompting an LLM (ChatGPT, Claude)Free-form extraction you write and maintainPer token; output can vary between calls

Frequently asked questions

How do I extract salary, seniority and remote location from a job posting?

Send the posting's title, location and description to POST /v1/parse. Job Posting Parser API returns the seniority level, job function, remote type with allowed countries and regions, the salary range with currency, period and an annualized min and max, employment type, years of experience, skills and flags, each with a human-readable reason.

Is there an API that tells me which countries a remote job is open to?

Yes. Job Posting Parser API returns remote.regions_allowed: ISO country codes such as US or DE and region slugs such as worldwide, emea, europe or latam. They come from the title, the location and eligibility sentences in the description ("must be based in…", "open to candidates in…"); office lists are ignored.

How do I normalize job titles and seniority levels across job boards?

Job Posting Parser API cleans the title (gender tags such as m/w/d, requisition IDs, "Remote - US" suffixes and pay snippets are removed, Sr./Mgr/SWE are expanded) and maps it to one of 10 levels: intern, junior, mid, senior, staff, principal, lead, manager, director, exec. People managers are kept apart from IC titles such as Product Manager, and II, III and L5 are understood.

How do I annualize hourly, daily or monthly salaries from job ads?

Job Posting Parser API detects the pay period and annualizes with 2,080 hours, 260 days, 52 weeks or 12 months a year. It reads $, €, £, 30 ISO currency codes, European number formats (€60.000, CHF 120'000), k-ranges and "up to" amounts, and ignores funding rounds, stipends and 401(k).

How accurate is Job Posting Parser API?

On 44 real held-out postings (title and location only): seniority 97.7%, job function 93.2%, remote type 100% and allowed regions 95.5%. Before one round of generic fixes the same set scored 95.5%, 68.2%, 97.7% and 93.2%. Job function is the weakest field because many titles are ambiguous.

Should I use ChatGPT or another LLM to parse job descriptions instead?

An LLM handles any wording but can return different answers for the same posting and costs tokens per call. Job Posting Parser API is deterministic, takes about 1 ms per posting and explains every label, so results are consistent filters you can audit. Use an LLM for free-form questions about a posting; use this API for the same fixed fields on every posting.

How much does Job Posting Parser API cost?

On RapidAPI: free for 100 requests a month, then $9.99 for 10,000, $29.99 for 60,000 and $99 for 300,000 a month. On Apify it is pay per result at $0.002 per posting ($2 per 1,000).

Can I parse thousands of job postings in bulk?

Yes. POST /v1/parse/batch takes 1 to 20 postings per call. For a large list, the Apify Actor takes up to 1,000 postings per run and writes one dataset row per posting, charged per posting; empty postings are skipped and not charged.

Does it store the job postings I send?

No. The API is stateless: there is no database, nothing is written to disk, and it makes no outbound calls.

Last updated 2026-10-24. Machine-readable summary: llms.txt.