Job Postings Scraper — fill-rate report avatar

Job Postings Scraper — fill-rate report

Pricing

from $2.50 / 1,000 job listing rows

Go to Apify Store
Job Postings Scraper — fill-rate report

Job Postings Scraper — fill-rate report

Search a job title and a place to get structured listings: title, company, location and a direct apply link on essentially every row. The real fill-rate of salary, applicant count and full description is measured and published for every run.

Pricing

from $2.50 / 1,000 job listing rows

Rating

0.0

(0)

Developer

RankFabrik Team

RankFabrik Team

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

13 days ago

Last modified

Share

Job Listings Scraper — title, company, location and a direct link on every row

Give it a job title and a place, and it returns structured job listings ready to work: a title, a company, a location and a direct link to apply on essentially every row, because those are the fields the source itself always publishes.

The fields that tell you whether a listing is worth pursuing (salary, applicant count, a full description) are published unevenly, and most job scrapers only let you find that out after the run is paid for. This one measures the real fill-rate of those fields and puts it in front of you before you commit your budget, so you never pay to discover a search was thin.

Unofficial tool — not affiliated. This is an independent tool. It is not affiliated with, endorsed by, or sponsored by LinkedIn, Indeed, or any other third-party service. All product names, logos and brands are the property of their respective owners and are used for identification only.


Source disclosed, no login scraped

This actor reads the public, logged-out job listing channel: no account, no session, no protection bypassed. It accesses only what is already visible to any anonymous visitor.

You see the fill-rate before you pay, not after

Most scrapers work in the dark: you pay, you run, and only then learn how many rows carry a salary or an applicant count. This one turns that around. Every run reports the live fill-rate of salary, url and — with the full fiche on — applicantsCount, in two places: the run's status message while it works, and a batchCompleteness block on every single row. Start small, read the real numbers for your exact search, and scale up only when they look worth it. A search that returns nothing is never billed either — see Pricing.


What you get

One row per job listing, deduplicated on the listing identifier when the source provides one, on title + company + location otherwise:

FieldNotes
idsource listing identifier, or null when the source omits it
titlejob title
companycompany name
locationraw location string as published
city, region, countryparsed from location — no extra request
publishedpublication date (ISO), when the source dates the card
salarysalary as published, or null — see Known limits
urldirect link to the listing
logocompany logo URL, or null
enrichedtrue when both salary and url are present
batchCompletenessthe completeness percentages of this run

With Fetch the full listing for each job turned on, every row also gets:

FieldNotes
descriptionfull job description, plain text
descriptionLengthcharacter count — a quick filter for thin postings
seniorityseniority level, as labeled by the source
employmentTypecontract type (full-time, contract, internship…)
jobFunctionjob function
industriesindustry
applicantsCountapplicant count, or null — see Known limits
applicantsCountCappedtrue when the source's own display cap was hit

No field is ever inferred. If the source does not publish a salary, you get a clean null — never a plausible-looking figure invented by a language model to fill the gap. A made-up salary looks like data right up until it misleads a hiring decision, so we would rather hand you an honest blank.

The batchCompleteness percentages mirror exactly what the source publishes, not what we drop. A low or 0% salary reading simply means the source does not expose that field for those listings — and because you read it before you pay, an empty field is never a surprise you discover after the run.


Example output — one row, illustrative

{
"id": "4446697394",
"title": "Full-Stack Developer",
"company": "Example Inc",
"location": "Austin, Texas, United States",
"city": "Austin",
"region": "Texas",
"country": "United States",
"published": "2026-08-10",
"salary": null,
"url": "https://www.linkedin.com/jobs/view/4446697394",
"logo": null,
"enriched": false,
"batchCompleteness": {
"title": 100,
"company": 99,
"location": 100,
"salary": 9,
"url": 100,
"published": 87
}
}

This row shows exactly what "no field is ever inferred" means in practice: salary is null because the source didn't publish one for this listing: not a guess, not a blank filled in. With Fetch the full listing for each job on, this same row also carries description, descriptionLength, seniority, employmentType, jobFunction, industries, applicantsCount and applicantsCountCapped.


Good to know before you run it

Published up front, not buried in a changelog — so there are no surprises.

  • Salary is rarely published. Most listings carry no salary field at all — that is a property of the source, not of the tool. batchCompleteness.salary tells you the real rate for your exact search, every run.
  • The source hard-stops at 1000 positions per query. Beyond that, nothing is served, at all — segmenting the same search re-opens a fresh thousand. This actor does that for you: add cities in Extra cities to sweep, or turn on Also sweep the 3 publish-date windows to split by publish-date window (24 h / 7 d / 30 d) as well. Measured on one search: 929 listings on a single US query rose to 2,727 with the three windows added, and 5,028 with eight cities.
  • Applicant count is capped by the source at 200. applicantsCountCapped: true tells you the real number is 200 or more, not exactly 200.
  • Full-listing mode costs one extra request per listing. With Fetch the full listing for each job on, expect roughly double the run time for the same result count. The source also occasionally refuses an individual listing even when its card loaded fine; that row is returned without the extra fields rather than dropped.
  • An empty result is never charged. If the source refuses the request or the search is genuinely empty, the run reports it and bills you nothing.

Input

FieldRequiredDefaultMeaning
jobTitleyesjob title or keywords, in plain words
locationnoUnited Statescountry, region or city
maxResultsno100hard ceiling on delivered (and billed) rows
fullDetailsnofalsefetch description, seniority, contract type, applicant count
datePostednoany timerestrict to last 24 h / 7 d / 30 d
remoteOnlynoall listingsremote-only
experienceLevelnoall levelsseniority filter
extraCitiesno[]extra cities to sweep, each one a fresh 1000-position budget
sweepDateWindowsnofalsealso sweep all 3 publish-date windows, ×3 requests

Example:

{
"jobTitle": "software engineer",
"location": "United States",
"maxResults": 300,
"fullDetails": true,
"datePosted": "r604800"
}

Pricing

Pay per result, in two tiers, because not all rows are worth the same to you:

EventPriceWhat it is
job$2.50 per 1,000 rowsa job listing row
job-complete$4.00 per 1,000 rowsa row with both a published salary and a direct link

You are charged per row written to your dataset, and for nothing else. Failed runs, refused requests and empty searches cost you zero. Your own spending cap is enforced by the platform — the run stops cleanly when it is reached, mid-dataset, without burning compute you did not authorise.


Prefer a hosted API with a flat monthly plan?

This actor bills per result on the Apify platform. If you'd rather call a hosted endpoint with your own key, a flat monthly quota, and the same completeness block on every response, the same data ships as a standalone API:

  • Jobs API — built for volume past the 1,000-result-per-query wall this actor works around by sweeping cities and publish-date windows. See the full pricing breakdown: https://rankfabrik.com/jobs-api-pricing
  • Sibling APIs on the same principle: Places (local business data, one flat unit per enriched record) and YouTube transcripts (human-vs-auto caption transparency).

Both share one engine and report the same measured fill rate. Pick the billing model that fits your workload.


Your responsibility as the user. You are solely responsible for how you use the data this tool returns, including compliance with applicable laws, the source's terms, and data-protection rules where they apply. Job listings are mostly company, role and location data rather than personal data, but any personal detail (a named recruiter, for instance) is yours to handle lawfully: you act as the data controller for it. We provide a data-access tool and grant no license over third-party content.

Removal requests. To have a specific record removed, contact contact@rankfabrik.com. Justified requests are processed promptly (target: within 30 days).


Support

Have a question or hit a bad run? Open the actor's Issues tab and quote the run. Every execution logs its completeness figures, so we both start from the same numbers rather than from guesswork.