Oracle Cloud Jobs API.
Oracle's cloud-based recruiting solution (HCM Cloud/Recruiting Cloud) with REST APIs for enterprise job listings.
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.
- REST API access
- Full job descriptions
- Skills and qualifications
- Multiple data centers
- Enterprise scale
- 01Enterprise job aggregation
- 02Fortune 500 company tracking
- 03Global recruitment monitoring
- 04Large-scale job data extraction
How to scrape Oracle Cloud.
Step-by-step guide to extracting jobs from Oracle Cloud-powered career pages—endpoints, authentication, and working code.
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_45001import 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})")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),
})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", [])},
})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)}")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.
The listings API returns ShortDescriptionStr only. Use the recruitingCEJobRequisitionDetails endpoint with the job ID to fetch ExternalDescriptionStr, ExternalQualificationsStr, and ExternalResponsibilitiesStr.
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.
Add delays of 500ms-1s between requests. Oracle Cloud has undocumented rate limits. Implement exponential backoff if you receive 429 responses.
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.
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.
- 1Always discover the site number from the careers page HTML or cookies before making API calls
- 2Use the recruitingCEJobRequisitionDetails endpoint for full descriptions; listings API only returns short summaries
- 3Include all required headers (ora-irc-cx-userid, ora-irc-language, content-type) in every request
- 4Rate limit to 1-2 requests per second with 500ms delays to avoid 429 errors
- 5Cache site numbers per company domain as they rarely change
- 6Handle empty arrays gracefully for optional fields like secondaryLocations, skills, and media
One endpoint. All Oracle Cloud jobs. No scraping, no sessions, no maintenance.
Get API accesscurl "https://enterprise.jobo.world/api/jobs?sources=oracle cloud" \
-H "X-Api-Key: YOUR_KEY" 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.