LinkedIn Jobs - Residential IPs
Pricing
Pay per usage
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
Actor stats
0
Bookmarked
1
Total users
0
Monthly active users
2 days ago
Last modified
Categories
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
| Field | Type | Required | Description |
|---|---|---|---|
keywords | string | yes | Job-title or skills query, e.g. Senior Python Engineer |
location | string | no | Geo string, e.g. United States, San Francisco Bay Area |
count | integer (1-50) | no | How many job cards to return (default 25) |
start | integer | no | Pagination offset (default 0; use 25 for the next page) |
apiKey | string (secret) | yes | Your MoneyMaker API key (mm_sk_...) |
apiBaseUrl | string | no | Default: the public MM origin |
verifyTls | boolean | no | Default 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.