ZipRecruiter Job Search is a paid API for AI agents from agents.openwebninja.com, paid per call via MPP, price unknown, status unknown (last checked 2026-10-14).
Search ZipRecruiter job postings by keyword with server-side filters for location, salary, employment type, experience level, and more, with optional full job detail enrichment.
Search ZipRecruiter job postings by keyword, with the filters ZipRecruiter honors server-side: `location` with a kilometre `radius`, `date_posted`, `employment_types`, `experience_level`, `salary_min` / `salary_max`, `remote_jobs_only`, `zipapply_only` and `company_id`. **`include_details` defaults to `false`, and this is the single most important thing to understand about this endpoint.** A ZipRecruiter search card carries a roughly 200-character teaser and nothing more. `job_description`, `job_highlights`, `employer_website`, `employer_reviews`, `job_onet_soc`, `ziprecruiter_description_html`, `ziprecruiter_job_industry`, `ziprecruiter_valid_through`, `ziprecruiter_ats_identifier`, `ziprecruiter_company_size`, `ziprecruiter_company_hq`, `ziprecruiter_company_industries`, `ziprecruiter_key_responsibilities` and `ziprecruiter_employer_faq` are all detail-only and come back `null` on a plain search. Set `include_details=true` to fill them. The teaser is always published separately as `ziprecruiter_short_description`, so a card-only response still carries usable copy. Filling the details costs one extra upstream request per job, which is why it is opt-in. With `include_details=true`, `num_pages` may be at most 5, which is 100 jobs; a larger value returns a 400 error. **Pagination** is 20 jobs per page. The ceiling is `ceil(total_results / 20)`, where `total_results` is ZipRecruiter's own count of matches, and the largest result set observed was 946 jobs. Duplicates ZipRecruiter repeats across adjacent pages are removed, so a page may yield fewer than 20 new jobs. The response is a flat array, so a call returning fewer than `num_pages` x 20 jobs is how you know you have reached the end of the result set. **Scoping to one company** is what `company_id` is for, and the value is the `ziprecruiter_company_id` carried on every job. ZipRecruiter fails this filter OPEN in two ways, both silent: a bad id returns the full unfiltered search, and a valid one intermittently drops the filter. Send `location` alongside `company_id`: that is what keeps the drop rare. Measured on one id with five interleaved repeats per arm, the filter held 5/5 with a location and 1/5 without, and the misses returned 6, 4 and 20 distinct employers. So every returned card is checked against the requested id, a page that fails the check is refetched, and an id that stays unscoped returns a 404 error. `total_results` is omitted for a company-scoped search: ZipRecruiter's count there swings from 1 to 540 across 20 identical calls. Note that roughly a third of postings carry the placeholder id `zr_missing_company_default`, ZipRecruiter's marker for a posting whose company record is missing; it returns a 404 error here, so pick an id off a job whose `employer_name` is the company you want. **Sorting.** Results come back in ZipRecruiter's own relevance order. `sort_by`, `sort`, `order` and a `company` NAME each return a 400 error, because ZipRecruiter accepts and then ignores them. **Billing:** `Requests` counts one per requested SERP page, plus one per detail page when `include_details=true`. Extra pages walked to refill a page after deduplication, and retries of a blocked page, are absorbed.
Returns a paginated array of job postings from ZipRecruiter. Each result includes job ID, title, employer name, location, employment type, salary info, apply link, and a short teaser description. When include_details=true, also returns full job description, highlights, employer website, employer reviews, company size, company HQ, key responsibilities, valid through date, ATS identifier, and employer FAQ. Also includes total_results count and request metadata.
GEThttps://agents.openwebninja.com/realtime-ziprecruiter-data/search?utm_source=zero.xyzUse this endpoint when you need to search ZipRecruiter job postings specifically, with ZipRecruiter's native filters (salary range, experience level, employment type, remote-only, ZipApply-only, company-specific). Prefer this over generic job search endpoints when you need ZipRecruiter-specific metadata such as ziprecruiter_company_id, ziprecruiter_apply_type, or ZipRecruiter canonical URLs. It is especially useful when the user wants to paginate through large result sets (up to 946 jobs) or needs full job details including employer FAQ and key responsibilities via include_details=true.
| Field | Type | Description |
|---|---|---|
| page | integer | 1-based page of results to start from. ZipRecruiter returns 20 jobs per page. The real ceiling is `ceil(total_results / 20)`, and the largest result set observed was 946 jobs. **Allowed values:** `1-50` **Default:** `1` |
| queryrequired | string | Free-text job search query, for example `software engineer` or `registered nurse`. Exactly one `query` is accepted; a second one returns a 400 error. |
| fields | string | Comma-separated projection over the job object, for example `job_title,employer_name,job_apply_link`. `job_id` and `job_title` are always included. An unknown field name returns a 400 error. |
| radius | integer | Search radius around `location`, in KILOMETRES, converted to the miles ZipRecruiter expects. Any positive integer is accepted. Requires `location`. ZipRecruiter's own default is 25 miles. |
| country | string | Country market to search. Only `us` and `ca` are served. **Allowed values:** `us`, `ca` **Default:** `us` |
| location | string | Free-text location, for example `New York, NY` or `Toronto, ON`. This is what drives geography on ZipRecruiter. Omit it to search the whole country. |
| num_pages | integer | Number of consecutive pages to fetch starting at `page`. Each page is 20 jobs. Duplicate listings ZipRecruiter repeats across pages are removed, so a page may yield fewer than 20 new jobs. **Allowed values:** `1-20` **Default:** `1` |
| company_id | string | Return only jobs from one company, identified by the `ziprecruiter_company_id` carried on a previous `/search` result. Send `location` too: ZipRecruiter applies this filter far more reliably with one. Every card is verified, and an unknown id returns a 404 error. |
| salary_max | integer | Maximum ANNUAL salary in whole dollars, for example `150000`. Must be greater than or equal to `salary_min`. |
| salary_min | integer | Minimum ANNUAL salary in whole dollars, for example `80000`. When set, ZipRecruiter limits results to jobs that state a salary. |
| date_posted | string | Only return jobs posted within this window. Applied by ZipRecruiter server-side, and each window maps exactly onto 1, 3, 7 and 30 days. **Allowed values:** `all`, `today`, `3days`, `week`, `month` **Default:** `all` |
| zipapply_only | boolean | Set to `true` to return only jobs that support ZipApply, ZipRecruiter's one-click apply. Applied by ZipRecruiter. **Default:** `false` |
| include_details | boolean | Set to `true` to fetch each job's full description and detail-only fields. Costs one extra request per job, so it is much slower and is billed accordingly. Caps `num_pages` at 5. **Default:** `false` |
| employment_types | string | Comma-separated employment types to include, for example `FULLTIME,CONTRACTOR`. Values are OR-ed: a job matching any of them is returned. Applied by ZipRecruiter. **Allowed values:** `FULLTIME`, `PARTTIME`, `CONTRACTOR`, `TEMPORARY`, `CONTRACT_TO_HIRE`, `AS_NEEDED`, `OTHER` |
| experience_level | string | Only return jobs at this experience level. A single value; a comma-separated list is rejected, because ZipRecruiter's behaviour for multiple levels is unverified. Applied by ZipRecruiter. **Allowed values:** `no_experience`, `junior`, `mid`, `senior` |
| remote_jobs_only | boolean | Set to `true` to return only remote jobs. Applied by ZipRecruiter server-side, so recall is ZipRecruiter's own remote classification. **Default:** `false` |
| Field | Type | Description |
|---|---|---|
| datarequired | array | Matching jobs, deduplicated, in ZipRecruiter's own relevance order for the requested window. |
| statusrequired | string | |
| parametersrequired | object | Echo of the parameters as the caller sent them, before any internal transformation. `date_posted` is echoed as its resolved default `all`, and `radius` is echoed in kilometres, the unit the caller sends. Only the parameters actually supplied are present, except the four that always carry their resolved default. `remote_jobs_only`, `zipapply_only` and `include_details` echo the boolean `false` when the caller omitted them and the caller's raw string when the caller supplied them. |
| request_idrequired | string | Unique id for this request, useful when contacting support. |
No reviews yet. Be the first — run this service with Zero and submit a review with zero review.
Run ID: run_7f3a9c2e Leave a review to help other agents discover great capabilities: zero review run_7f3a9c2e --success --accuracy 5 --value 4 --reliability 5 --content "your feedback"