Indeed & LinkedIn Jobs Scraper
Pricing
$3.50 / 1,000 job offer delivereds
Indeed & LinkedIn Jobs Scraper
Scrapes job listings from Indeed and LinkedIn into one normalized, deduplicated dataset — never two rows for the same job posted on both sites. You are never charged for a run that delivers zero offers. An Indeed and LinkedIn jobs scraper for job search and recruiting data.
Pricing
$3.50 / 1,000 job offer delivereds
Rating
0.0
(0)
Developer
matheo daney
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Fetch job listings published on Indeed and LinkedIn for a given title and location in a single run, already cleaned up and deduplicated — one row per listing, even when it was posted on both sites at once.
Why this Actor
- One schema, two sites — no need to run a separate Indeed scraper and LinkedIn scraper and then reconcile the results by hand: title, company, location (city/country), remote status, contract type, and salary (min/max/currency/period) arrive already normalized, regardless of the source site.
- Never a billed duplicate — the same listing posted on both Indeed and LinkedIn is delivered only once (the more complete of the two versions), with a record of every source it was found on.
- You only pay for what's delivered, always at the same price — no event is ever charged on a run that delivers zero usable offers, whatever the reason (source outage, an overly narrow search, etc.), and the price per offer never varies by source site. See "Pricing" below.
Sample output (one dataset row)
{"title": "Ingénieur Systèmes et Réseaux - DevOps H/F","company_name": "Exemple Technologies SAS","company_url": "https://fr.indeed.com/cmp/Exemple-Technologies","location_city": "Nanterre","location_country": "FR","remote_type": "hybrid","contract_type": "full_time","salary_min": 55000,"salary_max": 60000,"salary_currency": "EUR","salary_period": "year","description_text": "Nous recherchons un(e) ingénieur systèmes et réseaux pour renforcer notre équipe technique. Poste en CDI à temps plein, télétravail partiel possible.","job_url": "https://fr.indeed.com/viewjob?jk=aaaa1111bbbb2222","apply_url": "https://careers.exemple-employeur.com/vacancy/devops-h-f","published_at": "2026-09-04T05:00:00.000Z","source_site": "indeed","source_actor": "valig/indeed-jobs-scraper","duplicate_of_sources": []}
(Real listing content is in whatever language the original posting used — this example reflects
a French job market listing, since Indeed/LinkedIn France is this Actor's current scope. Fields
location_raw, salary_raw, scraped_at, and dedup_key are omitted here for readability, but
present in the real dataset.) A field that couldn't be determined for a given listing is always
explicit null — never a guessed value.
Country format: location_country is always an ISO 3166-1 alpha-2 code in UPPERCASE (e.g.
"FR"), regardless of which source found the listing — never a full country name ("France").
No region field: unlike city and country, none of the 3 sources behind this Actor (2 for
Indeed, 1 for LinkedIn) expose a usable region/state name in their actual data — so this dataset
does not include a location_region field. If you need a finer breakdown than city, you'll need
to derive it yourself from location_city or description_text.
Salary: salary_min/salary_max are rounded to the nearest whole currency unit (to the cent
for an hourly rate) and set to null if they fall outside a plausible range for their period, or
if their raw precision is absurd (more than 2 decimal places — a sign of an upstream conversion
artifact, never a salary actually displayed by an employer). An unusable salary is always null,
never a questionable value delivered as-is.
Available filters
- Job title / keyword (
query, required) — e.g. "react developer", "accountant". - Location (
location) — city, region, or country. - Remote only (
remoteOnly) — only keepremote/hybridlistings. Note: remote/hybrid status isn't always available from every source, soremote_typeis sometimesunknowneven for a listing that could genuinely be remote. - Contract types (
contractTypes) — full-time, part-time, internship, apprenticeship, freelance, temporary, volunteer. - Include LinkedIn (
enableLinkedin, enabled by default) — see the known limitation below.
⚠️ Actual scope — read before you buy
2 sites, no more: Indeed (via valig/indeed-jobs-scraper as the primary source, with an
automatic fallback to borderline/indeed-scraper if the primary is down) and LinkedIn (via
crawlworks/linkedin-jobs-scraper). This isn't "a lot of sources" — it's a common schema, real
deduplication, and an automatic fallback across 2 sites, not a promise of broader coverage.
The price stays the same no matter which source found the listing — we never pass a variable sourcing cost on to your bill. As a trade-off, if Indeed's primary source is fully down when your run starts, the automatic fallback may deliberately deliver nothing rather than run a more expensive source to collect data: you'd then be charged $0 for that run (see "Pricing" below, "no offer delivered = $0"), never a higher price to compensate.
Known limitation of the LinkedIn source (checked 2026-09-05, source's Store page): since
August 2026, LinkedIn's own Job Type / Experience Level / Work Type filters no longer work on
LinkedIn's side (it switched to AI-driven search) — result matching is done by that AI and is
not guaranteed to be exact. LinkedIn is included by default (this Actor's value is combining
both sites, not scraping Indeed alone) — a LinkedIn outage never fails the run either way. Turn it
off (enableLinkedin: false) if you'd rather use Indeed only.
Remote status isn't always known: remote_type reflects what each source actually exposes.
Indeed's own listings often don't state remote/hybrid status explicitly, and LinkedIn doesn't
expose a dedicated field for it either — in both cases this Actor falls back to scanning the job
description text, which is not as reliable as a dedicated field. Expect a meaningful share of
listings to come back as remote_type: "unknown" rather than a guess.
Pricing
| Unique offers delivered | Price |
|---|---|
| 1 offer | $0.0035 |
| 1,000 offers | $3.50 |
| 10,000 offers | $35.00 |
No offer delivered = $0. A run that finds nothing usable (an overly narrow search, upstream sources down, etc.) charges nothing at all — never a fixed start-up fee, never a charge for a failed run.
Configuration
| Field | Type | Description |
|---|---|---|
query | string (required) | Job title or keyword. |
location | string | City, region, or country. |
enableLinkedin | boolean (default true) | Include LinkedIn (see the limitation above). |
maxItemsPerSource | integer (default 100) | Cap on results requested from EACH source — protects your own bill, independently of the price above. |
upstreamTimeoutSecs | integer (default 120) | Delay before a source is considered down (triggers the automatic Indeed fallback). |
remoteOnly | boolean (default false) | Filter applied after normalization. |
contractTypes | array (default empty = all) | Filter applied after normalization. |
See .actor/INPUT_SCHEMA.json for the full field list and .actor/dataset_schema.json for the
complete output schema.