ZipRecruiter Jobs Scraper — Remote Jobs, Salaries & Details avatar

ZipRecruiter Jobs Scraper — Remote Jobs, Salaries & Details

Pricing

from $3.75 / 1,000 job extracteds

Go to Apify Store
ZipRecruiter Jobs Scraper — Remote Jobs, Salaries & Details

ZipRecruiter Jobs Scraper — Remote Jobs, Salaries & Details

Extract ZipRecruiter jobs by keyword, location, or direct URL. Supports remote filters, salary and apply fields, detail enrichment, US residential proxy defaults, and in-run deduplication.

Pricing

from $3.75 / 1,000 job extracteds

Rating

0.0

(0)

Developer

Crowd Pull

Crowd Pull

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

10 hours ago

Last modified

Share

CrowdPull ZipRecruiter Jobs Search

Pure HTTP Apify actor for searching ZipRecruiter jobs by keyword and location.

This actor is designed for SignalApply-style job discovery pipelines:

  • Search multiple titles/keywords across multiple locations.
  • Start from ZipRecruiter search URLs or job detail URLs while preserving URL filters.
  • Search generated keyword/location pairs across supported ZipRecruiter country domains.
  • Emit normalized job rows into the default Apify dataset.
  • Deduplicate results by external ID, URL, or title/company/location.
  • Run in incremental mode so recurring runs emit only new or changed jobs.
  • Save run metadata to SEARCH_SPECS and SUMMARY key-value records.
  • Run in API mode, pure HTTP web mode, auto mode, or fallback URL mode.
  • Parse /jobs-search Schema.org ItemList results and job-page JobPosting JSON-LD.
  • Normalize richer fields when exposed by ZipRecruiter: typed salary ranges, remote/hybrid flags, company metadata, apply URLs, benefits, and geo fields.

Search Modes

  • auto: uses the ZipRecruiter Search API when apiKey is present and no startUrls are supplied, otherwise uses pure HTTP web search.
  • api: requires a ZipRecruiter Search API key.
  • web: fetches ZipRecruiter search URLs, parses result links, then optionally fetches job detail pages for JobPosting JSON-LD.
  • fallbackUrls: emits search URLs only.

With empty input, the actor defaults to this remote-first sales search:

https://www.ziprecruiter.com/jobs-search?search=Sales&location=USA&refine_by_location_type=only_remote

Production Apify runs require a proxy. The default input uses US residential Apify Proxy because ZipRecruiter blocked direct Apify datacenter egress during remote testing, while US residential proxying allowed search results and better detail-page enrichment:

{
"proxyConfig": {
"useApifyProxy": true,
"apifyProxyGroups": ["RESIDENTIAL"],
"apifyProxyCountry": "US"
}
}

Input

{
"startUrls": [
{
"url": "https://www.ziprecruiter.com/jobs-search?search=Sales&location=USA&refine_by_location_type=only_remote"
}
],
"searchQueries": [
"Sales"
],
"locations": ["USA"],
"countryCodes": ["US"],
"searchMode": "auto",
"apiKey": "YOUR_ZIPRECRUITER_SEARCH_API_KEY",
"maxItems": 100,
"jobsPerPage": 25,
"pagesPerSearch": 1,
"radiusMiles": 25,
"daysAgo": 7,
"employmentType": "full_time",
"locationType": "only_remote",
"minAnnualSalary": 100000,
"maxAnnualSalary": 180000,
"applyType": "one_click_apply",
"experienceLevel": "senior_level",
"includeEmptyFilterParams": false,
"seniorityFiltersExplicitlySet": false,
"applyTypesExplicitlySet": false,
"employmentTypesExplicitlySet": false,
"locationTypesExplicitlySet": false,
"linkKey": "hGEq63bjJQ2bOUaqEdaVJA",
"includeJobDetails": true,
"fallbackToSearchUrls": true,
"pushFallbackSearchUrls": true,
"deduplicate": true,
"incrementalMode": false,
"incrementalStoreName": "ziprecruiter-incremental",
"delayMs": 250,
"proxyConfig": {
"useApifyProxy": true,
"apifyProxyGroups": ["RESIDENTIAL"],
"apifyProxyCountry": "US"
}
}

You can also provide the API key as ZIPRECRUITER_SEARCH_API_KEY or ZIPRECRUITER_API_KEY.

Supported Search Filters

The actor currently maps these web search parameters:

  • locations: becomes ZipRecruiter's location parameter. Pass multiple locations to fan out searches.
  • countryCodes: generated searches can target US, CA, GB, IE, IN, DE, FR, or NZ. URL-based searches use the domain from each startUrls entry.
  • startUrls: direct ZipRecruiter search or job URLs. Existing query parameters are preserved and paginated with page.
  • daysAgo: becomes days in web mode and days_ago in API mode. Use 1, 7, 14, 30, etc.
  • radiusMiles: becomes radius in web mode and radius_miles in API mode. ZipRecruiter web search normalizes very small radii to 25 miles.
  • employmentType: maps to refine_by_employment, e.g. full_time, part_time, contract, temporary, internship.
  • locationType: maps to refine_by_location_type, e.g. remote, only_remote, hybrid, in_person, remote_optional.
  • minAnnualSalary and maxAnnualSalary: map to refine_by_salary and refine_by_salary_ceil.
  • applyType: maps to refine_by_apply_type, currently one_click_apply.
  • experienceLevel: maps to refine_by_experience_level, e.g. entry_level, mid_level, senior_level.
  • includeEmptyFilterParams: includes empty refine_by_* parameters for filters left as Any, matching ZipRecruiter's browser URLs more closely.
  • seniorityFiltersExplicitlySet, applyTypesExplicitlySet, employmentTypesExplicitlySet, and locationTypesExplicitlySet: add ZipRecruiter's *_explicitly_set= URL markers.
  • linkKey: advanced passthrough for ZipRecruiter's opaque lk query parameter when copied from a browser URL.
  • extraSearchParams: raw escape hatch for newly discovered query parameters. Empty string values are preserved.
  • incrementalMode: saves fingerprints in a named key-value store and emits only new or changed jobs on later runs.
  • pushFallbackSearchUrls: set to false when using pay-per-job pricing so generated fallback links are saved to FALLBACK_SEARCH_URLS but not counted as dataset result rows.
  • proxyConfig: required for Apify runs. Defaults to US residential Apify Proxy (RESIDENTIAL, country US) because ZipRecruiter blocks direct Apify datacenter egress.

Recommended launch pricing is pay-per-event with platform usage included:

EventPriceNotes
apify-actor-start$0.00005/runSynthetic start event; keep Apify's default and do not charge manually in code.
job-extracted$3.75 / 1,000 jobsPrimary event, charged for job records pushed to the dataset.

Configure these events in Apify Monetization before Store publication. The actor code emits job-extracted; the synthetic start event is handled by Apify.

This prices the actor between the cheapest direct ZipRecruiter competitors and the higher-priced detail-enrichment actors while protecting residential proxy margin. Fallback search_url rows should remain free or disabled with pushFallbackSearchUrls: false for paid Store runs.

Output

Job rows look like:

{
"type": "job",
"source": "ziprecruiter",
"sourceMode": "web",
"countryCode": "US",
"searchQuery": "Fire Alarm Technician",
"searchLocation": "Westbury, NY",
"externalId": "VklYGmxpudK3jnCJl23TbA",
"listingVersionKey": "VklYGmxpudK3jnCJl23TbA",
"encryptedQuizId": "827e0df3",
"title": "Full-Time Alarm technicians",
"company": "Securetell Inc",
"companyUrl": "https://www.ziprecruiter.com/co/Securetell-Inc/Jobs",
"companyUuid": "zr_missing_company_default",
"location": "Westbury, NY",
"city": "Westbury",
"state": "NY",
"postalCode": "11590",
"latitude": 40.75566101074219,
"longitude": -73.5876235961914,
"url": "https://www.ziprecruiter.com/c/Securetell-Inc/Job/Full-Time-Alarm-technicians/-in-Westbury,NY?jid=dff3b05032fd7e28",
"applyUrl": "https://www.ziprecruiter.com/jobs/apply/...",
"directApply": true,
"hasZipApply": true,
"isExternalApply": false,
"quickApplyUrl": "https://www.ziprecruiter.com/jobs/apply/...",
"description": "Growing Alarm Company based in Nassau County is looking for Full-Time technicians...",
"descriptionHtml": "<h3>Job Description</h3><div>...</div>",
"snippet": "Growing Alarm Company based in Nassau County is looking for Full-Time technicians...",
"salary": "$25 Hourly",
"formattedSalaryShort": "$25 / hr",
"salaryMin": 25,
"salaryMax": 25,
"salaryCurrency": "USD",
"salaryPeriod": "hour",
"salarySource": "provided",
"employmentType": "Full-Time",
"benefits": ["Paid Time Off", "Retirement"],
"isRemote": false,
"isHybrid": false,
"postedAt": "2026-04-08T23:44:29Z",
"postedTime": "24 days ago",
"industry": "Real Estate",
"companyDetails": {
"name": "Securetell Inc",
"city": "Westbury",
"state": "NY",
"countryCode": "USA",
"postalCode": "11590",
"joinedYear": "2021",
"followers": 14
},
"applyDetails": {
"hasZipApply": true,
"destination": "Internal",
"applyButtonType": "Open Apply Flow"
},
"statusDetails": {
"isActive": true,
"isClosed": false,
"postedTime": "24 days ago"
},
"jobPageImage": {
"url": "https://www.ziprecruiter.com/...",
"alt": "Securetell Inc job posting for a Full-Time Alarm technicians in Westbury, NY..."
},
"zipRecruiter": {
"listingVersionKey": "VklYGmxpudK3jnCJl23TbA",
"encryptedQuizId": "827e0df3",
"impressionId": "5Z6lVs8Bhgoo29-8"
},
"fingerprint": "d9b8...",
"scrapedAt": "2026-04-23T12:00:00.000Z",
"raw": {},
"rawSources": {}
}

The actor keeps the stable fields above table-friendly while also preserving source payloads in raw and rawSources. When ZipRecruiter exposes richer page data, the output includes apply/status metadata, listing identifiers, salary display strings, company details, job page image data, and ZipRecruiter-specific metadata in normalized camelCase fields.

Fallback mode emits rows like:

{
"type": "search_url",
"source": "ziprecruiter",
"searchQuery": "Senior Patching Engineer",
"searchLocation": "Remote",
"searchUrl": "https://www.ziprecruiter.com/Jobs/Remote-Senior-Patching-Engineer?search=Senior+Patching+Engineer&location=Remote",
"reason": "missing_api_key"
}

Local Development

Install dependencies:

$npm install

Build:

$npm run build

Run locally with pure HTTP web search:

$CROWDPULL_DISABLE_DEFAULT_PROXY=1 apify run --input '{"searchMode":"web","searchQueries":["Senior Patching Engineer"],"locations":["Remote"],"daysAgo":7,"locationType":"remote","employmentType":"full_time","minAnnualSalary":100000,"maxItems":5,"includeJobDetails":true}'

Run locally with fallback URLs only:

$CROWDPULL_DISABLE_DEFAULT_PROXY=1 apify run --input '{"searchMode":"fallbackUrls","searchQueries":["Senior Patching Engineer"],"locations":["Remote"]}'

Dataset output is written under storage/datasets/default.

Run locally from a copied ZipRecruiter search URL:

$CROWDPULL_DISABLE_DEFAULT_PROXY=1 apify run --input '{"searchMode":"web","startUrls":[{"url":"https://www.ziprecruiter.com/jobs-search?search=data+engineer&location=Remote&days=7"}],"maxItems":5,"includeJobDetails":true}'

Run locally in incremental mode:

$CROWDPULL_DISABLE_DEFAULT_PROXY=1 apify run --input '{"searchMode":"web","searchQueries":["Senior Patching Engineer"],"locations":["Remote"],"maxItems":5,"incrementalMode":true,"incrementalStoreName":"ziprecruiter-incremental-dev"}'

CROWDPULL_DISABLE_DEFAULT_PROXY=1 is only for local development where Apify Proxy credentials are not available. Do not use it for production Apify runs.

SignalApply Integration

The SignalApply app can call this actor as a source adapter:

  1. Build search specs from the candidate profile and target roles.
  2. Run the actor in auto or web mode.
  3. Pull dataset items from the run.
  4. Import type: "job" rows into SignalApply's jobs table.
  5. Score, rank, and generate review-before-apply packets in the app.

No auto-submit is included. Application submission should remain human-approved.