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

1

Bookmarked

5

Total users

3

Monthly active users

a month 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.