
Global Sources Supplier Scraper
scrape.ly/store/cornerledger/globalsources-scraperLead generationE-commerce
2 monthly users

Scrape Bayt.com job listings across the UAE, Saudi Arabia, Qatar, Egypt and all of MENA: title, company, location, salary, career level, employment type, full description, skills and apply link. Search by keyword, country, city and filters, or paste Bayt URLs.
Scrape job listings from Bayt.com, the largest job site in the Middle East and North Africa. Search by keyword, country and city (UAE, Saudi Arabia, Qatar, Egypt, Kuwait and more) or paste any Bayt search or job link, and get clean rows with the title, company, location, salary, career level, employment type, full description, skills and apply link. No login, no cookies, and it costs $0.50 per 1,000 jobs.
accountant or software engineer) and pick a country, optionally a city. Or paste Bayt search or job URLs.| Field | What it does |
|---|---|
searchKeywords | Job titles or skills. Each keyword is a separate search. Leave empty to list the newest jobs. |
country | international (all countries) or a country such as uae, saudi-arabia, qatar, egypt. |
city | Optional city, for example Dubai or Riyadh. |
startUrls | Bayt search result pages (with any filters set on the site) or single job pages. |
maxResults | Total jobs to save (default 20, 0 = no limit). |
postedWithin, employmentTypes, careerLevels, workplaceTypes, companyTypes, companyNames, easyApplyOnly, sortBy | Bayt's search filters for keyword searches. |
minSalaryUsd, onlyWithSalary | Keep only jobs that publish a salary (at least this much per month in USD). |
includeDetails | Open each job page for the full description and details (default on). |
maxResultsPerSearch | Cap per keyword or URL. |
language | en or ar. |
{
"searchKeywords": ["accountant", "software engineer"],
"country": "uae",
"city": "Dubai",
"maxResults": 100,
"postedWithin": "past_7_days",
"careerLevels": ["mid"]
}
One row per job. The main fields:
| Field | Example |
|---|---|
title | Senior Accountant |
company, companyUrl, companyLogo, companySize, companyIndustry | Example Trading LLC, Bayt company page, 50-99 Employees |
location, locationCity, locationCountry | Dubai, UAE / Dubai / AE |
employmentType, careerLevel, yearsOfExperience, degree | Full Time / Mid career / 3+ years / Bachelor's degree |
salaryText | AED 11,018 - AED 14,690 (as shown on Bayt) |
salaryMin, salaryMax, salaryCurrency, salaryPeriod, salary | 3000 / 4000 / USD / month, plus USD values |
workplaceType, isRemote | remote, hybrid or onsite when stated |
summary, descriptionText, descriptionHtml, skills | Full job text and the skills list |
jobDetails, preferredCandidate | Bayt's detail tables as label: value |
contacts | Emails, phones and links that the employer published in the job text |
datePosted, postedAt, postedDateText, expiryDate | 2026-10-12 / ISO timestamp / 3 days ago / closing date |
isEasyApply, isExternal, applyUrl, jobUrl | Apply and job links |
Example row (fictional company, real shape):
{
"id": "5400001",
"title": "Senior Accountant",
"company": "Example Trading LLC",
"companyUrl": "https://www.bayt.com/en/company/example-trading-llc-2300001/",
"companySize": "50-99 Employees",
"companyIndustry": "Accounting",
"location": "Dubai, UAE",
"locationCity": "Dubai",
"locationCountry": "AE",
"employmentType": "Full Time",
"careerLevel": "Mid career",
"yearsOfExperience": "3+ years",
"degree": "Bachelor's degree",
"salaryText": "AED 11,018 - AED 14,690",
"salaryMin": 3000,
"salaryMax": 4000,
"salaryCurrency": "USD",
"salaryPeriod": "month",
"salary": {"raw": "USD 3000.00 - 4000.00 per month", "currency": "USD", "min": 3000, "max": 4000, "period": "month", "usdMin": 3000, "usdMax": 4000, "isEstimate": false},
"summary": "An established trading company in Dubai is looking for a Senior Accountant to own month-end closing and VAT filings.",
"descriptionText": "We are looking for a Senior Accountant to manage the general ledger, month-end closing and VAT returns...",
"skills": ["IFRS reporting", "VAT filing in the UAE", "Advanced Excel"],
"preferredCandidate": {"Career level": "Mid career", "Years of experience": "3+ years", "Degree": "Bachelor's degree"},
"contacts": {"emails": [], "phones": [], "links": [], "socialProfiles": []},
"datePosted": "2026-10-12",
"postedAt": "2026-10-12T09:30:00Z",
"postedDateText": "3 days ago",
"expiryDate": "2026-11-11T00:00:00Z",
"isEasyApply": true,
"isExternal": false,
"applyUrl": "https://www.bayt.com/en/job/apply/index/5400001/",
"jobUrl": "https://www.bayt.com/en/uae/jobs/senior-accountant-5400001/",
"source": "bayt.com"
}
You pay $0.50 per 1,000 jobs ($0.0005 per job) plus the small platform usage of the run (compute and proxy traffic, a few cents per 1,000 jobs with full details). For example, 1,000 jobs with full details cost about $0.55 in total. Listing-only runs (includeDetails off) use even less traffic.
Is it legal to scrape Bayt? The actor reads only public job pages that anyone can open without an account. Use the data responsibly and follow Bayt's terms and the privacy laws that apply to you.
Do I need a Bayt account or my own proxy? No. Residential proxies are used by default (Bayt's Cloudflare refuses most datacenter addresses), and their traffic is included in the run's usage.
How many jobs can I get? Bayt shows at most about 10,000 jobs (333 pages) per search. For more, split the work into several keywords, cities or filters; duplicates across searches are removed automatically.
Why are some fields empty? Employers fill in different parts of the posting. Salary, experience, degree and preferred-candidate fields are only present when the employer published them. Most jobs on Bayt do not publish a salary.
Can I schedule runs or use the API? Yes. Schedule the actor (for example daily with "Past 24 hours") and read results through the API or webhooks.
Does it collect recruiter contact details? Only emails, phone numbers and links that the employer wrote into the public job text. Nothing behind a login is read.
Every field below can be set in the run form, passed through the API, or saved as a task. Unset fields fall back to the defaults shown.
searchKeywordsarrayOptionalSearch keywords
Job titles or skills to search for, one per line, for example accountant, software engineer, محاسب. Each keyword is a separate Bayt search. Leave empty to list all jobs in the chosen country or city.
countryenumOptionaldefault "international"Country
Country to search in. International searches all countries on Bayt.
citystringOptionalCity
Optional city inside the chosen country, for example Dubai, Riyadh, Cairo or Doha.
startUrlsarrayOptionalBayt URLs
Bayt.com search result pages (with any filters you set on the site) or single job pages. Search URLs are paged automatically. Filters below apply to keyword searches only; salary filters apply to everything.
maxResultsintegerOptionaldefault 20Max results
Maximum number of jobs to save in total. Use 0 for no limit. Bayt shows at most about 10,000 jobs per search.
Bayt's own search filters. They apply to keyword searches; for start URLs set the filters on Bayt before copying the link.
postedWithinenumOptionaldefault "anytime"Date posted
Only jobs posted in this period.
employmentTypesarrayOptionalEmployment type
Keep jobs of any of these employment types. Leave empty for all.
careerLevelsarrayOptionalCareer level
Keep jobs for any of these career levels. Leave empty for all.
workplaceTypesarrayOptionalRemote or hybrid
Keep only remote (work from home) or hybrid jobs. Leave empty for all, including on-site.
companyTypesarrayOptionalCompany type
Keep jobs posted by these kinds of employers. Leave empty for all.
companyNamesarrayOptionalCompany names
Keep only jobs from these companies, exactly as Bayt spells them, for example Accor or Infosys.
easyApplyOnlybooleanOptionaldefault falseEasy Apply jobs only
Keep only jobs you can apply to directly on Bayt.
minSalaryUsdintegerOptionalMinimum monthly salary (USD)
Keep only jobs that publish a salary whose top end is at least this much per month, in US dollars. Most Bayt jobs do not publish a salary, so this filter drops many jobs.
onlyWithSalarybooleanOptionaldefault falseOnly jobs with a salary
Keep only jobs that publish a salary range.
sortByenumOptionaldefault "relevance"Sort by
Order of keyword search results.
includeDetailsbooleanOptionaldefault trueInclude full job details
Open every job page for the full description, skills, salary range in the original currency, employment type, experience, degree, preferred candidate and expiry date. Turn off for faster, listing-only rows (title, company, location, salary as shown, career level, summary).
maxResultsPerSearchintegerOptionaldefault 0Max results per search
Cap the jobs saved per keyword or search URL, so one search does not use up the whole limit. 0 means no cap.
languageenumOptionaldefault "en"Language
Language of the Bayt pages for keyword searches. Arabic returns Arabic titles, locations and career levels where Bayt has them.
proxyConfigurationobjectOptionaldefault {"useScrapelyProxy":true,"scrapelyProxyGroups":["RESIDENTIA…Proxy configuration
Residential proxies are the default because Bayt's Cloudflare refuses most datacenter addresses. If you pick datacenter, the run switches to residential on its own when it is refused.
Every run writes its results to a dataset. Preview it in the dashboard, then export it or read it through the API.
| Field | Type | Description |
|---|---|---|
| id | string | null | Bayt job id (also in the job URL) |
| title | string | null | Job title |
| company | string | null | Hiring company |
| companyName | string | null | Hiring company (same as company) |
| companyId | string | null | Bayt employer id |
| companyUrl | string | null | Company page on Bayt |
| companyLogo | string | null | Company logo URL |
| companyIndustry | string | null | Company industry |
| companyType | string | null | Company type, when listed |
| companySize | string | null | Company size, for example 1-9 Employees |
| location | string | null | Location as shown, for example Dubai, UAE |
| locationCity | string | null | City |
| locationRegion | string | null | Region or emirate |
| locationCountry | string | null | Two-letter country code |
| country | string | null | Country name as shown |
| workplaceType | string | null | remote, hybrid or onsite when stated |
| isRemote | boolean | null | True for remote jobs |
| workStyle | string | null | Work style text as shown |
| employmentType | string | null | Employment type, for example Full Time |
| careerLevel | string | null | Career level, for example Mid career |
| yearsOfExperience | string | null | Required experience as shown |
| monthsOfExperience | number | null | Required experience in months |
| degree | string | null | Required degree |
| jobRole | string | null | Job role, when listed |
| numberOfVacancies | string | null | Number of openings |
| residenceLocation | string | null | Preferred residence location |
| gender | string | null | Preferred gender, when stated by the employer |
| nationality | string | null | Preferred nationality, when stated by the employer |
| age | string | null | Preferred age, when stated by the employer |
| salaryText | string | null | Salary as shown on Bayt (local currency) |
| monthlySalaryRange | string | null | Monthly salary range in the posting currency |
| salaryMin | number | null | Minimum salary in the posting currency |
| salaryMax | number | null | Maximum salary in the posting currency |
| salaryCurrency | string | null | Salary currency code |
| salaryPeriod | string | null | month, year, week, day or hour |
| salary | object | null | Parsed salary: raw, currency, min, max, period, usdMin, usdMax, isEstimate |
| summary | string | null | Short summary shown in search results |
| descriptionText | string | null | Job description as plain text |
| descriptionHtml | string | null | Job description as HTML |
| skills | array | null | Skills and requirements, one line each |
| jobDetails | object | null | Job details table as label: value |
| preferredCandidate | object | null | Preferred candidate table as label: value |
| contacts | object | null | Emails, phones and links published in the job text |
| postedDateText | string | null | Posting age as shown, for example 3 days ago |
| datePosted | string | null | Posting date (YYYY-MM-DD) |
| postedAt | string | null | Posting timestamp (ISO 8601) |
| expiryDate | string | null | Date the listing closes (ISO 8601) |
| isEasyApply | boolean | null | True when you can apply directly on Bayt |
| isExternal | boolean | null | True when applying happens on the company site |
| applyUrl | string | null | Apply link |
| applyButtonText | string | null | Apply button label |
| jobUrl | string | null | Job page on Bayt |
| searchUrl | string | null | Search the job was found in |
| source | string | null | Always bayt.com |
| detailsScraped | boolean | null | True when the job page was read |
| scrapedAt | string | null | When the row was saved (ISO 8601) |
You pay for the events the actor reports, such as each result or page it produces. Platform usage is included in the event prices.
| Event | Charged when | Price |
|---|---|---|
| Job | One saved Bayt job listing. | $0.0005 |
Run this actor from your own code. Swap in your API token and the examples work as-is.
import { ScrapelyClient } from 'scrapely-client'
const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN })
// Start the actor and wait for the run to finish.
const run = await client.actor('openrole/bayt-scraper').call({
"searchKeywords": [
"software engineer"
],
"country": "uae",
"startUrls": [],
"maxResults": 20,
"companyNames": [],
"proxyConfiguration": {
"useScrapelyProxy": true,
"scrapelyProxyGroups": [
"RESIDENTIAL"
]
}
})
// Read the dataset the run produced.
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)Tokens live in your account settings. Keep them server-side: a token carries the full permissions of your account.
Connect the Scrape.ly MCP server once and your agent can run this actor as a tool. Pick your tool:
Fetch scrape.ly/agents.md and run openrole/bayt-scraperPaste into Claude Code, Codex, Cursor or any AI agent. It signs you in once in the browser.
{
"mcpServers": {
"scrapely": {
"url": "https://api.scrape.ly/mcp?tools=actors,runs,storage,docs&actors=openrole/bayt-scraper"
}
}
}No key in the file: your client opens the browser to sign you in the first time it connects.
Inputs the developer prepared for common jobs. Open one to see its input, then copy it to your account to run it as-is or adjust it.
Job ads with full details.
Newest Arabic job listings first.
Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.