Vexaloom Labs

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.

FieldTypeRequiredDescription
modestringoptionalSearch job postings, scrape URLs you already have, or get salary benchmarks for a role and location.
searchQueriesarrayoptionalJob titles or keywords, e.g. `registered nurse` or `software engineer`. Every keyword is searched in every location below.
locationsarrayoptionalCities, states, ZIP codes or `United States` for a nationwide search. Every keyword is searched in every location.
Show all input fields
FieldTypeRequiredDescription
modestringoptionalSearch job postings, scrape URLs you already have, or get salary benchmarks for a role and location.
searchQueriesarrayoptionalJob titles or keywords, e.g. `registered nurse` or `software engineer`. Every keyword is searched in every location below.
locationsarrayoptionalCities, states, ZIP codes or `United States` for a nationwide search. Every keyword is searched in every location.
companyNamestringoptionalOnly jobs from this employer, e.g. `Visa`. Leave the keywords empty to browse every open role at the company.
startUrlsarrayoptionalSearch, job, company or salary URLs. Use this with `Scrape specific URLs`; filters already in a search URL are kept.
jobTypestringoptionalEmployment-type filter for keyword searches.
workplacestringoptionalWork arrangement for keyword searches.
experienceLevelsarrayoptionalRestrict to one or more seniority levels. Empty means no filter.
daysPostedintegeroptionalOnly jobs posted within the last N days. 0 means any time.
radiusMilesintegeroptionalDistance around each location. 0 uses ZipRecruiter's default.
salaryMinintegeroptionalOnly jobs whose advertised annual pay reaches this amount. 0 means no lower bound.
salaryMaxintegeroptionalOnly jobs whose advertised annual pay stays at or below this amount. Best effort; 0 means no upper bound.
fetchDescriptionsbooleanoptionalFetch each posting's detail page for the complete description, benefits, company profile and apply details. Off gives faster card-only rows.
includeCompanyProfilebooleanoptionalAdd industry, website, size, headquarters, rating and about text from the posting's company data.
maxItemsintegeroptionalMaximum number of job or salary records to return across all searches and URLs.
maxSearchesintegeroptionalCap on keyword × location combinations in search mode.
salaryRolesarrayoptionalJob titles for salary benchmarks, e.g. `registered nurse` or `data analyst`. Used in salary mode.
salaryLocationsarrayoptionalCities, states or `United States` for salary benchmarks. Every role is looked up in every location.
salaryUrlsarrayoptionalExact 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.

FieldTypeRequiredDescription
jobsstringoptionalJob rows (type `job_ziprecruiter`) with description, pay, company, location, benefits, dates and apply details.
salariesstringoptionalSalary 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>/Jobs URL 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: predicted means 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 descriptionFetchFailed instead 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.

Open the step-by-step Python guide →

Source build MiuZfLBEFxbiXz4Uj. Documentation is regenerated from the default published build; private drafts are not included.