# Michael Page Scraper (`santamaria-automations/michaelpage-scraper`) Actor

Scrape Michael Page jobs from 20 country domains. Returns title, city, salary, contract type, posted date, full description, requirements, benefits, consultant contact and apply URL. Pay per event: $0.001 per run, $0.003 per search job, $0.005 per full-detail job.

- **URL**: https://apify.com/santamaria-automations/michaelpage-scraper.md
- **Developed by:** [NanoScrape](https://apify.com/santamaria-automations) (community)
- **Categories:** Jobs, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 actor starts

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Michael Page Scraper - Jobs, Salaries & Consultant Contacts from 20 Countries

Extract live job listings from [Michael Page](https://www.michaelpage.com), one of the world's largest recruitment agencies, across 20 country domains. Each record includes job title, location, salary (min, max, currency, period), contract type, posted date, and the full description (text, HTML and Markdown). With detail mode on, you also get the Michael Page consultant handling the job (name and, on some domains, phone), the reference number, category and industry, requirements, benefits, and the apply link. No API key, no login.

**Note on employers:** Michael Page advertises most jobs for confidential clients. `company_name` is the recruiter brand (for example "Michael Page" or "Michael Page Japan"), and the client's own description is in `company_about`. The client's name is not published on the site.

### Sample output

```json
{
  "id": "jn-092026-7113615",
  "title": "Superintendent",
  "company_name": "Michael Page",
  "company": "Michael Page",
  "location": "Columbus",
  "city": "Columbus",
  "region": "Ohio",
  "country": "US",
  "employment_type": "Permanent",
  "contract_type": "permanent",
  "working_pattern": "Full-time",
  "salary_min": 110000,
  "salary_max": 130000,
  "salary_currency": "USD",
  "salary_period": "year",
  "salary_text": "USD110,000 - USD130,000 per year",
  "posted_at": "2026-09-29T00:00:00Z",
  "posted_at_datetime": "2026-09-29T00:00:00Z",
  "posted_at_text": "2026-09-29",
  "description_snippet": "Quick promotion track with fast growing GC and great benefits.",
  "description_full": "- Quick promotion track with fast growing GC and great benefits!\n\nAbout Our Client\nThis outstanding General Contractor has been one of the leading firms in the Mid-West...",
  "description_html": "<ul><li>Quick promotion track with fast growing GC and great benefits!</li></ul>\n<h2>About Our Client</h2>...",
  "description_md": "- Quick promotion track with fast growing GC and great benefits!\n\n## About Our Client\n\nThis outstanding General Contractor...",
  "requirements": ["At least 5+ years of building construction experience required", "Completed OSHA 30 hour training course."],
  "benefits": ["Performance based bonus", "A 401(k) plan with a company match and immediate vesting"],
  "highlights": ["Quick promotion track with fast growing GC and great benefits!"],
  "category": "Construction",
  "sub_category": "Site Manager",
  "company_industry": "Property",
  "company_about": "This outstanding General Contractor has been one of the leading firms in the Mid-West since the roaring 20's...",
  "employer_disclosed": false,
  "contact_name": "Hunter Roberts",
  "contact_phone": null,
  "contact_phones": null,
  "reference_number": "JN-092026-7113615",
  "job_url": "https://www.michaelpage.com/job-detail/superintendent/ref/jn-092026-7113615",
  "source_url": "https://www.michaelpage.com/job-detail/superintendent/ref/jn-092026-7113615",
  "apply_url": "https://www.michaelpage.com/job-apply/superintendent/ref/jn-092026-7113615",
  "source_platform": "michaelpage.com",
  "search_query": "superintendent",
  "scraped_at": "2026-09-29T10:00:00Z"
}
```

### Pricing

Pay per event:

- $0.001 per run start
- $0.003 per job returned (about $3 per 1,000)
- +$0.005 per job enriched with full details (about $8 per 1,000 jobs with details)

Every returned job is charged the first price. Jobs with a parsed detail page (description, contact, etc.) are charged the second price as well.

| Jobs | Search only | With detail |
|------|-------------|-------------|
| 10 jobs | $0.03 | $0.08 |
| 100 jobs | $0.30 | $0.80 |
| 1,000 jobs | $3.00 | $8.00 |

Add $0.001 per run for the start event.

New to Apify? Every account gets a $5 free monthly platform credit, enough for about 1,000 detail jobs before you commit to paying anything. Test extensively first.

### Supported country domains

Checked live on 2026-09-29: all 20 domains below return job listings with the same page structure.

| Code | Domain | Code | Domain |
|------|--------|------|--------|
| US | michaelpage.com | IE | michaelpage.ie |
| GB | michaelpage.co.uk | AU | michaelpage.com.au |
| CH | michaelpage.ch | SG | michaelpage.com.sg |
| DE | michaelpage.de | HK | michaelpage.com.hk |
| FR | michaelpage.fr | JP | michaelpage.co.jp |
| ES | michaelpage.es | BR | michaelpage.com.br |
| IT | michaelpage.it | MX | michaelpage.com.mx |
| NL | michaelpage.nl | AE | michaelpage.ae |
| BE | michaelpage.be | AT | michaelpage.at |
| PT | michaelpage.pt | PL | michaelpage.pl |

Luxembourg is not supported: michaelpage.lu now redirects to michaelpage.be.

Job text is returned in the language of the domain (German on .de, Japanese on .co.jp, and so on). Some Swiss and Polish jobs are only published in their local language.

### Input

No API key required. Pick a country and keywords, or paste search URLs. With an empty input the actor lists the newest jobs on the selected country domain (default US).

| Field | Type | Required | Description | Example |
|-------|------|----------|-------------|---------|
| `searchQueries` | array | No | Keywords. Each runs as a separate search on the `country` domain, using Michael Page's own keyword listing (`/jobs/software-engineer`) and its relevance order. Very rare keywords can return no results, because Michael Page only has listing pages for keywords it knows. | `["data analyst", "controller"]` |
| `location` | string | No | City, region or postcode, as typed into Michael Page's own location box (for example `London` or `Zürich`). Filtered on the Michael Page server together with each keyword, or on its own to list all jobs in that place. Michael Page may include nearby areas. Ignored for `searchUrls` and `directUrls`. | `"London"` |
| `country` | string | No | Two-letter code from the table above. Default `US`. Ignored for `searchUrls`. | `"CH"` |
| `searchUrls` | array | No | Michael Page search URLs from any supported domain. `sort_by`, `contract` and `page` already in the URL are kept. | `["https://www.michaelpage.ch/jobs/software"]` |
| `directUrls` | array | No | Individual job pages, fetched in detail mode. Expired jobs are skipped. | `["https://www.michaelpage.com/job-detail/superintendent/ref/jn-092026-7113615"]` |
| `sortBy` | string | No | `newest` (default, the site's `sort_by=most_recent`), `relevance` (site default), `salary_desc`, `salary_asc`. | `"newest"` |
| `contractType` | string | No | `PERMANENT` or `TEMPORARY`. Empty means all. | `"PERMANENT"` |
| `maxResultsPerQuery` | integer | No | Cap per keyword or URL. Default 100. | `50` |
| `maxResults` | integer | No | Total cap across everything. `0` means unlimited. Default 10. | `200` |
| `includeJobDetails` | boolean | No | Fetch each job page for the full description, contact, dates and taxonomy. Default true. | `true` |
| `maxConcurrency` | integer | No | Parallel detail fetches (1 to 20). Default 3, which stays under the michaelpage.com rate limit. | `3` |
| `salaryMin` | integer | No | Minimum advertised pay, filtered on the Michael Page server (`field_job_salary_min`). Thousands of local currency (`100` = 100k) or a full amount (`100000`). The site compares the raw number, so hourly and daily rates are compared as written. | `100` |
| `salaryMax` | integer | No | Maximum advertised pay (`field_job_salary_max`), same units. The site needs a minimum with a maximum, so the actor sends a minimum of 0 when only a maximum is set. | `150` |
| `sector` | string | No | Sector facet slug from the site URL, optionally with sub-sector, for example `sales` or `sales/account-manager`. Added after the keyword in the path and filtered server-side. Slugs are in the domain's language. Ignored for `searchUrls`. | `"sales"` |
| `industry` | string | No | Industry facet slug from the site URL, for example `financial-services`. Filtered server-side. Slugs are in the domain's language. Ignored for `searchUrls`. | `"financial-services"` |
| `titleFilter` | string | No | Comma-separated title terms (OR-match, case-insensitive). Non-matching rows are dropped before the detail fetch, so you do not pay for them. | `"manager, director"` |

Copy-paste example:

```json
{
  "searchQueries": ["software engineer", "data analyst"],
  "country": "CH",
  "sortBy": "newest",
  "contractType": "PERMANENT",
  "includeJobDetails": true,
  "maxResultsPerQuery": 50,
  "maxResults": 100
}
```

If `maxResults` is lower than `maxResultsPerQuery` times the number of keywords, the first keywords fill the total cap and later keywords get fewer or no rows. Set `maxResults` to at least the product to let every keyword reach its cap.

#### Precision title filter

```json
{
  "searchQueries": ["director"],
  "titleFilter": "manager, director",
  "country": "US",
  "maxResults": 50
}
```

Only jobs with "manager" or "director" in the title are returned. Non-matching rows are dropped before any detail fetch.

#### Sorting and dates

Each `sortBy` value maps to the site's own `sort_by` parameter: `newest` = `sort_by=most_recent`, `relevance` = no parameter, `salary_desc` = `sort_by=max_to_min` (by advertised maximum), `salary_asc` = `sort_by=min_to_max` (by advertised minimum). The site sorts the raw advertised number, so on domains that mix hourly or daily rates with annual salaries the rates sort alongside annual pay.

`sortBy: "newest"` uses Michael Page's own "most recent" order, so the freshest jobs come first on every domain. The site orders by its latest update of a listing, so a re-published older job can appear near the top; `posted_at` is the original posting day, and the order is mostly but not strictly descending on it. Michael Page has no "posted within N days" filter, so apply your own cutoff on `posted_at` (detail mode).

### Output fields

**Core**

- `id`: Michael Page job reference in lower case (for example `jn-092026-7113615`), stable across runs.
- `title`: Job title.
- `company_name`: Advertiser name, the recruiter brand. See the note above.
- `company`: Deprecated duplicate of `company_name`, see Deprecation notes below.
- `employer_disclosed`: Always `false` today, because the client employer is not named.
- `location`: Location as printed on the search page.
- `city`, `region`, `country`: Parsed location. `country` is a two-letter code. City and region need detail mode; `country` is always set.

**Employment**

- `employment_type`: Contract type as printed on the site, in the site's language (for example `Permanent`, `Festanstellung`, `正社員`).
- `contract_type`: Language-neutral `permanent`, `temporary` or `contract` (detail mode).
- `working_pattern`: `Full-time` or `Part-time` (detail mode).
- `work_arrangement`: Work nature flag as printed (for example "Home Office"), when the listing has one.
- `remote_option`: `hybrid` or `remote` derived from `work_arrangement`. `null` when nothing is flagged.

**Salary**

- `salary_min`, `salary_max`: Numeric bounds. Parsed for every locale (`45.000€`, `CHF135.000`, `年収 800万円`, and so on). `null` when the listing shows no pay.
- `salary_currency`: ISO 4217 code.
- `salary_period`: `year`, `month`, `week`, `day` or `hour`, as advertised.
- `salary_text`: Raw pay string from the search page.

**Description** (`description_snippet` on every row; the rest in detail mode)

- `description_snippet`: Search page teaser.
- `description_full`: Full plain-text body (highlights, client, role, candidate profile, offer).
- `description_html`: The same body as cleaned HTML with section headings.
- `description_md`: The same body as Markdown.
- `requirements`: List items from the "Successful Applicant" section.
- `benefits`: List items from the "What's on Offer" section. `null` when the posting has no such section, or when the section only repeats the requirements.
- `highlights`: The short bullets shown directly under the title (for example "Full desk, direct hire placements"). `null` when a posting has none.
- `company_about`: The "About Our Client" text.

**Classification** (detail mode)

- `category`, `sub_category`: Michael Page function and specialisation (for example "Accounting & Finance" and "Financial Accounting").
- `company_industry`: Client industry.
- `company_type`: Company type flag. Only michaelpage.co.jp publishes it (for example "外資系企業"); `null` on every other domain, including US and GB.
- `company_logo_url`: Client logo, only on a few featured jobs (seen on michaelpage.co.uk, .fr and .pl); `null` on US and the other domains.

**Contact** (detail mode; `null` when the domain does not publish it)

- `contact_name`: The Michael Page consultant for the job.
- `contact_phone`, `contact_phones`: Consultant phone number. Published on some domains such as JP, DE and AU. No email addresses are published.
- `reference_number`: Quote this reference when contacting Michael Page (for example `JN-092026-7113615`).

**Dates and links**

- `posted_at`, `posted_at_datetime`: ISO 8601 posted date (midnight UTC, the site publishes the day only). Detail mode.
- `posted_at_text`: The date string as published.
- `job_url`: Canonical job page. `source_url` carries the same value.
- `apply_url`: The Michael Page application page for the job.
- `source_platform`: The domain scraped, for example `michaelpage.ch`.
- `search_query`: The keyword or URL that produced the row.
- `scraped_at`: ISO timestamp when the record was written.

#### Deprecation notes

The following field name is deprecated and will be removed after **2027-09-29** (one-year backward-compatibility window):

- `company` -> use `company_name` (canonical since 2026-09-29)

Both fields are emitted in every dataset row during the window. Please migrate downstream consumers to the canonical name before the removal date.

### Use with AI Agents (MCP)

Connect this actor to any MCP-compatible AI client: Claude Desktop, Claude.ai, Cursor, VS Code, LangChain, LlamaIndex, or custom agents.

Configure MCP server with Michael Page Scraper. Get a ready-to-use configuration for your MCP client with the Michael Page Scraper preconfigured at `mcp.apify.com?tools=santamaria-automations/michaelpage-scraper`. You can connect to the Apify MCP Server using clients like Tester MCP Client, or any other MCP client of your choice. See the Apify MCP docs for implementation details, the MCP protocol introduction for an overview, or the Apify blog post for a walkthrough.

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=santamaria-automations/michaelpage-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}
```

For per-tool schemas and copy-paste snippets for MCP clients, see the [MCP tab](https://console.apify.com/actors/5bfwnBPvYAhNYVTc2/info/api/mcp?build=latest).

Example prompt: "Use `michaelpage-scraper` to find permanent finance jobs in Switzerland posted this week. Return a table with title, city, salary and consultant name."

See the [auto-generated API tab](https://console.apify.com/actors/5bfwnBPvYAhNYVTc2/info/api) for language-specific examples (cURL, JS, Python, .NET, Ruby, PHP).

### Why this actor

- 20 Michael Page domains in one actor, with the same output shape everywhere.
- Salary parsed to numbers in every locale, including European thousands separators and Japanese man-yen amounts.
- The consultant name, reference number and (where published) phone on every detail row, ready for outreach.
- Full description with section structure, requirements and benefits split out, so downstream LLM parsing has clean input.
- Newest-first sorting, contract-type, salary, sector and industry filters (all applied on the Michael Page server), and a title filter that saves detail fees on irrelevant rows.

### Speed and scale

| Run | Measured time |
|-----|---------------|
| 30 jobs, one keyword, detail mode | about 10 seconds |
| 50 jobs, two keywords, search pages only | about 3 to 10 seconds |
| 40 jobs across 20 country domains, detail mode | about 80 seconds |

Cost per run in these tests was well under $0.01 of compute; you pay only the per-job price. Larger runs scale roughly linearly. Michael Page rate limits fast bursts, so the actor backs off automatically and very large runs may take longer.

Each search page holds up to 30 jobs and pagination follows the site's own "next" link. Run time is dominated by detail-page fetches; turn detail mode off for a search-page-only run.

### Notes and limits

- Michael Page publishes only the posting day, not the time, so `posted_at` is midnight UTC.
- The client employer is confidential on most listings. Use `company_about` for the client description.
- Multi-word keywords use the site's own listing for the whole phrase. When a domain has no listing for the phrase (for example `software engineer` on michaelpage.co.uk), the actor uses the broader single-word listing in the site's own order and logs a warning. Rows are not filtered by title unless you set `titleFilter`.
- Michael Page rate limits fast bursts (HTTP 429). Detail fetches retry with exponential backoff, jitter and a fresh proxy session per retry, and rows that still fail get a slower second pass at the end.
- Search pages exist for keywords Michael Page has a listing for. An unknown keyword returns no rows and a clear log line; try a broader keyword or paste a `searchUrls` link from the site.
- Some jobs on Swiss and Polish domains are published only in French, German, Italian or Polish, matching the domain's language versions.

### Related actors

- [Website Job Extractor](https://apify.com/santamaria-automations/website-job-extractor): pull job listings from any employer career page.
- [Indeed Scraper](https://apify.com/santamaria-automations/indeed-http-scraper): Indeed jobs across many countries.
- [Glassdoor Scraper](https://apify.com/santamaria-automations/glassdoor-scraper): Glassdoor jobs with company ratings.
- [Hays Scraper](https://apify.com/santamaria-automations/hays-scraper): another global recruitment agency's live jobs.
- [Reed UK Scraper](https://apify.com/santamaria-automations/reed-uk-scraper): UK job board listings.
- [StepStone DE Scraper](https://apify.com/santamaria-automations/stepstone-de-scraper): German job market.
- [Jobs.ch Scraper](https://apify.com/santamaria-automations/jobs-ch-scraper): Swiss job market.

### Support

- **Questions or issues?** Email contact@nanoscrape.com, we typically reply within 6 hours. You can also open a ticket in the [Issues tab](https://console.apify.com/actors/5bfwnBPvYAhNYVTc2/info/issues) on the actor page.
- **Feature request for this actor?** Open a ticket in the [Issues tab](https://console.apify.com/actors/5bfwnBPvYAhNYVTc2/info/issues) or email contact@nanoscrape.com with the platform field you need and (if possible) a URL that shows the data live.
- **Need a scraper for a job board we don't cover yet?** Email contact@nanoscrape.com with the target site + your rough usage volume. We ship one-off boards regularly.

# Actor input Schema

## `searchUrls` (type: `array`):

Michael Page search result URLs from any supported country domain (for example https://www.michaelpage.ch/jobs/software). Run a search on the site and copy the URL. Filters already in the URL (sort\_by, contract, page) are preserved.

## `directUrls` (type: `array`):

Individual Michael Page job pages (for example https://www.michaelpage.com/job-detail/superintendent/ref/jn-092026-7113615). Each URL is fetched in detail mode, useful to check whether a saved job is still live. Expired jobs are skipped.

## `searchQueries` (type: `array`):

One or more search keywords (for example 'data analyst', 'marketing manager'). Each runs as a separate search on the domain selected by the 'country' field, using Michael Page's own keyword listing and its relevance order. If the site has no listing for a multi-word phrase (for example 'software engineer' on michaelpage.co.uk), the actor falls back to the broader single-word listing and logs it; use titleFilter to narrow. Results are deduplicated across queries. With no keywords, search URLs or direct URLs, the actor lists the newest jobs on the selected country domain.

## `location` (type: `string`):

City, region or postcode, as typed into Michael Page's own 'Region, postcode or city' box (for example London or Zürich). Applied server-side together with each keyword in Search queries, or on its own to list all jobs in that place. Michael Page may include nearby areas. Ignored for Search URLs and Direct URLs.

## `country` (type: `string`):

Target Michael Page country domain for keyword searches. Ignored when searchUrls are provided (the domain is read from the URL). Default: US (michaelpage.com). Luxembourg is not offered because michaelpage.lu now redirects to michaelpage.be.

## `sortBy` (type: `string`):

How to order results. 'newest' maps to sort\_by=most\_recent (Michael Page's own recency order), 'relevance' omits the sort param (platform default), 'salary\_desc' maps to sort\_by=max\_to\_min, 'salary\_asc' maps to sort\_by=min\_to\_max. Default: newest. Michael Page has no date-range filter; apply your own cutoff on posted\_at.

## `contractType` (type: `string`):

Filter by employment contract type. PERMANENT maps to contract=permanent; TEMPORARY maps to contract=temp. Leave empty to return all contract types.

## `salaryMin` (type: `integer`):

Only jobs whose advertised pay is at or above this value, using Michael Page's own server-side salary filter (field\_job\_salary\_min). Give thousands of the local currency (100 means 100k) or a full amount (100000). The site compares the raw advertised number, so hourly or daily rates in the same listing are compared as written. Leave empty for no filter. Applies to keyword, location and default searches, and to searchUrls that do not already carry the parameter.

## `salaryMax` (type: `integer`):

Only jobs whose advertised pay range fits at or below this value (field\_job\_salary\_max). Same units as Minimum Salary. Michael Page rejects a maximum without a minimum, so the actor sends a minimum of 0 when you set only a maximum. Leave empty for no filter.

## `sector` (type: `string`):

Michael Page sector facet as it appears in the site URL, for example 'sales', 'information-technology' or 'sales/account-manager' (sector/sub-sector). Added as a path segment after the keyword (/jobs/marketing/sales), which the site filters server-side. Slugs are in the domain's language (copy them from a Michael Page search URL). Ignored for searchUrls.

## `industry` (type: `string`):

Michael Page industry facet as it appears in the site URL, for example 'financial-services' or 'technology-telecoms'. Added as a path segment after the keyword (/jobs/marketing/financial-services), filtered server-side. Slugs are in the domain's language (copy them from a Michael Page search URL). Ignored for searchUrls.

## `includeJobDetails` (type: `boolean`):

Fetch each job's detail page for the full description (text, HTML, Markdown), requirements, benefits, posted date, consultant contact name and phone, reference number, category and industry. Turn off for a faster SERP-only run.

## `maxConcurrency` (type: `integer`):

Number of job detail pages fetched in parallel. Default 3, which keeps michaelpage.com under its rate limit; failed pages are retried with backoff and a second pass. Raise it for speed on domains that tolerate it.

## `titleFilter` (type: `string`):

Comma-separated list of terms to match against job titles (case-insensitive OR-match). Only jobs whose title contains one of the terms are emitted. Non-matching rows are dropped before the detail-fetch event, so you don't pay for filtered-out jobs. Leave empty to disable.

## `maxResultsPerQuery` (type: `integer`):

Maximum results per search URL or keyword. Set maxResults high enough to let every query reach this cap (maxResults >= maxResultsPerQuery x number of queries).

## `maxResults` (type: `integer`):

Total cap across all queries and search URLs. Set to 0 for unlimited.

## Actor input object example

```json
{
  "country": "US",
  "sortBy": "newest",
  "contractType": "",
  "includeJobDetails": true,
  "maxConcurrency": 3,
  "titleFilter": "",
  "maxResultsPerQuery": 100,
  "maxResults": 10
}
```

# Actor output Schema

## `jobListings` (type: `string`):

Dataset of Michael Page jobs. Fields: id, title, company\_name, location, city, region, country, employment\_type, contract\_type, working\_pattern, work\_arrangement, remote\_option, salary\_min, salary\_max, salary\_currency, salary\_period, salary\_text, posted\_at, posted\_at\_datetime, posted\_at\_text, description\_snippet, description\_full, description\_html, description\_md, requirements, benefits, highlights, category, sub\_category, company\_industry, company\_type, company\_about, company\_logo\_url, employer\_disclosed, contact\_name, contact\_phone, contact\_phones, reference\_number, job\_url, apply\_url, source\_url, source\_platform, search\_query, scraped\_at. `company` is a deprecated duplicate of `company_name` (removed after 2027-09-29). Detail-only fields (posted\_at, description\_full/html/md, requirements, benefits, highlights, contact\_\*, category, sub\_category, company\_industry, company\_about, contract\_type, working\_pattern) are filled when includeJobDetails is true.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "country": "US",
    "sortBy": "newest",
    "includeJobDetails": true,
    "maxConcurrency": 3,
    "maxResultsPerQuery": 100,
    "maxResults": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("santamaria-automations/michaelpage-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "country": "US",
    "sortBy": "newest",
    "includeJobDetails": True,
    "maxConcurrency": 3,
    "maxResultsPerQuery": 100,
    "maxResults": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("santamaria-automations/michaelpage-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "country": "US",
  "sortBy": "newest",
  "includeJobDetails": true,
  "maxConcurrency": 3,
  "maxResultsPerQuery": 100,
  "maxResults": 10
}' |
apify call santamaria-automations/michaelpage-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,santamaria-automations/michaelpage-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/5bfwnBPvYAhNYVTc2/builds/7YJKVC0xnYME0gcph/openapi.json
