LinkedIn Jobs - Residential IPs avatar

LinkedIn Jobs - Residential IPs

Pricing

Pay per usage

Go to Apify Store
LinkedIn Jobs - Residential IPs

LinkedIn Jobs - Residential IPs

Search LinkedIn's public guest jobs index through 23 real US residential IPs (Verizon AS701). BYOK against the MoneyMaker Residential Scraping API.

Pricing

Pay per usage

Rating

0.0

(0)

Developer

Kevin Yen

Kevin Yen

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

2 days ago

Last modified

Share

Search LinkedIn's public guest jobs index from a real US residential IP (Verizon AS701) and get back parsed job cards plus the raw HTML. Each request rotates LRU through a 23-IP residential pool. Every dataset item includes the literal egress IP so you can verify it yourself with ipapi.com or WHOIS.

This Actor is a thin wrapper around the MoneyMaker Residential Scraping API's /v1/scrape/linkedin-jobs endpoint. Apify hosts and runs the Actor; the residential proxy fleet runs on Hetzner with Verizon AS701 ISP proxies. Apify does not charge for this Actor — you bring your own API key from the MoneyMaker listing on RapidAPI (or directly from the publisher).


Why residential matters for LinkedIn

LinkedIn's public guest jobs index does aggressive ASN-level filtering at the TCP layer before any HTML renders:

  • Datacenter ranges (AWS, GCP, DigitalOcean, Azure) get a stripped guest skeleton, an HTTP 999 "Request denied", or a redirect to the auth wall.
  • Residential ASNs (Verizon AS701, Comcast AS7922, Spectrum AS20115) get the full server-rendered job listing HTML with every card's title, company, location, posting timestamp, and stable job URL.

That's a structural difference, not a rate-limit difference. Pulling 1 result from a datacenter IP is harder than pulling 1,000 from residential.


Use cases

  • ATS / CRM enrichment — fetch company hiring signals on a candidate account; auto-tag accounts that posted Senior Backend roles in the last 7 days.
  • Talent intelligence — track competitor hiring velocity, location trends, role-mix shifts.
  • Recruiting automation — feed an internal sourcing tool with fresh postings filtered by keyword / location / posting date.
  • Market research — count "Senior Python Engineer" postings by metro monthly to model hiring demand.
  • Compensation benchmarking — combine with Levels.fyi / Glassdoor data on the same role and location.

Inputs

FieldTypeRequiredDescription
keywordsstringyesJob-title or skills query, e.g. Senior Python Engineer
locationstringnoGeo string, e.g. United States, San Francisco Bay Area
countinteger (1-50)noHow many job cards to return (default 25)
startintegernoPagination offset (default 0; use 25 for the next page)
apiKeystring (secret)yesYour MoneyMaker API key (mm_sk_...)
apiBaseUrlstringnoDefault: the public MM origin
verifyTlsbooleannoDefault true

Output

Two kinds of dataset items per run.

1. The raw response (one per run)

{
"kind": "raw_response",
"ok": true,
"request_id": "req_w-v8wa1qZ79YcihQ",
"status_code": 200,
"ip_used": "65.195.39.208",
"proxy_node": "Hetzner-12",
"headers": { "content-type": "text/html; charset=UTF-8" },
"body": "<!DOCTYPE html>...<li class=\"job-search-card\">...",
"body_truncated": false,
"upstream_latency_ms": 1820,
"actor_latency_ms": 1900,
"search": { "keywords": "Senior Python Engineer", "location": "United States", "count": 25, "start": 0 }
}

2. One parsed job card per item

{
"kind": "job_card",
"ok": true,
"title": "Senior Python Engineer",
"company": "Stripe",
"location": "South San Francisco, CA",
"posted_at": "2026-04-29",
"job_url": "https://www.linkedin.com/jobs/view/senior-python-engineer-at-stripe-3987654321",
"job_id": "3987654321",
"ip_used": "65.195.39.208",
"search": { "keywords": "Senior Python Engineer", "location": "United States", "count": 25, "start": 0 }
}

The Actor's key-value store also gets a SUMMARY record with the search inputs, parsed-card count, the residential IP used, and timing.


How it works

Apify run
Actor (this code)
│ GET /v1/scrape/linkedin-jobs?keywords=...&location=...&count=...&start=...
│ Authorization: Bearer <your MM key>
MoneyMaker Scraping API
│ Picks an LRU residential proxy from the 23-IP pool
Verizon AS701 home-broadband IP
│ GET https://www.linkedin.com/jobs/search/?keywords=...
LinkedIn returns full job-listings HTML → JSON wrapper to Actor → push_data

You only pay MoneyMaker for the underlying calls — Apify is free. Costs follow the MoneyMaker pricing tiers on RapidAPI.


Pacing guidance

  • One run is one upstream call. To page through deeper results, schedule multiple runs with start = 0, 25, 50, 75, ....
  • LinkedIn caps the public guest index at roughly 1,000 results per query; past that, set additional filters via keywords / location.
  • Cache aggressively. A given keyword/location pair changes maybe a few times per hour — daily polling is plenty for most analytics use cases.
  • Respect LinkedIn's ToS. This Actor only fetches the publicly accessible guest-mode HTML — no auth bypass, no scraping of authenticated views, no CAPTCHA solving.

Limitations

  • Public guest data only. No salary, no description body, no applicant count, no recruiter contact — those fields require an authenticated session and are out of scope.
  • No JS rendering. Static HTML only.
  • US residential only. All egress is Verizon AS701 / United States.
  • No CAPTCHA solving. If LinkedIn returns a challenge, you'll see the challenge HTML — it's not auto-solved.
  • Body cap of 2 MB per response.

Source & support

The Actor source lives at sksyen/moneymaker-dashboard/scripts/apify_actor_linkedin_jobs. Issues and feature requests go on the GitHub repo. Underlying API contract is published as OpenAPI 3.0 at the /openapi.yaml path on the origin.