# Dayforce Jobs Scraper (`gefese/dayforce-jobs-scraper`) Actor

Extract job postings (title, locations, posted date, department, full description, job and apply URLs) from public Dayforce career sites. Independent tool, not affiliated with Dayforce.

- **URL**: https://apify.com/gefese/dayforce-jobs-scraper.md
- **Developed by:** [Gonzalo Fajardo](https://apify.com/gefese) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.50 / 1,000 result items

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

## Dayforce Jobs Scraper

Extract open job postings from public employer career sites hosted on Dayforce (addresses that look like `https://jobs.dayforcehcm.com/<locale>/<clientNamespace>/<careerSiteCode>`). Give it one or more career site URLs and it returns one clean record per posting: title, locations, posted date, department, pay type, the full description as plain text and HTML, plus the public job and apply links.

This is an independent tool. It is not affiliated with, endorsed by or sponsored by Dayforce or Ceridian. It only reads pages and data that any visitor can open in a browser without logging in.

### What data does it return?

Each dataset item is one job posting with these fields:

- `jobId`, `jobRequisitionId`: the posting ID and the requisition ID shown by the career site
- `title`, `companyName`: job title and the employer name as labelled on the career site (falls back to the client namespace from the URL)
- `clientNamespace`, `careerSiteCode`, `careerSiteUrl`: where the posting came from
- `locations`: array of `{city, state, country, postalCode, formattedAddress}` (`postalCode` is `null` because the career site does not publish it as a separate field)
- `isRemote`, `workplaceType`: `true` / `"remote"` when the posting has a virtual location
- `postedDate`, `expiryDate`: ISO 8601 timestamps (expiry is `null` when not set)
- `employmentType`, `payType`, `department`, `category`: taken from the posting attributes the employer publishes (for example `PayType`, `JobFamily`, `JobFunction`, `EmploymentIndicator`); `null` when absent
- `attributes`: every posting attribute as a name-to-value object
- `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod`: always `null` today, because these career sites do not expose structured salary fields. Pay that an employer writes into the description text stays in the description.
- `descriptionText`: description with HTML stripped; `descriptionHtml`: the description as published (only when "Include description HTML" is on)
- `jobUrl`, `applyUrl`, `scrapedAt`

The Actor does not output recruiter or hiring-manager names, emails or phone numbers as fields. Descriptions are kept exactly as the employer published them.

### How to run it

1. Open the Actor and leave the prefilled input as it is: it points at one public Dayforce career site and asks for up to 20 jobs.
2. Click Start. No account, cookies or credentials for the target site are needed.
3. When the run finishes, open the Output tab to see the table, or download the dataset as JSON, CSV or Excel.
4. To scrape your own targets, replace the URL in "Career site URLs" with the address of any public Dayforce career site (open the employer's careers page and copy the address from your browser). You can add several URLs; limits apply per site.
5. Optional: enter a keyword to use the career site's own search, raise "Maximum jobs per career site", or turn off the HTML description to get smaller records.

In a local test run with the prefilled input, 20 jobs were returned in 28 seconds.

### How much does it cost to scrape Dayforce career sites?

Pricing is pay per event: **0.0015 USD per job posting returned** (one result event per dataset item). There is no separate start fee in this Actor's pricing. Example: 1,000 job postings = 1.50 USD; 20 postings (the prefill) = 0.03 USD. You can cap spending with the maximum total charge setting of your run; the Actor stops when that limit is reached. Platform usage (compute) is billed according to your Apify plan.

### Input and output example

Input:

```json
{
  "startUrls": [{ "url": "https://jobs.dayforcehcm.com/en-US/herffjones/HERFFJONESCANDIDATEPORTAL" }],
  "searchQuery": "",
  "maxItemsPerSite": 20,
  "includeDescription": true
}
```

Output (three of the 20 items from the local run; long description fields are truncated here for readability, the dataset contains them in full):

```json
[
  {
    "jobId": "6232",
    "jobRequisitionId": 990,
    "title": "Planner",
    "companyName": "Herff Jones",
    "clientNamespace": "herffjones",
    "careerSiteCode": "HERFFJONESCANDIDATEPORTAL",
    "locations": [
      {
        "city": "Warwick",
        "state": "RI",
        "country": "US",
        "postalCode": null,
        "formattedAddress": "Warwick, RI, USA"
      }
    ],
    "isRemote": false,
    "workplaceType": null,
    "postedDate": "2026-09-29T05:00:00+00:00",
    "expiryDate": null,
    "employmentType": null,
    "payType": "Hourly",
    "department": "JF_Production",
    "category": "Operations",
    "attributes": {
      "JobFamily": "JF_Production",
      "JobFunction": "Operations",
      "PayType": "Hourly"
    },
    "salaryMin": null,
    "salaryMax": null,
    "salaryCurrency": null,
    "salaryPeriod": null,
    "descriptionText": "Position Title: Planner\n\nLocation: Warwick\n\nStarting Pay for position: $30/hour\n\nJOIN OUR TEAM!\n\nAbout Herff Jones:\n\nIndianapolis-based Herff Jones is the leadi… [truncated for this README]",
    "jobUrl": "https://jobs.dayforcehcm.com/en-US/herffjones/HERFFJONESCANDIDATEPORTAL/jobs/6232",
    "applyUrl": "https://jobs.dayforcehcm.com/en-US/herffjones/HERFFJONESCANDIDATEPORTAL/jobs/6232/apply",
    "careerSiteUrl": "https://jobs.dayforcehcm.com/en-US/herffjones/HERFFJONESCANDIDATEPORTAL",
    "scrapedAt": "2026-10-01T12:17:50.313864+00:00",
    "descriptionHtml": "<p style=\"margin: 0in 0in 8pt; line-height: 107%; font-size: 11pt; font-family: Calibri, s… [truncated for this README]"
  },
  {
    "jobId": "6175",
    "jobRequisitionId": 980,
    "title": "Inventory Control Clerk",
    "companyName": "Herff Jones",
    "clientNamespace": "herffjones",
    "careerSiteCode": "HERFFJONESCANDIDATEPORTAL",
    "locations": [
      {
        "city": "Arcola",
        "state": "IL",
        "country": "US",
        "postalCode": null,
        "formattedAddress": "Arcola, IL 61910, USA"
      }
    ],
    "isRemote": false,
    "workplaceType": null,
    "postedDate": "2026-09-16T04:00:00+00:00",
    "expiryDate": null,
    "employmentType": null,
    "payType": "Hourly",
    "department": "JF_Supply Chain",
    "category": "Mfg Support",
    "attributes": {
      "JobFamily": "JF_Supply Chain",
      "JobFunction": "Mfg Support",
      "PayType": "Hourly"
    },
    "salaryMin": null,
    "salaryMax": null,
    "salaryCurrency": null,
    "salaryPeriod": null,
    "descriptionText": "Position Title: Inventory Control Clerk\n\nLocation: Arcola, IL\n\nStarting Pay for position: $19 per hour\n\nJOIN OUR TEAM!\n\nAbout Herff Jones:\n\nIndianapolis-based H… [truncated for this README]",
    "jobUrl": "https://jobs.dayforcehcm.com/en-US/herffjones/HERFFJONESCANDIDATEPORTAL/jobs/6175",
    "applyUrl": "https://jobs.dayforcehcm.com/en-US/herffjones/HERFFJONESCANDIDATEPORTAL/jobs/6175/apply",
    "careerSiteUrl": "https://jobs.dayforcehcm.com/en-US/herffjones/HERFFJONESCANDIDATEPORTAL",
    "scrapedAt": "2026-10-01T12:17:50.399105+00:00",
    "descriptionHtml": "<p style=\"margin: 0in 0in 8pt; line-height: 107%; font-size: 11pt; font-family: Calibri, s… [truncated for this README]"
  },
  {
    "jobId": "6008",
    "jobRequisitionId": 944,
    "title": "Part-Time Office Manager - Broward County / Fort Lauderdale",
    "companyName": "Herff Jones",
    "clientNamespace": "herffjones",
    "careerSiteCode": "HERFFJONESCANDIDATEPORTAL",
    "locations": [
      {
        "city": null,
        "state": "FL",
        "country": "US",
        "postalCode": null,
        "formattedAddress": "Broward County, FL, USA"
      },
      {
        "city": "Fort Lauderdale",
        "state": "FL",
        "country": "US",
        "postalCode": null,
        "formattedAddress": "Fort Lauderdale, FL, USA"
      }
    ],
    "isRemote": false,
    "workplaceType": null,
    "postedDate": "2026-08-12T05:00:00+00:00",
    "expiryDate": null,
    "employmentType": null,
    "payType": "Hourly",
    "department": "JF_Sales Support",
    "category": "Other",
    "attributes": {
      "JobFamily": "JF_Sales Support",
      "JobFunction": "Other",
      "PayType": "Hourly"
    },
    "salaryMin": null,
    "salaryMax": null,
    "salaryCurrency": null,
    "salaryPeriod": null,
    "descriptionText": "Position Title: Part-Time Office Manager\n\nLocation: Broward County/Fort Lauderdale\n\nStarting Pay for position: $20 - $32 / Hour\n\nJOIN OUR TEAM!\n\nAbout Herff Jon… [truncated for this README]",
    "jobUrl": "https://jobs.dayforcehcm.com/en-US/herffjones/HERFFJONESCANDIDATEPORTAL/jobs/6008",
    "applyUrl": "https://jobs.dayforcehcm.com/en-US/herffjones/HERFFJONESCANDIDATEPORTAL/jobs/6008/apply",
    "careerSiteUrl": "https://jobs.dayforcehcm.com/en-US/herffjones/HERFFJONESCANDIDATEPORTAL",
    "scrapedAt": "2026-10-01T12:17:50.577854+00:00",
    "descriptionHtml": "<p style=\"margin: 0in 0in 8pt; line-height: 107%; font-size: 11pt; font-family: Calibri, s… [truncated for this README]"
  }
]
```

### Limitations and the free plan

- Only public career sites on jobs.dayforcehcm.com are supported. Employer sites on other domains, login-protected pages and internal (employee-only) postings are not read.
- Requests are sent politely: at most 2 in flight and at least one second between requests, with retries and growing waits on rate-limit or server errors, giving up after 3 retries per request. The Actor does not use proxies, and it stops working on a site if the site refuses access.
- A URL whose career site does not exist or has no jobs returns no items (a warning is logged). Postings are returned as the site currently lists them; the Actor does not keep history.
- Salary fields are `null` (see above). The "department" and "category" values are whatever codes the employer used, for example `JF_Production`.
- Data comes from an unofficial interface used by the career site pages, which the site owner can change at any time. If that happens runs may return fewer or no items until the Actor is updated.
- Free plan: a run with the prefilled input (20 jobs) fits comfortably; how many jobs your plan's credit covers depends on your Apify plan, at 0.0015 USD per job plus platform usage.

### FAQ

**Do I need a Dayforce account?** No. Only public career sites are read, without logging in.

**Can I scrape several employers in one run?** Yes. Add several career site URLs; "Maximum jobs per career site" applies to each of them.

**How do I find the right URL?** Open the employer's careers page; if it is a Dayforce site, the address has the form shown above. Copy it into "Career site URLs".

**Why is a field empty?** Employers decide what they publish. Fields the career site does not provide are `null`.

**Something is wrong or a career site stopped working.** Please report it in the Issues tab of this Actor on Apify, including the career site URL you used.

# Actor input Schema

## `startUrls` (type: `array`):

Public Dayforce career site URLs in the form https://jobs.dayforcehcm.com/<locale>/<clientNamespace>/<careerSiteCode>. Open the employer's careers page and copy the address from the browser.

## `searchQuery` (type: `string`):

Optional keyword passed to the career site's own search. Leave empty to scrape all open postings.

## `maxItemsPerSite` (type: `integer`):

Stop after this many job postings for each career site URL.

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

Add the full job description as HTML (descriptionHtml). The plain-text description is always included.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://jobs.dayforcehcm.com/en-US/herffjones/HERFFJONESCANDIDATEPORTAL"
    }
  ],
  "searchQuery": "",
  "maxItemsPerSite": 20,
  "includeDescription": true
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# 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 = {
    "startUrls": [
        {
            "url": "https://jobs.dayforcehcm.com/en-US/herffjones/HERFFJONESCANDIDATEPORTAL"
        }
    ],
    "searchQuery": "",
    "maxItemsPerSite": 20,
    "includeDescription": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("gefese/dayforce-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 = {
    "startUrls": [{ "url": "https://jobs.dayforcehcm.com/en-US/herffjones/HERFFJONESCANDIDATEPORTAL" }],
    "searchQuery": "",
    "maxItemsPerSite": 20,
    "includeDescription": True,
}

# Run the Actor and wait for it to finish
run = client.actor("gefese/dayforce-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 '{
  "startUrls": [
    {
      "url": "https://jobs.dayforcehcm.com/en-US/herffjones/HERFFJONESCANDIDATEPORTAL"
    }
  ],
  "searchQuery": "",
  "maxItemsPerSite": 20,
  "includeDescription": true
}' |
apify call gefese/dayforce-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,gefese/dayforce-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/eeteMKpjSFM6RoJzx/builds/QGf5Hl9z29lnr8m5M/openapi.json
