Middle East Jobs API
Pricing
from $0.80 / 1,000 job records
Middle East Jobs API
Find job postings across Middle Eastern markets by role, location query, company, category, salary, posting age, employment type, remote status, and seniority.
Pricing
from $0.80 / 1,000 job records
Rating
0.0
(0)
Developer
Aspen Technology Labs, Inc.
Maintained by CommunityActor stats
0
Bookmarked
5
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Middle East Jobs API - JobsIndex by Aspen Tech Labs
Access fresh job postings across the Middle East through the JobsIndex API, built by Aspen Tech Labs. Job data is sourced directly from company career pages and ATS platforms, not scraped from job boards or aggregators. Coverage spans the United Arab Emirates, Saudi Arabia, and other countries throughout the region, with coverage depth varying by country.
Use this Actor when you need job posting data centered on the Middle East rather than the full global JobsIndex feed. Search by keyword, title, company, category, salary, seniority, employment type, work arrangement, posting age, and more across the default region, with the option to add other locations through where.
Regional Coverage
The current regional dataset contains ~89,000 active jobs from 85,000+ employer career sites across 13 countries.
- United Arab Emirates (UAE): ~29,000 jobs
- Saudi Arabia: ~15,000 jobs
- Egypt: ~10,000 jobs
- Qatar: ~8,000 jobs
- Turkey: ~5,000 jobs
Need More or Something Different?
If this Actor is working well for you, we'd love a review. For more data, custom feeds, feedback, or any questions, reach out via our website or by email. You can also explore JobMarketPulse, our labor and job market intelligence platform.
Built-In Regional Preset
The intended regional preset covers the United Arab Emirates, Saudi Arabia, Qatar, Israel, Turkey, Egypt, Jordan, Kuwait, Oman, Bahrain, Lebanon, Iraq, and Cyprus.
Direct structured location inputs are not accepted because they could replace the default country scope. Use where to add locations to the default region.
Quick Start
{"what": "hotel OR hospitality OR restaurant","size": 5}
Input Parameters
| Parameter | Description | Example |
|---|---|---|
salary | Salary amount or range filter. | 20h-30h |
what | Job search query with keywords, boolean logic, exact phrases, or field targeting. | hotel OR hospitality OR restaurant |
where | Additional field-targeted location query combined with the default regional preset using OR. | @(city) (Dubai) |
title | Job title filter. | Hotel Manager |
company_name | Employer name filter. | Hospitality Group |
company_domain | Employer website domain. | example-hospitality.com |
category | Job category. | Hotels |
sub_category | More specific job function or role. | Housekeeper |
industry | Employer industry. | Hotels and Restaurants |
posted | Relative posting age or ISO date. | 1w |
employment_type | Employment type. | Full-Time |
remote | Work arrangement: remote, on-site, or hybrid. | hybrid |
seniority | Seniority level. | Senior |
page | Page number, starting from 0. | 0 |
size | Results per page, from 1 to 100. | 5 |
Advanced Filters
what supports plain text, boolean logic, exact phrases, and field-targeted search.
what = hotel OR hospitality OR restaurantwhat = @(title,description) (housekeeper OR bartender)
Structured Filter Precedence
When what is provided together with structured job filters such as title, company_name, company_domain, category, sub_category, industry, posted, salary, employment_type, remote, or seniority, those structured filters take priority and can override or narrow the keyword query. Use what when the corresponding structured fields are not set.
where adds locations to the internal 13-country regional preset using OR. The default regional results remain included. Use field-targeted location syntax:
where = @(city) (Dubai)where = @(region) (Abu Dhabi)
Do not send separate country, region, city, postal_code, metro_area, county, or sub_city fields. The Actor removes those fields to protect the default country scope. User-provided where values are always appended with OR; they can add locations but cannot remove or replace the default Middle East preset.
Example with an additional city query:
{"what": "software engineer","where": "@(city) (Dubai)","size": 5}
Salary Filter Format
Use NUMBER[UNIT] or NUMBER[UNIT]-NUMBER[UNIT]. Supported units are h, d, w, m, and y.
Limits and Pagination
This Actor uses the JobsIndex jobs API. Results are paginated with page and size.
| Parameter | Default | Min | Max |
|---|---|---|---|
page | 0 | 0 | Depends on size and the item cap |
size | 5 | 1 | 100 |
Individual numeric bounds are checked before a run starts. Query-dependent pagination is checked after the run starts, as explained below.
One Run, One Page
Each run requests one page, not all available pages. size is the requested number of jobs for that page, with an absolute maximum of 100. Company filters can reduce the effective page size to 5 or 20; see Item Caps below.
For searches without company filters, the retrieval window is 1000 jobs: page * size must be less than 1000. The page number is zero-based.
size | Valid page range | First page outside the window |
|---|---|---|
| 100 | 0-9 | 10 |
| 20 | 0-49 | 50 |
| 10 | 0-99 | 100 |
| 1 | 0-999 | 1000 |
The last page can contain fewer jobs than requested. For example, page=12, size=80 starts at job 960 and can return up to 40 jobs. Narrow the search with filters to retrieve a different result set beyond the window; the Actor does not change the requested page or paginate automatically.
The input schema checks page and size individually. It cannot pre-validate their combination: page=10, size=100 passes the individual bounds but is rejected after a run starts, so the run can still finish as FAILED.
Item Caps
| Query shape | Max items | Effective max size | Over-size behavior |
|---|---|---|---|
| No company filter | 1000 | 100 | Validation error; not silently capped |
| Company filter plus another keyword or filter | 20 | 20 | Silent cap with capping metadata |
| Company filter only | 5 | 5 | Silent cap with capping metadata |
A company filter means company_name, company_domain, or a company field referenced inside what. Another keyword or filter means anything in what other than company_*, or a value in fields such as title, category, sub_category, industry, posted, salary, employment_type, remote, or seniority.
This Actor always applies an internal regional where preset, so company-filtered requests normally use the 20-item company|keywords cap.
When a company-filtered request asks for size greater than the effective cap, the API returns up to the capped number of results instead of erroring. Response metadata includes size_requested and size_capped_by: "company" for the 5-item cap or "company|keywords" for the 20-item cap. These fields are absent from uncapped responses.
No-company-filter requests are not silently capped. Requests beyond the 1000-item retrieval window can return 400 Item limit reached. Maximum of 1000 items can be retrieved.
Free-Text Query Limits
These limits apply to each available user-entered field and are enforced before the Actor starts.
| Input | Maximum characters | Maximum operator characters |
|---|---|---|
what | 700 | 20 |
where | 511 | 20 |
The operator-character limit counts ?, +, pipe, and @ together within each input. Longer searches should be split into separate requests. Remaining backend syntax and safety checks can still reject an expression after the run starts.
The current JobsIndex API accepts up to 700 characters per effective query parameter. The smaller limits above, where applicable, and the 20-operator-character guard are Actor-side limits, not a claim that the API rejects every longer expression.
This Actor appends user input to an internal preset. The limits above are for the user-entered values; the combined upstream expression also includes the preset and is checked by JobsIndex. The preset is not replaced.
Field Validation
Apify validates the input schema before creating a run, including requests made directly through the API. A schema violation returns HTTP 400 with error.type = invalid-input; no run is created. API clients should handle this response when starting the Actor; there is no run ID to poll or run error file to fetch.
| Input | Accepted values / limits |
|---|---|
page | Integer 0-999; the usable maximum also depends on size and query shape. |
size | Integer 1-100; company capping remains upstream. |
company_domain | A domain name only, e.g. example.com; 3-100 raw input characters. No protocol, path, port, or internal spaces. The API trims surrounding ASCII whitespace. |
posted | Recommended windows: 1d, 1w, 1m, 1y, or a real calendar date (YYYY, YYYY-MM, YYYY-MM-DD). Use 2-10 raw input characters. Surrounding ASCII whitespace is trimmed after the raw length check. Relative amounts use 1-4 digits without leading zeros. |
salary | 2-30 raw input characters. 1-9 digits plus h, d, w, m, or y; a range needs units on both ends, e.g. 20h-30h. Surrounding ASCII whitespace is trimmed. Decimals and currency prefixes are not accepted. |
employment_type | 2-50 raw input characters in total. Comma-separated values; 1-31 characters per item after trimming surrounding spaces. No empty items. |
seniority | 2-50 raw input characters in total. Comma-separated values; 1-31 characters per item after trimming surrounding spaces. No empty items. |
remote | remote, on-site, hybrid, or an empty string for no filter. |
| Other text fields | Raw input character ranges: title (2-200), company_name (2-150), category (2-100), sub_category (2-100), industry (2-100). Empty optional inputs remain allowed. |
Empty optional text fields are allowed and are omitted from the upstream request. Raw input length means the decoded string including surrounding whitespace, before API trimming, not URL-encoded bytes. The schema checks preliminary formats, list structure, and lengths, not whether a matching location, employer, role, or job exists. The API retains its detailed character checks, including permitted Unicode characters in list values. A valid search with no matching jobs succeeds with an empty dataset.
Query-dependent pagination, combined filters, and other backend-only checks remain upstream or runtime checks. If they reject a request after a run starts, the run can still finish as FAILED. Technical errors are not reported as successful searches.
Output
Each run stores job records in the default Apify dataset. The dataset schema includes an Overview table for the most useful fields and a Raw data (all fields) table for the complete JobsIndex record.
Example dataset item:
{"id": "example-middle-east-job-id","title": "Housekeeper","title_raw": "Hotel Housekeeping Attendant","company_name": "Example Hospitality Group","company_domain": "example-hospitality.com","company_type": "company","category": "Hotels","sub_category": "Housekeeper","industry": "Hotels and Restaurants","country": "United Arab Emirates","region": "Dubayy","city": "Dubai","salary_value": "18000.00-25000.00","salary_currency": "AED","salary_unit": "MONTH","employment_type": "Full-Time","remote": "on-site","posted": "2026-08-01","url_source": "https://example-hospitality.com/careers/housekeeper","url_apply": "https://example-hospitality.com/careers/housekeeper/apply"}
Field availability depends on the source job posting.