Use GulfTalent Job Listings Across 16 Middle East Markets with Python
Search GulfTalent by keyword, category, industry, job type or nationality preference, or browse one employer's careers page, and get salary, description and preference details.
1. Choose the data you need
Review the published README for supported collection modes, examples, and limits. The recipe below uses the current published input definition.
2. Prepare a source-based input
This JSON contains published prefills and required-field defaults. Review every value for your task before running it; it is not a promise of successful collection.
{
"careerLevel": "",
"category": "",
"city": "",
"companyUrl": "",
"country": "uae",
"easyApplyOnly": false,
"employmentTypes": [],
"excludeKeywords": [],
"exclusiveOnly": false,
"fetchFullDetails": false,
"includeKeywords": [],
"industry": "",
"maxItems": 3,
"mode": "search",
"nationality": "",
"postedWithinDays": 0,
"remoteOnly": false,
"salaryCountry": "uae",
"salaryCurrency": "",
"salaryTitles": [
"accountant"
],
"searchQueries": [
"accountant"
],
"startUrls": []
}
Download input.example.json and save your reviewed copy as input.json.
| Field | Type | Required | Description |
|---|---|---|---|
mode | string | required | What to collect: job search, one employer, pasted URLs, or salary benchmarks. |
searchQueries | array | optional | One or more job-title keywords. Each query is paginated in full and results are de-duplicated. Leave empty to browse all jobs that match the filters. |
country | string | optional | Restrict jobs to one of GulfTalent's 38 markets. |
city | string | optional | Restrict jobs to a city. Selecting a city also selects its country. |
category | string | optional | Job function such as Accounting, Software or Logistics. |
industry | string | optional | The hiring company's industry sector. |
careerLevel | string | optional | Seniority required by the posting. |
employmentTypes | array | optional | Any of: full-time, part-time, contract, temporary, internship. Leave empty for all types. |
nationality | string | optional | Only jobs aimed at this Gulf nationality. |
remoteOnly | boolean | optional | Keep only postings GulfTalent flags as remote. |
easyApplyOnly | boolean | optional | Keep only jobs that can be applied for on GulfTalent. |
exclusiveOnly | boolean | optional | Keep only GulfTalent-exclusive postings. |
postedWithinDays | integer | optional | Only jobs posted in the last N days. 0 means any age. |
includeKeywords | array | optional | Keep only jobs whose title, description or job function contains any of these terms (case-insensitive). |
excludeKeywords | array | optional | Drop jobs whose title, description or job function contains any of these terms (case-insensitive). |
minSalary | integer | optional | Drop jobs below this salary in the job's own currency. Jobs without a disclosed salary are kept. |
maxSalary | integer | optional | Drop jobs above this salary in the job's own currency. Jobs without a disclosed salary are kept. |
fetchFullDetails | boolean | optional | Visit each job page for the full description, salary, address and preference fields. Turn off for the fastest, cheapest listing-only runs. |
maxItems | integer | optional | Hard cap on emitted records (1-10000). |
companyUrl | string | optional | A GulfTalent company page such as https://www.gulftalent.com/companies/marriott-international-careers or just marriott-international-careers. |
startUrls | array | optional | Job detail URLs, search/listing URLs or company careers URLs. |
salaryTitles | array | optional | Job titles to benchmark, e.g. accountant or project manager. |
salaryCountry | string | optional | GulfTalent publishes salary benchmarks for six GCC countries. |
salaryCurrency | string | optional | Primary currency for the percentile fields. Leave empty for the country's own currency. |
3. Start an Actor run
Set APIFY_TOKEN in your environment. Python 3.10 or newer is sufficient; this recipe uses no third-party packages.
Execution may incur charges. Review current pricing on Apify. The request asks for a 120-second timeout and a charge limit; these settings are subject to Apify’s pricing and do not guarantee an all-inclusive spending cap.
import json
import os
import urllib.request
# Save the schema-derived example as input.json; review and edit it first.
with open("input.json", encoding="utf-8") as stream:
actor_input = json.load(stream)
token = os.environ["APIFY_TOKEN"]
request = urllib.request.Request(
"https://api.apify.com/v2/acts/j1nrC2bK9hXJRNcOJ/runs?timeout=120&maxTotalChargeUsd=0.50",
data=json.dumps(actor_input).encode("utf-8"),
headers={"Authorization": "Bearer " + token, "Content-Type": "application/json"},
method="POST",
)
# This starts a potentially billable run. Do not automatically retry this POST.
with urllib.request.urlopen(request, timeout=40) as response:
run = json.load(response)["data"]
print("Run ID:", run["id"])
print("Status:", run["status"])
# Inspect and download results in Apify Console once the run succeeds.
4. Inspect the actual results
Open the run in Apify Console and wait for a successful completion. Use the published output schema to locate results and the dataset schema to understand declared views. Missing or optional record fields must not be treated as guaranteed values.
GulfTalent job records with company, location, salary, description and application fields, plus salary-benchmark records with percentiles, sample sizes and allowances.
Questions before you run
Which inputs are required?
The published required fields are mode
What does this guide verify?
The fields, prefills, and schema links are rendered from the published build. This is a usage recipe, not a paid live extraction test. Source availability and collection results can vary.
What if the run request times out?
Check Apify Console before retrying. The first request may already have created a run. Do not automatically repeat a run-creation POST.
Generated from source build zZCteaXnpbNbasj4u and its README and schemas. Source changes regenerate this guide; no third-party editorial claims are inferred.