GCC Jobs API - Direct Employers, ATS, Visa Signals & Alerts
Pricing
from $2.00 / 1,000 verified gcc job results
GCC Jobs API - Direct Employers, ATS, Visa Signals & Alerts
Search direct employer career sites across the GCC. Get canonical apply links, normalized hiring requirements, evidence-backed GCC signals, deduplication, and incremental monitoring.
Pricing
from $2.00 / 1,000 verified gcc job results
Rating
0.0
(0)
Developer
Fetch Finch
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
7 days ago
Last modified
Categories
Share
GCC Jobs API: Direct Employers, ATS, Visa Signals & Alerts
Collect GCC vacancies directly from employer career systems, normalize them into one stable schema, and optionally receive only meaningful changes on scheduled runs.
This Actor is built for recruitment intelligence, job-search products, market research, and automation workflows that need more than shallow search cards. Every result retains its employer-source provenance and canonical application link. Parsed GCC-specific signals include the evidence used to produce them.
Why use this Actor?
- Direct-employer data: public Greenhouse, Lever, Ashby, and SmartRecruiters job-posting APIs, not scraped copies of aggregator listings.
- GCC-aware normalization: UAE, Saudi Arabia, Qatar, Kuwait, Bahrain, and Oman country/city handling, with structured ISO fields preferred over ambiguous text.
- Useful candidate signals: visa/work-authorization language, Arabic requirements, nationality eligibility, relocation, regulated licenses, experience, salary, skills, function, and seniority.
- Evidence, not mystery labels: important inferred fields include confidence, source/parsed/inferred kind, and exact supporting text offsets.
- Incremental monitoring: emit
NEW,UPDATED,REAPPEARED, orEXPIREDjobs; unchanged jobs are free unless explicitly requested. - Safe expiration behavior: a job is never expired because an ATS failed, timed out, or returned a truncated snapshot.
- Transparent health: every run writes per-source request, retry, completeness, result, and error diagnostics to
OUTPUT. - Automation-friendly: standard, compact/MCP, and raw output modes plus versioned IDs and deterministic field hashes.
Source coverage
| Provider | Collection method | Typical strengths |
|---|---|---|
| Greenhouse | Public Job Board API | Full descriptions, departments, offices, requisition IDs, publication/update times |
| Lever | Public Postings API | Structured location/country, teams, workplace and employment types, direct apply URLs |
| Ashby | Public Job Postings API | Primary/secondary locations, workplace type, plain/HTML descriptions, compensation objects |
| SmartRecruiters | Public company postings API | Country-filtered pagination, structured location, reference and job-ad sections |
The built-in launch registry currently contains the four continuously tested source boards below. Add any supported employer through careerUrls; the Actor detects the provider and board token automatically.
| Employer key | Provider | Expected GCC coverage |
|---|---|---|
alphasights | Greenhouse | UAE |
trendyol | Lever | UAE, Saudi Arabia |
cohere | Ashby | UAE, Saudi Arabia, Qatar / Middle East roles |
aecom | SmartRecruiters | UAE, Saudi Arabia, Qatar, Oman |
A live UAE validation on August 12, 2026 fetched 414 active source records and emitted 162 GCC matches before high-precision deduplication. Counts change as employers publish and close vacancies.
Quick start
Search every built-in employer for recently posted UAE and Saudi engineering roles:
{"keywords": ["software engineer", "data engineer", "platform engineer"],"countries": ["AE", "SA"],"postedWithinDays": 30,"includeDetails": true,"outputMode": "standard","maxResults": 500}
Search selected employers and add your own supported career boards:
{"countries": ["AE", "SA", "QA"],"employers": ["cohere", "trendyol"],"careerUrls": ["https://boards.greenhouse.io/YOUR_BOARD","https://jobs.lever.co/YOUR_COMPANY","https://jobs.ashbyhq.com/YOUR_BOARD","https://jobs.smartrecruiters.com/YOUR_COMPANY"],"includeKeywords": ["typescript", "python"],"excludeKeywords": ["intern"],"workplaceTypes": ["hybrid", "remote"]}
Create a quiet daily monitor that establishes its first snapshot without emitting billable rows:
{"countries": ["AE"],"cities": ["Dubai", "Abu Dhabi"],"monitorMode": true,"stateKey": "uae-tech-daily","baselineMode": "state_only","changeTypes": ["NEW", "UPDATED", "REAPPEARED", "EXPIRED"],"missingRunsBeforeExpiry": 2,"outputMode": "compact"}
For later scheduled runs, keep the same filters and stateKey, and change baselineMode to emit if desired. The query fingerprint is part of the state namespace, preventing different watchlists from overwriting each other.
Input
| Field | Meaning |
|---|---|
keywords | Match any phrase against normalized title and description |
countries | GCC ISO codes: AE, SA, QA, KW, BH, OM |
cities | Optional normalized city filter |
sources | Any of greenhouse, lever, ashby, smartrecruiters |
employers | Built-in registry keys; empty searches all compatible entries |
careerUrls | Additional supported ATS board or job URLs |
postedWithinDays | Publication-date window; 0 disables it |
includeKeywords / excludeKeywords | Post-normalization content filters |
workplaceTypes | onsite, hybrid, and/or remote |
employmentTypes | Normalized full-time, part-time, contract, temporary, internship, or other values |
includeDetails | Retain/fetch descriptions needed for evidence and richer parsing |
outputMode | standard, compact, or raw |
maxResults | Hard cap on emitted, billable rows |
maxResultsPerSource | Per-board safety cap; reaching it disables expiry for that board |
monitorMode | Enable persistent change detection |
stateKey | Human-readable watchlist state name |
changeTypes | Monitoring events to emit |
baselineMode | emit or free state_only first snapshot |
missingRunsBeforeExpiry | Complete successful absences required before EXPIRED (default 2) |
requestTimeoutSecs / maxConcurrency | Network controls |
proxyConfiguration | Optional Apify proxy settings; normally unnecessary for public ATS APIs |
Output
Each standard job record contains:
- stable
jobId, cross-sourceclusterId, andschemaVersion; changeType,changedFields,firstSeenAt, andlastSeenAt;- title, normalized company, structured locations, work mode, employment type, department, and dates;
- typed
experienceandsalary, including normalized monthly salary when the period is known; - extracted
skillsand GCC-specific signals with confidence and evidence; - deterministic function/seniority classification with evidence;
- canonical employer application URL and every retained source reference;
- completeness score and warnings.
Example signal:
{"arabic": {"value": "required","confidence": 0.95,"kind": "parsed","evidence": [{"text": "Arabic is required","start": 2433,"end": 2451,"field": "description","rule": "arabic-required"}]}}
compact mode retains the fields most useful to MCP clients and LLM workflows. raw mode adds the original source payload. Raw mode uses more dataset storage and should be enabled only when source-level debugging or archival is required.
The default key-value store's OUTPUT record contains the run summary:
{"status": "SUCCEEDED","counts": {"sourcesRequested": 4,"sourcesSucceeded": 4,"rawFetched": 414,"afterGccFilter": 162,"emitted": 162},"sourceHealth": [{"sourceKey": "greenhouse:alphasights","status": "SUCCEEDED","complete": true,"requests": 1,"retries": 0,"jobsFetched": 87,"gccJobs": 2,"error": null}]}
Monitoring semantics
Monitoring state is stored in the named gcc-jobs-monitor-state-v1 key-value store. A short lease rejects overlapping runs for the same query rather than racing two state writes.
NEW: no prior source identity exists.UPDATED: the same job exists and one or more normalized fields changed.REAPPEARED: a previously expired job is visible again.EXPIRED: every source previously associated with the job completed successfully and omitted it for the configured number of runs.UNCHANGED: the normalized content hash is the same. It is not emitted by default.
State is committed only after all intended rows are saved. If the run's maximum charge limit prevents the full result from being emitted, state is not advanced, so unseen changes are not lost.
Pricing behavior
The Actor is designed for Apify pay-per-event pricing using the standard apify-default-dataset-item event. One saved, deduplicated job or change event is one billable result.
- Filtered jobs, exact duplicates, source failures, and the
OUTPUTsummary are not billed. - A cross-source cluster is billed once.
- Unchanged monitoring records are not billed unless
UNCHANGEDis requested. - A
state_onlybaseline produces no dataset items. - The Actor checks the run's maximum total charge before writing data and avoids committing partial monitor state.
Suggested launch price: $0.0015–$0.0020 per emitted item ($1.50–$2.00 per 1,000). The final Store price and tiering are configured on the Actor's Monetization page.
Local development
npm installnpm testnpm run typechecknpm run buildapify validate-schemaapify run --purge --input '{"countries":["AE"],"employers":["alphasights"],"maxResults":10}'
Local output is written to storage/datasets/default and storage/key_value_stores/default/OUTPUT.json.
Reliability and source policy
Requests use keep-alive HTTP, bounded concurrency, timeouts, and retry/backoff for rate limits and transient server errors. Sources fail independently. A partial run can still return healthy-source data while reporting exactly what failed.
This launch version uses documented or purpose-built public employer job-posting endpoints. It does not scrape Bayt, GulfTalent, NaukriGulf, Foundit, LinkedIn, Indeed, or Glassdoor. Those portals require an explicit permission/licensing decision before being added to a public paid product.
The implementation and commercial research behind these choices is included in gcc-jobs-aggregator-implementation-research-2026-08-12.md.