# OpenWeb Ninja API quickstart: your first job search in one call

OpenWeb Ninja's JSearch API returns live job postings from Google for Jobs as JSON. The same agent credential and credit balance also reach the other real-time web data APIs in the catalog. A search costs $0.03 per 10 requests, drawn from a plan your credential holds (the Free plan or prepaid Credits), and you call it with `GET https://agents.openwebninja.com/zcj/448sq25n2v6s/jsearch/search-v2?query=<query>` and `Authorization: Bearer <token>`.

## At a glance

- **Endpoint:** `GET https://agents.openwebninja.com/zcj/448sq25n2v6s/jsearch/search-v2`
- **Query:** `query` (required, title and location), `country`, `num_pages=1`, `fields` (the job fields to keep), `cursor` (next page)
- **Price:** $0.03 per 10 requests. A few services, such as ChatGPT, cost $0.05 per 10 requests.
- **Access:** a free agent credential, sent as a bearer, plus a plan. There are two plans. Free grants $0.15 once per person, after that person claims the credential with a verified email. Credits starts at $0.50 by wallet (x402 or MPP, settling in USDC) or $0.50 by card.
- **Payment:** you pay only when you buy a plan. That purchase answers with a 402, a price quote that you settle and then retry. Data calls have no per-call payment and need no API key.
- **Response:** `data.jobs` (the postings) and `data.cursor` (the next page). The charge appears in the `zc-billing` header.
- **Full flow:** [the buyer skill](https://agents.openwebninja.com/zcj/448sq25n2v6s/SKILL.md)

## Run a first job search

1. **Get a credential.** Reuse a ZeroClick credential you already hold, or register a free one. [Identity](https://agents.openwebninja.com/zcj/448sq25n2v6s/auth.md) has the steps.

2. **Hold a plan.** Buy Credits or claim the Free plan with `POST https://agents.openwebninja.com/zcj/448sq25n2v6s/plans/{planId}/purchase` and your bearer. Find the plan in `plans[]` in `https://agents.openwebninja.com/zcj/448sq25n2v6s/manifest.json`. A Credits purchase answers with a priced 402 that you settle by wallet or card. The [buyer skill](https://agents.openwebninja.com/zcj/448sq25n2v6s/SKILL.md) and [How to pay](https://agents.openwebninja.com/zcj/448sq25n2v6s/payment.md) have the steps.

3. **Search.** Send one page and keep only the fields you need:

   ```bash
   curl -s -D headers.txt \
     -H "Authorization: Bearer $ACCESS_TOKEN" \
     "https://agents.openwebninja.com/zcj/448sq25n2v6s/jsearch/search-v2?query=data+engineer+in+Austin,+TX&country=us&num_pages=1&fields=job_id,job_title,employer_name,job_publisher,job_employment_type,job_city,job_state,job_is_remote,job_posted_at_datetime_utc,job_min_salary,job_max_salary,job_apply_link"
   ```

   The response is a JSON object. This is a sample of the example search, which returned ten jobs:

   ```json
   {
     "status": "OK",
     "parameters": {"query": "data engineer in Austin, TX", "num_pages": 1, "country": "us", "language": "en"},
     "data": {
       "jobs": [
         {
           "job_id": "<id>",
           "job_title": "AI Data Engineering Manager - GPSC Insights Engineering",
           "employer_name": "General Motors",
           "job_publisher": "General Motors Careers",
           "job_employment_type": "Full-time",
           "job_apply_link": "https://search-careers.gm.com/<path>",
           "job_is_remote": false,
           "job_posted_at_datetime_utc": "2026-11-03T07:00:00.000Z",
           "job_city": null,
           "job_state": null,
           "job_min_salary": null,
           "job_max_salary": null
         }
       ],
       "cursor": "<cursor>"
     }
   }
   ```

4. **Read the charge.** A plan-funded response carries a header of this shape:

   ```
   zc-billing: {"status":"settled","fundingSource":"credit","chargedUsd":"<debited>","remainingCreditUsd":"<balance>"}
   ```

   The example search drew $0.003 from credit.

5. **Fetch the next page.** Send the same request with `cursor=<data.cursor>` added. When `data.cursor` is `null`, there are no more pages.

## Read the response

| Field | Holds |
| --- | --- |
| `data.jobs` | The postings, each with only the fields named in `fields` |
| `data.jobs[].job_id` | The id to pass to `/jsearch/job-details` for the full posting |
| `data.jobs[].job_apply_link` | The primary apply URL |
| `data.cursor` | The value for the next page's `cursor`, or `null` on the last page |
| `parameters` | The parameters the API used, after defaults |

Nullable fields, such as `job_city` and the salary fields, return `null` when the posting has no value.

## Narrow the search

| You need | Set |
| --- | --- |
| Jobs in another country | `country=de` (any ISO 3166-1 alpha-2 code), with the city in `query` |
| Recent postings only | `date_posted=today`, `3days`, `week` or `month` |
| Remote jobs only | `work_from_home=true` |
| Certain contract types | `employment_types=FULLTIME,CONTRACTOR` (also `PARTTIME`, `INTERN`) |
| A smaller response | `fields=` with a comma-separated list of job fields |

## Boundaries

- Data calls have no per-call price. A call without a bearer answers `401`, and a call without a covering plan answers `403`. Neither charges anything.
- Money moves only when you settle a plan purchase. After that, calls draw down the balance. A delivered response with no `zc-billing` header billed nothing.
- Keep `num_pages=1` and page with `cursor`.
- A credential you register anonymously and never claim lapses within days, and a plan bought with it lapses along with it. Claim the credential soon after buying.

## Errors

| Response | Meaning | Action |
| --- | --- | --- |
| `401 bearer_required` | No agent credential was sent | Register at [Identity](https://agents.openwebninja.com/zcj/448sq25n2v6s/auth.md), then retry with the bearer |
| `401 invalid_token` | The access token expired or did not verify | Re-exchange the stored assertion for a fresh token |
| `403 plan_required` | No plan covers the call | Buy a plan listed in the body's `plans`, then retry |
| `403 verified_email_required` | The Free plan needs a claimed credential | Complete the claim, then claim Free again |
| `409 free_plan_already_claimed` | This person already holds the Free plan | Use the existing plan |
| `usage_exhausted` | The credit ran out | Top up with `POST https://agents.openwebninja.com/zcj/448sq25n2v6s/extend` and `amountUsd` |
| `503` | A temporary upstream error. The request is not billed. | Retry the GET with bounded backoff |

## What else the same credential reaches

One credential and one balance cover every service in the catalog. Browse them at [Services and pricing](https://agents.openwebninja.com/zcj/448sq25n2v6s/services), and find each service's routes at `https://agents.openwebninja.com/zcj/448sq25n2v6s/services/<slug>`.

| You need | Services |
| --- | --- |
| Search and AI answers | Real-Time Web Search, AI Overviews, Google AI Mode, ChatGPT, Copilot, Gemini, Web Search Autocomplete, Real-Time Bing Search Data |
| Jobs and salaries | JSearch, Job Salary Data, Real-Time LinkedIn Data, Real-Time Indeed Data, Real-Time Glassdoor Data, Real-Time ZipRecruiter Data, Real-Time Monster Data, Real-Time Bing Jobs Data |
| Local businesses | Local Business Data, Local Business Database, Yelp Business Data, Local Rank Tracker |
| Shopping | Real-Time Product Search, Real-Time Amazon Data, Real-Time Walmart Data, Real-Time eBay Data, Real-Time Costco Data, Real-Time Wayfair Data, Real-Time Home Depot Data |
| Real estate | Real-Time Zillow Data, Real-Time Redfin Data |
| Finance and news | Real-Time Finance Data, Real-Time News Data, Real-Time News Search |

Most services cost $0.03 per 10 requests. ChatGPT, Copilot, Gemini and Google AI Mode cost $0.05 per 10 requests.

## Frequently asked questions

### Does the OpenWeb Ninja API need an API key?

No. Every call carries the agent credential the storefront issues, sent as `Authorization: Bearer <token>`. No upstream key is needed.

### How much does a job search API call cost?

One search with `num_pages=1` costs $0.03 per 10 requests, which is $0.003 per call. A thousand searches cost $3, drawn from your plan's balance.

### Can I try JSearch for free?

Yes. The Free plan grants $0.15 once per person, after that person claims your credential with a verified email. Claim it with the purchase POST and an empty body.

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

No. Every call draws on a plan your credential holds. The only payment is the 402 from a plan purchase, settled over x402, MPP or card.

### How do I get more than one page of jobs?

Send the next request with `cursor` set to the previous response's `data.cursor`, and keep `num_pages=1`.

## Keep reading

- [Buyer skill](https://agents.openwebninja.com/zcj/448sq25n2v6s/SKILL.md): the full access and purchase flow
- [Identity](https://agents.openwebninja.com/zcj/448sq25n2v6s/auth.md): registering, claiming and exchanging the credential
- [How to pay](https://agents.openwebninja.com/zcj/448sq25n2v6s/payment.md): Credits, the Free plan and each rail
- [Error reference](https://agents.openwebninja.com/zcj/448sq25n2v6s/errors.md): every code and how to react
- [JSearch API reference](https://agents.openwebninja.com/zcj/448sq25n2v6s/services/jsearch/openapi.json): every parameter and field

---

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