Dataspryva

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.

FieldTypeRequiredDescription
startUrlsarrayoptionalZipRecruiter 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=...`.
searchQueriesarrayoptionalJob keywords to search, e.g. `registered nurse`, `software engineer`. Every query is searched in every location below.
locationsarrayoptionalCities, states or `United States` for a national search. Leave empty to search the whole United States. Every query is searched in every location.
companyNamestringoptionalOnly 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.
jobTypestringoptionalEmployment-type filter, applied to keyword searches.
workplacestringoptionalWork-arrangement filter (remote includes jobs that offer a remote option).
remoteOnlybooleanoptionalKept for older tasks: same as setting Workplace type to `Remote`.
experienceLevelsarrayoptionalRestrict to one or more seniority levels. Empty = no filter.
daysPostedintegeroptionalOnly jobs posted within the last N days. 0 = any time.
radiusMilesintegeroptionalDistance around the location. 0 = ZipRecruiter's default.
salaryMinintegeroptionalLower bound of the pay range: only jobs whose advertised annual pay reaches at least this amount. 0 = no lower bound.
salaryMaxintegeroptionalUpper bound of the pay range: only jobs whose advertised annual pay stays at or below this amount. 0 = no upper bound.
quickApplyOnlybooleanoptionalOnly jobs that can be applied to on ZipRecruiter with 1-Click Apply.
fetchDescriptionsbooleanoptionalWhen 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.
maxItemsintegeroptionalMaximum number of job postings to return across all searches.
maxSearchesintegeroptionalCap 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.