Indeed & LinkedIn Jobs Scraper avatar

Indeed & LinkedIn Jobs Scraper

Pricing

$3.50 / 1,000 job offer delivereds

Go to Apify Store
Indeed & LinkedIn Jobs Scraper

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

matheo daney

Maintained by Community

Actor 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 keep remote/hybrid listings. Note: remote/hybrid status isn't always available from every source, so remote_type is sometimes unknown even 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 deliveredPrice
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

FieldTypeDescription
querystring (required)Job title or keyword.
locationstringCity, region, or country.
enableLinkedinboolean (default true)Include LinkedIn (see the limitation above).
maxItemsPerSourceinteger (default 100)Cap on results requested from EACH source — protects your own bill, independently of the price above.
upstreamTimeoutSecsinteger (default 120)Delay before a source is considered down (triggers the automatic Indeed fallback).
remoteOnlyboolean (default false)Filter applied after normalization.
contractTypesarray (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.