Vexaloom Labs

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.

FieldTypeRequiredDescription
modestringrequiredWhat to collect: job search, one employer, pasted URLs, or salary benchmarks.
searchQueriesarrayoptionalOne 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.
countrystringoptionalRestrict jobs to one of GulfTalent's 38 markets.
citystringoptionalRestrict jobs to a city. Selecting a city also selects its country.
categorystringoptionalJob function such as Accounting, Software or Logistics.
industrystringoptionalThe hiring company's industry sector.
careerLevelstringoptionalSeniority required by the posting.
employmentTypesarrayoptionalAny of: full-time, part-time, contract, temporary, internship. Leave empty for all types.
nationalitystringoptionalOnly jobs aimed at this Gulf nationality.
remoteOnlybooleanoptionalKeep only postings GulfTalent flags as remote.
easyApplyOnlybooleanoptionalKeep only jobs that can be applied for on GulfTalent.
exclusiveOnlybooleanoptionalKeep only GulfTalent-exclusive postings.
postedWithinDaysintegeroptionalOnly jobs posted in the last N days. 0 means any age.
includeKeywordsarrayoptionalKeep only jobs whose title, description or job function contains any of these terms (case-insensitive).
excludeKeywordsarrayoptionalDrop jobs whose title, description or job function contains any of these terms (case-insensitive).
minSalaryintegeroptionalDrop jobs below this salary in the job's own currency. Jobs without a disclosed salary are kept.
maxSalaryintegeroptionalDrop jobs above this salary in the job's own currency. Jobs without a disclosed salary are kept.
fetchFullDetailsbooleanoptionalVisit each job page for the full description, salary, address and preference fields. Turn off for the fastest, cheapest listing-only runs.
maxItemsintegeroptionalHard cap on emitted records (1-10000).
companyUrlstringoptionalA GulfTalent company page such as https://www.gulftalent.com/companies/marriott-international-careers or just marriott-international-careers.
startUrlsarrayoptionalJob detail URLs, search/listing URLs or company careers URLs.
salaryTitlesarrayoptionalJob titles to benchmark, e.g. accountant or project manager.
salaryCountrystringoptionalGulfTalent publishes salary benchmarks for six GCC countries.
salaryCurrencystringoptionalPrimary 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.