# Monster Job Search

> Monster 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 Monster.com job postings by keyword with location, country, date, and employment type filters, returning full job details in each result

## Facts

- Endpoint: GET https://agents.openwebninja.com/realtime-monster-data/search?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-monster-job-search-57432ad3
- Structured record (JSON): https://api.zero.xyz/v1/capabilities/cap_STQnFAvcd66z0nkEUDKnB

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-monster-job-search-57432ad3
```

Example prompt: Search Monster for software engineer jobs in Austin, Texas within 80km posted in the last 7 days — I want full-time positions and show me the first page of results.

## When to prefer this

Choose this endpoint when you need real-time Monster.com job listings with full job details (description, salary, apply URL, coordinates) already included in the search response — avoiding a separate detail fetch. Prefer it over LinkedIn or Indeed scrapers when Monster inventory is desired, or when you need kilometre-radius filtering, country-specific Monster locale search, or reliable deduplication across a paginated result window of up to 510 postings.

## Known failure modes

- Empty array with 200 status when page exceeds Monster's upstream offset ceiling of 500 (page > 51)
- 400 error if both radius and country-wide search are combined without a location
- 400 error if an unknown field name is passed in the fields projection parameter
- 400 error if more than one query parameter is supplied
- No results returned if query, location, and company are all absent
- Short pages (fewer than 10 jobs) may appear within the retrievable window and do not indicate the end of results

## How this service works

Search Monster job postings by keyword, with the filters Monster honors server-side:
`location` with a kilometre `radius`, `country`, `date_posted` and `employment_types`.

**A search row already carries the whole job.** Description, salary, coordinates and the
apply URL are all on the search response.

**Pagination** is offset-based via `page` / `num_pages`, 10 jobs per page. Pages are
chained upstream: a full walk of the retrievable window at Monster's own maximum page
size returned 550 rows, 550 unique ids and zero duplicates.

**Retrieval ceiling: 510 postings per query.** Monster serves nothing past an upstream
offset of 500 and does so silently, with a 200 and an empty array, so `page` is capped
at 51 and `page` + `num_pages` may not cross it. This is independent of the much larger
estimated total Monster reports internally for the same query.

**Knowing when to stop:** the response is a flat array of jobs, and page 51 is the
last page. Short pages do occur inside the window, so a page of fewer than 10 jobs is
still a page in the middle of it.

**Billing:** `Requests` counts one per upstream page of 10 actually fetched. Two things
add to it, and both are visible in the `X-RapidAPI-Billing` header.
Any `page` above 1 costs **one extra request**: Monster ignores the offset on the first
call of a new search and serves the head of the list, so a deep start has to pin the
result set with a tiny lookup before it can page into it. That is one extra request no
matter how deep you start. And combining `remote_jobs_only` with `employment_types`
over-fetches up to 3x the requested pages (capped at 10) to refill the page after local
filtering, and those extra pages are billed too.


## Output

A flat array of job objects, up to 10 per page, each containing job ID, title, employer name and logo, job description, salary details (min/max/period/currency), apply URL, location (city, state, country, latitude/longitude), employment type, remote status, posting date, required skills, job highlights, employer size, and employer reviews. Also includes request metadata and pagination context.

## Request schema (JSON Schema)

```json
{
 "type": "object",
 "required": [
  "query"
 ],
 "properties": {
  "page": {
   "type": "integer",
   "default": 1,
   "maximum": 51,
   "minimum": 1,
   "description": "1-based page to start from. Each page is 10 jobs. Capped at 51 by Monster's upstream\noffset ceiling of 500, and `page` + `num_pages` may not cross it either.\n\n**Default:** `1`\n\n**Allowed values:** `1-51`\n"
  },
  "query": {
   "type": "string",
   "example": "software engineer",
   "description": "Free-form job search query, for example `software engineer` or `registered nurse`.\nRequired: Monster returns nothing for a search with no query, no location and no\ncompany. Exactly one `query` is accepted; a second one is a 400.\n"
  },
  "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\nincluded. An unknown field name is a 400.\n"
  },
  "radius": {
   "type": "integer",
   "maximum": 160,
   "minimum": 1,
   "description": "Search radius around `location`, in KILOMETRES, converted to the miles Monster\nexpects. Requires `location`; Monster ignores a radius on a country-wide search, so\nthat combination is a 400. Past the maximum Monster returns nothing, so an\nout-of-range value is also a 400.\n\n**Allowed values:** `1-160`\n"
  },
  "country": {
   "type": "string",
   "default": "us",
   "description": "2-letter country code. Selects both the Monster locale the search runs on and the\nmarket searched, and both matter: a country's own locale returned 1.35x to 6.9x the\ninventory `en-US` did. See Coverage for the markets Monster actually carries.\n\n**Default:** `us`\n"
  },
  "sort_by": {
   "enum": [
    "relevance",
    "date"
   ],
   "type": "string",
   "default": "relevance",
   "description": "`relevance` leaves Monster's own ordering alone. `date` sorts the jobs in THIS\nresponse newest-first, applied locally because Monster ignores its own `orderBy`.\nPair it with `date_posted` for real freshness control.\n\n**Default:** `relevance`\n\n**Allowed values:** `relevance`, `date`\n"
  },
  "language": {
   "type": "string",
   "description": "The language your `query` text is written in, as an `xx-xx` code such as `en-us` or\n`fr-fr`. It picks Monster's keyword analyser, so the postings come back in whatever\nlanguage Monster published them. Omitted, Monster derives it from `country`. A\nmalformed code is a 400.\n"
  },
  "location": {
   "
… (truncated)
```

## 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",
     "job_seo_id",
     "job_canonical_url",
     "job_apply_type",
     "job_skills",
     "job_industry",
     "job_occupational_category",
     "job_location_type",
     "job_status",
     "job_valid_through",
     "job_provider",
     "employer_description",
     "employer_founding_date",
     "employer_size",
     "employer_address",
     "job_posted_at_date",
     "job_salary_currency",
     "job_publisher_recency_label",
     "job_position"
    ],
    "properties": {
     "job_id": {
      "type": "string",
      "example": "bW9uc3RlcjplNzc2MTJmNS1iYjNiLTQ2NWUtYTk2NS00MzlhZjk0MDk0YmQ",
      "description": "Opaque public id for the posting, `base64url(\"monster:\" + <Monster job uuid>)`. Pass it back to `/job-details`. Stable for the life of the posting."
     },
     "job_uid": {
      "type": "string",
      "example": "e77612f5-bb3b-465e-a965-439af94094bd",
      "description": "Monster's own job id, a permanent UUIDv4. Accepted directly by `/job-details` and the right key for a downstream cache."
     },
     "job_city": {
      "type": "string",
      "example": "DFW Airport",
      "nullable": true,
      "description": "City. `null` on a country-level or region-only posting."
     },
     "job_state": {
      "type": "string",
      "example": "Texas",
      "nullable": true,
      "description": "The full state or province NAME, matching JSearch. The code appears inside `job_location`."
     },
     "job_title": {
      "type": "string",
      "example": 
… (truncated)
```

## More

- Live health (JSON, refreshed every minute): https://www.zero.xyz/c/agents-openwebninja-com-monster-job-search-57432ad3/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)
