Salary Data Extraction from Job Listings
Compensation data appears in many forms across job listings. JobsDataAPI normalizes the parts it can structure while preserving the original salary text for display.
What You Get
The API exposes salary through four fields:
salary_min— numeric lower bound when availablesalary_max— numeric upper bound when availablesalary_currency— currency code when availablesalary_text— original employer salary text
Example:
{
"title": "Senior Product Designer",
"salary_min": 140000,
"salary_max": 170000,
"salary_currency": "USD",
"salary_text": "$140k-$170k"
}
If the source does not provide structured compensation, numeric fields may be null. Always handle missing salary gracefully in your UI.
Filtering by Salary
Use the salary query parameter for a range:
curl "$CLEANJOBDATA_API_BASE_URL/jobs?salary=120000,180000&title=engineer" \
-H "Authorization: Bearer $CLEANJOBDATA_API_KEY"
Use min_salary for a simple lower-bound filter:
curl "$CLEANJOBDATA_API_BASE_URL/jobs?min_salary=100000&remote=true" \
-H "Authorization: Bearer $CLEANJOBDATA_API_KEY"
The salary filter is designed to work with incomplete ranges. A job may match when its maximum salary is missing, because the source may not disclose the top of the range.
Displaying Salary
Use salary_text when you want to show the employer's original wording. Use salary_min and salary_max when you want consistent formatting.
function formatSalary(job: Job) {
if (!job.salary_min && !job.salary_max && job.salary_text) {
return job.salary_text;
}
if (!job.salary_min && !job.salary_max) return null;
const currency = job.salary_currency || "USD";
const formatter = new Intl.NumberFormat("en-US", {
style: "currency",
currency,
maximumFractionDigits: 0,
});
const min = job.salary_min ? formatter.format(job.salary_min) : null;
const max = job.salary_max ? formatter.format(job.salary_max) : null;
return [min, max].filter(Boolean).join(" - ");
}
Salary Analytics
Structured salary fields make it possible to build:
- salary range filters
- compensation badges
- average salary by role
- average salary by location
- remote vs on-site comparisons
- seniority-based salary distributions
Keep in mind that salary data is source-dependent. Not every employer discloses compensation, and not every ATS exposes it in a structured way.
Recommended Implementation
- Fetch jobs with
salary_min,salary_max,salary_currency, andsalary_text. - Display structured salary when both numeric bounds exist.
- Fall back to
salary_textwhen structured fields are missing. - Use
salaryormin_salaryfor server-side filtering. - Avoid client-side salary parsing unless you need custom presentation.
Common Pitfalls
- Treating missing salary as zero.
- Assuming all salaries are annual.
- Ignoring currency.
- Parsing salary text in the frontend instead of using structured fields.
- Hiding jobs just because one salary bound is missing.
JobsDataAPI gives you the fields you need to build salary-aware product experiences without writing custom parsers for every source.