# ZipRecruiter Scraper | $1 / 1k | Fast & Reliable (`fatihtahta/ziprecruiter-scraper`) Actor

Extract structured ZipRecruiter job listings with companies, locations, compensation ranges, employment types, contacts and full descriptions. Built for hiring intelligence, labor-market research, and automated recruiting or analytics pipelines.

- **URL**: https://apify.com/fatihtahta/ziprecruiter-scraper.md
- **Developed by:** [Fatih Tahta](https://apify.com/fatihtahta) (community)
- **Categories:** Jobs, Automation, Developer tools
- **Stats:** 55 total users, 21 monthly users, 100.0% runs succeeded, 3 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## ZipRecruiter Scraper

**Slug:** `fatihtahta/ziprecruiter-scraper`

### Overview
ZipRecruiter Scraper collects structured job listing data from [ZipRecruiter](https://www.ziprecruiter.com), including job titles, listing URLs, posting dates, company details, location details, compensation ranges, employment attributes, and application links. It is designed for teams that need repeatable, structured access to public job market data without manually reviewing search pages one by one. ZipRecruiter is one of the most widely used job marketplaces in the United States, which makes its listing data valuable for hiring analysis, employer research, market tracking, and enrichment workflows. This actor automates the collection process across direct search URLs and keyword-based searches so runs stay consistent as your scope grows. The output is organized for practical downstream use in analytics tools, spreadsheets, ETL jobs, and internal reporting systems.

### Why Use This Actor
- **Market research and analytics teams:** Track job volume, salary ranges, employer activity, location demand, and hiring patterns across roles, regions, and time windows.
- **Product and content teams:** Discover trending job titles, compare how employers describe similar roles, and identify demand signals for new pages, reports, or editorial content.
- **Developers and data engineering teams:** Feed structured job records into warehouses, dashboards, enrichment services, APIs, or recurring data pipelines without manual transformation.
- **Lead generation and enrichment teams:** Identify active hiring companies, enrich company profiles with hiring context, and connect job activity to outreach, sales, or recruiting workflows.
- **Monitoring and competitive intelligence teams:** Watch specific markets, employers, or role categories over time to detect changes in compensation, remote work mix, and competitor hiring activity.

### Input Parameters
Provide any combination of URLs, queries, and filters to control the scope of collection.

| Parameter | Type | Description | Default |
| --- | --- | --- | --- |
| `startUrls` | `string[]` | One or more direct ZipRecruiter URLs to scrape. These are typically search result pages, but they can also be individual listing pages when needed. | – |
| `queries` | `string[]` | Free-text job keywords such as `software engineer`, `data analyst`, or `marketing manager`. Each query can be combined with the optional filters below. | – |
| `location` | `string` | Optional location applied to every query. You can use a ZIP code, city, state, or `City, ST` format such as `New York, NY`. | – |
| `location_remote` | `boolean` | When `true`, forces ZipRecruiter remote search mode by overriding `location` to `US` and `remote_options` to `only_remote`. | `false` |
| `radius` | `string` | Optional distance filter in miles. Allowed values: `5`, `10`, `25`, `50`, `100`. | – |
| `remote_options` | `string` | Optional work arrangement filter. Allowed values: `""` (all remote/on-site), `no_remote` (on-site), `hybrid`, `only_remote` (remote). | – |
| `days` | `string` | Optional date-posted filter. Allowed values: `""` (posted anytime), `30`, `10`, `5`, `1`. | – |
| `refineByEmployment` | `string` | Optional employment type filter. Allowed values: `""` (all employment types), `employment_type:full_time`, `employment_type:part_time`, `employment_type:contract`, `employment_type:temporary`, `employment_type:other`. | – |
| `refineBySalary` | `integer` | Optional minimum salary floor to include in query-based searches. | – |
| `refineBySalaryCeil` | `integer` | Optional maximum salary ceiling to include in query-based searches. | – |
| `refineByApplyType` | `boolean` | When `true`, limits results to listings where Quick Apply is available. | `false` |
| `refineByExperienceLevel` | `string[]` | Optional experience level filter. Allowed values: `no_experience`, `junior`, `mid`, `senior`. You can provide one or more values. | – |
| `limit` | `integer` | Maximum number of listings to save for each query or start URL seed. | `50000` |
| `proxyConfiguration` | `object` | Optional Apify proxy settings for the run. | Apify proxy with `RESIDENTIAL` group and `US` country |

### Example Input
```json
{
  "queries": [
    "software engineer",
    "data analyst"
  ],
  "location_remote": true,
  "days": "10",
  "refineByApplyType": true,
  "limit": 1500
}
````

### Output

#### 6.1 Output destination

The actor writes results to an Apify dataset as JSON records. And the dataset is designed for direct consumption by analytics tools, ETL pipelines, and downstream APIs without post-processing.

#### 6.2 Record envelope (all items)

Every production record represents a single job listing and includes stable identifiers that can be normalized consistently in downstream systems.

- **type** *(string, required)*: Recommended logical record category. Use `job`.
- **id** *(string, required)*: Stable job identifier, available as `job.id`.
- **url** *(string, required)*: Canonical job URL, available as `source.job_url`.

Recommended idempotency key: `type + ":" + id`

Use this key for deduplication and upserts when the same job appears in multiple searches, multiple locations, or repeated scheduled runs. The actor's internal runtime dedupe also preserves distinct seat-level jobs by preferring `job.ziprecruiter_open_seat_id` and `job.id` before broader listing identifiers.

#### 6.3 Examples

##### Example: job (`type = "job"`)

```json
{
  "job": {
    "id": "0b406c8b73d05511",
    "title": "Java Engineer / Banking / Iselin / Hybrid",
    "posted_at": "2026-01-15T17:33:33Z",
    "rolling_posted_at": "2026-02-14T17:33:33Z",
    "ziprecruiter_listing_key": "ywqwkkS7cBE__zoqkPyDLA",
    "ziprecruiter_match_id": "019cf53c-efaa-7bbb-868e-2d9fbede3a30",
    "ziprecruiter_open_seat_id": "0b406c8b73d05511",
    "ziprecruiter_bid_tracking_data": "AAEpiU2nL4lq8lAuAerZE00I6tCZTAvVyz2ck5l0fvcGrZvuiZgPYbxTixiTd6u-yhdDZZgwAg26IDn4XfU",
    "status": {
      "is_active": true
    },
    "ziprecruiter_bsf_eligibility_code": 1
  },
  "source": {
    "job_url": "https://www.ziprecruiter.com/c/Motion-Recruitment/Job/Java-Engineer-Banking-Iselin-Hybrid/-in-Iselin,NJ?jid=0b406c8b73d05511",
    "search_results_url": "https://www.ziprecruiter.com/jobs-search?days=&lk=IT9lTkXPJTK7U-uiUz0fNQ&location=New+York%2C+NY&radius=25&refine_by_apply_type=&refine_by_employment=&refine_by_experience_level=&refine_by_location_type=&refine_by_salary=&refine_by_salary_ceil=&search=software+engineer",
    "page_index": 1,
    "scraped_time": "2026-03-16T06:02:18.081268Z",
    "seed": {
      "id": "32148ecc4e30",
      "type": "url",
      "value": "https://www.ziprecruiter.com/jobs-search?days=&lk=IT9lTkXPJTK7U-uiUz0fNQ&location=New+York%2C+NY&radius=25&refine_by_apply_type=&refine_by_employment=&refine_by_experience_level=&refine_by_location_type=&refine_by_salary=&refine_by_salary_ceil=&search=software+engineer"
    }
  },
  "company": {
    "name": "Motion Recruitment",
    "id": "KOwJGkdRvDNlur9AMC4w3HjpV+8=",
    "jobs_url": "https://www.ziprecruiter.com/co/Motion-Recruitment/Jobs",
    "canonical_display_name": "motion recruitment",
    "logo_url": "https://www.ziprecruiter.com/svc/fotomat/public-nosensitive-ziprecruiter-logos/company/5cef46a9.png",
    "profile_uuid": "KOwJGkdRvDNlur9AMC4w3HjpV+8=",
    "profile_display_name": "Motion Recruitment",
    "profile_logo_file_name": "5cef46a9.png",
    "profile_page_url": "https://www.ziprecruiter.com/www.ziprecruiter.com/co/Motion-Recruitment?id=KOwJGkdRvDNlur9AMC4w3HjpV+8%3D",
    "website": "motionrecruitment.com",
    "founded_year": "1989",
    "size": "501 - 1000 Employees",
    "headquarters_location": "Boston, MA, US",
    "headquarters_country": "US",
    "headquarters_state": "MA",
    "headquarters_city": "Boston",
    "industries": [
      "Recruiting and Staffing Services"
    ],
    "twitter_url": "https://twitter.com/MotionStaffing",
    "facebook_url": "https://www.facebook.com/MotionRecruitmentPartners/",
    "similar_companies": [
      {
        "id": "8WWYca8/ldvdBzp3IfmAPRku04o=",
        "display_name": "Robert Half",
        "hq_city": "San Ramon",
        "hq_state": "CA",
        "logo_file_name": "1779d09f.png",
        "company_page_url": "https://www.ziprecruiter.com/www.ziprecruiter.com/co/Robert-Half?id=8WWYca8_ldvdBzp3IfmAPRku04o%3D"
      },
      {
        "id": "8V/wsZDRV6phTbTZmR6B8SBtE9U=",
        "display_name": "Apex Systems",
        "hq_city": "Glen Allen",
        "hq_state": "VA",
        "logo_file_name": "96252033.png",
        "company_page_url": "https://www.ziprecruiter.com/www.ziprecruiter.com/co/Apex-Systems?id=8V_wsZDRV6phTbTZmR6B8SBtE9U%3D"
      }
    ]
  },
  "location": {
    "display_name": "Iselin, NJ US 08830",
    "country_code": "US",
    "state_code": "NJ",
    "search_url": "https://www.ziprecruiter.com/jobs-search?location=Iselin%2CNJ",
    "country": "United States",
    "state": "New Jersey",
    "county": "Middlesex",
    "city": "Iselin",
    "postal_code": "08830",
    "loc_id": "bd3bc246-ca44-4195-8341-424e4240de89",
    "granularity_code": 3,
    "resolve_location_details": {
      "confidence_code": 3,
      "reason_code": 1,
      "success": true
    },
    "area_size": 1
  },
  "compensation": {
    "salary_min": 52.5,
    "salary_max": 72,
    "salary_interval": "PAY_INTERVAL_HOUR",
    "currency": "USD",
    "salary_interval_code": 1,
    "currency_code": 5,
    "salary_min_annual": 105000,
    "salary_max_annual": 144000
  },
  "employment": {
    "employment_types": [
      "Other"
    ],
    "location_types": [
      "Hybrid"
    ],
    "employment_type_codes": [
      6
    ],
    "location_type_codes": [
      3
    ]
  },
  "descriptions": {
    "summary": "A well-known Financial Services Company is looking for a Java Software Engineer in Iselin, NJ, Charlotte, NC, Minneapolis, MN, Dallas, TX, or Phoenix, AZ. Bring your expertise in Java and SQL Server ...",
    "html": "<div>Outstanding long-term contract opportunity! A well-known Financial Services Company is looking for a Java Software Engineer in Iselin, NJ, Charlotte, NC, Minneapolis, MN, Dallas, TX, or Phoenix, AZ. <br> <br> Bring your expertise in Java and SQL Server to a company known for its robust heritage, focus on customer success, and commitment to digital innovation. You’ll collaborate with talented professionals on large-scale projects that shape the future of banking and financial services technology. If you thrive in challenging enterprise environments and love solving complex problems, we want to connect with you!<br> <br> Contract Duration: 24 months with possible conversion (no sponsorship offered) <br> <br> <strong>Required Skills & Experience</strong> <ul> <li>5+ years of professional software engineering experience<br> Deep proficiency in Java (modern versions required) </li><li>Strong command of SQL Server for database-driven applications </li><li>Experience with .NET-to-Java conversions and application modernization (highly desired) </li><li>Background in financial services, banking, or high-compliance enterprise environments preferred </li><li>Excellent communication, problem-solving, and stakeholder management skills </li></ul> <strong>What You Will Be Doing</strong> <ul> <li>Provide expert guidance and technical direction on sophisticated, high-visibility software engineering initiatives<br> Analyze and solve multifaceted engineering and architectural challenges across the development lifecycle </li><li>Collaborate closely with internal teams and external clients to translate requirements into secure, scalable solutions<br> Lead or contribute to .NET-to-Java migrations to modernize legacy systems </li><li>Ensure compliance with regulatory and company standards throughout all phases of project delivery </li><li>Strategically collaborate and consult with client personnel </li></ul></div>",
    "text": "Outstanding long-term contract opportunity! A well-known Financial Services Company is looking for a Java Software Engineer in Iselin, NJ, Charlotte, NC, Minneapolis, MN, Dallas, TX, or Phoenix, AZ. Bring your expertise in Java and SQL Server to a company known for its robust heritage, focus on customer success, and commitment to digital innovation. You’ll collaborate with talented professionals on large-scale projects that shape the future of banking and financial services technology. If you thrive in challenging enterprise environments and love solving complex problems, we want to connect with you! Contract Duration: 24 months with possible conversion (no sponsorship offered) Required Skills & Experience 5+ years of professional software engineering experience Deep proficiency in Java (modern versions required) Strong command of SQL Server for database-driven applications Experience with .NET-to-Java conversions and application modernization (highly desired) Background in financial services, banking, or high-compliance enterprise environments preferred Excellent communication, problem-solving, and stakeholder management skills What You Will Be Doing Provide expert guidance and technical direction on sophisticated, high-visibility software engineering initiatives Analyze and solve multifaceted engineering and architectural challenges across the development lifecycle Collaborate closely with internal teams and external clients to translate requirements into secure, scalable solutions Lead or contribute to .NET-to-Java migrations to modernize legacy systems Ensure compliance with regulatory and company standards throughout all phases of project delivery Strategically collaborate and consult with client personnel"
  },
  "application": {
    "apply_url": "https://www.ziprecruiter.com/job-redirect?match_token=eyJKb2JLZXkiOnsibGlzdGluZ19rZXkiOiJ5d3F3a2tTN2NCRV9fem9xa1B5RExBIiwibWF0Y2hfaWQiOiIwMTljZjUzYy1lZmFhLTdiYmItODY4ZS0yZDlmYmVkZTNhMzAiLCJiaWRfdHJhY2tpbmdfZGF0YSI6IkFBRXBpVTJuTDRscThsQXVBZXJaRTAwSTZ0Q1pUQXZWeXoyY2s1bDBmdmNHclp2dWlaZ1BZYnhUaXhpVGQ2dS15aGREWlpnd0FnMjZJRG40WGZVIn0sIkRlc3RpbmF0aW9uIjoyLCJFeHRlcm5hbEFwcGx5VXJsIjoiaHR0cHM6Ly9jbGljay5hcHBjYXN0LmlvL3QvYUdmWGlVZF9oMWZGclVjREJLdzlHY2hzVGJGX3VQUlJOVkF2LUNOQWZBOUo0cXB3Mm56d2pzTFdUZGUxdU43dz9jaWQ9W2NsaWNrX2lkXSIsIlBsYWNlbWVudElkIjo0NDA3MiwiU2VvSm9iUGFnZVVybCI6IiJ9",
    "button": {
      "apply_button_type_code": 4,
      "destination": "External",
      "destination_code": 2
    }
  }
}
```

### Field reference

#### Job record fields (`type = "job"`)

- **job.id** *(string, required)*: Stable job identifier.
- **job.title** *(string, required)*: Job title shown on the listing.
- **job.status.is\_active** *(boolean, optional)*: Whether the listing appears active.
- **job.posted\_at** *(string, optional)*: Original posted timestamp.
- **job.rolling\_posted\_at** *(string, optional)*: Rolling or refreshed posted timestamp.
- **job.is\_new** *(boolean, optional)*: Whether ZipRecruiter marked the listing as newly posted.
- **job.ziprecruiter\_listing\_key** *(string, optional)*: ZipRecruiter listing key.
- **job.ziprecruiter\_match\_id** *(string, optional)*: ZipRecruiter match identifier.
- **job.ziprecruiter\_open\_seat\_id** *(string, optional)*: ZipRecruiter seat identifier.
- **job.ziprecruiter\_bid\_tracking\_data** *(string, optional)*: Source tracking token.
- **job.ziprecruiter\_bsf\_eligibility** *(string, optional)*: Human-readable BSF eligibility label when available.
- **job.ziprecruiter\_bsf\_eligibility\_code** *(integer, optional)*: Source eligibility code.
- **source.job\_url** *(string, required)*: Canonical URL of the job detail page.
- **source.search\_results\_url** *(string, required)*: Search results page where the job was found.
- **source.page\_index** *(integer, required)*: Results page number for this record.
- **source.scraped\_time** *(string, required)*: Extraction timestamp in ISO 8601 format.
- **source.placement\_id** *(integer, optional)*: ZipRecruiter placement identifier for the result set.
- **source.impression\_lot\_id** *(string, optional)*: ZipRecruiter impression lot identifier for the result set.
- **source.jobs\_count** *(integer, optional)*: Number of jobs in the rendered result set when exposed by the page payload.
- **source.total\_listings** *(integer, optional)*: Total matching listings when exposed by the page payload.
- **source.resolved\_location** *(object|string, optional)*: Resolved search location metadata when present.
- **source.autocorrect** *(object|string, optional)*: Query autocorrect metadata when present.
- **source.predicted\_filters** *(array|object, optional)*: Predicted filter suggestions when present.
- **source.search\_context** *(object|string, optional)*: Search-context metadata when present.
- **source.ptid** *(string, optional)*: Source request/session identifier when present.
- **source.visit\_id** *(string, optional)*: Source visit identifier when present.
- **source.has\_location\_in\_url** *(boolean, optional)*: Whether the source page encoded location in the URL.
- **source.is\_logged\_in** *(boolean, optional)*: Whether the source payload indicated an authenticated session.
- **source.is\_mobile\_ssr** *(boolean, optional)*: Whether the source payload indicated a mobile SSR response.
- **source.is\_sem\_traffic** *(boolean, optional)*: Whether the source payload indicated SEM traffic.
- **source.seed.id** *(string, required)*: Stable identifier for the input seed.
- **source.seed.type** *(string, required)*: Seed category such as `url` or `query`.
- **source.seed.value** *(string, required)*: Original seed value used for discovery.
- **company.name** *(string, optional)*: Company name.
- **company.id** *(string, optional)*: Company identifier.
- **company.hiring\_company\_id** *(string, optional)*: Hiring company identifier when available.
- **company.jobs\_url** *(string, optional)*: Public jobs page for the company.
- **company.canonical\_display\_name** *(string, optional)*: Normalized company display name.
- **company.logo\_url** *(string, optional)*: Company logo URL.
- **company.logo\_source** *(string, optional)*: Human-readable company logo source label.
- **company.profile\_uuid** *(string, optional)*: Company profile UUID.
- **company.profile\_display\_name** *(string, optional)*: Company profile display name.
- **company.profile\_logo\_file\_name** *(string, optional)*: Company profile logo filename.
- **company.profile\_page\_url** *(string, optional)*: Company profile page URL.
- **company.about** *(string, optional)*: Company profile summary when available.
- **company.website** *(string, optional)*: Company website.
- **company.founded\_year** *(string, optional)*: Company founded year.
- **company.size** *(string, optional)*: Company size label.
- **company.headquarters\_location** *(string, optional)*: Headquarters location text.
- **company.headquarters\_country** *(string, optional)*: Headquarters country code.
- **company.headquarters\_state** *(string, optional)*: Headquarters state or region code.
- **company.headquarters\_city** *(string, optional)*: Headquarters city.
- **company.headquarters\_street** *(string, optional)*: Headquarters street address.
- **company.headquarters\_postal\_code** *(string, optional)*: Headquarters postal code.
- **company.industries** *(array\[string], optional)*: Industry labels.
- **company.twitter\_url** *(string, optional)*: Twitter or X profile URL.
- **company.facebook\_url** *(string, optional)*: Facebook page URL.
- **company.similar\_companies** *(array\[object], optional)*: Related companies shown with the profile.
- **company.similar\_companies\[].id** *(string, optional)*: Related company identifier.
- **company.similar\_companies\[].display\_name** *(string, optional)*: Related company display name.
- **company.similar\_companies\[].hq\_city** *(string, optional)*: Related company headquarters city.
- **company.similar\_companies\[].hq\_state** *(string, optional)*: Related company headquarters state.
- **company.similar\_companies\[].logo\_file\_name** *(string, optional)*: Related company logo filename.
- **company.similar\_companies\[].company\_page\_url** *(string, optional)*: Related company page URL.
- **location.display\_name** *(string, optional)*: Human-readable job location.
- **location.country\_code** *(string, optional)*: Country code.
- **location.state\_code** *(string, optional)*: State or region code.
- **location.search\_url** *(string, optional)*: Public search URL for the location.
- **location.country** *(string, optional)*: Country name.
- **location.state** *(string, optional)*: State or region name.
- **location.county** *(string, optional)*: County name.
- **location.neighborhood** *(string, optional)*: Neighborhood name.
- **location.city** *(string, optional)*: City name.
- **location.postal\_code** *(string, optional)*: Postal code.
- **location.loc\_id** *(string, optional)*: Source location identifier.
- **location.granularity** *(string, optional)*: Human-readable location precision label when exposed.
- **location.granularity\_code** *(integer, optional)*: Location precision code.
- **location.resolve\_location\_details.confidence** *(string, optional)*: Human-readable location resolution confidence label.
- **location.resolve\_location\_details.confidence\_code** *(integer, optional)*: Location resolution confidence code.
- **location.resolve\_location\_details.reason** *(string, optional)*: Human-readable location resolution reason label.
- **location.resolve\_location\_details.reason\_code** *(integer, optional)*: Location resolution reason code.
- **location.resolve\_location\_details.success** *(boolean, optional)*: Whether location resolution succeeded.
- **location.area\_size** *(integer, optional)*: Area size value when available.
- **compensation.exact\_amount** *(number, optional)*: Single pay amount when only one value is shown.
- **compensation.salary\_min** *(number, optional)*: Minimum salary or pay value.
- **compensation.salary\_max** *(number, optional)*: Maximum salary or pay value.
- **compensation.salary\_interval** *(string, optional)*: Pay interval label.
- **compensation.salary\_interval\_code** *(integer, optional)*: Pay interval code.
- **compensation.currency** *(string, optional)*: Currency code.
- **compensation.currency\_code** *(integer, optional)*: Currency code value.
- **compensation.salary\_min\_annual** *(number, optional)*: Annualized minimum salary.
- **compensation.salary\_max\_annual** *(number, optional)*: Annualized maximum salary.
- **compensation.metadata.source\_type** *(string, optional)*: Human-readable compensation metadata source label.
- **compensation.metadata.visible** *(boolean, optional)*: Whether compensation metadata was marked visible.
- **employment.employment\_types** *(array\[string], optional)*: Employment type labels.
- **employment.location\_types** *(array\[string], optional)*: Work arrangement labels.
- **employment.employment\_type\_codes** *(array\[integer], optional)*: Employment type codes.
- **employment.employment\_type\_details** *(array\[object], optional)*: Structured employment type details with labels, codes, and metadata.
- **employment.location\_type\_codes** *(array\[integer], optional)*: Work arrangement codes.
- **employment.location\_type\_details** *(array\[object], optional)*: Structured work arrangement details with labels, codes, and metadata.
- **employment.benefits** *(array\[string], optional)*: Benefits when available.
- **employment.benefit\_details** *(array\[object], optional)*: Structured benefit details with labels and metadata.
- **descriptions.summary** *(string, optional)*: Short listing summary.
- **descriptions.html** *(string, optional)*: HTML version of the job description.
- **descriptions.text** *(string, optional)*: Plain-text version of the job description.
- **application.apply\_url** *(string, optional)*: Application URL.
- **application.job\_redirect\_url** *(string, optional)*: Internal ZipRecruiter redirect URL when present.
- **application.ping\_url** *(string, optional)*: Internal ZipRecruiter redirect ping URL when present.
- **application.seo\_job\_redirect\_url** *(string, optional)*: Alternate SEO redirect URL when present.
- **application.canonical\_job\_page\_url** *(string, optional)*: Canonical ZipRecruiter job page URL when present.
- **application.current\_application\_status** *(object|string, optional)*: Current application-state payload when exposed by the source response.
- **application.button.apply\_button\_type** *(string, optional)*: Apply button type label.
- **application.button.apply\_button\_type\_code** *(integer, optional)*: Apply button type code.
- **application.button.destination** *(string, optional)*: Application destination label.
- **application.button.destination\_code** *(integer, optional)*: Application destination code.

Many of the richer `source`, `company`, `location`, `employment`, and `application` fields are endpoint-dependent. Search-result HTML, search-result API hydrate responses, and breakroom job-detail enrichment do not always expose the same subfields, so missing values should be treated as normal rather than as parsing failures.

### Data guarantees & handling

- **Best-effort extraction:** fields may vary by region, session, availability, and UI experiments.
- **Optional fields:** null-check in downstream code.
- **Deduplication:** recommend `type + ":" + id`; runtime dedupe also prioritizes seat-level IDs before listing-level keys.

### How to Run on Apify

1. Open the Actor in Apify Console.
2. Configure your search parameters, such as keywords, location, distance, remote preference, posting date, and employment filters.
3. Set the maximum number of outputs to collect with the `limit` field.
4. Click **Start** and wait for the run to finish.
5. Download results in JSON, CSV, Excel, or another supported export format.

### Scheduling & Automation

#### Scheduling

**Automated Data Collection**

You can schedule this actor to run automatically so your dataset stays current without manual intervention. This is useful for recurring market reports, employer monitoring, enrichment jobs, and periodic analytics refreshes.

- Navigate to **Schedules** in Apify Console
- Create a new schedule (daily, weekly, or custom cron)
- Configure input parameters
- Enable notifications for run completion
- Optional: add webhooks for automated processing

#### Integration Options

- **Webhooks:** Trigger downstream actions when a run completes
- **Zapier:** Connect to 5,000+ apps without coding
- **Make (Integromat):** Build multi-step automation workflows
- **Google Sheets:** Export results to a spreadsheet
- **Slack/Discord:** Receive notifications and summaries
- **Email:** Send automated reports via email

### Performance

Estimated run times:

- **Small runs (< 1,000 outputs):** ~2-3 minutes
- **Medium runs (1,000-5,000 outputs):** ~5-15 minutes
- **Large runs (5,000+ outputs):** ~15-30 minutes

Execution time varies based on filters, result volume, and how much information is returned per record.

### Compliance & Ethics

#### Responsible Data Collection

This actor collects publicly available **job listing and company** information from **ZipRecruiter** for legitimate business purposes, including:

- **Labor market** research and market analysis
- **Hiring trend monitoring**
- **Data enrichment and internal reporting**

Users are responsible for ensuring that their use of collected data complies with applicable laws, regulations, and the target site's terms. This section is informational and not legal advice.

#### Best Practices

- Use collected data in accordance with applicable laws, regulations, and the target site’s terms
- Respect individual privacy and personal information
- Use data responsibly and avoid disruptive or excessive collection
- Do not use this actor for spamming, harassment, or other harmful purposes
- Follow relevant data protection requirements where applicable (e.g., GDPR, CCPA)

### Support

If you need help, use the Issues tab or the actor page in Apify Console. Include the input you used with sensitive values redacted, the run ID, a short note describing expected versus actual behavior, and, if helpful, a small output sample that shows the issue clearly.

# Actor input Schema

## `queries` (type: `array`):

Enter job titles, skills, departments, or hiring keywords such as `software engineer` or `marketing manager`. Each entry is searched separately, and the filters below are applied to every keyword.

## `location` (type: `string`):

Enter a city, state, ZIP code, or `City, ST` value such as `New York, NY` or `10001`. The same location is used for every keyword search.

## `radius` (type: `string`):

Choose how far from the selected location each search should reach. A smaller radius keeps results more local, while a larger radius broadens coverage around the same market.

## `remote_options` (type: `string`):

Choose which work arrangement to include for keyword-based searches. Leave the default to include both remote and location-based opportunities.

## `days` (type: `string`):

Choose the maximum age of job postings to include. Leave the default to avoid narrowing results by posting date.

## `refineByEmployment` (type: `string`):

Choose one employment type to include. Leave the default when you want to collect listings across all available employment types.

## `refineBySalary` (type: `integer`):

Enter the lowest salary amount to include. Leave blank when you do not want to filter out lower salary listings.

## `refineBySalaryCeil` (type: `integer`):

Enter the highest salary amount to include. Leave blank when you do not want to filter out higher salary listings.

## `refineByApplyType` (type: `boolean`):

Enable this to collect only listings marked for Quick Apply on ZipRecruiter. Leave it off when external application links are acceptable for your workflow.

## `refineByExperienceLevel` (type: `array`):

Choose one or more required experience levels to include. Leave empty when you do not want to narrow listings by seniority.

## `limit` (type: `integer`):

Set the maximum number of job listings to save for each keyword search. The limit applies separately to each keyword you provide.

## Actor input object example

```json
{
  "refineByApplyType": false,
  "limit": 50000
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {};

// Run the Actor and wait for it to finish
const run = await client.actor("fatihtahta/ziprecruiter-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {}

# Run the Actor and wait for it to finish
run = client.actor("fatihtahta/ziprecruiter-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call fatihtahta/ziprecruiter-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=fatihtahta/ziprecruiter-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "ZipRecruiter Scraper | $1 / 1k | Fast & Reliable",
        "description": "Extract structured ZipRecruiter job listings with companies, locations, compensation ranges, employment types, contacts and full descriptions. Built for hiring intelligence, labor-market research, and automated recruiting or analytics pipelines.",
        "version": "0.3",
        "x-build-id": "txuZEBNU7jR5Kyzg2"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/fatihtahta~ziprecruiter-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-fatihtahta-ziprecruiter-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/fatihtahta~ziprecruiter-scraper/runs": {
            "post": {
                "operationId": "runs-sync-fatihtahta-ziprecruiter-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/fatihtahta~ziprecruiter-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-fatihtahta-ziprecruiter-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "queries": {
                        "title": "Add Job Keywords",
                        "type": "array",
                        "description": "Enter job titles, skills, departments, or hiring keywords such as `software engineer` or `marketing manager`. Each entry is searched separately, and the filters below are applied to every keyword.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "location": {
                        "title": "Choose Search Location",
                        "type": "string",
                        "description": "Enter a city, state, ZIP code, or `City, ST` value such as `New York, NY` or `10001`. The same location is used for every keyword search."
                    },
                    "radius": {
                        "title": "Set Search Radius",
                        "enum": [
                            "5",
                            "10",
                            "25",
                            "50",
                            "100"
                        ],
                        "type": "string",
                        "description": "Choose how far from the selected location each search should reach. A smaller radius keeps results more local, while a larger radius broadens coverage around the same market."
                    },
                    "remote_options": {
                        "title": "Choose Work Arrangement",
                        "enum": [
                            "",
                            "no_remote",
                            "hybrid",
                            "only_remote"
                        ],
                        "type": "string",
                        "description": "Choose which work arrangement to include for keyword-based searches. Leave the default to include both remote and location-based opportunities."
                    },
                    "days": {
                        "title": "Choose Posting Window",
                        "enum": [
                            "",
                            "30",
                            "10",
                            "5",
                            "1"
                        ],
                        "type": "string",
                        "description": "Choose the maximum age of job postings to include. Leave the default to avoid narrowing results by posting date."
                    },
                    "refineByEmployment": {
                        "title": "Choose Employment Type",
                        "enum": [
                            "",
                            "employment_type:full_time",
                            "employment_type:part_time",
                            "employment_type:contract",
                            "employment_type:temporary",
                            "employment_type:as_needed",
                            "employment_type:other"
                        ],
                        "type": "string",
                        "description": "Choose one employment type to include. Leave the default when you want to collect listings across all available employment types."
                    },
                    "refineBySalary": {
                        "title": "Set Minimum Salary",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Enter the lowest salary amount to include. Leave blank when you do not want to filter out lower salary listings."
                    },
                    "refineBySalaryCeil": {
                        "title": "Set Maximum Salary",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Enter the highest salary amount to include. Leave blank when you do not want to filter out higher salary listings."
                    },
                    "refineByApplyType": {
                        "title": "Include Quick Apply Jobs Only",
                        "type": "boolean",
                        "description": "Enable this to collect only listings marked for Quick Apply on ZipRecruiter. Leave it off when external application links are acceptable for your workflow.",
                        "default": false
                    },
                    "refineByExperienceLevel": {
                        "title": "Choose Experience Levels",
                        "type": "array",
                        "description": "Choose one or more required experience levels to include. Leave empty when you do not want to narrow listings by seniority.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "no_experience",
                                "junior",
                                "mid",
                                "senior"
                            ],
                            "enumTitles": [
                                "No experience | entry access",
                                "Junior | early career",
                                "Mid | experienced roles",
                                "Senior | senior and above"
                            ]
                        }
                    },
                    "limit": {
                        "title": "Set Maximum Listings per Search",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Set the maximum number of job listings to save for each keyword search. The limit applies separately to each keyword you provide.",
                        "default": 50000
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
