# Get every open LinkedIn job at a company with OpenWeb Ninja's API

OpenWeb Ninja's Real-Time LinkedIn Data API lists every open LinkedIn job at a company from one GET request that names the company by its LinkedIn slug. Calls are billed at $0.03 per 10 requests against a plan your credential holds. Send `GET https://agents.openwebninja.com/zcj/zonyryu43s0t/realtime-linkedin-data/company-jobs?company=<slug>&num_pages=1` with `Authorization: Bearer <token>`, then keep the `job_linkedin_company_id` it returns so later checks can skip resolving the slug.

## At a glance

- **Endpoint:** `GET https://agents.openwebninja.com/zcj/zonyryu43s0t/realtime-linkedin-data/company-jobs`, 10 jobs per page
- **Query:** `company` (a LinkedIn slug) or `company_id` (the numeric id), plus `num_pages=1`, optional `fields`, `query`, `location`, `date_posted`, `seniority_levels`, `employment_types`, `page`
- **Price:** $0.03 per 10 requests.
- **Payment:** calls draw on a plan held by a bearer credential, the agent identity the storefront issues: Free ($0.15 of credit) or Credits (from $0.50). There is no per-call payment.
- **Response:** JSON with `status`, `parameters` (including `company_ids_resolved`) and a `data` array of job objects
- **Follow-up:** `GET https://agents.openwebninja.com/zcj/zonyryu43s0t/realtime-linkedin-data/job-details?job_id=<job_id>` for one posting's function, industries and seniority
- **Full purchase flow:** [the buyer skill](https://agents.openwebninja.com/zcj/zonyryu43s0t/SKILL.md)

## Get access first

Every call needs `Authorization: Bearer <token>` for a credential that holds a plan here. A call without a credential answers `401 bearer_required`, and a credential without a covering plan answers `403 plan_required`. Free grants $0.15 once per human and needs the credential claimed with a verified email. Credits is prepaid, with a minimum of $0.50 ($0.50 by card), and calls draw it down. Buy a plan with `POST https://agents.openwebninja.com/zcj/zonyryu43s0t/plans/{planId}/purchase`, taking the plan id from [the catalog](https://agents.openwebninja.com/zcj/zonyryu43s0t/manifest.json). That purchase answers with a 402, the price quote you pay over x402, MPP or card and then retry. [The buyer skill](https://agents.openwebninja.com/zcj/zonyryu43s0t/SKILL.md) and [Identity](https://agents.openwebninja.com/zcj/zonyryu43s0t/auth.md) have the steps.

## Get every open job at a company

1. Request the company's jobs by slug, one page, with only the fields you need:

   ```bash
   curl -s "https://agents.openwebninja.com/zcj/zonyryu43s0t/realtime-linkedin-data/company-jobs?company=atlassian&num_pages=1&fields=job_id,job_title,employer_name,job_linkedin_company_id,job_city,job_country,job_is_remote,job_seniority_level,job_posted_at_date" \
     -H "Authorization: Bearer $ACCESS_TOKEN"
   ```

   The example response for Atlassian holds 10 jobs and resolves the slug to company id `22688`. Its first job:

   ```json
   {
     "status": "OK",
     "parameters": {"page": 1, "num_pages": 1, "company": "atlassian", "company_ids_resolved": "22688"},
     "data": [
       {"job_id": "bGlua2VkaW46NDQ4MjE3MjU2Nw", "job_title": "Machine Learning Engineering Manager", "employer_name": "Atlassian", "job_is_remote": null, "job_city": "Seattle", "job_country": "US", "job_linkedin_company_id": "22688", "job_seniority_level": "Mid-Senior level", "job_posted_at_date": "2026-10-21"},
       "… 9 more"
     ]
   }
   ```

   This example drew $0.003 from credit.

2. Store `job_linkedin_company_id` with the company. The same value is echoed in `parameters.company_ids_resolved`. Keep `include_details` at its default of `true`, since the company id is filled from each job's detail page.

3. Run repeat checks by `company_id`, which skips resolving the slug. Add `query` to filter within the company:

   ```bash
   curl -s "https://agents.openwebninja.com/zcj/zonyryu43s0t/realtime-linkedin-data/company-jobs?company_id=22688&query=engineer&num_pages=1&fields=job_id,job_title,job_city,job_country,job_posted_at_date" \
     -H "Authorization: Bearer $ACCESS_TOKEN"
   ```

   The example returns 10 engineering jobs, the first being `"Senior Backend Software Engineer - Platform"` in Austin, US, posted `2026-10-29`, and it drew $0.003 from credit.

4. Open one posting by its `job_id` for the fields a listing does not need:

   ```bash
   curl -s "https://agents.openwebninja.com/zcj/zonyryu43s0t/realtime-linkedin-data/job-details?job_id=bGlua2VkaW46NDQ4MjE3MjU2Nw&fields=job_id,job_title,job_function,job_industries,job_seniority_level,job_employment_type" \
     -H "Authorization: Bearer $ACCESS_TOKEN"
   ```

   The example returns `"job_employment_type": "Full-time"`, `"job_seniority_level": "Mid-Senior level"`, `"job_industries": ["Software Development"]` and `"job_function": null`, and it drew $0.003 from credit. `job_id` takes up to 20 comma-separated ids.

5. Page through a long list with `page=2`, `page=3` and so on, keeping `num_pages=1`. With no local filter, a page that returns fewer than 10 jobs is the last one.

## Narrow the list

| To get | Add |
| --- | --- |
| Jobs matching a keyword | `query=engineer` (one `query` only) |
| Jobs in one place | `location=London, United Kingdom` |
| Recent postings | `date_posted=today`, `3days`, `week` or `month` |
| One seniority | `seniority_levels=Mid-Senior level` (LinkedIn's own values, such as `Entry level`, `Director`) |
| One contract type | `employment_types=FULLTIME`, `PARTTIME`, `CONTRACTOR` or `INTERN` |
| Smaller responses | `fields=` a comma-separated list; `job_id` and `job_title` are always included |

`seniority_levels` and `employment_types` are applied after the jobs are fetched, so a page can hold fewer than 10 jobs.

To search all of LinkedIn by keyword instead of one company, use `GET https://agents.openwebninja.com/zcj/zonyryu43s0t/realtime-linkedin-data/search?query=<keywords>`, which takes the same filters and an optional `company_id`.

## Limits

- `job_posted_at_date` is the exact posting date and appears only on listings. `/job-details` returns it as `null`.
- `job_is_remote` is `true` or `null`, never `false`. `null` means LinkedIn did not say.
- A `company_id` that does not exist returns an empty `data` array, the same as a company with no open jobs. Use the slug when a bad identifier should be an error.
- `job_apply_link` is the public LinkedIn posting page, not the employer's own application page.
- A response with no `zc-billing` header billed nothing.

## Errors

| Response | Meaning | Action |
| --- | --- | --- |
| `401 bearer_required` | No agent credential on the call | Register at [Identity](https://agents.openwebninja.com/zcj/zonyryu43s0t/auth.md), retry with the bearer |
| `403 plan_required` | The credential holds no plan covering the call | Buy Free or Credits, then retry |
| `usage_exhausted` | The plan's credit is used up | Top up with `POST https://agents.openwebninja.com/zcj/zonyryu43s0t/extend` and `{"amountUsd": "..."}` |
| `400` | An unknown field in `fields`, a second `query`, `radius` without `geo_id`, or `num_pages` above 20 | Fix the parameter |
| `404` | No LinkedIn company page exists for the slug | Check the slug on the company's LinkedIn URL |
| `503` | A temporary error, not billed | Retry the same request |

## Frequently asked questions

### How do I track a company's new LinkedIn job postings?

Check the company by its stored `company_id` with `num_pages=1` and `date_posted=today` or `week`, and compare the returned `job_id` values with the ones you saw last time. A `job_id` is stable for the life of the posting, so a new id is a new opening.

### How much does it cost to check a company's LinkedIn jobs?

Requests are billed at $0.03 per 10 requests, drawn from your plan's credit. One hundred repeat checks by `company_id` with `num_pages=1` come to $0.30.

### Can I pay for one call without buying a plan?

No. Every call on this storefront draws on a plan held by your credential, either the Free trial or Credits. The only 402 you pay is the plan purchase.

### Why does a company_id return an empty list?

Either the company has no open jobs or the id does not exist, and LinkedIn answers both the same way. Send the company's slug in `company` to tell them apart: an unknown slug answers `404`.

### How do I get a job's description, function and industries?

Call `/job-details` with the `job_id`, or leave `include_details` at `true` on the company call and request those fields. `job_function` and `job_industries` are `null` when LinkedIn publishes no label.

## Keep reading

- [The buyer skill](https://agents.openwebninja.com/zcj/zonyryu43s0t/SKILL.md): the full purchase flow
- [Real-Time LinkedIn Data API reference](https://agents.openwebninja.com/zcj/zonyryu43s0t/services/realtime-linkedin-data/openapi.json): every parameter and field
- [How to pay](https://agents.openwebninja.com/zcj/zonyryu43s0t/payment.md): plans, credits and top-ups
- [Identity](https://agents.openwebninja.com/zcj/zonyryu43s0t/auth.md): register and claim an agent credential
- [Error reference](https://agents.openwebninja.com/zcj/zonyryu43s0t/errors.md): every storefront error code

---

Updated 2026-11-05. All OpenWeb Ninja guides: https://agents.openwebninja.com/guides.md. Storefront: https://agents.openwebninja.com/zcj/zonyryu43s0t/llms.txt.
