All platforms

Oracle Cloud Jobs API.

Oracle's cloud-based recruiting solution (HCM Cloud/Recruiting Cloud) with REST APIs for enterprise job listings.

Oracle Cloud
Live
250K+jobs indexed monthly
<3haverage discovery time
1hrefresh interval
Companies using Oracle Cloud
OracleJPMorgan ChaseGoldman SachsMacy'sMarriott
Developer tools

Try the API.

Test Jobs, Feed, and Auto-Apply endpoints against https://connect.jobo.world with live request/response examples, then copy ready-to-use curl commands.

What's in every response.

Data fields, real-world applications, and the companies already running on Oracle Cloud.

Data fields
  • REST API access
  • Full job descriptions
  • Skills and qualifications
  • Multiple data centers
  • Enterprise scale
Use cases
  1. 01Enterprise job aggregation
  2. 02Fortune 500 company tracking
  3. 03Global recruitment monitoring
  4. 04Large-scale job data extraction
Trusted by
OracleJPMorgan ChaseGoldman SachsMacy'sMarriottFordTexas InstrumentsSherwin-Williams
DIY GUIDE

How to scrape Oracle Cloud.

Step-by-step guide to extracting jobs from Oracle Cloud-powered career pages—endpoints, authentication, and working code.

RESTintermediate~60 requests/minute recommendedNo auth

Discover the site number

Oracle Cloud requires a site number parameter for API calls. Extract it from the careers page HTML or cookies. The site number follows the pattern 'CX_XXXXX'.

Step 1: Discover the site number
import requests
import re
import uuid

def discover_site_number(careers_url: str) -> str:
    """Extract site number from Oracle Cloud careers page."""
    response = requests.get(careers_url)
    html = response.text

    # Look for siteNumber in JavaScript
    match = re.search(r"siteNumber:\s*['"](CX_\d+)['"]", html)
    if match:
        return match.group(1)

    # Check cookies for site number
    if 'ORA_CX_SITE_NUMBER' in response.cookies:
        return response.cookies['ORA_CX_SITE_NUMBER']

    raise ValueError("Could not find site number")

# Example usage
careers_url = "https://eeho.fa.us2.oraclecloud.com/hcmUI/CandidateExperience/en/sites/jobsearch"
site_number = discover_site_number(careers_url)
print(f"Site number: {site_number}")  # Output: CX_45001

Fetch job listings from the API

Use the recruitingCEJobRequisitions endpoint to retrieve job listings with summaries. The API returns jobs with short descriptions, locations, and metadata.

Step 2: Fetch job listings from the API
import requests
import uuid

domain = "eeho.fa.us2.oraclecloud.com"
site_number = "CX_45001"

url = f"https://{domain}/hcmRestApi/resources/latest/recruitingCEJobRequisitions"

params = {
    "onlyData": "true",
    "expand": "requisitionList.workLocation,requisitionList.otherWorkLocations,requisitionList.secondaryLocations",
    "finder": f"findReqs;siteNumber={site_number}",
    "facetsList": "LOCATIONS;WORK_LOCATIONS;WORKPLACE_TYPES;TITLES;CATEGORIES;ORGANIZATIONS;POSTING_DATES;FLEX_FIELDS",
    "limit": 100,
    "offset": 0,
}

headers = {
    "ora-irc-cx-userid": str(uuid.uuid4()),
    "ora-irc-language": "en",
    "content-type": "application/vnd.oracle.adf.resourceitem+json;charset=utf-8",
}

response = requests.get(url, params=params, headers=headers)
data = response.json()

# Extract jobs from response
requisitions = data.get("items", [])
jobs = []
for item in requisitions:
    jobs.extend(item.get("requisitionList", []))

print(f"Found {len(jobs)} jobs (Total: {requisitions[0].get('TotalJobsCount', 0) if requisitions else 0})")

Parse job listing data

Extract the relevant fields from each job in the listings response. The listings API returns short descriptions; for full details you'll need the details API.

Step 3: Parse job listing data
for job in jobs[:5]:  # Show first 5 jobs
    print({
        "id": job.get("Id"),
        "title": job.get("Title"),
        "location": job.get("PrimaryLocation"),
        "country": job.get("PrimaryLocationCountry"),
        "posted_date": job.get("PostedDate"),
        "short_description": job.get("ShortDescriptionStr", "")[:100] + "...",
        "is_hot_job": job.get("HotJobFlag", False),
        "is_trending": job.get("TrendingFlag", False),
    })

Fetch full job details

The listings API only returns short descriptions. Use the job details API with the job ID to get the full description, qualifications, responsibilities, and skills.

Step 4: Fetch full job details
import requests
import uuid

def get_job_details(domain: str, site_number: str, job_id: str) -> dict:
    """Fetch full job details from Oracle Cloud API."""
    url = f"https://{domain}/hcmRestApi/resources/latest/recruitingCEJobRequisitionDetails"

    params = {
        "expand": "all",
        "onlyData": "true",
        "finder": f'ById;Id="{job_id}",siteNumber={site_number}',
    }

    headers = {
        "ora-irc-cx-userid": str(uuid.uuid4()),
        "ora-irc-language": "en",
        "content-type": "application/vnd.oracle.adf.resourceitem+json;charset=utf-8",
    }

    response = requests.get(url, params=params, headers=headers)
    data = response.json()

    if data.get("items"):
        return data["items"][0]
    return None

# Example usage
job_details = get_job_details(domain, site_number, "307750")
if job_details:
    print({
        "id": job_details.get("Id"),
        "title": job_details.get("Title"),
        "category": job_details.get("Category"),
        "description": job_details.get("ExternalDescriptionStr", "")[:200],
        "qualifications": job_details.get("ExternalQualificationsStr", "")[:200],
        "responsibilities": job_details.get("ExternalResponsibilitiesStr", "")[:200],
        "skills": [s.get("Skill") for s in job_details.get("skills", [])],
        "flex_fields": {f["Prompt"]: f["Value"] for f in job_details.get("requisitionFlexFields", [])},
    })

Handle pagination

Use the limit and offset parameters to paginate through large job listings. The response includes TotalJobsCount and hasMore to help track progress.

Step 5: Handle pagination
import time
import requests
import uuid

def fetch_all_jobs(domain: str, site_number: str, limit: int = 100) -> list:
    """Fetch all jobs with pagination."""
    url = f"https://{domain}/hcmRestApi/resources/latest/recruitingCEJobRequisitions"

    headers = {
        "ora-irc-cx-userid": str(uuid.uuid4()),
        "ora-irc-language": "en",
        "content-type": "application/vnd.oracle.adf.resourceitem+json;charset=utf-8",
    }

    all_jobs = []
    offset = 0
    total_count = None

    while True:
        params = {
            "onlyData": "true",
            "expand": "requisitionList.workLocation",
            "finder": f"findReqs;siteNumber={site_number}",
            "limit": limit,
            "offset": offset,
        }

        response = requests.get(url, params=params, headers=headers)
        data = response.json()

        items = data.get("items", [])
        if not items:
            break

        for item in items:
            jobs = item.get("requisitionList", [])
            all_jobs.extend(jobs)
            if total_count is None:
                total_count = item.get("TotalJobsCount", 0)

        print(f"Fetched {len(all_jobs)} of {total_count} jobs...")

        # Check if more pages exist
        if data.get("hasMore") == False or len(jobs) < limit:
            break

        offset += limit
        time.sleep(0.5)  # Rate limiting

    return all_jobs

# Fetch all jobs
all_jobs = fetch_all_jobs(domain, site_number)
print(f"Total jobs collected: {len(all_jobs)}")
Common issues
criticalMissing site number causes API errors

The site number (e.g., CX_45001) is required for all API calls. Extract it from the careers page HTML using regex for 'siteNumber: CX_XXXXX' or check cookies for ORA_CX_SITE_NUMBER.

highShort descriptions instead of full job content

The listings API returns ShortDescriptionStr only. Use the recruitingCEJobRequisitionDetails endpoint with the job ID to fetch ExternalDescriptionStr, ExternalQualificationsStr, and ExternalResponsibilitiesStr.

mediumDomain structure varies between companies

Oracle Cloud uses different domains per company (e.g., eeho.fa.us2.oraclecloud.com for Oracle, egud.fa.us2.oraclecloud.com for AutoZone). Extract the domain from the company's actual careers page URL.

mediumRate limiting with 429 errors

Add delays of 500ms-1s between requests. Oracle Cloud has undocumented rate limits. Implement exponential backoff if you receive 429 responses.

highSSO redirects blocking access

Some Oracle Cloud instances redirect to SSO authentication. Try the public CandidateExperience URL path (/hcmUI/CandidateExperience/). If SSO is mandatory, the company may not have public job listings.

mediumRequired headers missing

Include ora-irc-cx-userid (any UUID), ora-irc-language (e.g., 'en'), and content-type headers. Without these, the API may return errors or empty responses.

Best practices
  1. 1Always discover the site number from the careers page HTML or cookies before making API calls
  2. 2Use the recruitingCEJobRequisitionDetails endpoint for full descriptions; listings API only returns short summaries
  3. 3Include all required headers (ora-irc-cx-userid, ora-irc-language, content-type) in every request
  4. 4Rate limit to 1-2 requests per second with 500ms delays to avoid 429 errors
  5. 5Cache site numbers per company domain as they rarely change
  6. 6Handle empty arrays gracefully for optional fields like secondaryLocations, skills, and media
Or skip the complexity

One endpoint. All Oracle Cloud jobs. No scraping, no sessions, no maintenance.

Get API access
cURL
curl "https://enterprise.jobo.world/api/jobs?sources=oracle cloud" \
  -H "X-Api-Key: YOUR_KEY"
Ready to integrate

Access Oracle Cloud
job data today.

One API call. Structured data. No scraping infrastructure to build or maintain — start with the free tier and scale as you grow.

99.9%API uptime
<200msAvg response
50M+Jobs processed