# ADP Jobs Scraper: WorkforceNow Career Sites (`santamaria-automations/adp-jobs-scraper`) Actor

Scrape open jobs from ADP WorkforceNow career sites: title, location, department, employment type, posting date, apply URL and full description. Filter by keyword, location and date. Pay per result.

- **URL**: https://apify.com/santamaria-automations/adp-jobs-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

Pay per event

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

## ADP Jobs Scraper: WorkforceNow Career Sites

Get the open jobs of any company that publishes its openings on an ADP WorkforceNow career site (`workforcenow.adp.com`). Paste the career site URL and receive title, location, employment type, posting date, salary when stated, apply URL and the job description as clean dataset rows. MyJobs career sites are not supported yet.

### What you can do with it

- Pull all open roles of a list of target employers that hire through ADP for lead generation or recruiting research.
- Track hiring over time: run it on a schedule with `postedWithinDays` and `sortBy: newest` to see only new postings.
- Feed a job board or alert system with the openings of the companies you follow.
- Filter by keyword in the title, by location or by country.

### What you get

One dataset row per job. Duplicates are removed before anything is charged, so the number of rows is the number of results you pay for.

| Field | Description |
|-------|-------------|
| `id` | Job id, unique across boards |
| `ats_job_id` | The id the portal itself uses for the posting |
| `title` | Job title |
| `company` | Employer label of the career site: `ADP-WFN`, because WorkforceNow does not publish the employer name in its job list |
| `ats_platform` | `adp` |
| `location`, `city`, `country` | Location text as posted, the city and the two-letter country code when they can be read from it |
| `department` | Department or team, when the board states one |
| `employment_type` | Full-time, part-time, contract and so on, when stated |
| `remote` | Remote flag, when the board states one |
| `description` | Full description HTML (`includeDescription`). Returned for the first 50 jobs of each career site; jobs beyond 50 come without a description |
| `apply_url`, `job_url` | Link that opens the posting on the company's WorkforceNow career site |
| `created_at` | Posting date |
| `language` | Language of the posting text |
| `scraped_at` | Time of the run |

Salary fields (`salary_text`, `salary_min`, `salary_max`, `salary_currency`, `salary_period`, `salary_source`) are filled only when the posting states a salary. They are never estimated.

### Input

| Field | Description |
|-------|-------------|
| `companies` | ADP WorkforceNow career site URLs, full URLs only (with `cid=`). A bare company name cannot be used. Strings, `{"url": "..."}` objects, a single string, or several separated by commas or new lines. Empty = one sample career site. MyJobs URLs (`myjobs.adp.com`, `recruiting.adp.com`) are skipped with a warning and never charged. |
| `keywords` | Keep only jobs whose title matches at least one keyword. They filter the jobs of the career sites you list; they do not search other companies. |
| `location` | Keep only jobs in this city, region or country (`London`, `Germany`, `DE`). |
| `countries` | ISO-2 codes such as `["US", "CA"]`: keep only jobs located in these countries (jobs whose country cannot be determined are left out). |
| `includeRemoteWithoutRegion` | Only with a country filter: also keep remote jobs that state no country or region (they may not be open to applicants in that country). Default `false`. |
| `postedWithinDays` | Drop jobs older than this many days. Jobs without a posting date are kept. |
| `sortBy` | `newest` (default) or `relevance` (the portal's own order). |
| `maxJobsPerCompany` | Cap per career site, counted after the filters. `0` = all. Default 50. |
| `maxResults` | Cap for the whole run. The run stops cleanly when it is reached. `0` = no limit. Default 100. |
| `includeDescription` | Include the description HTML (first 50 jobs per career site). Default `true`. |

#### Example: one WorkforceNow career site

```json
{
  "companies": [
    "https://workforcenow.adp.com/mascsr/default/mdf/recruitment/recruitment.html?cid=a4c08bd3-eedf-419a-9fb6-5d2ac8a3bafa&ccId=19000101_000001&lang=en_US"
  ],
  "maxResults": 20
}
```

#### Example: several career sites with filters

```json
{
  "companies": [
    "https://workforcenow.adp.com/mascsr/default/mdf/recruitment/recruitment.html?cid=a4c08bd3-eedf-419a-9fb6-5d2ac8a3bafa&ccId=19000101_000001&lang=en_US",
    "https://workforcenow.adp.com/mascsr/default/mdf/recruitment/recruitment.html?cid=ede1ea78-34fc-4920-a043-335c6e96f763&ccId=19000101_000001&lang=en_US"
  ],
  "keywords": ["engineer", "analyst"],
  "postedWithinDays": 30,
  "sortBy": "newest",
  "maxJobsPerCompany": 25
}
```

Only ADP career sites are read. A URL of any other job system is skipped with a log line that names the actor to use, and is never charged.

#### Supported URL formats

- WorkforceNow: `https://workforcenow.adp.com/mascsr/default/mdf/recruitment/recruitment.html?cid={GUID}` (the `cid` is required; other parameters are optional).
- MyJobs career sites (`myjobs.adp.com`, `recruiting.adp.com`) are not supported yet.

### Output

```json
{
  "id": "adp-5e1c0a77-9202055764638_1",
  "ats_job_id": "9202055764638_1",
  "title": "Customer Service Representative",
  "company": "ADP-WFN",
  "ats_platform": "adp",
  "location": "Chicago, IL",
  "city": "Chicago",
  "country": "US",
  "employment_type": "Full-time",
  "description": "<p>Responsibilities include ...</p>",
  "apply_url": "https://workforcenow.adp.com/mascsr/default/mdf/recruitment/recruitment.html?cid=a4c08bd3-eedf-419a-9fb6-5d2ac8a3bafa&lang=en_US&type=MP&jobId=1115",
  "job_url": "https://workforcenow.adp.com/mascsr/default/mdf/recruitment/recruitment.html?cid=a4c08bd3-eedf-419a-9fb6-5d2ac8a3bafa&lang=en_US&type=MP&jobId=1115",
  "language": "en",
  "created_at": "2026-10-20T00:00:00Z",
  "scraped_at": "2026-10-25T09:00:00Z"
}
```

The row above is illustrative; values depend on the career site. `created_at` is the posting date the portal reports.

### Pricing

Pay per result. You pay the platform start fee per run and then only for the jobs you receive. Filtered-out and duplicate jobs are never charged. The pricing box on the actor page always shows the current rates.

### Use with AI Agents (MCP)

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

**Example prompts once connected:**

> "Use `adp-jobs-scraper` on this ADP career site URL and list the open roles posted in the last 30 days with title, location and apply URL."

> "Use `adp-jobs-scraper` for these three ADP career sites and return the roles whose title contains engineer."

Configure the MCP server with the ADP Jobs Scraper preconfigured at `mcp.apify.com?tools=santamaria-automations/adp-jobs-scraper`:

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

See the auto-generated API tab on the actor page for language-specific examples (cURL, JavaScript, Python, and more).

### FAQ

**How do I find a company's ADP career site URL?**
Open the company's careers page and click through to a job list or a job. If the address starts with `workforcenow.adp.com`, copy it; the URL must contain `cid=`. Careers pages usually link to it from an "Apply" or "Current openings" button. MyJobs career sites (`myjobs.adp.com`, `recruiting.adp.com`) are not supported yet.

**Can I search by company name or by keyword across all ADP employers?**
No. Give the career site URL of each employer. Keywords only filter the titles of the jobs of the sites you list.

**What if a career site returns nothing?**
The run continues with the other sites. The run status line names the site and the reason (for example `no_jobs_found` or `invalid_query`), and nothing is charged for it. An employer with no open roles also returns no rows.

**Why is `company` `ADP-WFN` for some rows?**
WorkforceNow portals do not include the employer name in their job list. The `cid` in your input tells the employers apart.

**Why did I get fewer jobs than `maxJobsPerCompany`?**
The caps apply after your filters, and a career site can simply have fewer open jobs. The career sites are read in the order you list them, and the run stops once `maxResults` is reached.

### Limits

- Full career site URLs only; no company-name lookup and no search across employers.
- A career site lists what the employer has published; some employers publish few or no openings.
- Descriptions are returned for the first 50 jobs of each career site; jobs beyond 50 come without a description. Set `includeDescription` to `false` for a faster run.
- MyJobs career sites are not supported yet: such a URL is skipped with a warning, returns no rows and is never charged.
- Job links open the posting itself. WorkforceNow always returns the posting date and employment type; salary is filled when the posting states one.

### Related actors

- [Career Site Jobs Scraper](https://apify.com/santamaria-automations/career-site-jobs-scraper): the same engine for 40+ job systems (Workday, SmartRecruiters, Personio and more).
- [Greenhouse, Lever & Ashby Jobs Scraper](https://apify.com/santamaria-automations/greenhouse-lever-ashby-jobs-scraper): jobs of any Greenhouse, Lever or Ashby board, with keyword search across companies.
- [Workday Jobs Scraper](https://apify.com/santamaria-automations/workday-jobs-scraper): jobs of any Workday job site.
- [Website Job Extractor](https://apify.com/santamaria-automations/website-job-extractor): any company website to its careers page, job system and jobs.

### Support

- **Questions or issues?** Email contact@nanoscrape.com, we typically reply within 6 hours, or open a ticket in the Issues tab on the actor page.
- **Need a scraper for a job board we don't cover yet?** Email contact@nanoscrape.com with the target site and your rough usage volume.

# Actor input Schema

## `companies` (type: `array`):

ADP WorkforceNow career site URLs, as strings or as {"url": "..."} objects (a single string, or several separated by commas or new lines, also works), for example https://workforcenow.adp.com/mascsr/default/mdf/recruitment/recruitment.html?cid=a4c08bd3-eedf-419a-9fb6-5d2ac8a3bafa (the cid value identifies the company). Keep the whole URL, including cid=. A bare company name cannot be used. MyJobs career sites (myjobs.adp.com, recruiting.adp.com) are not supported yet: they are skipped with a log line and never charged. URLs of other job systems are skipped with a log line that names the right actor, and are never charged. With no companies (an empty input does this too) the actor runs one sample career site.

## `keywords` (type: `array`):

Return only jobs whose TITLE matches at least one of these words or phrases (OR). Case and accents are ignored. A keyword of 4 or more characters matches anywhere inside the title; a keyword of 3 or fewer characters (for example QA, PM) must match as a whole word. Example: \["engineer", "manager"]. The keywords filter the jobs of the career sites you list; they do not search other companies.

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

Optional. Return only jobs in this city, region or country, for example "Chicago", "Germany" or "US". Country names and ISO codes match in both directions.

## `includeRemoteWithoutRegion` (type: `boolean`):

Only matters when you filter by country (the Location input is a country, or a query carries a country). Off (default): a remote job counts for the country only when it names it ("Remote - Germany"), names a region that contains it (EMEA, Europe, EU, DACH, Americas, APAC) or is open worldwide. Remote jobs that say only "Remote" are left out and are not charged. On: those jobs are kept too, but they may not be open to applicants in the chosen country.

## `countries` (type: `array`):

Optional. ISO 3166-1 alpha-2 codes such as \["US", "CA"]. Returns only jobs located in these countries (jobs whose country cannot be determined are left out).

## `postedWithinDays` (type: `integer`):

Optional. Drop jobs posted more than this many days ago. Jobs without a posting date are kept.

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

"newest" returns the most recently posted jobs of each board first, so maxJobsPerCompany keeps the newest ones. "relevance" keeps the portal's own order. Boards are read in the order you list them.

## `maxJobsPerCompany` (type: `integer`):

Maximum number of jobs returned per board, counted after the filters (filtered-out jobs are never returned or charged). 0 = all jobs.

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

Maximum number of jobs returned in total across all companies. The run stops cleanly once it is reached. 0 = no limit.

## `includeDescription` (type: `boolean`):

Include the full job description (HTML) in the output. Switch off for a smaller, faster run.

## Actor input object example

```json
{
  "companies": [
    "https://workforcenow.adp.com/mascsr/default/mdf/recruitment/recruitment.html?cid=a4c08bd3-eedf-419a-9fb6-5d2ac8a3bafa&ccId=19000101_000001&lang=en_US"
  ],
  "includeRemoteWithoutRegion": false,
  "sortBy": "newest",
  "maxJobsPerCompany": 20,
  "maxResults": 20,
  "includeDescription": true
}
```

# Actor output Schema

## `items` (type: `string`):

Job listings from ADP WorkforceNow career sites

# 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 = {
    "companies": [
        "https://workforcenow.adp.com/mascsr/default/mdf/recruitment/recruitment.html?cid=a4c08bd3-eedf-419a-9fb6-5d2ac8a3bafa&ccId=19000101_000001&lang=en_US"
    ],
    "maxJobsPerCompany": 20,
    "maxResults": 20,
    "includeDescription": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("santamaria-automations/adp-jobs-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 = {
    "companies": ["https://workforcenow.adp.com/mascsr/default/mdf/recruitment/recruitment.html?cid=a4c08bd3-eedf-419a-9fb6-5d2ac8a3bafa&ccId=19000101_000001&lang=en_US"],
    "maxJobsPerCompany": 20,
    "maxResults": 20,
    "includeDescription": True,
}

# Run the Actor and wait for it to finish
run = client.actor("santamaria-automations/adp-jobs-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 '{
  "companies": [
    "https://workforcenow.adp.com/mascsr/default/mdf/recruitment/recruitment.html?cid=a4c08bd3-eedf-419a-9fb6-5d2ac8a3bafa&ccId=19000101_000001&lang=en_US"
  ],
  "maxJobsPerCompany": 20,
  "maxResults": 20,
  "includeDescription": true
}' |
apify call santamaria-automations/adp-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,santamaria-automations/adp-jobs-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/cAhrgiLwchE3vvXXr/builds/Tu8IE7wf0J3FoIwuN/openapi.json
