Bayt.com Scraper icon

Bayt.com Scraper

Scrape Bayt.com job listings by keyword, country, or URL. Extract structured data including job title, company, location, salary, experience, career…

Start using this actor on Apify ↗Need a custom scraper?Contact us ↗

Bayt.com Scraper at a glance

Bayt.com Scraper is a ready-to-run Apify actor from abotapi for collecting jobs data. Its documented output includes job id, change type (incremental mode), title, url and company, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $2.00 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify.

Runs on
Apify cloud: console, API, schedules and integrations
Data type
Jobs, Automation, Developer Tools
Pricing
$2.00 per 1,000 results (Free plan), from $1.00 on paid plans
Output
Documented below · JSON, CSV, Excel
Inputs
19 options

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

What Bayt.com Scraper can do

  • Two ways to search. Build a search from a country and keyword, or paste one or more Bayt.com search links and walk them forward.
  • 15 markets covered. UAE, Saudi Arabia, Egypt, Qatar, Kuwait, Bahrain, Oman, Jordan, Lebanon, Iraq, Morocco, Tunisia, Algeria, Pakistan and International.
  • Up to 37 fields per job. Salary range, career level, years of experience, work style, company industry and the full preferred-candidate criteria (residence location, nationality, gender, degree, major).
  • Full detail by default. Fetch full job details is on by default and adds the complete description, employment type, posting and expiry dates, vacancies, and company size, billed as a small surcharge per job. Turn it off for a lighter, cheaper run.
  • Filters and sorting. Narrow a keyword search to a city, filter by employment type, and sort by newest first. The same sort and employment type also apply to pasted links that do not already carry them.
  • Forward pagination. Walks every result page (30 jobs per page) until the natural end, your page cap or your listing cap, whichever comes first.

Choose what to collect

These inputs let you configure Bayt.com Scraper - Salaries, Companies & Job Details. Open the actor on Apify to enter your values and review the current options.

Supported input fields
InputWhat it controls
modestring · requiredsearch = build a search from a country and keyword. url = paste one or more Bayt.com search URLs and walk them forward.

Choices: search, url

countrystringMarket to search. Bayt.com is organized by country.

Choices: uae, saudi-arabia, egypt, qatar, kuwait, bahrain, oman, jordan, lebanon, iraq, morocco, tunisia, algeria, pakistan, international

keywordstringOptional free-text search, e.g. "accountant", "software engineer", "sales manager". Leave blank to list all jobs in the chosen country.
citystringOptional city name (for example Dubai) to narrow a keyword search to that city. Needs a keyword; a name Bayt.com does not know is answered with a not-found page, so the run returns no jobs and logs an error.
sortBystringOrder of the listing: relevance (Bayt.com default) or date (newest first). Also applied to pasted listing URLs that do not already carry a sort.

Choices: relevance, date

employmentTypestringOptional Bayt.com employment-type filter number (the number after filters[jb_employment_type][]= in a Bayt.com filtered link, for example 1). Words such as FULL_TIME are rejected. Leave empty for all types. Also applied to pasted listing URLs that do not already carry it.
urlsarrayBayt.com listing links (country, keyword, keyword plus city, page, filters, sort, international, Arabic) and single job pages. Search-form links are rewritten to the keyword path; company profile links have no job cards and are skipped with a warning. Country and keyword are ignored in this mode. Pagination starts at the page in the URL and walks forward.
Show 12 more inputs
More input fields
InputWhat it controls
maxPagesintegerHow many result 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.
maxListingsintegerThe 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).
fetchDetailsbooleanOpen each job page to add the full description, employment type, posting and expiry dates, vacancies, and company size. Adds one request per job (billed as a detail-enrichment surcharge). Turn off for a faster, lighter run that uses only the search-card fields.
resumeFromRunIdstringPaste a previous run ID or dataset ID to continue a large crawl of job listings without returning or charging for jobs already collected there. Use this after an interrupted run, or when continuing a job catalogue pull in another run. For recurring daily monitoring of the same search, use Incremental mode below instead.
incrementalModebooleanTurn this on for daily or recurring monitoring. The first run returns all matching jobs as NEW. Later runs normally return only NEW, UPDATED, and REAPPEARED jobs. A job counts as UPDATED when any output field other than the always-ignored scrapedAt, postedAtRelative, postedDate and listingPage (relative or position-dependent values that change with every scrape; postedTimestamp stays compared) and the fields you list under "Ignore fields when detecting changes") differs from the last run; changedFields names them. Turn on "Emit unchanged" or "Emit expired" only when you also want those jobs returned (and billed). State is kept separately for each country/keyword/city/employment-type/URL and detail-mode setup; use State key when you want to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above.
stateKeystringOptional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from the country/keyword/URL and detail settings, different searches then never mix state with each other.
emitUnchangedbooleanOff by default. Turn on to also return jobs that have not changed since the last run, marked UNCHANGED. This returns, and bills, extra rows you already have, so leave it off unless you specifically want the full snapshot every run.
emitExpiredbooleanOff by default. Turn on to also return jobs that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search, not when Max listings capped it or when Resume was used. This returns, and bills, extra synthetic rows, so leave it off unless you need expiry tracking.
ignoreFieldsForChangesarrayField names that must NOT count as a change when incremental mode compares a job with the last run, so a job that only differs in these fields stays UNCHANGED. Use a dotted path (for example company.name) for a nested field. These are always ignored because they are relative or position-dependent values that change with every scrape: scrapedAt, postedAtRelative, postedDate, listingPage. Every other output field is compared, so any edit to it makes the job UPDATED.
mcpConnectorsarrayOptionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON, the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com).
notionParentPageUrlstringURL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors.
maxNotifyListingsintegerCap on items written to each connector per run. Does not affect the dataset.

Fields in the output

The documented dataset includes the fields below. Availability can depend on the source page and selected mode.

jobIdJob ID (text)
changeTypeChange type (incremental mode) (text)
titleTitle (text)
urlURL (link)
companyCompany (text)
companyUrlCompany URL (link)
cityCity (text)
countryCountry (text)
locationLocation (text)
postedAtRelativePosted (relative) (text)
listingPageListing page (number)
scrapedAtScraped at (date)
Show 18 more fields
salarySalary (text)
careerLevelCareer level (text)
experienceExperience (text)
workStyleWork style (text)
employmentTypeEmployment type (text)
postedDatePosted (text)
aiSummarySummary (text)
vacanciesVacancies (number)
companyIndustryIndustry (text)
companySizeCompany size (text)
residenceLocationResidence location (text)
nationalityNationality (text)
genderGender (text)
degreeDegree (text)
descriptionDescription (text)
changedFieldsChanged fields (incremental mode) (array)
firstSeenAtFirst seen (incremental mode) (date)
lastSeenAtLast seen (incremental mode) (date)

Example output

An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.

{
  "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",
    "nationality": "Sample Nationality",
    "gender": "Any",
    "age": "25 - 40 years",
    "degree": "Bachelor's degree",
    "major": "Sample Major"
  },
  "jobCountryCode": "AE",
  "directApply": true,
  "scrapedAt": "2026-01-01T00:00:00.000Z"
}

Ways to use this data

  • Recruitment and staffing: track new postings across a market or keyword to source candidates or benchmark competing roles.
  • Market research and salary benchmarking: collect salary ranges, career levels and experience requirements across countries and industries.
  • Job aggregators and boards: feed Bayt.com listings with full detail into your own site or app.
  • Workforce and migration research: analyse preferred-candidate criteria such as nationality, residence location and degree requirements by market.
  • Recurring monitoring: watch a search on a schedule and get only the jobs that are new or changed.

Before you run

Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.

Questions about this actor

What data does Bayt.com Scraper return?

The documented output for Bayt.com Scraper includes job id, change type (incremental mode), title, url, company, company url, city and country. Availability of each field depends on the source page and the selected mode.

How much does Bayt.com Scraper cost?

It costs $2.00 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.

Can I get only new or changed jobs on a schedule?

Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only new, updated and reappeared jobs, and unchanged ones are not billed unless you turn on emitUnchanged.

Can I use it with AI agents or MCP?

Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.

Ready to collect with Bayt.com Scraper?

Run it on Apify with your own input and export the results as JSON, CSV or Excel.