ZipRecruiter Job Search Results & Salary Scraper
Extract job postings from ZipRecruiter.com search results - title, company, location, parsed salary range, city, state, and apply URL. Search by keyword and location or supply your own filtered search URL.
Input schema
Input fields, types, required flags, descriptions, defaults, and prefills come from the published definition. Prefill examples are distinct from defaults.
| Field | Type | Required | Description |
|---|---|---|---|
mode | string | optional | Search job postings, scrape URLs you already have, or get salary benchmarks for a role and location. |
searchQueries | array | optional | Job titles or keywords, e.g. `registered nurse` or `software engineer`. Every keyword is searched in every location below. |
locations | array | optional | Cities, states, ZIP codes or `United States` for a nationwide search. Every keyword is searched in every location. |
Show all input fields
| Field | Type | Required | Description |
|---|---|---|---|
mode | string | optional | Search job postings, scrape URLs you already have, or get salary benchmarks for a role and location. |
searchQueries | array | optional | Job titles or keywords, e.g. `registered nurse` or `software engineer`. Every keyword is searched in every location below. |
locations | array | optional | Cities, states, ZIP codes or `United States` for a nationwide search. Every keyword is searched in every location. |
companyName | string | optional | Only jobs from this employer, e.g. `Visa`. Leave the keywords empty to browse every open role at the company. |
startUrls | array | optional | Search, job, company or salary URLs. Use this with `Scrape specific URLs`; filters already in a search URL are kept. |
jobType | string | optional | Employment-type filter for keyword searches. |
workplace | string | optional | Work arrangement for keyword searches. |
experienceLevels | array | optional | Restrict to one or more seniority levels. Empty means no filter. |
daysPosted | integer | optional | Only jobs posted within the last N days. 0 means any time. |
radiusMiles | integer | optional | Distance around each location. 0 uses ZipRecruiter's default. |
salaryMin | integer | optional | Only jobs whose advertised annual pay reaches this amount. 0 means no lower bound. |
salaryMax | integer | optional | Only jobs whose advertised annual pay stays at or below this amount. Best effort; 0 means no upper bound. |
fetchDescriptions | boolean | optional | Fetch each posting's detail page for the complete description, benefits, company profile and apply details. Off gives faster card-only rows. |
includeCompanyProfile | boolean | optional | Add industry, website, size, headquarters, rating and about text from the posting's company data. |
maxItems | integer | optional | Maximum number of job or salary records to return across all searches and URLs. |
maxSearches | integer | optional | Cap on keyword × location combinations in search mode. |
salaryRoles | array | optional | Job titles for salary benchmarks, e.g. `registered nurse` or `data analyst`. Used in salary mode. |
salaryLocations | array | optional | Cities, states or `United States` for salary benchmarks. Every role is looked up in every location. |
salaryUrls | array | optional | Exact ZipRecruiter `/Salaries/...` URLs. When set, these are used instead of role and location pairs. |
Download the published input schema
View complete JSON
{
"description": "Search ZipRecruiter jobs by keyword, location or company, scrape exact URLs, or read salary benchmarks. Descriptions, benefits, company profiles and structured pay are optional.",
"properties": {
"companyName": {
"default": "",
"description": "Only jobs from this employer, e.g. `Visa`. Leave the keywords empty to browse every open role at the company.",
"editor": "textfield",
"title": "Company name",
"type": "string"
},
"daysPosted": {
"default": 0,
"description": "Only jobs posted within the last N days. 0 means any time.",
"maximum": 30,
"minimum": 0,
"prefill": 0,
"title": "Posted within (days)",
"type": "integer"
},
"experienceLevels": {
"default": [],
"description": "Restrict to one or more seniority levels. Empty means no filter.",
"editor": "select",
"items": {
"enum": [
"no_experience",
"junior",
"mid",
"senior"
],
"enumTitles": [
"No experience",
"Junior",
"Mid",
"Senior"
],
"type": "string"
},
"prefill": [],
"title": "Experience levels",
"type": "array"
},
"fetchDescriptions": {
"default": true,
"description": "Fetch each posting's detail page for the complete description, benefits, company profile and apply details. Off gives faster card-only rows.",
"prefill": false,
"title": "Fetch full descriptions",
"type": "boolean"
},
"includeCompanyProfile": {
"default": true,
"description": "Add industry, website, size, headquarters, rating and about text from the posting's company data.",
"prefill": false,
"title": "Include company profile",
"type": "boolean"
},
"jobType": {
"default": "any",
"description": "Employment-type filter for keyword searches.",
"editor": "select",
"enum": [
"any",
"full_time",
"part_time",
"contract",
"contract_to_hire",
"temporary",
"as_needed",
"other",
"internship"
],
"enumTitles": [
"Any",
"Full-time",
"Part-time",
"Contract",
"Contract to hire",
"Temporary",
"As needed",
"Other",
"Internship"
],
"prefill": "any",
"title": "Job type",
"type": "string"
},
"locations": {
"default": [
"United States"
],
"description": "Cities, states, ZIP codes or `United States` for a nationwide search. Every keyword is searched in every location.",
"editor": "stringList",
"items": {
"type": "string"
},
"prefill": [
"Chicago, IL"
],
"title": "Locations",
"type": "array"
},
"maxItems": {
"default": 50,
"description": "Maximum number of job or salary records to return across all searches and URLs.",
"maximum": 10000,
"minimum": 1,
"prefill": 3,
"title": "Max records",
"type": "integer"
},
"maxSearches": {
"default": 100,
"description": "Cap on keyword × location combinations in search mode.",
"maximum": 100,
"minimum": 1,
"prefill": 1,
"title": "Max searches",
"type": "integer"
},
"mode": {
"default": "search",
"description": "Search job postings, scrape URLs you already have, or get salary benchmarks for a role and location.",
"editor": "select",
"enum": [
"search",
"byUrls",
"salary"
],
"enumTitles": [
"Search jobs",
"Scrape specific URLs",
"Salary benchmarks"
],
"prefill": "search",
"title": "What do you want to scrape?",
"type": "string"
},
"radiusMiles": {
"default": 0,
"description": "Distance around each location. 0 uses ZipRecruiter's default.",
"maximum": 100,
"minimum": 0,
"prefill": 0,
"title": "Search radius (miles)",
"type": "integer"
},
"salaryLocations": {
"default": [
"United States"
],
"description": "Cities, states or `United States` for salary benchmarks. Every role is looked up in every location.",
"editor": "stringList",
"items": {
"type": "string"
},
"prefill": [
"Chicago, IL"
],
"title": "Salary locations",
"type": "array"
},
"salaryMax": {
"default": 0,
"description": "Only jobs whose advertised annual pay stays at or below this amount. Best effort; 0 means no upper bound.",
"maximum": 1000000,
"minimum": 0,
"prefill": 0,
"title": "Maximum annual salary (USD)",
"type": "integer"
},
"salaryMin": {
"default": 0,
"description": "Only jobs whose advertised annual pay reaches this amount. 0 means no lower bound.",
"maximum": 1000000,
"minimum": 0,
"prefill": 0,
"title": "Minimum annual salary (USD)",
"type": "integer"
},
"salaryRoles": {
"default": [],
"description": "Job titles for salary benchmarks, e.g. `registered nurse` or `data analyst`. Used in salary mode.",
"editor": "stringList",
"items": {
"type": "string"
},
"prefill": [
"registered nurse"
],
"title": "Salary roles",
"type": "array"
},
"salaryUrls": {
"default": [],
"description": "Exact ZipRecruiter `/Salaries/...` URLs. When set, these are used instead of role and location pairs.",
"editor": "stringList",
"items": {
"type": "string"
},
"prefill": [],
"title": "Salary page URLs",
"type": "array"
},
"searchQueries": {
"default": [],
"description": "Job titles or keywords, e.g. `registered nurse` or `software engineer`. Every keyword is searched in every location below.",
"editor": "stringList",
"items": {
"type": "string"
},
"prefill": [
"registered nurse"
],
"title": "Search keywords",
"type": "array"
},
"startUrls": {
"default": [],
"description": "Search, job, company or salary URLs. Use this with `Scrape specific URLs`; filters already in a search URL are kept.",
"editor": "stringList",
"items": {
"type": "string"
},
"prefill": [],
"title": "ZipRecruiter URLs",
"type": "array"
},
"workplace": {
"default": "any",
"description": "Work arrangement for keyword searches.",
"editor": "select",
"enum": [
"any",
"remote",
"hybrid",
"onsite"
],
"enumTitles": [
"Any",
"Remote",
"Hybrid",
"On-site"
],
"prefill": "any",
"title": "Workplace type",
"type": "string"
}
},
"required": [],
"schemaVersion": 1,
"title": "ZipRecruiter Jobs & Salary Scraper Input",
"type": "object"
}
Output schema
Published result links and storage locations. This schema is not an exhaustive contract for every field in a dataset record.
| Field | Type | Required | Description |
|---|---|---|---|
jobs | string | optional | Job rows (type `job_ziprecruiter`) with description, pay, company, location, benefits, dates and apply details. |
salaries | string | optional | Salary rows (type `salary_ziprecruiter`) with median, percentile, average, related titles and top-paying cities. |
Download the published output schema
View complete JSON
{
"actorOutputSchemaVersion": 1,
"description": "One flat dataset with job postings and salary benchmark records. Job rows carry the full description, structured pay, company profile, benefits, dates and apply link; salary rows carry median, percentile and average pay.",
"properties": {
"jobs": {
"description": "Job rows (type `job_ziprecruiter`) with description, pay, company, location, benefits, dates and apply details.",
"template": "{{links.apiDefaultDatasetUrl}}/items?view=jobs",
"title": "ZipRecruiter job postings",
"type": "string"
},
"salaries": {
"description": "Salary rows (type `salary_ziprecruiter`) with median, percentile, average, related titles and top-paying cities.",
"template": "{{links.apiDefaultDatasetUrl}}/items?view=salaries",
"title": "Salary benchmarks",
"type": "string"
}
},
"title": "ZipRecruiter Jobs & Salary Scraper Output",
"type": "object"
}
Dataset schema
Published dataset views and any declared field definitions. A view can select only a subset of the returned record fields.
Download the published dataset schema
View complete JSON
{
"actorSpecification": 1,
"fields": {
"properties": {
"applyType": {
"description": "external, quick_apply or internal",
"type": "string"
},
"applyUrl": {
"description": "Apply URL, decoded to the employer when external",
"type": "string"
},
"benefits": {
"description": "Benefits shown for the job",
"items": {
"type": "string"
},
"type": "array"
},
"city": {
"description": "City",
"type": "string"
},
"company": {
"description": "Hiring company name",
"type": "string"
},
"companyAbout": {
"description": "Company description",
"type": "string"
},
"companyFoundedYear": {
"description": "Company founding year when shown",
"type": "string"
},
"companyHqLocation": {
"description": "Company headquarters",
"type": "string"
},
"companyId": {
"description": "ZipRecruiter company id",
"type": "string"
},
"companyIndustries": {
"description": "Company industries",
"items": {
"type": "string"
},
"type": "array"
},
"companyLogo": {
"description": "Company logo image URL",
"type": "string"
},
"companyRating": {
"description": "Breakroom company rating",
"type": "number"
},
"companySize": {
"description": "Company size label",
"type": "string"
},
"companyUrl": {
"description": "Company profile URL",
"type": "string"
},
"companyWebsite": {
"description": "Company website URL",
"type": "string"
},
"country": {
"description": "Country name",
"type": "string"
},
"countryCode": {
"description": "ISO country code",
"type": "string"
},
"county": {
"description": "County",
"type": "string"
},
"description": {
"description": "Full description as plain text",
"type": "string"
},
"descriptionFetchFailed": {
"description": "True when a requested description could not be fetched",
"type": "boolean"
},
"descriptionHtml": {
"description": "Full description as HTML",
"type": "string"
},
"directApply": {
"description": "True for 1-Click Apply",
"type": "boolean"
},
"educationLevels": {
"description": "Education expectations",
"items": {
"type": "string"
},
"type": "array"
},
"employmentTypes": {
"description": "full_time, part_time, contract and so on",
"items": {
"type": "string"
},
"type": "array"
},
"experienceMonths": {
"description": "Required experience in months",
"type": "integer"
},
"id": {
"description": "Job identity: open seat id, listing key or canonical URL",
"type": "string"
},
"industry": {
"description": "Job industry from JSON-LD",
"type": "string"
},
"inputUrl": {
"description": "Search or job URL that produced the row",
"type": "string"
},
"isActive": {
"description": "Whether the listing is active",
"type": "boolean"
},
"isEstimatedSalary": {
"description": "True when the pay is estimated",
"type": "boolean"
},
"isHybrid": {
"description": "True when the job is hybrid",
"type": "boolean"
},
"isNew": {
"description": "Whether ZipRecruiter marks the listing new",
"type": "boolean"
},
"isRemote": {
"description": "True when the job is remote",
"type": "boolean"
},
"jid": {
"description": "ZipRecruiter job id from the jid parameter",
"type": "string"
},
"listingKey": {
"description": "ZipRecruiter listing key",
"type": "string"
},
"location": {
"description": "Display location",
"type": "string"
},
"locationId": {
"description": "ZipRecruiter location id",
"type": "string"
},
"matchId": {
"description": "ZipRecruiter match id",
"type": "string"
},
"occupationalCategory": {
"description": "O*NET occupational category",
"type": "string"
},
"openSeatId": {
"description": "ZipRecruiter open seat id",
"type": "string"
},
"postalCode": {
"description": "Postal code",
"type": "string"
},
"postedAgo": {
"description": "Human posting age",
"type": "string"
},
"postedAt": {
"description": "Original posting timestamp",
"type": "string"
},
"recordType": {
"description": "job or salary",
"type": "string"
},
"relatedTitles": {
"description": "Related job titles and their average annual pay",
"items": {
"properties": {
"annualSalary": {
"type": "number"
},
"title": {
"type": "string"
}
},
"type": "object"
},
"type": "array"
},
"rollingPostedAt": {
"description": "Rolling refresh timestamp",
"type": "string"
},
"salary": {
"description": "Salary text as shown",
"type": "string"
},
"salaryAverage": {
"description": "Average annual pay from the FAQ",
"type": "number"
},
"salaryAverageHourly": {
"description": "Average hourly pay from the FAQ",
"type": "number"
},
"salaryCurrency": {
"description": "Pay currency code",
"type": "string"
},
"salaryLocation": {
"description": "Location for a salary row",
"type": "string"
},
"salaryMax": {
"description": "Maximum pay in the displayed period",
"type": "number"
},
"salaryMaxAnnual": {
"description": "Annualized maximum pay",
"type": "number"
},
"salaryMedian": {
"description": "Median annual pay",
"type": "number"
},
"salaryMin": {
"description": "Minimum pay in the displayed period",
"type": "number"
},
"salaryMinAnnual": {
"description": "Annualized minimum pay",
"type": "number"
},
"salaryP10": {
"description": "10th percentile annual pay",
"type": "number"
},
"salaryP25": {
"description": "25th percentile annual pay",
"type": "number"
},
"salaryP75": {
"description": "75th percentile annual pay",
"type": "number"
},
"salaryP90": {
"description": "90th percentile annual pay",
"type": "number"
},
"salaryPeriod": {
"description": "hour, day, week, month or year",
"type": "string"
},
"salaryRole": {
"description": "Role title for a salary row",
"type": "string"
},
"salarySource": {
"description": "provided, parsed, predicted or missing",
"type": "string"
},
"salaryUrl": {
"description": "Salary page URL",
"type": "string"
},
"scrapedAt": {
"description": "ISO scrape timestamp",
"type": "string"
},
"searchQuery": {
"description": "Keyword that produced the row",
"type": "string"
},
"shareUrl": {
"description": "Short share URL",
"type": "string"
},
"shortDescription": {
"description": "Search-card teaser",
"type": "string"
},
"skills": {
"description": "Skills listed in JSON-LD",
"items": {
"type": "string"
},
"type": "array"
},
"state": {
"description": "State or region code",
"type": "string"
},
"title": {
"description": "Job title",
"type": "string"
},
"topPayingCities": {
"description": "Cities with the highest pay for the role",
"items": {
"properties": {
"annualSalary": {
"type": "number"
},
"location": {
"type": "string"
}
},
"type": "object"
},
"type": "array"
},
"type": {
"description": "job_ziprecruiter or salary_ziprecruiter",
"type": "string"
},
"url": {
"description": "Canonical job page URL",
"type": "string"
},
"validThrough": {
"description": "Posting expiry date",
"type": "string"
},
"workplaceTypes": {
"description": "onsite, remote or hybrid",
"items": {
"type": "string"
},
"type": "array"
}
},
"type": "object"
},
"title": "ZipRecruiter jobs and salary benchmarks",
"views": {
"jobs": {
"display": {
"component": "table",
"properties": {
"applyUrl": {
"format": "link",
"label": "Apply"
},
"company": {
"format": "text",
"label": "Company"
},
"employmentTypes": {
"format": "text",
"label": "Employment"
},
"location": {
"format": "text",
"label": "Location"
},
"postedAt": {
"format": "text",
"label": "Posted"
},
"salary": {
"format": "text",
"label": "Salary"
},
"salaryMax": {
"format": "number",
"label": "Max"
},
"salaryMin": {
"format": "number",
"label": "Min"
},
"salaryPeriod": {
"format": "text",
"label": "Period"
},
"salarySource": {
"format": "text",
"label": "Pay source"
},
"title": {
"format": "text",
"label": "Title"
},
"url": {
"format": "link",
"label": "Job URL"
},
"workplaceTypes": {
"format": "text",
"label": "Workplace"
}
}
},
"title": "Jobs",
"transformation": {
"fields": [
"title",
"company",
"location",
"salary",
"salaryMin",
"salaryMax",
"salaryPeriod",
"salarySource",
"employmentTypes",
"workplaceTypes",
"postedAt",
"applyUrl",
"url"
]
}
},
"overview": {
"display": {
"component": "table",
"properties": {
"city": {
"format": "text",
"label": "City"
},
"company": {
"format": "text",
"label": "Company"
},
"salary": {
"format": "text",
"label": "Salary"
},
"state": {
"format": "text",
"label": "State"
},
"title": {
"format": "text",
"label": "Title"
},
"url": {
"format": "link",
"label": "URL"
},
"workplaceTypes": {
"format": "text",
"label": "Workplace"
}
}
},
"title": "Job overview",
"transformation": {
"fields": [
"title",
"company",
"city",
"state",
"salary",
"workplaceTypes",
"url"
]
}
},
"salaries": {
"display": {
"component": "table",
"properties": {
"salaryAverage": {
"format": "number",
"label": "Average"
},
"salaryAverageHourly": {
"format": "number",
"label": "Average hourly"
},
"salaryCurrency": {
"format": "text",
"label": "Currency"
},
"salaryLocation": {
"format": "text",
"label": "Location"
},
"salaryMedian": {
"format": "number",
"label": "Median"
},
"salaryP10": {
"format": "number",
"label": "P10"
},
"salaryP25": {
"format": "number",
"label": "P25"
},
"salaryP75": {
"format": "number",
"label": "P75"
},
"salaryP90": {
"format": "number",
"label": "P90"
},
"salaryRole": {
"format": "text",
"label": "Role"
},
"salaryUrl": {
"format": "link",
"label": "Salary URL"
}
}
},
"title": "Salary benchmarks",
"transformation": {
"fields": [
"salaryRole",
"salaryLocation",
"salaryMedian",
"salaryP10",
"salaryP25",
"salaryP75",
"salaryP90",
"salaryAverage",
"salaryAverageHourly",
"salaryCurrency",
"salaryUrl"
]
}
}
}
}
Key-value schema
Published key-value store definitions, when provided by this build.
This definition is not present in the default published build. See the published README for available documentation.
Published README
Read the full published documentation
ZipRecruiter Jobs & Salary Scraper
Collect ZipRecruiter job postings and salary benchmarks in one run. Search by keyword across locations, browse a single employer, paste search/job/company URLs, or ask for salary percentiles by role and city. Job rows carry the full description, structured pay with a source flag, benefits, company profile, dates and the real apply destination.
What this actor does
- Three modes: search jobs, scrape exact URLs, or read salary benchmarks.
- Multi-query × multi-location: every keyword is searched in every location, deduplicated by ZipRecruiter's own job identity.
- Company-scoped search: set a company name or paste a
/co/<company>/JobsURL to get only that employer's postings. - Rich job rows: full description text and HTML, structured pay (min/max, period, currency, annualized values, provided vs predicted), benefits, workplace and employment types, posting dates, education, skills, company industry/website/size/HQ/rating, and apply links.
- Salary directory: median, 10th/25th/75th/90th percentile, average annual and hourly pay, related titles and top-paying cities — something plain job-board scrapers usually skip.
- Filters that work: employment type, remote/hybrid/on-site, experience level, posted within N days, radius, and minimum salary (maximum is best effort).
- HTTP-first and cheap: search, detail and salary pages are fetched directly with a Safari TLS profile. A headed browser with a US residential exit is used automatically only when the source challenges the request.
- No setup: no cookies, account, API key or proxy configuration. Omit-empty everywhere: a value the source does not show is left out, never sent as
null.
Modes
| Mode | What it reads | Example input |
|---|---|---|
search |
Keyword × location searches, or a company name | searchQueries: ["registered nurse"], locations: ["Chicago, IL"] |
byUrls |
Search, job, company or salary URLs you already have | startUrls: ["https://www.ziprecruiter.com/c/..."] |
salary |
Salary pages for role × location, or exact salary URLs | salaryRoles: ["data analyst"], salaryLocations: ["Austin, TX"] |
Output
Job records use type: job_ziprecruiter and recordType: job.
Identity: id, jid, listingKey, openSeatId, matchId, url, title.
Company: company, companyId, companyUrl, companyLogo, companyWebsite, companyIndustries, companySize, companyHqLocation, companyRating, companyAbout, companyFoundedYear.
Location: location, city, state, country, countryCode, postalCode, county, locationId, workplaceTypes, isRemote, isHybrid.
Pay: salary, salaryMin, salaryMax, salaryPeriod, salaryCurrency, salaryMinAnnual, salaryMaxAnnual, salarySource (provided, parsed, predicted or missing), isEstimatedSalary.
Job: description, descriptionHtml, shortDescription, employmentTypes, benefits, educationLevels, experienceMonths, postedAt, rollingPostedAt, postedAgo, validThrough, isActive, isNew, skills, occupationalCategory, industry.
Apply and meta: applyUrl, applyType, directApply, shareUrl, inputUrl, searchQuery, descriptionFetchFailed, scrapedAt.
Salary records use type: salary_ziprecruiter and recordType: salary: salaryRole, salaryLocation, salaryMedian, salaryP10, salaryP25, salaryP75, salaryP90, salaryAverage, salaryAverageHourly, salaryCurrency, salaryPeriod, salaryUrl, relatedTitles, topPayingCities, scrapedAt.
Input
| Field | Type | Default | Description |
|---|---|---|---|
mode |
Select | search |
search, byUrls or salary |
searchQueries |
String list | [] |
Keywords searched in every location |
locations |
String list | ["United States"] |
Cities, states, ZIPs or nationwide |
companyName |
String | – | Only this employer's jobs; empty keywords browse all of them |
startUrls |
String list | [] |
Search, job, company or salary URLs for byUrls |
jobType |
Select | any |
full_time, part_time, contract, contract_to_hire, temporary, as_needed, other, internship |
workplace |
Select | any |
remote, hybrid, onsite |
experienceLevels |
Multi-select | [] |
no_experience, junior, mid, senior |
daysPosted |
Integer | 0 |
Posted within N days (0–30); 0 = any |
radiusMiles |
Integer | 0 |
Radius around each location (0–100); 0 = default |
salaryMin |
Integer | 0 |
Annual minimum; 0 = any |
salaryMax |
Integer | 0 |
Annual maximum (best effort); 0 = any |
fetchDescriptions |
Boolean | true |
Fetch detail pages for full descriptions and pay |
includeCompanyProfile |
Boolean | true |
Add industry, website, size, HQ, rating and about |
maxItems |
Integer | 50 |
Total records across all searches |
maxSearches |
Integer | 100 |
Cap on keyword × location searches |
salaryRoles |
String list | [] |
Role titles for salary mode |
salaryLocations |
String list | ["United States"] |
Locations for salary mode |
salaryUrls |
String list | [] |
Exact /Salaries/... URLs; overrides role/location pairs |
Example: keyword search with filters
{
"mode": "search",
"searchQueries": ["registered nurse"],
"locations": ["Chicago, IL"],
"jobType": "full_time",
"daysPosted": 7,
"maxItems": 50
}
Example: several queries and locations
{
"mode": "search",
"searchQueries": ["data engineer", "analytics engineer"],
"locations": ["Texas", "Florida"],
"workplace": "remote",
"experienceLevels": ["senior"],
"salaryMin": 120000,
"maxItems": 200
}
Example: one company's openings
{
"mode": "search",
"companyName": "Visa",
"locations": ["United States"],
"fetchDescriptions": true,
"maxItems": 100
}
Example: exact URLs
{
"mode": "byUrls",
"startUrls": [
"https://www.ziprecruiter.com/jobs-search?search=fire+alarm+technician&location=New+York%2C+NY&days=7",
"https://www.ziprecruiter.com/c/Company/Job/Title/-in-Chicago,IL?jid=abcdef1234567890",
"https://www.ziprecruiter.com/co/Visa/Jobs"
],
"maxItems": 100
}
Example: salary benchmarks
{
"mode": "salary",
"salaryRoles": ["software engineer", "data analyst"],
"salaryLocations": ["New York, NY", "Austin, TX"],
"maxItems": 10
}
Use cases
- Talent intelligence: follow hiring volume and role mix for a company, city or industry.
- Compensation research: compare provided versus predicted pay and build salary bands from percentiles.
- Recruiting pipelines: export clean rows with real apply links and workplace types.
- Remote-work tracking: measure remote, hybrid and on-site mixes across markets.
- Job-board products: refresh an internal board with scheduled runs and deduplicate on
jid.
Limitations
- ZipRecruiter's public data has no latitude/longitude, so this actor does not invent coordinates.
- Search results arrive in ZipRecruiter's own order; the public site ignores sort parameters, so no sort input is offered.
- One search is capped at roughly 10,000 results. Split broad topics by keyword, location or filter for more.
- The salary maximum filter is best effort because ZipRecruiter's ceiling parameter does not narrow reliably; the minimum filter is server-side and is also checked on each row.
salarySource: predictedmeans ZipRecruiter estimated the range, not that the employer published it. Values are kept and flagged rather than silently mixed with provided pay.- US and Canada listings on ziprecruiter.com are covered. The separate UK and Ireland sites are not.
- A very broad run can hit detail-page rate limits; the actor pauses, backs off and keeps card rows with
descriptionFetchFailedinstead of failing the whole run.
FAQ
Do I need a ZipRecruiter account, cookies or a proxy? No. Only public pages are read, and the actor chooses its own network path. There is nothing to configure.
What is the difference between the three modes?
search discovers jobs from keywords, locations or a company. byUrls reads exact search, job, company or salary URLs. salary reads salary benchmark pages and returns percentile/average pay.
Why do some rows have no salary?
ZipRecruiter does not publish pay for every posting. When it shows an estimated range, the row is marked salarySource: predicted and isEstimatedSalary: true; when it shows nothing, the pay fields are omitted rather than filled with zero.
Do I get the full job description?
Yes when fetchDescriptions is on. It returns both plain text and HTML. Turn it off for faster, cheaper card-only runs.
What does descriptionFetchFailed: true mean?
The detail page could not be read for that posting, so the row was kept from search-card data. Re-run those job URLs later if you need the description.
Why is the same job missing from a second search? Jobs are deduplicated by ZipRecruiter's job id across every query and location in the run, so a posting found twice is delivered once. Running the same search on another day can return different rows as ZipRecruiter re-ranks and refreshes listings.
How current is the salary data? Salary pages are ZipRecruiter's own estimates and are returned as shown, including median, percentiles, average annual/hourly pay, related titles and top-paying cities. They are benchmarks, not offers.
Can I filter for 1-Click Apply jobs?
There is no reliable server-side filter for it, so it is not exposed as an input. applyType on each row tells you whether the application is external, internal or quick-apply.
How many results can I get?
maxItems supports up to 10,000 per run, and that also matches ZipRecruiter's per-search ceiling. For larger datasets, split the work into multiple runs by keyword or location.
Is this affiliated with ZipRecruiter? No. It is an independent tool that reads ZipRecruiter's public job and salary data.
Python quickstart
Use a schema-derived input and the Python standard library to start a run. An Apify account and token are required for execution.
Source build MiuZfLBEFxbiXz4Uj. Documentation is regenerated from the default published build; private drafts are not included.