# LinkedIn Job Details Bulk Fetch

> LinkedIn Job Details Bulk Fetch 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 details for up to 20 LinkedIn job postings concurrently by job ID, returning a rich 35+ field object per posting.

## Facts

- Endpoint: GET https://agents.openwebninja.com/realtime-linkedin-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-linkedin-job-details-bulk-fetch-2c2adb01
- Structured record (JSON): https://api.zero.xyz/v1/capabilities/cap_sUFXQM3kU17dO-45BRMeZ

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-linkedin-job-details-bulk-fetch-2c2adb01
```

Example prompt: Can you pull the full details — job description, salary, employer, seniority level, and apply link — for these LinkedIn job IDs: bGlua2VkaW46NDQ1MzY3MDk3Mw and bGlua2VkaW46NDQ1MzY3MDk3Ng, using the US market proxy?

## When to prefer this

Use this endpoint when you already have LinkedIn job IDs (from a prior /search call or stored elsewhere) and need the full 35+ field detail object for each posting — especially for batch hydration of up to 20 jobs in one call. Prefer /search when you need the exact posting date (job_posted_at_date) or the job's absolute rank in a result set (job_position), since those fields are only authoritative on search results.

## Known failure modes

- Invalid or unrecognized field name in 'fields' parameter returns HTTP 400
- Job ID not minted by this API or posting taken down by LinkedIn — posting silently absent from response array (not an error)
- More than 20 job IDs supplied — excess IDs beyond cap are ignored or rejected
- Invalid country code may result in incorrect proxy exit market or error
- Posting date may be off by a few days since it is derived from LinkedIn's relative label ('1 week ago') snapped to midnight UTC
- Rate limiting or upstream LinkedIn blocking may result in partial or empty results

## How this service works

Full details for up to 20 LinkedIn job postings in one call, fetched concurrently (bounded to 10 in flight).

The returned objects carry the same 35-key JSearch contract plus the LinkedIn extras. Two fields exist only on a search card and are therefore always `null` here: `job_position` (LinkedIn's absolute rank within a result set) and `job_posted_at_date` (the exact `datetime` attribute). On this surface the posting date is derived from LinkedIn's relative label ("1 week ago") and snapped to midnight UTC, so it can be off by a few days — `/search` is the authoritative source for the exact date.

An id this API did not mint, or a posting LinkedIn has taken down, is simply absent from the array. It is never an error and never a fabricated shell object.

## Output

An array of job objects (one per valid, live posting ID supplied), each containing 35+ fields: job ID, title, employer name/logo/website/LinkedIn URL, employment type, apply link and options, job description, remote flag, posting date and timestamp, location details (city, state, country, lat/lon), salary data (min, max, single figure, currency, period), job highlights, O*NET codes, employer reviews, LinkedIn-specific fields (seniority level, job function, industries, applicant count and label, LinkedIn badges). Missing or taken-down postings are silently omitted from the array rather than causing errors.

## Request schema (JSON Schema)

```json
{
 "type": "object",
 "required": [
  "job_id"
 ],
 "properties": {
  "fields": {
   "type": "string",
   "description": "Comma-separated projection over the job object. `job_id` and `job_title` are always included. An unknown field is a 400."
  },
  "job_id": {
   "type": "string",
   "example": "bGlua2VkaW46NDQ1MzY3MDk3Mw",
   "description": "Comma-separated list of up to 20 `job_id` values as returned by `/search`. Duplicates are collapsed before the cap is applied. The raw numeric LinkedIn posting id (`job_uid`) is also accepted."
  },
  "country": {
   "type": "string",
   "default": "us",
   "description": "2-letter country code; selects the proxy exit market."
  }
 }
}
```

## 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",
     "employer_linkedin_url",
     "job_linkedin_company_id",
     "job_seniority_level",
     "job_function",
     "job_industries",
     "job_applicants_count",
     "job_applicants_label",
     "job_salary_currency",
     "job_posted_at_date",
     "job_posted_at_linkedin_label",
     "job_linkedin_badges",
     "job_position"
    ],
    "properties": {
     "job_id": {
      "type": "string",
      "example": "bGlua2VkaW46NDQ1MzY3MDk3Mw",
      "description": "Opaque public id: `base64url(\"linkedin:\" + <posting id>)`. Pass it back to `/job-details`. Stable for the life of the posting."
     },
     "job_uid": {
      "type": "string",
      "example": "4453670973",
      "description": "The raw numeric LinkedIn posting id. Permanent, and accepted directly by `/job-details`."
     },
     "job_city": {
      "type": "string",
      "example": "New York",
      "nullable": true
     },
     "job_state": {
      "type": "string",
      "example": "New York",
      "nullable": true,
      "description": "US 2-letter codes are expanded to the full state name, matching JSearch."
     },
     "job_title": {
      "type": "string",
      "example": "Software Engineer III (Java/AWS)"
     },
     "job_salary": {
      "type": "number",
      "example": null,
      "nullable": true,
      "description": "Set only when a posting states a single figure rather than a range; a range populates `job_min_salary` / `job_max_salary` instead."
     },
     "job_country": {
      "typ
… (truncated)
```

## More

- Live health (JSON, refreshed every minute): https://www.zero.xyz/c/agents-openwebninja-com-linkedin-job-details-bulk-fetch-2c2adb01/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)
