# Oracle Cloud HCM Jobs Scraper: Oracle Recruiting Career Sites (`hydrocore/oracle-hcm-jobs-scraper`) Actor

Scrape open jobs from any Oracle Recruiting Cloud (Oracle Fusion HCM) career site on oraclecloud.com: JPMorgan Chase, Oracle and other big employers. Exact posted date, pay range, workplace type, address, description. Filters, sort, new-job monitor.

- **URL**: https://apify.com/hydrocore/oracle-hcm-jobs-scraper.md
- **Developed by:** [Hydrocore Data](https://apify.com/hydrocore) (community)
- **Categories:** Jobs, Lead generation, Automation
- **Security:** Limited permissions
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.68 / 1,000 job saveds

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?

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

## Oracle Cloud HCM Jobs Scraper: Oracle Recruiting Career Sites

Scrape every open job from any **Oracle Recruiting Cloud** career site (Oracle Fusion HCM "Candidate Experience", hosted on `*.oraclecloud.com`). Big employers run their careers pages on it, including JPMorgan Chase (7,000+ open jobs), Oracle itself and many banks, hospitals, retailers, airlines and governments.

Each job comes back as **one flat row with the same 39 columns**: exact posting date, job family, workplace type (remote / hybrid / onsite), work address with coordinates, pay range from the description, full description and a direct job link. Use it for job boards, recruiting and sales prospecting, hiring-signal research and salary benchmarking, or schedule it as a **new-job monitor**.

> Changed in v1.0: first release.

### What you get

| Field | Type | Example | Description |
|---|---|---|---|
| `companyName` | string | `JPMorgan Chase` | Your label ("Name | URL") or the Oracle tenant code |
| `title` | string | `Lead Software Engineer` | Job title |
| `location` | string | `London, London, United Kingdom` | Primary location |
| `workplaceType` | string | `hybrid` | remote / hybrid / onsite when published |
| `postedDate` | date | `2026-11-07` | Exact posting date (YYYY-MM-DD) |
| `jobFamily` | string | `Software Engineering` | Job family / category |
| `salaryMin` / `salaryMax` | number | `79200` / `209500` | First pay range found in the description |
| `salaryCurrency` / `salaryPeriod` | string | `USD` / `year` | ISO currency; year, month or hour |
| `streetAddress`, `city`, `postalCode`, `latitude`, `longitude` | mixed | `1 Cabot Square`, `London` | Work address when the site publishes it |
| `url` | link | job page | Direct Oracle job link (apply from there) |

Other columns: `jobId`, `countryCode`, `isRemote`, `daysSincePosted`, `jobFunction`, `jobSchedule`, `careerSiteUrl`, `additionalLocations` + `locationCount`, `businessUnit`, `legalEmployer`, `requisitionType`, `isHotJob`, `postingEndDate`, `salaryText`, `shortDescription`, `descriptionText`, `tenant`, `siteNumber`, `searchText`, `detailsScraped`, `scrapedAt`. Missing values are always `null` (never empty strings), numbers are numbers and dates are ISO.

Dataset views: **Overview**, **Salary**, **Location & remote** and **Detailed (all fields)**. Export as JSON, CSV, Excel, XML or HTML, or read the API (`?view=overview`).

#### Output example (real row from a test run, text shortened)

```json
{
  "recordType": "job",
  "jobId": "eeho:346887",
  "title": "Senior Core Infrastructure Engineer",
  "companyName": "Oracle",
  "location": "Nashville, TN, United States",
  "countryCode": "US",
  "workplaceType": null,
  "isRemote": false,
  "postedDate": "2026-11-08",
  "daysSincePosted": 0,
  "jobFamily": "Product and Research",
  "jobFunction": null,
  "jobSchedule": null,
  "salaryMin": 79200,
  "salaryMax": 209500,
  "salaryCurrency": "USD",
  "salaryPeriod": "year",
  "url": "https://eeho.fa.us2.oraclecloud.com/hcmUI/CandidateExperience/en/sites/CX_45001/job/346887",
  "careerSiteUrl": "https://eeho.fa.us2.oraclecloud.com/hcmUI/CandidateExperience/en/sites/jobsearch",
  "additionalLocations": [
    "United States",
    "Austin, TX, United States"
  ],
  "locationCount": 3,
  "city": null,
  "postalCode": null,
  "streetAddress": null,
  "latitude": null,
  "longitude": null,
  "businessUnit": null,
  "legalEmployer": null,
  "requisitionType": "Professional",
  "isHotJob": false,
  "postingEndDate": null,
  "salaryText": "$79,200 to $209,500",
  "shortDescription": "Designs, implements, and optimizes components in distributed systems with an emphasis on scalability…",
  "descriptionText": "Designs, implements, and optimizes components in distributed systems with an emphasis on scalability, resiliency, and operability. Delivers features and load/pe…",
  "tenant": "eeho",
  "siteNumber": "CX_45001",
  "searchText": null,
  "detailsScraped": true,
  "scrapedAt": "2026-11-08T02:20:42.363Z"
}
```

### How it works

1. Paste one or more career site links. The scraper reads the same public JSON the career site itself loads, with no login and no cookies.
2. It lists the newest jobs on each site for free, removes duplicates, then applies your title, date, location and remote filters.
3. It sorts before applying your limit, so "newest 40" really are the 40 newest, and opens each remaining job page for the full description and pay.
4. Only the final rows are saved and charged. A run summary (jobs per site, filtered counts, failures) is saved as `OUTPUT` in the key-value store.

**Finding the URL:** open a company's careers page and click any job. If the address contains `oraclecloud.com/hcmUI/CandidateExperience/en/sites/...`, copy the part up to the site name, e.g. `https://jpmc.fa.oraclecloud.com/hcmUI/CandidateExperience/en/sites/CX_1001`. Named sites (like `/sites/jobsearch`) work too.

### Input

| Field | Default | What it does |
|---|---|---|
| Oracle career site URLs | JPMorgan Chase + Oracle | One or more sites; optional `Company \| URL` label |
| Search text | empty | Sent to the site's own job search, e.g. `data engineer` |
| Job title must / must NOT contain | empty | Keyword include / exclude lists (any match) |
| Location contains | empty | e.g. `New York`, `GB`, `Texas` |
| Posted within last N days | 7 | Date window |
| Remote only / Only jobs with a pay range | off | Extra filters (never charged when filtered out) |
| Sort by | Newest | Newest, highest pay, title A-Z, company |
| Max jobs to save | 40 | Hard cap for the run (fast, cheap first run) |
| Only new jobs (monitor mode) | off | Scheduled runs save only jobs not seen before |

Example input:

```json
{
  "careerSiteUrls": ["JPMorgan Chase | https://jpmc.fa.oraclecloud.com/hcmUI/CandidateExperience/en/sites/CX_1001"],
  "titleKeywords": ["engineer", "data"],
  "locationKeywords": ["New York"],
  "postedWithinDays": 14,
  "sortBy": "newest",
  "maxResults": 50
}
```

### Why use this scraper

- **Built for Oracle Recruiting Cloud.** General job scrapers and ATS bundles rarely cover Oracle sites, so these jobs are often missing from aggregated feeds.
- **Clean, stable columns** that map straight into Sheets, Airtable, n8n, Make or Zapier, with the same keys on every row.
- **Fields others skip:** workplace type, work address with coordinates, job family, business unit, posting end date.
- **Monitor mode** for daily "new jobs at these companies" alerts, charging only for new jobs.

### Pricing

Pay per event. You pay only for jobs saved to your dataset, at competitive pricing:

| Event | Free plan | Bronze | Silver | Gold and above |
|---|---|---|---|---|
| Job saved (with details) | $0.00084 | $0.00079 | $0.00073 | $0.00068 |
| Actor start (once per run) | $0.0005 | $0.0005 | $0.0005 | $0.0005 |

That works out to **$0.84 per 1,000 jobs** on the Free plan. The default run (40 jobs) costs about $0.034. Filtered, duplicate and already-seen jobs are never charged, and you can set a maximum charge per run in Apify.

### FAQ

**Which companies use Oracle Recruiting Cloud?** Many large employers. Look for `oraclecloud.com` in the address bar after clicking a job on their careers page.

**Why is the salary empty for some jobs?** The pay range is read from the job description. Many US postings include one (for pay-transparency laws); many others don't publish pay at all. Use "Only jobs with a pay range" to keep only those that do.

**Can I get more than 200 jobs per site?** Yes. Raise "Max jobs to list per site" and "Max jobs to save". Large sites list thousands of jobs.

**Can I run it every day?** Yes. Turn on monitor mode, give the monitor a name and schedule the task. Each run saves only jobs it hasn't returned before.

**Is this legal?** It reads publicly posted job listings that each employer publishes for anyone to see, with no login. You're responsible for how you use the data. Don't use it to spam candidates or recruiters.

**Something broke or a site isn't working?** Open an issue on the Issues tab with the URL, and we'll usually reply the same day.

### Notes

- `postedDate` and `scrapedAt` are in UTC.
- Some sites publish street addresses and coordinates and others don't, in which case those fields are `null`.

# Actor input Schema

## `careerSiteUrls` (type: `array`):

Paste one or more Oracle Recruiting Cloud career site links (they contain 'oraclecloud.com/hcmUI/CandidateExperience/.../sites/...'). Optional label: 'Company | URL'. Tip: open a company's careers page, click a job and copy the address from the browser.

## `searchText` (type: `string`):

Sent to each site's own Oracle job search, e.g. 'data engineer'. Empty = all open jobs.

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

Keep jobs whose title contains any of these words (case-insensitive), e.g. engineer, analyst, nurse.

## `excludeTitleKeywords` (type: `array`):

Drop jobs whose title contains any of these, e.g. intern, senior director.

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

Keep jobs where the location, any other location, the country or the country code matches one of these whole words, e.g. 'United States', 'TX', 'London', 'Remote'.

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

Only jobs posted in the last N days (exact posting date from each job page). 0 = any date. Default 7.

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

Keep only jobs whose workplace type (or title/location) says remote.

## `salaryOnly` (type: `boolean`):

Keep jobs whose description includes a pay range with a currency (common for US states with pay-transparency laws).

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

Sorting happens before the limit, so 'newest 40' are really the 40 newest of the jobs listed. 'Highest pay first' compares pay ranges of up to 6x your max (at least 300) of the newest matching jobs.

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

Hard cap on saved (charged) jobs for the whole run. Default 40 for a fast, cheap first run.

## `maxJobsPerSite` (type: `integer`):

How many of each site's newest jobs to read before filtering and sorting (listing is free; only saved jobs are charged).

## `includeDetails` (type: `boolean`):

On by default. Turn off for a faster list of titles, locations and links only (no description, salary or country). Same price per job.

## `onlyNew` (type: `boolean`):

Skip jobs this monitor already returned in earlier runs, so scheduled runs only save and charge for new postings.

## `monitorKey` (type: `string`):

Keeps separate 'already seen' lists for different searches, e.g. 'banks' and 'tech'.

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

Not needed for most sites. Turn on Apify Proxy only if a site starts rate-limiting large runs.

## Actor input object example

```json
{
  "careerSiteUrls": [
    "JPMorgan Chase | https://jpmc.fa.oraclecloud.com/hcmUI/CandidateExperience/en/sites/CX_1001",
    "Oracle | https://eeho.fa.us2.oraclecloud.com/hcmUI/CandidateExperience/en/sites/jobsearch"
  ],
  "postedWithinDays": 7,
  "remoteOnly": false,
  "salaryOnly": false,
  "sortBy": "newest",
  "maxResults": 40,
  "maxJobsPerSite": 200,
  "includeDetails": true,
  "onlyNew": false,
  "monitorKey": "default",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Company, title, location, workplace type, posted date, job family, pay range and link.

## `salary` (type: `string`):

Structured pay ranges found in job descriptions.

## `locations` (type: `string`):

Locations, work address, coordinates and workplace type.

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

Every field for each job, including the full description.

## `summary` (type: `string`):

Jobs listed per site, filtered and duplicate counts (never charged), requests and failures.

# 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 = {
    "careerSiteUrls": [
        "JPMorgan Chase | https://jpmc.fa.oraclecloud.com/hcmUI/CandidateExperience/en/sites/CX_1001",
        "Oracle | https://eeho.fa.us2.oraclecloud.com/hcmUI/CandidateExperience/en/sites/jobsearch"
    ],
    "postedWithinDays": 7,
    "maxResults": 40
};

// Run the Actor and wait for it to finish
const run = await client.actor("hydrocore/oracle-hcm-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 = {
    "careerSiteUrls": [
        "JPMorgan Chase | https://jpmc.fa.oraclecloud.com/hcmUI/CandidateExperience/en/sites/CX_1001",
        "Oracle | https://eeho.fa.us2.oraclecloud.com/hcmUI/CandidateExperience/en/sites/jobsearch",
    ],
    "postedWithinDays": 7,
    "maxResults": 40,
}

# Run the Actor and wait for it to finish
run = client.actor("hydrocore/oracle-hcm-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 '{
  "careerSiteUrls": [
    "JPMorgan Chase | https://jpmc.fa.oraclecloud.com/hcmUI/CandidateExperience/en/sites/CX_1001",
    "Oracle | https://eeho.fa.us2.oraclecloud.com/hcmUI/CandidateExperience/en/sites/jobsearch"
  ],
  "postedWithinDays": 7,
  "maxResults": 40
}' |
apify call hydrocore/oracle-hcm-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,hydrocore/oracle-hcm-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/M46ME5dtuVV2FSS9u/builds/NAdVF9l72WkbozuVA/openapi.json
