# SAP SuccessFactors Jobs Scraper — Full Job Catalogs, No Login (`yugenox/successfactors-jobs-scraper`) Actor

Scrape job postings from any company career site that runs SAP SuccessFactors (classic and Career Site Builder). Keyword + location search or full catalog: title, location, dates, department, job type, work model, salary, full description. 65 verified employers built in. No login.

- **URL**: https://apify.com/yugenox/successfactors-jobs-scraper.md
- **Developed by:** [Yugenox Corp](https://apify.com/yugenox) (community)
- **Categories:** Jobs, Lead generation
- **Stats:** 2 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.50 / 1,000 jobs

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

## SAP SuccessFactors Jobs Scraper

Scrape job postings from **any company career site that runs SAP SuccessFactors**: Scotiabank, Deloitte, BMW Group, CN, Rogers, TELUS, adidas, Bayer, McDonald's, John Deere and thousands more. You can search by keyword and location, or pull a company's **entire open-job catalog** with full descriptions.

It works with both kinds of SuccessFactors career site, classic and the newer Career Site Builder, and detects which one a company uses. You don't need a login or an API key.

### What you get

For each job:

- **Title**, **job ID** and **requisition ID**
- **Location**: the full text, plus city, region/province/state, country and postal code. You also get every location of a multi-site posting, and map coordinates when the site publishes them.
- **Date posted** and **closing date**, both as ISO dates (`2026-09-24`)
- **Department / job family**, **business unit**, **employment type**, **work model** (remote/hybrid/on-site), **career level**, **salary** and **currency** when the site shows them
- **Full description**, as clean text and as HTML
- **Job page URL** and **apply URL**
- **Every other field the site shows** (e.g. "Operating Sector", "Highest Level Division", "Bilingual Requirement") in `extraFields`

### How to use it

1. **Pick companies.** Enter career-site addresses (`jobs.scotiabank.com`), paste any page from the site, or choose from the built-in list of 65 verified SuccessFactors employers (Canada, US, Europe).
2. **Optionally search.** Add keywords (`data analyst`) and a location (`Toronto`). Leave both empty to get every open job.
3. **Set limits.** Use jobs per company, total jobs, or "posted within N days".
4. Run it and download the results as JSON, CSV, Excel or HTML, or connect them to your tools through the Apify API or integrations.

You can also paste a **single job URL** to get the details of that one job.

#### Input example

```json
{
  "companies": ["jobs.scotiabank.com", "careers.deloitte.ca"],
  "presets": ["bmw_group", "rogers"],
  "keywords": "analyst",
  "location": "Toronto",
  "maxItemsPerCompany": 100,
  "postedWithinDays": 14,
  "includeDescription": true
}
```

| Field | What it does |
|---|---|
| `companies` | Career-site hosts, site URLs, search URLs or job URLs |
| `presets` | Verified SuccessFactors employers, picked from a list |
| `keywords` / `location` | The same search the career site offers. Empty = everything |
| `maxItemsPerCompany` | Default 200. `0` = the whole catalog |
| `maxItems` | Overall limit across all companies |
| `postedWithinDays` | Only recent postings |
| `includeDescription` | Full description and job-page details (default on). Off = a faster listing-only run |
| `sortBy` | `date` (newest first, default) or `relevance` |
| `locale` / `allLocales` | Site language (e.g. `fr_CA`, `de_DE`). Multinational sites often list different jobs per language |
| `includeFacets` | Also saves the site's filter counts (jobs per country, city, department…) |

#### Output example

```json
{
  "companyName": "Scotiabank",
  "jobId": "605290517",
  "reqId": "269647",
  "title": "Digital Business Analyst, Global Wealth Management Digital",
  "location": "Toronto, ON, CA, M5H 0B4",
  "city": "Toronto",
  "region": "ON",
  "country": "CA",
  "postalCode": "M5H 0B4",
  "allLocations": ["Toronto, ON, CA, M5H 0B4"],
  "datePosted": "2026-09-15",
  "expirationDate": null,
  "department": null,
  "employmentType": null,
  "workModel": null,
  "industry": "Business Analyst, Quality Assurance, QA, User Experience, Finance, Technology, Quality",
  "url": "https://jobs.scotiabank.com/job/Toronto-Digital-Business-Analyst%2C-Global-Wealth-Management-Digital-ON-M5H-0B4/605290517/",
  "applyUrl": "https://jobs.scotiabank.com/talentcommunity/apply/605290517/?locale=en_US",
  "descriptionText": "Requisition ID: 269647\n\nJoin a purpose driven winning team…",
  "descriptionHtml": "<p>Requisition ID: 269647</p>…",
  "extraFields": { "Date": "Sep 15, 2026", "Location": "Toronto, ON, CA, M5H 0B4" },
  "host": "jobs.scotiabank.com",
  "platformFlavor": "classic",
  "locale": "en_US",
  "searchKeywords": "analyst",
  "searchLocation": "Toronto",
  "scrapedAt": "2026-09-24T07:13:38.002Z"
}
```

Which fields are filled depends on what each employer publishes. Each company chooses its own columns, so `department` or `salary` may be empty for one company and filled for another.

### Use cases

- **Job boards and aggregators:** feed live postings straight from employers' own career sites
- **Recruiting and talent intelligence:** track who is hiring, where, and for which roles
- **Sales prospecting:** spot companies expanding a team or opening a new office
- **Labour-market research:** hiring volume by city, department or seniority over time
- **Job seekers:** a daily feed of new postings from your target employers

### FAQ

**How do I know if a company uses SuccessFactors?**
Its career site usually has addresses like `jobs.company.com/job/City-Title/123456789/` or `/search/?q=`. Paste the site into `companies`. If it isn't SuccessFactors, the run says so and skips it at no charge. The built-in list covers 65 verified employers to start with.

**Can I get every job a company has open?**
Yes. Leave keywords and location empty and set `maxItemsPerCompany` to `0`.

**How fresh is the data?**
It is live. Every run reads the employer's career site at that moment. Nothing comes from a stale database.

**Why do some jobs have an empty department or salary?**
The Actor returns what the employer publishes. Fields a company doesn't show stay `null`, and anything site-specific appears in `extraFields`.

**Some sites list different jobs in different languages. How do I get them all?**
Turn on `allLocales`. The Actor visits every language version of the site and removes duplicates.

**What happens if a site is down or doesn't respond?**
The run still finishes successfully with every job it could collect. Sites that could not be loaded are named in the run's status message, and a job whose page did not load is still delivered with its listing data. You only pay for the job rows in the dataset — never for skipped sites, errors or empty searches.

**Is it legal to scrape SAP SuccessFactors career sites?**
This Actor only collects job postings that employers publish openly on their public career sites, the same pages any job seeker can open without an account. Some job descriptions include a recruiter's name, work email or phone number, which is personal data: if you store or use it, make sure you have a legitimate reason to do so. Follow the data-protection laws that apply to you (such as GDPR, PIPEDA and CCPA) and each site's terms, and check with a lawyer if you are unsure about your use case. For more background, read [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/) on the Apify blog.

**Does it access any private data?**
No. It never logs in and uses no accounts, passwords or API keys. It reads only the public job search pages and job pages that each career site shows to every visitor, with the ordinary visitor session the site gives any browser. Candidate profiles, applications and anything else behind the SuccessFactors login are never touched.

**I typed a company name instead of an address.**
That works for the built-in employers: `Deloitte` runs both Deloitte sites, `bmw` runs BMW Group. Other inputs must be the career-site address. Common alternative input names are accepted too (`maxResults`, `limit`, `keyword`, `query`, `url`, `startUrls`…).

**Is it fast?**
A 20-job search with descriptions finishes in seconds. A full catalog of about 1,700 jobs with descriptions takes a few minutes. Turn off descriptions for a much faster listing-only run.

# Actor input Schema

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

Career-site addresses of companies that use SAP SuccessFactors — a host (jobs.scotiabank.com), any page on the site, a search URL, or a single job URL. Not sure which companies use SuccessFactors? Pick from the list below instead.

## `presets` (type: `array`):

Verified SuccessFactors career sites (65). Combined with the list above.

## `keywords` (type: `string`):

Search terms, as typed into the career site search box (e.g. "data analyst"). Leave empty to get every open job.

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

City, province/state or country, as typed into the site's location box (e.g. "Toronto"). Leave empty for all locations.

## `maxItemsPerCompany` (type: `integer`):

Stop after this many jobs from each career site. 0 = no limit (the whole catalog).

## `maxItems` (type: `integer`):

Overall limit across all companies. 0 = no limit.

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

Only jobs posted in the last N days. Leave empty for any date.

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

Adds the full description (text + HTML) and extra details from each job page. Turn off for a faster listing-only run.

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

Which jobs come first when a limit applies.

## `locale` (type: `string`):

Site language, e.g. en_US, fr_CA, de_DE. Many multinational sites list different jobs per language. Empty = the site default.

## `allLocales` (type: `boolean`):

Collect jobs from every language version of each site (duplicates are removed).

## `includeFacets` (type: `boolean`):

Also save the site's filter counts (jobs per country, city, department…) for your search to the key-value store as FACETS-<site>. Available on Career Site Builder sites.

## `concurrency` (type: `integer`):

How many pages to load at once from each career site.

## `proxyConfiguration` (type: `object`):

Apify datacenter proxy works for almost every career site. A site that blocks it is switched to residential automatically.

## Actor input object example

```json
{
  "companies": [
    "jobs.scotiabank.com",
    "careers.deloitte.ca",
    "jobs.bmwgroup.com"
  ],
  "keywords": "analyst",
  "maxItemsPerCompany": 20,
  "maxItems": 0,
  "includeDescription": true,
  "sortBy": "date",
  "allLocales": false,
  "includeFacets": false,
  "concurrency": 6,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

Every row this run saved, as JSON.

## `resultsCsv` (type: `string`):

The same rows as CSV, ready for a spreadsheet.

## `resultsTable` (type: `string`):

The same rows narrowed to the key columns (the "overview" view).

# 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": [
        "jobs.scotiabank.com",
        "careers.deloitte.ca"
    ],
    "keywords": "analyst",
    "maxItemsPerCompany": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("yugenox/successfactors-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": [
        "jobs.scotiabank.com",
        "careers.deloitte.ca",
    ],
    "keywords": "analyst",
    "maxItemsPerCompany": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("yugenox/successfactors-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": [
    "jobs.scotiabank.com",
    "careers.deloitte.ca"
  ],
  "keywords": "analyst",
  "maxItemsPerCompany": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call yugenox/successfactors-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,yugenox/successfactors-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/wCcNFCl8SeibgP4n0/builds/3hGMhJ30OlRsazPrJ/openapi.json
