# SAP SuccessFactors Jobs API | Live Postings & Descriptions (`johnvc/sap-successfactors-jobs-api`) Actor

SAP SuccessFactors Jobs API access without keys: live postings from public SuccessFactors career sites with full descriptions, requisition IDs, locations, and job functions, plus tenant discovery. Markdown, HTML, or text output. Pay only for delivered rows, no start fee, no minimum.

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

## Pricing

from $0.40 / 1,000 job records

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## SAP SuccessFactors Jobs API

Pull live jobs from any public SAP SuccessFactors career site, with no API key and no login. This is the SuccessFactors API for public job data: no employer OData credentials and nothing to sign up for. Give it a career-site URL, a host like jobs.sap.com, or a company name, and get back structured job records with titles, locations, job functions, requisition IDs, expiration dates, and full descriptions as Markdown, HTML, or text. Turn on the detail add-on for the posted date, department, facility, shift type, and travel that only the job page carries.

SAP SuccessFactors is one of the most widely installed enterprise recruiting platforms, second only to Workday among the Fortune 500, and there has never been a clean way to read its public postings on demand. Most tools crawl the search pages one result at a time. This actor reads each tenant's public Google-for-Jobs feed instead: one request returns the whole live inventory with descriptions, so every row reflects what the career site says right now, not what an index remembered last week. If you have been searching for a SuccessFactors jobs API, a SuccessFactors career site reader, or a way to pull SAP SuccessFactors postings into your own pipeline, this is the maintained version of that tool.

This is an independent SuccessFactors API for public job data. It is not affiliated with, endorsed by, or connected to [SAP SuccessFactors](https://www.sap.com/products/hcm.html); it reads only the public career-site feeds that SuccessFactors tenants already publish.

### What you get per job

| Field group | Fields |
|---|---|
| Identity | requisitionId, title, companyName, employer, tenant, url, applyUrl |
| Structure | jobFunction, location, countryCode, isRemote |
| Dates | validThrough (expiration); datePosted with the detail add-on |
| Detail add-on | datePosted, department, facility, shiftType, travel, customFields |
| Salary | salaryDerived plus flat salaryMin, salaryMax, salaryCurrency, salaryPeriod columns (parsed from the posting text when present) |
| Content | descriptionMarkdown, descriptionHtml, descriptionText |
| Provenance | flavor, source, sourceType, sourceUrl, scrapedAt |

### One request, the whole career site

Each SuccessFactors career site publishes a public feed of every live job, with the full description on each one. This actor reads that feed, so a single request returns a tenant's complete inventory rather than page after page of search results. That makes it fast, complete, and cheap: you are not paying for one request per job to list a whole company.

### One actor, three ways to read a career site

1. **Full job records** (default): every open job on the career sites you name, with descriptions in the formats you pick.
2. **Job URLs only**: the cheapest way to index everything: requisition id, title, company, link, function, and expiration, without descriptions.
3. **Tenant discovery**: one row per SuccessFactors career site, live-verified with a current open-jobs count.

Leave the company list empty and the actor sweeps its bundled tenant directory for you, capped by maxTenants and maxJobs so an exploratory run stays small.

### Per-job detail fields nobody else surfaces

Turn on the detail add-on and each job row is enriched from its own public job page with the fields the feed does not carry: the date the posting went live, the department, the facility, the shift type, and the travel requirement, plus any employer-defined custom fields. It costs one extra request per job, so it is optional and billed only on the rows that carry it.

### Pay for exactly what you receive

Billing is per delivered row, with no start fee and no minimum spend. Filters (title, job function, location, remote, active-only) run before billing, so filtered jobs cost nothing. The base job record is one event; Markdown, HTML, or plain-text descriptions, the per-job detail fields, and the whole-run report are optional add-ons, each billed only on the rows that actually carry them. Turn everything off and a job row costs a fraction of a cent.

### Input parameters

| Parameter | Type | Default | What it does |
|---|---|---|---|
| companies | array | \["jobs.sap.com"] | Career-site hosts, full URLs, single-job URLs, or company names, mixed freely |
| startUrls | array | \[] | Same values in URL-list form; merged with companies |
| outputMode | select | jobs | jobs, urlsOnly, or tenantsOnly |
| discoveryQuery | string | "" | Text match over the tenant directory for discovery and sweeps |
| verifyTenants | boolean | true | Live-probe each discovered career site before returning it |
| titleKeywords | array | \[] | Keep jobs whose title contains any of these |
| jobFunctions | array | \[] | Keep jobs whose job function contains any of these |
| locationKeywords | array | \[] | Keep jobs whose location contains any of these |
| activeOnly | boolean | true | Drop postings whose expiration date has passed |
| remoteOnly | boolean | false | Keep only jobs whose title or location indicates a remote role |
| includeDescriptionMarkdown | boolean | true | Add the description as Markdown (paid add-on) |
| includeDescriptionHtml | boolean | false | Add the original HTML (paid add-on) |
| includeDescriptionText | boolean | false | Add a plain-text rendering (paid add-on) |
| includeDetailFields | boolean | false | Add posted date, department, facility, shift type, travel, and custom fields from the job page (paid add-on) |
| report | select | none | Write a Markdown or HTML run report (paid add-on) |
| maxTenants | integer | 25 | Cap on career sites in sweeps and discovery |
| maxJobsPerTenant | integer | 0 | Per-tenant cap, 0 = all |
| maxJobs | integer | 100 | Whole-run cap, the main cost control |
| maxConcurrency | integer | 5 | Parallel detail fetches and discovery probes |

### Example output

```json
{
  "resultType": "job",
  "requisitionId": "1432725333",
  "title": "Senior UX Designer - Design Systems",
  "companyName": "SAP",
  "employer": "SAP",
  "tenant": "jobs.sap.com",
  "careerSiteUrl": "https://jobs.sap.com",
  "url": "https://jobs.sap.com/job/Prague-Senior-UX-Designer/1432725333/",
  "applyUrl": "https://jobs.sap.com/job/Prague-Senior-UX-Designer/1432725333/",
  "jobFunction": "Administration",
  "location": "Prague 5, CZ, 158 00",
  "countryCode": "CZ",
  "validThrough": "2026-10-08",
  "isRemote": false,
  "datePosted": "2026-09-01",
  "department": "Administration",
  "facility": "459296",
  "shiftType": "Limited Full Time",
  "travel": "0 - 10%",
  "descriptionMarkdown": "**We help the world run better**\n\nAt SAP, we keep it simple...",
  "flavor": "rmk",
  "source": "successfactors",
  "scrapedAt": "2026-09-08T16:00:00Z"
}
```

### Use cases

- Job boards and aggregators: backfill and refresh SuccessFactors listings straight from the source, not from a third-party index.
- Recruiters and sourcers: pull every open role at target enterprises, filtered by title, job function, or location.
- Enterprise hiring signals: SuccessFactors runs behind thousands of large employers; watch where headcount is going.
- Compensation research: collect job descriptions at scale and parse published pay ranges for benchmarking.
- AI agents: structured JSON, Markdown descriptions, stable field names, and MCP support make this a clean tool for agent pipelines.

### Getting started

1. Add career-site URLs, hosts, or company names to the companies field.
2. Pick the description formats you want (Markdown is on by default), and turn on the detail add-on if you need the posted date and department.
3. Run it. Rows land in the dataset; a per-tenant summary lands in the key-value store.

[View on Apify Store](https://apify.com/johnvc/sap-successfactors-jobs-api?fpr=9n7kx3)

### 🔌 Integrations: build a recurring SuccessFactors jobs pipeline

Run this once for a one-off pull, or wire it into a standing pipeline that keeps your own database in sync with what SuccessFactors career sites publish.

- Tasks and Schedules: save a configured run as an Apify Task, then attach a daily or hourly Schedule. Paired with the active-only filter, each run returns the current open roles for the career sites you follow, hands-off.
- n8n, Make, and Zapier: trigger the actor and route rows into your stack through Apify's [integrations](https://docs.apify.com/platform/integrations) for webhooks, Google Sheets, and hundreds of apps.
- Storage and databases: push results straight to a dataset and sync to Supabase, Postgres, or a warehouse; export JSON, CSV, or Excel from the Console.
- Apify API and clients: run the actor and read the dataset from Python or JavaScript with the [Apify API](https://docs.apify.com/api/v2).
- MCP: add the actor to any MCP client through the hosted server (see the MCP section below).
- Crypto-native agents: pay per run over the x402 protocol (see the x402 section below).

### Related tools

Part of a family of job-data APIs on this account:

- [Workday Careers API](https://apify.com/johnvc/workday-careers-api?fpr=9n7kx3) for Workday-hosted career sites
- [Greenhouse Job Board API](https://apify.com/johnvc/greenhouse-job-board-api?fpr=9n7kx3) for Greenhouse-hosted career sites
- [Ashby Job Board API](https://apify.com/johnvc/ashby-job-board-scraper?fpr=9n7kx3) for Ashby-hosted career sites
- [iCIMS Careers API](https://apify.com/johnvc/icims-careers-api?fpr=9n7kx3) for iCIMS career portals
- [Oracle Taleo Jobs API](https://apify.com/johnvc/oracle-taleo-jobs-api?fpr=9n7kx3) for Taleo career sections
- [LinkedIn Jobs API](https://apify.com/johnvc/linkedin-jobs-api?fpr=9n7kx3) for LinkedIn job search results

Unlike the thin single-tenant SuccessFactors scrapers that crawl one search page at a time and stop there, this actor reads the whole career-site feed in one request and adds tenant discovery and per-job detail fields, with output field names that match the rest of the family so you can merge several ATS platforms into one dataset.

### 🔌 SuccessFactors MCP: use this API from Claude and AI agents

Looking for a SuccessFactors MCP server that reads career sites instead of managing them? Add this actor as a tool in [Claude Code](https://claude.ai/referral/uIlpa7nPLg) (free trial), [Claude Cowork](https://claude.ai/referral/uIlpa7nPLg) (free trial), or any MCP client, through the hosted Apify MCP server:

```
https://mcp.apify.com/?tools=actors,docs,johnvc/sap-successfactors-jobs-api
```

Apify MCP integration docs: https://docs.apify.com/platform/integrations/mcp

### 💸 Pay per run with crypto (x402)

The SAP SuccessFactors Jobs API supports agentic payments via the [x402 protocol](https://docs.apify.com/platform/integrations/x402).
AI agents and MCP clients can pay for runs in USDC (on Base) with no Apify account or API token needed:
point your agent at the [Apify MCP server](https://mcp.apify.com/?tools=actors,docs,johnvc/sap-successfactors-jobs-api) and it can
discover, pay for, and run this actor autonomously. Read the
[Apify x402 announcement](https://apify.com/change-log/pay-for-apify-actors-with-x402?fpr=9n7kx3) for details.

### SuccessFactors API pricing

Pay per event, per delivered row. The base job record covers every structured field the feed provides. Add-ons bill only on rows that carry them: description formats, the per-job detail fields, and the whole-run report. URL index rows and discovered tenants have their own low per-row events. No start fee, no monthly rental, no minimum results per run, and filtered rows are never charged. Current prices are on the store page's pricing card.

### FAQ

#### How do I connect to the SuccessFactors API?

You do not need SAP's OData API or a key. This actor reads the public jobs feed that every SuccessFactors career site already publishes, so you connect by pointing it at a career-site host or URL and reading structured JSON back. Run it from the [Apify API](https://docs.apify.com/api/v2), the Console, or any MCP client.

#### Do I need a SuccessFactors API key?

No. The authenticated OData APIs from [SAP SuccessFactors](https://www.sap.com/products/hcm.html) are for employers. This actor uses only the public jobs layer that SuccessFactors career sites expose, so there is nothing to sign up for and no key to manage.

#### Can I use this instead of writing my own SuccessFactors scraper?

Yes, that is the point. A hand-built SuccessFactors scraper breaks the next time a career site changes; here someone else maintains the parser. Under the hood it reads each tenant's public jobs feed the way a scraper would, but what you get back is an API: structured JSON, filters, and stable field names.

#### How do I scrape SuccessFactors without a key?

Give the actor a career-site host such as jobs.sap.com, a full career-site URL, or a company name, and it returns every live posting with descriptions as JSON. No login, no OData credentials, and no crawling one search page at a time.

#### Can I use SuccessFactors from Claude or another MCP client?

Yes. Add the hosted MCP server URL from the MCP section above and the actor appears as a callable tool in [Claude Code](https://claude.ai/referral/uIlpa7nPLg) (free trial), [Claude Cowork](https://claude.ai/referral/uIlpa7nPLg) (free trial), or any MCP client. Agents can discover it, run it, and read the dataset without glue code.

#### How do I connect SuccessFactors to Claude AI?

Point Claude at the hosted Apify MCP server with this actor in the tools list (see the MCP section). Claude can then pull live SuccessFactors postings on demand and reason over them, which is the cleanest way to feed enterprise job data into an AI workflow.

#### Is SuccessFactors an ATS?

Yes. SAP SuccessFactors is one of the most widely installed [applicant tracking systems](https://en.wikipedia.org/wiki/Applicant_tracking_system) in the enterprise, second only to Workday among the Fortune 500. This actor reads the public job postings those tenants publish; see [SAP SuccessFactors](https://en.wikipedia.org/wiki/SAP_SuccessFactors) for background on the platform.

#### Can I schedule this to track new postings?

Yes. Pair a daily Apify Schedule with the active-only filter (see Integrations above) and each run returns the current open roles for the career sites you follow, with no state to manage between runs.

#### How do I get the posted date and department?

Turn on the detail add-on (includeDetailFields). The public feed carries the description and expiration date, but the posted date, department, facility, shift type, and travel live on the individual job page. The add-on fetches that page per job and adds those fields, billed only on the rows that carry them.

#### Do you have APIs for other ATS platforms?

Yes. This is part of a family of job-data APIs; see Related tools above for Workday, Greenhouse, Ashby, iCIMS, and Oracle Taleo. They share matching output field names, so you can merge several ATS platforms into one dataset.

#### Why did a career site return an error row?

Error rows carry a stable errorCode: tenant\_not\_found means the career site could not be resolved to a live feed (check the didYouMean suggestions), job\_not\_found means a single-job URL pointed at a closed posting, http\_error means the source answered abnormally. Errors are in-band rows, so your pipeline sees them without reading logs.

### Agent skills

Install ready-made Claude skills that drive this API:

- [SuccessFactors jobs API skill](https://github.com/johnisanerd/claude-skill-successfactors-jobs-api): pull live SAP SuccessFactors postings to a structured feed.
- [SuccessFactors MCP skill](https://github.com/johnisanerd/claude-skill-successfactors-mcp): use the same API live from Claude and other MCP clients.

Install with `npx skills add johnisanerd/claude-skill-successfactors-jobs-api` or add the folder to your agent's skills directory.

### 🌐 About Alpha OSINT

This Actor is part of [Alpha OSINT](https://www.alphaosint.com), toolset of financial and operations data sources and APIs.
For support or requests for this actor, please start a ticket [directly on our support page](https://apify.com/johnvc/sap-successfactors-jobs-api/issues/open?fpr=9n7kx3).

Last Updated: 2026.09.08

# Actor input Schema

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

SuccessFactors career-site inputs, mixed freely: a career-site host (jobs.sap.com), a full career-site URL (https://jobs.sap.com), a single job URL (https://jobs.sap.com/job/<slug>/<id>/), or a company name matched against the bundled directory. Leave empty together with startUrls to sweep tenants from the bundled directory instead.

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

Alternative to the companies field for URL-shaped input; both lists are merged. Accepts the same career-site and single-job URL forms.

## `outputMode` (type: `string`):

jobs returns full job records. urlsOnly returns the job index without descriptions, the cheapest way to list everything. tenantsOnly returns one row per career site from the discovery directory with a live job count.

## `discoveryQuery` (type: `string`):

Case-insensitive text matched against company names and tenant keys in the bundled directory. Scopes tenantsOnly runs and empty-input sweeps. Leave empty to take the largest tenants first.

## `verifyTenants` (type: `boolean`):

tenantsOnly mode: probe each candidate career site's live feed before returning it, adding a current job count. Dead tenants are skipped and never billed. Turn off to list the directory snapshot without network checks.

## `titleKeywords` (type: `array`):

Keep only jobs whose title contains any of these words, for example engineer, sales, designer. Filters run before billing, so filtered jobs cost nothing.

## `jobFunctions` (type: `array`):

Keep only jobs whose job function contains any of these values, for example Development, Sales, Administration.

## `locationKeywords` (type: `array`):

Keep only jobs whose location contains any of these values, for example Remote, Berlin, Bangalore, United States.

## `activeOnly` (type: `boolean`):

Keep only jobs whose expiration date is today or later, dropping postings that have already closed. On by default.

## `remoteOnly` (type: `boolean`):

Keep only jobs whose title or location indicates a remote role.

## `includeDescriptionMarkdown` (type: `boolean`):

Add descriptionMarkdown to each job row: the posting converted to clean Markdown, compact and ready for AI agents and LLM pipelines. Billed per job row that carries it. Uncheck for cheaper metadata-only rows.

## `includeDescriptionHtml` (type: `boolean`):

Add descriptionHtml to each job row: the original posting markup as the career site publishes it. Billed per job row that carries it.

## `includeDescriptionText` (type: `boolean`):

Add descriptionText to each job row: a clean plain-text rendering of the posting. Billed per job row that carries it.

## `includeDetailFields` (type: `boolean`):

Enrich each job row from its public detail page with the posted date, department, facility, shift type, travel requirement, and custom fields. One extra page request per job, so large runs are slower. Billed per job row that carries the data.

## `report` (type: `string`):

Also write a human-readable digest of every scraped job, grouped by company, to the key-value store under the REPORT key. One flat charge per report. Capped at 5000 rows.

## `maxTenants` (type: `integer`):

Cap on career sites processed in a discovery sweep or tenantsOnly run. Keeps empty-input runs small and predictable.

## `maxJobsPerTenant` (type: `integer`):

Cap on job rows per career site after filtering. 0 means no per-tenant cap.

## `maxJobs` (type: `integer`):

Hard ceiling on rows across the entire run, all tenants combined. The main cost control. 0 means unlimited.

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

Parallel detail-page fetches when the detail add-on is on, and parallel tenant probes in discovery mode. Feed scraping itself is one request per tenant.

## Actor input object example

```json
{
  "companies": [
    "jobs.sap.com"
  ],
  "startUrls": [],
  "outputMode": "jobs",
  "discoveryQuery": "",
  "verifyTenants": true,
  "titleKeywords": [],
  "jobFunctions": [],
  "locationKeywords": [],
  "activeOnly": true,
  "remoteOnly": false,
  "includeDescriptionMarkdown": true,
  "includeDescriptionHtml": false,
  "includeDescriptionText": false,
  "includeDetailFields": false,
  "report": "none",
  "maxTenants": 25,
  "maxJobsPerTenant": 0,
  "maxJobs": 100,
  "maxConcurrency": 5
}
```

# Actor output Schema

## `allResults` (type: `string`):

Every row this run produced.

## `overview` (type: `string`):

Job rows with the headline fields: title, company, location, country, function, and the view link.

## `details` (type: `string`):

Job rows with the per-job detail add-on fields: posted date, department, facility, shift type, and travel.

## `tenants` (type: `string`):

One row per discovered career site with a live open-jobs count and a link to the site.

## `report` (type: `string`):

The whole-run Markdown or HTML report, when the report add-on was enabled.

# 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.sap.com"
    ],
    "startUrls": [],
    "titleKeywords": [],
    "jobFunctions": [],
    "locationKeywords": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("johnvc/sap-successfactors-jobs-api").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.sap.com"],
    "startUrls": [],
    "titleKeywords": [],
    "jobFunctions": [],
    "locationKeywords": [],
}

# Run the Actor and wait for it to finish
run = client.actor("johnvc/sap-successfactors-jobs-api").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.sap.com"
  ],
  "startUrls": [],
  "titleKeywords": [],
  "jobFunctions": [],
  "locationKeywords": []
}' |
apify call johnvc/sap-successfactors-jobs-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,johnvc/sap-successfactors-jobs-api"
        }
    }
}

```

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/KLM4gIRuhyNcjgjfx/builds/jGFH5NpMMRGOTVd9F/openapi.json
