MENA Jobs Scraper — Bayt, GulfTalent, NaukriGulf & Akhtaboot avatar

MENA Jobs Scraper — Bayt, GulfTalent, NaukriGulf & Akhtaboot

Pricing

from $2.00 / 1,000 job records

Go to Apify Store
MENA Jobs Scraper — Bayt, GulfTalent, NaukriGulf & Akhtaboot

MENA Jobs Scraper — Bayt, GulfTalent, NaukriGulf & Akhtaboot

Job postings from Bayt, GulfTalent, NaukriGulf and Akhtaboot in one normalized schema: title, company, location, salary, seniority, function. Cross-board duplicates merged. Optional: only jobs posted since your last run.

Pricing

from $2.00 / 1,000 job records

Rating

0.0

(0)

Developer

Al Moutasem Nabil

Al Moutasem Nabil

Maintained by Community

Actor stats

0

Bookmarked

6

Total users

4

Monthly active users

6 days ago

Last modified

Categories

Share

MENA Jobs Scraper — Bayt, GulfTalent, NaukriGulf & Akhtaboot (Deduplicated)

Job postings from Bayt, GulfTalent, NaukriGulf and Akhtaboot in one normalized schema: title, company, location, salary, seniority, function. Cross-board duplicates merged. Optional: only jobs posted since your last run.

وظائف الخليج والأردن من أربع منصات في مكان واحد — بيت.كوم، جلف تالنت، نوكري جلف وأخطبوط. نتائج موحّدة، بدون تكرار، مع الراتب وتصنيف المستوى الوظيفي والمجال. السعودية، الإمارات، قطر، الكويت، البحرين، عُمان، الأردن، مصر، لبنان.

Who it's for

  • Gulf recruiters and agencies watching what competitors are hiring for, without opening four tabs.
  • HR-tech products that need a clean, normalized job feed instead of four different schemas.
  • Salary-report and market analysts tracking pay ranges and which functions and seniority levels are in demand, by country.
  • Job aggregators that want one deduplicated feed rather than four overlapping ones.

What makes it different

Single-board scrapers already exist. The layer on top does not:

  • Four boards, one schema. Every posting comes back with the same fields whichever board it came from.
  • Cross-board deduplication. The same vacancy posted to Bayt and GulfTalent returns once, with both URLs under boards. Matching is on normalized company + title + country + city, plus a Jaro-Winkler similarity check that catches "Senior iOS Developer", "Senior iOS Developer (m/f)" and "senior ios developer - urgent" as one job.
  • Arabic-aware. Titles and companies are normalized across alef forms, taa marbuta, yaa and tashkeel, so Arabic postings deduplicate as reliably as English ones.
  • Classified. Function (13 classes), seniority (10 levels), employment type and remote/onsite from the title and posting text; relative dates ("3 days ago", "12 Sep", "منذ ٥ أيام") become timestamps.
  • Normalized salary. Salaries as boards publish them ("SAR 7,500 - SAR 11,250") become
    { min, max, currency, period }
    across all eight MENA currencies plus USD, with the original text kept in salary.raw. Bayt is the board that publishes salaries; the others return null.
  • New since last run. Change mode emits only job_added, job_removed and job_updated.
  • Explicit results. A board that cannot be read, or that has nothing matching, gets a free status row that says why; a quiet change-mode run gets one free no_changes row.

Input

This is the Console prefill: the four boards for Saudi Arabia, the UAE and Jordan, jobs posted in the last 7 days, 10 per board. It finishes in about 10 seconds:

{
"keywords": [],
"countries": ["SA", "AE", "JO"],
"boards": ["bayt", "gulftalent", "naukrigulf", "akhtaboot"],
"postedWithinDays": 7,
"maxJobsPerBoard": 10,
"proxyConfiguration": {
"useApifyProxy": true
}
}

Add keywords (Arabic or English), functions, seniority or employmentType to narrow the feed, and raise maxJobsPerBoard for real pulls. GulfTalent and Akhtaboot filter keywords locally, so a narrow keyword needs a higher maxJobsPerBoard to find matches.

Output

One item per unique vacancy. Every field is documented in .actor/dataset_schema.json; the Console shows Jobs and New jobs views. A real record from the example input above:

{
"jobKey": "tri-interiors|sales-executive|AE|Dubai",
"title": "Sales Executive",
"titleNormalized": "sales executive",
"company": "TRI INTERIORS LLC",
"companyNormalized": "tri interiors",
"location": {
"raw": "Dubai - United Arab Emirates (UAE)",
"city": "Dubai",
"country": "AE"
},
"remote": "unknown",
"function": "sales",
"seniority": "mid",
"employmentType": "unknown",
"salary": null,
"postedAt": "2026-09-12T19:34:49.000Z",
"boards": [
{
"board": "naukrigulf",
"url": "https://www.naukrigulf.com/sales-executive-jobs-in-dubai-uae-in-tri-interiors-llc-0-to-4-years-n-cd-371433-jid-120926001944",
"postedAt": "2026-09-12T19:34:49.000Z",
"boardJobId": "120926001944"
}
],
"description": null,
"language": "en",
"firstSeenAt": "2026-09-13T01:32:27.668Z",
"lastSeenAt": "2026-09-13T01:32:27.668Z",
"scrapedAt": "2026-09-13T01:32:27.668Z"
}

When the same vacancy appears on several boards, boards lists one entry per board (URL, board job id and the board's own posted date) and the item is charged once.

Boards that could not be read appear as free board_error rows with board and error, and boards that were read but had nothing matching appear as free no_jobs rows, for example { "type": "no_jobs", "board": "akhtaboot", "error": "20 postings fetched, but none match your keywords, countries or filters" }.

Sample output

Real items from the example input above (a Bayt job with its salary, a GulfTalent job and a NaukriGulf job), verified on the Apify platform in September 2026. Long text and lists are shortened for this page; field names and values are otherwise exactly as the Actor returns them.

[
{
"jobKey": "masaratdx|مسوول-مبيعات|SA|Riyadh",
"title": "مسؤول مبيعات",
"titleNormalized": "مسوول مبيعات",
"company": "MasaratDX",
"companyNormalized": "masaratdx",
"location": {
"raw": "Riyadh, Saudi Arabia",
"city": "Riyadh",
"country": "SA"
},
"remote": "unknown",
"function": "other",
"seniority": "mid",
"employmentType": "unknown",
"salary": {
"min": 7500,
"max": 11250,
"currency": "SAR",
"period": "month",
"raw": "SAR 7,500 - SAR 11,250"
},
"postedAt": "2026-09-13T17:57:50.112Z",
"boards": [
{
"board": "bayt",
"url": "https://www.bayt.com/en/saudi-arabia/jobs/%D9%85%D8%B3%D8%A4%D9%88%D9%84-%D9%85%D8%A8%D9%8A%D8%B9%D8%A7%D8%AA-5482458/",
"postedAt": "3 hours ago",
"boardJobId": "5482458"
}
],
"description": null,
"language": "mixed",
"firstSeenAt": "2026-09-13T20:57:45.919Z",
"lastSeenAt": "2026-09-13T20:57:45.919Z",
"scrapedAt": "2026-09-13T20:57:45.919Z"
},
{
"jobKey": "isc-cx|mystery-shopper|SA|",
"title": "Mystery Shopper",
"titleNormalized": "mystery shopper",
"company": "ISC-CX",
"companyNormalized": "isc cx",
"location": {
"raw": "Saudi Arabia",
"city": null,
"country": "SA"
},
"remote": "unknown",
"function": "other",
"seniority": "mid",
"employmentType": "unknown",
"salary": null,
"postedAt": "2026-09-12T00:00:00.000Z",
"boards": [
{
"board": "gulftalent",
"url": "https://www.gulftalent.com/saudi-arabia/jobs/mystery-shopper-632495",
"postedAt": "12 Sep",
"boardJobId": "632495"
}
],
"description": null,
"language": "en",
"firstSeenAt": "2026-09-13T20:57:45.919Z",
"lastSeenAt": "2026-09-13T20:57:45.919Z",
"scrapedAt": "2026-09-13T20:57:45.919Z"
},
{
"jobKey": "saona-restaurant|head-hostess-head-host|AE|Dubai",
"title": "Head Hostess / Head Host",
"titleNormalized": "head hostess head host",
"company": "Saona restaurant",
"companyNormalized": "saona restaurant",
"location": {
"raw": "Dubai - United Arab Emirates (UAE)",
"city": "Dubai",
"country": "AE"
},
"remote": "unknown",
"function": "other",
"seniority": "director",
"employmentType": "unknown",
"salary": null,
"postedAt": "2026-09-13T20:22:58.000Z",
"boards": [
{
"board": "naukrigulf",
"url": "https://www.naukrigulf.com/head-hostess-head-host-jobs-in-dubai-uae-in-saona-restaurant-3-to-8-years-n-cd-371521-jid-130926001942",
"postedAt": "2026-09-13T20:22:58.000Z",
"boardJobId": "130926001942"
}
],
"description": null,
"language": "en",
"firstSeenAt": "2026-09-13T20:57:45.919Z",
"lastSeenAt": "2026-09-13T20:57:45.919Z",
"scrapedAt": "2026-09-13T20:57:45.919Z"
}
]

Pricing

Pay-per-event. You pay for boards actually read and jobs actually returned.

EventPriceWhen
Board checked$0.005Per board fetched successfully. A blocked board is free.
Job record$0.002Snapshot mode, per unique job — a role on two boards is one charge.
Change detected$0.01Change mode, per change event.
  • The example input above (4 boards, about 33 unique jobs): 4 × $0.005 + 33 × $0.002 = $0.086.
  • Weekly pull of all accountant jobs in SA + AE, ~300 unique jobs across 4 boards: 4 × $0.005 + 300 × $0.002 = $0.62 per run.
  • Daily new-jobs feed, 4 boards, quiet day: $0.02. With 12 new jobs: $0.14.

Apify's apify-actor-start fee and platform compute are billed separately. Default memory 512 MB. Bayt only goes through Apify residential proxies (it blocks datacenter IPs); a Bayt listing page holds about 30 jobs, so that traffic measured 2–3 KB per job on the platform, about $0.02 per 1,000 Bayt jobs at Apify's $8/GB residential rate. Leave bayt out of boards to avoid it.

Scheduling, integrations and API

  1. Fill in the input, Save as task, then add a Schedule — daily at 07:00 is typical.
  2. Turn on Emit changes only with a Tracking ID so each run returns only what is new.
  3. Under Integrations, push results to Slack, Google Sheets, a webhook, Make or Zapier on Run succeeded. In change mode a run where nothing changed contains a single free no_changes row.
  4. Standby mode answers synchronously, which is what an AI agent wants: GET https://almoutasem-nabil--mena-jobs-aggregator.apify.actor/?keywords=accountant&countries=SA,AE&postedWithinDays=7 with the header Authorization: Bearer <your Apify token>. The response is JSON with items, changes and errors.

State lives in the named key-value store mena-jobs-state, one record per tracking ID; delete it to reset a watch list.

Per-board notes and limitations

  • Bayt — server-rendered listings with title, company, city and country, salary where the employer publishes it, and a relative posting date. Bayt's Cloudflare blocks datacenter IPs and challenges a share of residential ones, so Bayt requests go through US residential proxies, are paced to one per second and are retried on fresh IPs. Some postings are confidential and carry no company name.
  • NaukriGulf — uses the site's own JSON search API. Carries a posting date; mostly UAE and Saudi roles.
  • GulfTalent — server-rendered country listings (title, company, country, posting date). Keyword filtering happens locally, so a narrow keyword search fetches more rows than it returns.
  • Akhtaboot — read from the per-country RSS feeds the site publishes. No city, and no keyword parameter, so keywords are filtered locally. Strongest for Jordan.
  • Salary comes from Bayt only; GulfTalent, NaukriGulf and Akhtaboot publish none in their listings.
  • Change detection is relative to your filters. Changing keywords, countries or boards between runs will look like added and removed jobs.

Watching specific employers rather than whole boards? ../hiring-signals-monitor tracks named companies' own career pages through their ATS and reports new roles, removed roles and hiring surges.

The Actor reads publicly listed job postings — the same pages any visitor sees — and Akhtaboot's own published RSS feeds. It never logs in and sends no cookies. It collects business data only: company names, titles, locations and salaries. It never collects recruiter names, emails or phone numbers, and drops such fields where a board's payload includes them. Requests are paced and concurrency is capped per board. Use the data in line with each board's terms and the laws that apply to you. Bayt, GulfTalent, NaukriGulf and Akhtaboot are trademarks of their owners; this Actor is not affiliated with them.

Roadmap

Not available yet:

  • Wuzzuf. Its Cloudflare challenge refuses requests from the Apify platform with datacenter and residential proxies and does not clear in a headless browser, so it cannot be offered reliably today.