Bayt.com Jobs Scraper | Search, URLs & Job Details avatar

Bayt.com Jobs Scraper | Search, URLs & Job Details

Pricing

from $1.00 / 1,000 results

Go to Apify Store
Bayt.com Jobs Scraper | Search, URLs & Job Details

Bayt.com Jobs Scraper | Search, URLs & Job Details

Extract Bayt.com job listings by keyword, country, or URL. Get structured data including title, company, location, salary, experience, career level, posting date, work style, and full job description. Ideal for recruitment, analytics, and job aggregation.

Pricing

from $1.00 / 1,000 results

Rating

0.0

(0)

Developer

Abot API

Abot API

Maintained by Community

Actor stats

0

Bookmarked

99

Total users

24

Monthly active users

a day ago

Last modified

Share

Bayt.com Jobs Scraper

Extract job listings from Bayt.com, the leading careers portal across the Middle East and North Africa. Search by country and keyword, or paste Bayt.com search links directly, and get clean structured records for every job: title, company, location, salary, career level, experience, work style, posting date, and the full job description. Built for recruiters, market analysts, and job aggregators who need reliable Bayt.com data at scale.

Why This Scraper?

  • Covers 15 markets: UAE, Saudi Arabia, Egypt, Qatar, Kuwait, Bahrain, Oman, Jordan, Lebanon, Iraq, Morocco, Tunisia, Algeria, Pakistan, and International.
  • Up to 37 fields per job, including salary range, career level, years of experience, work style (Remote / Hybrid / On-site), company industry, and preferred-candidate criteria (residence location, nationality, gender, degree, major).
  • Two ways to run: build a search from a country plus keyword, or paste one or more Bayt.com search URLs and walk them forward.
  • Optional full job details: open each posting for the complete description, employment type, posting and expiry dates, number of vacancies, company industry and size, and the full preferred-candidate criteria.
  • Forward pagination across all result pages (30 jobs per page).
  • Fast HTTP scraping with automatic session management, so you get consistent results without running a browser.
  • Daily/recurring change monitoring: turn on Incremental mode to get only NEW, UPDATED, and REAPPEARED jobs on every scheduled run, or resume one specific interrupted crawl with resumeFromRunId.

Data You Get

Sample shape, values are illustrative placeholders, not from a live listing.

FieldExample
jobId00000001
titleSample Job Title
urlhttps://www.bayt.com/en/uae/jobs/sample-job-title-00000001/
companySample Company
companyUrlhttps://www.bayt.com/en/company/sample-company-0000000/
cityDubai
countryUAE
countrySluguae
salaryAED 0 - AED 0
careerLevelMid career
experience0-4 Years of Experience
workStyleHybrid
postedDate1 day ago
postedTimestamp1700000000
isExternalfalse
easyApplytrue
aiSummaryShort AI generated summary of the role appears here.
employmentTypeFULL_TIME
datePosted2026-01-01
validThrough2026-02-01T00:00:00Z
vacancies1
companyIndustrySample Industry
companySize10-49 Employees
residenceLocationUnited Arab Emirates
nationalitySample Nationality
genderAny
age25 - 40 years
degreeBachelor's degree
majorSample Major
preferredCandidate{ ...all preferred-candidate criteria }
jobCountryCodeAE
descriptionFull job description text appears here when fetchDetails is on.
changeTypeNEW (incremental mode only — see "Resume & recurring updates" section above)
changedFields["salary"] (incremental mode, UPDATED rows only)
firstSeenAt2026-01-01T00:00:00.000Z (incremental mode only)
lastSeenAt2026-01-02T00:00:00.000Z (incremental mode only)

How to Use

Basic search, all jobs in one country:

{
"mode": "search",
"country": "uae",
"maxPages": 3
}

Keyword search with a result cap:

{
"mode": "search",
"country": "saudi-arabia",
"keyword": "software engineer",
"maxListings": 50
}

Lightweight run without opening each job page:

{
"mode": "search",
"country": "egypt",
"keyword": "accountant",
"fetchDetails": false
}

Paste Bayt.com search links directly (multi-URL supported):

{
"mode": "url",
"urls": [
"https://www.bayt.com/en/uae/jobs/?q=sales",
"https://www.bayt.com/en/qatar/jobs/accountant-jobs/"
],
"maxPages": 2
}

Resume & recurring updates

There are two different things here — pick the one that matches what you're doing:

NeedUse
A crawl stopped and should continueresumeFromRunId / automatic checkpoint recovery
Run the same search every day and receive only changesincrementalMode
Keep separate daily campaigns for similar searchesdistinct stateKey values
Run a normal full snapshotleave both off

Resume (resumeFromRunId) continues one specific interrupted or previous large crawl: paste a run ID or dataset ID and this run skips jobs already collected there, returning only the remaining NEW jobs. An automatic same-run checkpoint also protects against platform migrations/resurrects without any input needed.

Incremental mode (incrementalMode) is for a schedule (for example, daily): the actor remembers the previous run of the same search by itself, so you never paste a run ID. The first run returns everything as NEW. Later runs return only NEW, UPDATED, and REAPPEARED jobs by default — duplicates and unchanged jobs are suppressed (and not charged). Turn on emitUnchanged or emitExpired only when you also want those rows returned (and billed for). State is isolated per country/keyword/URL and detail-mode setup automatically; set stateKey to name or deliberately share a monitoring campaign.

Scheduled-run example — same search, run daily:

Day 1 (first run ever for this search):

{ "mode": "search", "country": "uae", "keyword": "accountant", "incrementalMode": true }

→ every job comes back with "changeType": "NEW".

Day 2 (the schedule fires again, identical input):

{ "mode": "search", "country": "uae", "keyword": "accountant", "incrementalMode": true }

→ jobs that vanished or reappeared come back as "changeType": "REAPPEARED", jobs whose salary/title/etc. changed come back as "changeType": "UPDATED" with changedFields listing what changed, brand-new postings come back as "changeType": "NEW" — and jobs that are still there, unchanged, are not returned at all (suppressed, not charged) unless emitUnchanged is on.

Input Parameters

ParameterTypeDefaultDescription
modestringsearchsearch builds a query from country plus keyword. url walks pasted Bayt.com search links.
countrystringuaeMarket to search in search mode. One of 15 supported countries.
keywordstring(empty)Optional job title or keyword in search mode. Blank lists all jobs in the country.
urlsarray(empty)One or more Bayt.com search URLs in url mode. Country and keyword are ignored here.
maxPagesinteger0Result pages to walk per search (30 jobs per page). 0 (default) means unlimited: the walk stops naturally once a page comes back empty or repeats jobs already collected, or sooner once Max listings is reached. Set a number only for an explicit page cap below that natural stop.
maxListingsinteger20The sole soft cap on the run: stop after this many jobs across all searches. Defaults to 20 so a run stays small unless you raise it. 0 = unlimited (bounded only by the natural stop on Max pages).
fetchDetailsbooleantrueOpen each job page for the full description and extra fields. Turn off for a faster, lighter run.
proxyobjectResidentialProxy configuration. Residential is required; datacenter connections are rejected.
resumeFromRunIdstring(empty)Continue one specific previous run/dataset: jobs already saved there are loaded before scraping starts and skipped, so this run only appends new jobs. For recurring daily monitoring of the same search, use incrementalMode instead — see the "Resume & recurring updates" section above.
incrementalModebooleanfalseDaily/recurring monitoring of this same search. First run returns everything as NEW; later runs return only NEW/UPDATED/REAPPEARED by default. See the "Resume & recurring updates" section above.
stateKeystring(empty)Optional name for a monitoring campaign, so its incremental state stays stable or is deliberately shared. Auto-derived from your search/detail settings when left empty.
emitUnchangedbooleanfalseIncremental mode only. Also return jobs unchanged since the last run, marked UNCHANGED. Adds and bills extra rows you already have.
emitExpiredbooleanfalseIncremental mode only. Also return jobs from a previous run no longer found, marked EXPIRED, once a run has fully scanned the search (not capped, not a resume). Adds and bills extra synthetic rows.

Send results into your apps (MCP connectors)

Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape — the Apify dataset is never changed.

What gets written to the connector: a condensed, human-readable summary of each record — not the full JSON. Each item becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.

  1. Authorize a connector once under Apify → Settings → Integrations (Notion, Linear, Airtable, or Apify).
  2. Select it in the "Pipe results into your apps" input field. (If the picker is empty, you haven't authorized a connector yet.)
  3. For Notion, also set notionParentPageUrl to the page where items should be created.

The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.

Output Example

Sample shape, values are illustrative placeholders, not from a live listing.

{
"jobId": "00000001",
"title": "Sample Job Title",
"url": "https://www.bayt.com/en/uae/jobs/sample-job-title-00000001/",
"company": "Sample Company",
"companyUrl": "https://www.bayt.com/en/company/sample-company-0000000/",
"city": "Dubai",
"country": "UAE",
"countrySlug": "uae",
"logo": "https://secure.b8cdn.com/58x58/images/logo/00/0000000_logo_0000000000_n.png",
"salary": "AED 0 - AED 0",
"careerLevel": "Mid career",
"experience": "0-4 Years of Experience",
"workStyle": "Hybrid",
"postedDate": "1 day ago",
"postedTimestamp": 1700000000,
"isExternal": false,
"isAggregated": false,
"easyApply": true,
"aiSummary": "Short AI generated summary of the role appears here.",
"description": "Full job description text appears here when fetchDetails is on.",
"employmentType": "FULL_TIME",
"datePosted": "2026-01-01",
"validThrough": "2026-02-01T00:00:00Z",
"vacancies": 1,
"companyIndustry": "Sample Industry",
"companySize": "10-49 Employees",
"residenceLocation": "United Arab Emirates",
"nationality": "Sample Nationality",
"gender": "Any",
"age": "25 - 40 years",
"degree": "Bachelor's degree",
"major": "Sample Major",
"preferredCandidate": {
"careerLevel": "Mid career",
"yearsOfExperience": "3+ years",
"residenceLocation": "United Arab Emirates",
"degree": "Bachelor's degree",
"major": "Sample Major"
},
"jobCountryCode": "AE",
"directApply": true,
"scrapedAt": "2026-01-01T00:00:00.000Z"
}

Plan Requirement

Bayt.com only accepts traffic from residential connections, so this actor needs Apify Residential proxy (any country works). The Apify Free plan does not include residential proxy access; to run this actor, upgrade to a paid plan (Starter or higher includes residential), or paste your own residential proxy URLs in the proxy field. Datacenter proxy is rejected by the site and will return no results.