GCC Jobs API - Direct Employers, ATS, Visa Signals & Alerts avatar

GCC Jobs API - Direct Employers, ATS, Visa Signals & Alerts

Pricing

from $2.00 / 1,000 verified gcc job results

Go to Apify Store
GCC Jobs API - Direct Employers, ATS, Visa Signals & Alerts

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

Fetch Finch

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

7 days ago

Last modified

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, or EXPIRED jobs; 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

ProviderCollection methodTypical strengths
GreenhousePublic Job Board APIFull descriptions, departments, offices, requisition IDs, publication/update times
LeverPublic Postings APIStructured location/country, teams, workplace and employment types, direct apply URLs
AshbyPublic Job Postings APIPrimary/secondary locations, workplace type, plain/HTML descriptions, compensation objects
SmartRecruitersPublic company postings APICountry-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 keyProviderExpected GCC coverage
alphasightsGreenhouseUAE
trendyolLeverUAE, Saudi Arabia
cohereAshbyUAE, Saudi Arabia, Qatar / Middle East roles
aecomSmartRecruitersUAE, 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

FieldMeaning
keywordsMatch any phrase against normalized title and description
countriesGCC ISO codes: AE, SA, QA, KW, BH, OM
citiesOptional normalized city filter
sourcesAny of greenhouse, lever, ashby, smartrecruiters
employersBuilt-in registry keys; empty searches all compatible entries
careerUrlsAdditional supported ATS board or job URLs
postedWithinDaysPublication-date window; 0 disables it
includeKeywords / excludeKeywordsPost-normalization content filters
workplaceTypesonsite, hybrid, and/or remote
employmentTypesNormalized full-time, part-time, contract, temporary, internship, or other values
includeDetailsRetain/fetch descriptions needed for evidence and richer parsing
outputModestandard, compact, or raw
maxResultsHard cap on emitted, billable rows
maxResultsPerSourcePer-board safety cap; reaching it disables expiry for that board
monitorModeEnable persistent change detection
stateKeyHuman-readable watchlist state name
changeTypesMonitoring events to emit
baselineModeemit or free state_only first snapshot
missingRunsBeforeExpiryComplete successful absences required before EXPIRED (default 2)
requestTimeoutSecs / maxConcurrencyNetwork controls
proxyConfigurationOptional Apify proxy settings; normally unnecessary for public ATS APIs

Output

Each standard job record contains:

  • stable jobId, cross-source clusterId, and schemaVersion;
  • changeType, changedFields, firstSeenAt, and lastSeenAt;
  • title, normalized company, structured locations, work mode, employment type, department, and dates;
  • typed experience and salary, including normalized monthly salary when the period is known;
  • extracted skills and 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 OUTPUT summary are not billed.
  • A cross-source cluster is billed once.
  • Unchanged monitoring records are not billed unless UNCHANGED is requested.
  • A state_only baseline 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 install
npm test
npm run typecheck
npm run build
apify validate-schema
apify 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.