# ZipRecruiter Job Details (Batch)

> ZipRecruiter Job Details (Batch) 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).

Fetches full ZipRecruiter job posting details for up to 20 job IDs in a single concurrent request, including description, highlights, salary, company info, and more.

## Facts

- Endpoint: GET https://agents.openwebninja.com/realtime-ziprecruiter-data/job-details?utm_source=zero.xyz
- Price: price unknown
- Payment: MPP
- Status: unknown
- Last checked: 2026-10-14
- Activations on Zero: 0
- Provider: agents.openwebninja.com
- Website: https://agents.openwebninja.com
- Canonical page: https://www.zero.xyz/c/agents-openwebninja-com-ziprecruiter-job-details-batch-656f90da
- Structured record (JSON): https://api.zero.xyz/v1/capabilities/cap__ePWwLiWY_lekIQI60VWU

Status and success rate cover calls made through Zero and Zero's own probes. Third-party monitors may report differently.

## How to call it through Zero

Zero handles the 402 payment challenge and records the run. With the Zero CLI installed (`npm i -g @zeroxyz/cli`):

```sh
zero fetch --capability agents-openwebninja-com-ziprecruiter-job-details-batch-656f90da
```

Example prompt: I found these ZipRecruiter job IDs from my earlier search — emlwcmVjcnVpdGVyOjkzNjIxNWNiNTAzZDhiZTI and a few others — can you pull the full job descriptions, salary ranges, and apply links for all of them at once?

## When to prefer this

Use this endpoint when you already have ZipRecruiter job IDs (from a prior /search call) and need full detail-page data — job description, highlights, salary, employer reviews, and company metadata — for up to 20 postings in a single call. Prefer this over re-running searches when you want to enrich or compare specific known listings efficiently. If you need to search for new jobs rather than look up known IDs, use the /search endpoint instead.

## Known failure modes

- All foreign (non-ZipRecruiter) IDs return 200 with an empty array
- Taken-down or expired listings are silently omitted from the response array
- Unknown field names in the 'fields' projection parameter return a 400 error
- Country mismatch (e.g. Canadian posting queried with country=us) may result in empty results
- Exceeding 20 job IDs per request is not supported and may error or truncate
- Billing counts each requested ID so foreign IDs still incur cost

## How this service works

Full details for up to 20 ZipRecruiter job postings in one call, fetched concurrently.

This endpoint always reads the detail surface, so the detail-only fields are filled without
any flag: `job_description` and `ziprecruiter_description_html` at 100%, `job_highlights`
at 72%, `job_onet_soc`, `ziprecruiter_job_industry` and `ziprecruiter_valid_through` at 73%
(ZipRecruiter ships JSON-LD on 73% of detail pages), `employer_website` and the company
widget fields at 54%, and `employer_reviews` at 14%.

Three fields belong to the search card and are `null` here:
`ziprecruiter_short_description`, the card teaser; `ziprecruiter_updated_at`,
ZipRecruiter's listing refresh stamp; and `ziprecruiter_is_new`, a card badge.

An id this API did not mint, or a posting ZipRecruiter has taken down, is omitted from the
array while the rest of the batch resolves normally. A request made entirely of ids from
another job API returns a 200 with an empty array.

**Billing:** `Requests` counts one per requested id, including ids that turn out to be
foreign, so the cost of a call is predictable before you make it.

## Output

Returns an array of job objects — one per valid ZipRecruiter job ID — each containing: full job description (plain text and HTML), job highlights, salary range and period, benefits, location details, apply link and options, employer name/logo/website/reviews, company size and HQ, job industry, ONET SOC code, posting expiry date, and numerous ZipRecruiter-specific metadata fields. Invalid or taken-down IDs are silently omitted while valid ones still resolve.

## Request schema (JSON Schema)

```json
{
 "type": "object",
 "required": [
  "job_id"
 ],
 "properties": {
  "fields": {
   "type": "string",
   "description": "Comma-separated projection over the job object, for example\n`job_title,employer_name,job_apply_link`. `job_id` and `job_title` are always included.\nAn unknown field name returns a 400 error."
  },
  "job_id": {
   "type": "string",
   "example": "emlwcmVjcnVpdGVyOjkzNjIxNWNiNTAzZDhiZTI",
   "description": "Comma-separated job ids from a `/search` response, up to 20 per request. The raw\n`job_uid` of a previous response is also accepted."
  },
  "country": {
   "enum": [
    "us",
    "ca"
   ],
   "type": "string",
   "default": "us",
   "description": "Country market the posting belongs to. Only `us` and `ca` are served.\n\n**Allowed values:** `us`, `ca`\n\n**Default:** `us`"
  }
 }
}
```

## Response schema (JSON Schema)

```json
{
 "type": "object",
 "required": [
  "status",
  "request_id",
  "parameters",
  "data"
 ],
 "properties": {
  "data": {
   "type": "array",
   "items": {
    "type": "object",
    "required": [
     "job_id",
     "job_title",
     "employer_name",
     "employer_logo",
     "employer_website",
     "job_publisher",
     "job_employment_type",
     "job_employment_types",
     "job_apply_link",
     "job_apply_is_direct",
     "apply_options",
     "job_description",
     "job_is_remote",
     "job_posted_at",
     "job_posted_at_timestamp",
     "job_posted_at_datetime_utc",
     "job_location",
     "job_city",
     "job_state",
     "job_country",
     "job_latitude",
     "job_longitude",
     "job_benefits",
     "job_benefits_strings",
     "job_google_link",
     "job_salary",
     "job_salary_string",
     "job_min_salary",
     "job_max_salary",
     "job_salary_period",
     "job_highlights",
     "job_onet_soc",
     "job_onet_job_zone",
     "employer_reviews",
     "job_uid",
     "ziprecruiter_listing_key",
     "ziprecruiter_short_description",
     "ziprecruiter_description_html",
     "ziprecruiter_share_url",
     "ziprecruiter_canonical_job_url",
     "ziprecruiter_updated_at",
     "ziprecruiter_is_new",
     "ziprecruiter_apply_type",
     "ziprecruiter_apply_host",
     "ziprecruiter_salary_source",
     "ziprecruiter_salary_is_estimated",
     "ziprecruiter_location_type",
     "ziprecruiter_location_county",
     "ziprecruiter_location_postal_code",
     "ziprecruiter_location_id",
     "ziprecruiter_company_id",
     "ziprecruiter_company_slug",
     "ziprecruiter_company_size",
     "ziprecruiter_company_hq",
     "ziprecruiter_company_industries",
     "ziprecruiter_job_industry",
     "ziprecruiter_valid_through",
     "ziprecruiter_ats_identifier",
     "ziprecruiter_key_responsibilities",
     "ziprecruiter_employer_faq"
    ],
    "properties": {
     "job_id": {
      "type": "string",
      "example": "emlwcmVjcnVpdGVyOjkzNjIxNWNiNTAzZDhiZTI",
      "description": "Stable, opaque id for this posting. Pass it straight back to `/job-details`. Encodes\nZipRecruiter's own seat id, so it survives re-fetches and is the same on every surface."
     },
     "job_uid": {
      "type": "string",
      "example": "936215cb503d8be2",
      "description": "ZipRecruiter's own raw seat id, 16 hex characters. Stable across surfaces and\nre-fetches, accepted directly by `/job-details`, and the right key for an enrichment\ncache."
     },

… (truncated)
```

## More

- Live health (JSON, refreshed every minute): https://www.zero.xyz/c/agents-openwebninja-com-ziprecruiter-job-details-batch-656f90da/health.json
- [Zero catalog index](https://www.zero.xyz/llms.txt)
- [Other services from agents.openwebninja.com](https://www.zero.xyz/host/agents.openwebninja.com/llms.txt)
