Use ZipRecruiter Jobs with Full Description Extractor with Python
Search ZipRecruiter by keyword and location, or a direct search URL, and get each job's full description text alongside company, location, salary, and remote/hybrid details.
1. Choose the data you need
Review the published README for supported collection modes, examples, and limits. The recipe below uses the current published input definition.
2. Prepare a source-based input
This JSON contains published prefills and required-field defaults. Review every value for your task before running it; it is not a promise of successful collection.
{
"fetchDescriptions": true,
"maxItems": 3,
"quickApplyOnly": false,
"remoteOnly": false,
"startUrls": [
"https://www.ziprecruiter.com/jobs-search?search=software+engineer&location=New+York%2C+NY"
]
}
Download input.example.json and save your reviewed copy as input.json.
| Field | Type | Required | Description |
|---|---|---|---|
startUrls | array | optional | ZipRecruiter search URLs (filters in the URL are honored, e.g. `https://www.ziprecruiter.com/jobs-search?search=software+engineer&location=New+York%2C+NY`) or individual job links like `https://www.ziprecruiter.com/c/Company/Job/Title/-in-City,ST?jid=...`. |
searchQueries | array | optional | Job keywords to search, e.g. `registered nurse`, `software engineer`. Every query is searched in every location below. |
locations | array | optional | Cities, states or `United States` for a national search. Leave empty to search the whole United States. Every query is searched in every location. |
companyName | string | optional | Only jobs from one company, e.g. `Visa`. The name is resolved on ZipRecruiter. Leave Search queries empty to browse all of the company's jobs. |
jobType | string | optional | Employment-type filter, applied to keyword searches. |
workplace | string | optional | Work-arrangement filter (remote includes jobs that offer a remote option). |
remoteOnly | boolean | optional | Kept for older tasks: same as setting Workplace type to `Remote`. |
experienceLevels | array | optional | Restrict to one or more seniority levels. Empty = no filter. |
daysPosted | integer | optional | Only jobs posted within the last N days. 0 = any time. |
radiusMiles | integer | optional | Distance around the location. 0 = ZipRecruiter's default. |
salaryMin | integer | optional | Lower bound of the pay range: only jobs whose advertised annual pay reaches at least this amount. 0 = no lower bound. |
salaryMax | integer | optional | Upper bound of the pay range: only jobs whose advertised annual pay stays at or below this amount. 0 = no upper bound. |
quickApplyOnly | boolean | optional | Only jobs that can be applied to on ZipRecruiter with 1-Click Apply. |
fetchDescriptions | boolean | optional | When on (recommended), each job's detail data and full description are fetched — the actor's core feature. Turn off for faster, cheaper runs with search-card fields only. |
maxItems | integer | optional | Maximum number of job postings to return across all searches. |
maxSearches | integer | optional | Cap on the number of query × location combinations when using Search queries (each combination is one search). |
3. Start an Actor run
Set APIFY_TOKEN in your environment. Python 3.10 or newer is sufficient; this recipe uses no third-party packages.
Execution may incur charges. Review current pricing on Apify. The request asks for a 120-second timeout and a charge limit; these settings are subject to Apify’s pricing and do not guarantee an all-inclusive spending cap.
import json
import os
import urllib.request
# Save the schema-derived example as input.json; review and edit it first.
with open("input.json", encoding="utf-8") as stream:
actor_input = json.load(stream)
token = os.environ["APIFY_TOKEN"]
request = urllib.request.Request(
"https://api.apify.com/v2/acts/6HsKvw9VT0JJhsrtu/runs?timeout=120&maxTotalChargeUsd=0.50",
data=json.dumps(actor_input).encode("utf-8"),
headers={"Authorization": "Bearer " + token, "Content-Type": "application/json"},
method="POST",
)
# This starts a potentially billable run. Do not automatically retry this POST.
with urllib.request.urlopen(request, timeout=40) as response:
run = json.load(response)["data"]
print("Run ID:", run["id"])
print("Status:", run["status"])
# Inspect and download results in Apify Console once the run succeeds.
4. Inspect the actual results
Open the run in Apify Console and wait for a successful completion. Use the published output schema to locate results and the dataset schema to understand declared views. Missing or optional record fields must not be treated as guaranteed values.
Dataset of ZipRecruiter job postings with title, company, location, salary, workplace and employment types, full description text, and apply details.
Questions before you run
Which inputs are required?
No top-level fields are marked required in the published schema. Conditional requirements can still apply; check the README.
What does this guide verify?
The fields, prefills, and schema links are rendered from the published build. This is a usage recipe, not a paid live extraction test. Source availability and collection results can vary.
What if the run request times out?
Check Apify Console before retrying. The first request may already have created a run. Do not automatically repeat a run-creation POST.
Generated from source build 8VGgLzspVLnGioOxo and its README and schemas. Source changes regenerate this guide; no third-party editorial claims are inferred.