# GulfWalkin Jobs Scraper (Unofficial) | Gulf Jobs (`tidyfeeds/gulfwalkin-jobs-scraper`) Actor

Unofficial GulfWalkin scraper for Gulf and Middle East walk-in jobs. Search by keyword and country; get title, agency, country, salary as numbers, openings, apply-before date and description. No login. $1 per 1,000 jobs or less, no start fee. Phone numbers and e-mails are removed.

- **URL**: https://apify.com/tidyfeeds/gulfwalkin-jobs-scraper.md
- **Developed by:** [Tidy Feeds](https://apify.com/tidyfeeds) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.60 / 1,000 job results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

Search GulfWalkin, the overseas job board for Gulf and Middle East walk-in interviews, by keyword and country, and get every matching job as a clean, structured record: title, position, agency, country, salary as numbers, number of openings, apply-before date, interview details and the description. No login, plain HTTP requests, and you pay per job that is actually saved.

**Unofficial.** This Actor is an independent tool. It is not affiliated with, endorsed by, or sponsored by GulfWalkin.

### Why use this Actor

- **Search the way the site does.** Keywords (several at once) and country or city, passed to GulfWalkin's own search.
- **Pay only for results.** One saved job is one charge. Searches that find nothing and pages that fail cost nothing, and there is no fee for starting a run.
- **Tidy values you can filter on.** `country` in one spelling ("UAE", "Dubai" and "Abu Dhabi" all become "United Arab Emirates"), `salaryMin` / `salaryMax` / `salaryCurrency` as numbers and codes ("SR 1800" becomes 1800 and SAR), `vacancies` as a number, and dates as YYYY-MM-DD.
- **Contact details left out.** Phone numbers, e-mail addresses and links to WhatsApp, Telegram, Instagram and other sites are not returned. Description lines that hold them or name a contact person are removed. A company name is returned only when it reads as an organisation; otherwise `company` is `null`. The full list and its limits are under "What is not in the output".
- **A link to each job.** `url` points to the job's page on GulfWalkin, where candidates apply.
- **Gentle on the site.** One request at a time with a pause between requests, and the site's robots.txt is followed.

### Try it in one minute

1. Open the **Input** tab. The form is already filled in with a working example (driver jobs).
2. Click **Start**.
3. When the run finishes, open the **Output** tab to see up to 20 jobs in a table.
4. Use **Export** to download the results as JSON, CSV or Excel, or read them through the API.

### Input examples

**Driver jobs in Saudi Arabia**

```json
{
    "keywords": ["driver"],
    "location": "Saudi Arabia",
    "maxResults": 20
}
```

**Several job titles in one search run**

```json
{
    "keywords": ["welder", "fitter", "rigger"],
    "location": "UAE",
    "maxResults": 100
}
```

**Quick daily check without opening each job page**

```json
{
    "keywords": ["nurse"],
    "includeDetails": false,
    "maxResults": 50
}
```

**Start from a search you already made in your browser**

```json
{
    "startUrls": ["<paste the address of a GulfWalkin search results page here>"],
    "maxResults": 30
}
```

### Input

All fields are optional. With an empty input the Actor returns the first 20 jobs of the site's job list.

| Field | Type | Default | What it does |
|---|---|---|---|
| `keywords` | array of strings | empty | Job titles, companies or skills. Each keyword is a separate search; a job found twice is returned and charged once. Up to 20 keywords. |
| `location` | string | empty | The country box of the site's search, for example Saudi Arabia, UAE, Qatar, Oman, Kuwait, Bahrain or Dubai. |
| `maxResults` | integer | 20 | The run stops after saving this many jobs in total (1 to 1000). |
| `includeDetails` | boolean | true | On: each job page is opened to add `description`, `industry`, `interviewDetails` and the full `location`. Off: only what the search results show is returned, which is faster. |
| `startUrls` | array of strings | empty | GulfWalkin search result page addresses to start from, instead of the fields above. Only GulfWalkin addresses are accepted. If an address carries the site's industry filter, that filter is left out and the rest of the search is kept, because the industry filter only finds expired jobs (see the FAQ); the run log says so. |
| `proxyConfiguration` | object | off | Leave off. Turn on only if runs fail because requests are blocked. |

### Output

Each job is one item in the dataset. These fields are always present; a value is `null` when the site does not show it, or when it is left out on purpose (see "What is not in the output").

| Field | Type | Description |
|---|---|---|
| `jobId` | string | GulfWalkin's own job number. Stable between runs, so you can use it to spot new jobs. |
| `title` | string | Job title. |
| `company` | string or null | Company or recruitment agency that posted the job, under the name it registered on the site. `null` when the name does not read as an organisation (for example a personal name), or holds an e-mail address, a phone number or a link. |
| `location` | string or null | Location as shown on the site, with repeats removed. |
| `country` | string or null | Country in one spelling. `null` when the location names no country or several. |
| `employmentType` | null | GulfWalkin does not show an employment type. |
| `experience` | string or null | Required experience, when the job page has a field for it. Most posters write it in the description instead. |
| `salaryText` | string or null | Salary exactly as the poster wrote it. |
| `salaryMin` | number or null | Lower end of the salary, when the text has one amount or one clear range. |
| `salaryMax` | number or null | Upper end of the salary, same rule. |
| `salaryCurrency` | string or null | Three-letter currency code (AED, SAR, QAR, OMR, KWD, BHD, SGD, USD, INR, EUR). |
| `postedAt` | string or null | Posting date as YYYY-MM-DD (India time, as the site shows it). |
| `skills` | array of strings | Always empty: GulfWalkin does not list skills. |
| `description` | string or null | Job description as plain text, without lines that hold e-mail addresses, phone numbers or links, and without the contact names a program can recognise (see "What is not in the output"). |
| `source` | string | Always `gulfwalkin`. |
| `scrapedAt` | string | When the record was collected (ISO 8601, UTC). |
| `position` | string or null | Main position named by the poster. One ad often covers several positions; the others are in the description. On jobs posted until June 2026 the site shows an industry label here instead. |
| `industry` | string or null | Industry chosen by the poster. Not always chosen carefully. |
| `vacancies` | number or null | Number of openings. |
| `applyBefore` | string or null | Last day to apply or the interview date, as YYYY-MM-DD. |
| `interviewDetails` | string or null | Walk-in or interview arrangement as written by the poster, for example "Online Interview". |
| `workingHours` | string or null | Working hours as written by the poster. On jobs posted until June 2026 the site often shows the employer's name in this field instead. |
| `url` | string or null | The job's page on GulfWalkin. |

Example item:

```json
{
    "jobId": "348721",
    "title": "Bus Driver-online interview",
    "company": "GOODMAN GLOBAL SOLUTIONS",
    "location": "UAE",
    "country": "United Arab Emirates",
    "employmentType": null,
    "experience": null,
    "salaryText": "AED 2500",
    "salaryMin": 2500,
    "salaryMax": 2500,
    "salaryCurrency": "AED",
    "postedAt": "2026-10-07",
    "skills": [],
    "description": "URGENT RECRUITMENT -UAE - ONLINE INTERVIEW ADNOC OIL&GAS PROJECT-LONG TERM PROJECT SALARY : AED 2500 FREE FOOD + ACCOMODATION+MEDICAL + TRANSPORT ...",
    "source": "gulfwalkin",
    "scrapedAt": "2026-10-08T09:00:00.000Z",
    "position": "Bus Driver",
    "industry": "Education/Training/Teaching",
    "vacancies": 20,
    "applyBefore": "2026-10-09",
    "interviewDetails": "Online Interview-uae",
    "workingHours": null,
    "url": "<the job's page on GulfWalkin>"
}
```

#### What is not in the output

- **Phone numbers and e-mail addresses.** They are removed from every text field, and the contact block of the job page is never read.
- **Links to other sites.** Addresses of WhatsApp groups and channels, Telegram, Instagram, Facebook and other web pages are removed from every text field, whether they are written with `http`, with `www` or with neither (for example a chat address starting with `wa.me`). In `description` the line that holds a link is dropped (in a long paragraph, the link and its label are cut out), so a label such as "WHATSAPP GROUP :" does not stay behind. The only link in a record is `url`, the job's own page on GulfWalkin.
- **Company names that do not read as an organisation.** `company` is returned only when the name carries a sign of an organisation: a word such as Ltd, LLC, Consultancy, Manpower, Travels or Services, a digit, or "&". "HR" or "Co" on its own is not such a sign (a personal name followed by HR gives `null`); "Co." with its dot is. Without such a sign it is `null`, because a few posters register under their own name. Some real company names come out as `null` for the same reason.
- **Contact names a program can recognise.** A name with a title such as "Mr." or "Mrs.", a line that holds a contact detail, and a name that follows a contact label such as "Contact person:".

Two limits remain. A person's name written in free text with none of these signs cannot be recognised. And a web address written without `http` or `www` is recognised by a known chat or social site or by a common ending (such as .com, .org or .co.in); one with an unusual ending is not.

### Use with AI assistants

This Actor can be used as a tool by Claude, ChatGPT and other assistants that support MCP, through the Apify MCP server. Add this Actor to your assistant's Apify tools and ask in plain language, for example:

> Find 30 driver jobs in Saudi Arabia on GulfWalkin that show a salary, and list them from the highest salary down with the apply-before date.

The assistant fills in `keywords`, `location` and `maxResults` for you and reads the results from the dataset.

### Pricing

This Actor uses pay per event pricing with a single event:

| Event | When it is charged |
|---|---|
| Job result | Once for each job saved to the dataset. |

- **$1.00 per 1,000 jobs ($0.001 per job) on the Apify Free plan.** Paid plans pay less per job: $0.80 per 1,000 on Starter, $0.70 on Scale and $0.60 on Business. The **Pricing** tab of this Actor always shows the current prices.
- **Platform usage is included.** You pay only for the jobs that are saved. The compute and storage a run uses are not charged to you on top.
- **How far the free plan goes:** the Apify Free plan comes with $5 of usage each month. At $1.00 per 1,000 jobs, that is up to about 5,000 jobs a month, if you spend that credit only on this Actor.
- **Not charged:** searches with no results, pages that fail to load, jobs that were removed from the site, duplicate jobs, and listings without a title.
- **No start fee.** Starting a run costs nothing by itself.
- You can set a maximum cost for a run in the run options. The Actor stops before going over it.

### FAQ

**Do I need a GulfWalkin account, or cookies?**
No. Only public pages are read. Applying for a job needs a GulfWalkin account; use `url` to open the job there.

**Does the output include phone numbers, e-mail addresses or contact names?**
Phone numbers and e-mail addresses: no. Links to WhatsApp, Telegram, Instagram and other sites: no. Contact names are removed where a program can recognise them, and `company` is returned only when the name reads as an organisation, so a poster who registered under a personal name gives `null`. The exact rules and the two limits that remain are listed under "What is not in the output".

**Can I filter by industry?**
No. The site's industry search relies on a label that jobs posted since July 2026 no longer carry, so it only finds older jobs whose apply-before date has passed (checked on 2026-10-09). Search with `keywords` instead. The `industry` field of the output is a separate value chosen by the poster, and it is still returned when the job page shows it.

**Why did I get fewer jobs than `maxResults`?**
The search has fewer matching jobs than you asked for, or some listings were skipped because the page was removed, had no title, or is disallowed by the site's robots.txt. Skipped listings are not charged.

**How does the location search work?**
`location` is passed to the site's own country filter. Posters type locations freely ("SAUDI ARABIA", "Dammam - Saudi Arabia", "KSA"), so the site may not find every spelling. Some posters choose a general location such as "Middle East / Overseas" and name the country only in the title; a location search does not find those jobs, but a keyword search does, because keywords are looked up in the title and the description. Use the `country` field of the results to group them in one spelling.

**How do I get only new jobs each day?**
Schedule a daily run and compare `jobId` with the ones you already have. `jobId` stays the same for a job between runs.

**Why is a run slower than I expected?**
The Actor reads one page at a time and pauses between requests so that it does not put load on the site. Turn `includeDetails` off for a faster run when you only need what the search results show.

**A field is `null`. Is that an error?**
No. It means the site did not show that information for the job, or, for `company`, that the name was left out (see "What is not in the output").

### Support

Found a problem or missing a field? Open the **Issues** tab of this Actor and describe the input you used and what you expected. Issues are read and answered there.

# Actor input Schema

## `keywords` (type: `array`):

Job titles, companies or skills to search for, one per line. Each keyword is a separate search on GulfWalkin; a job found by two keywords is returned (and charged) once. Leave empty to get the latest jobs.

## `location` (type: `string`):

Same as the country box of the GulfWalkin search, for example Saudi Arabia, UAE, Qatar, Oman, Kuwait, Bahrain or Dubai. Leave empty for all locations.

## `maxResults` (type: `integer`):

The run stops after saving this many jobs (across all keywords). You pay only for jobs that are saved.

## `includeDetails` (type: `boolean`):

On: every job page is opened to add the description, industry, interview details and the full location. Off: only what the search results show is returned, which is faster.

## `startUrls` (type: `array`):

Paste GulfWalkin search result page URLs instead of using the fields above. Only GulfWalkin URLs are accepted.

## `proxyConfiguration` (type: `object`):

Off by default. Turn on only if runs fail because the site blocks requests.

## Actor input object example

```json
{
  "keywords": [
    "driver",
    "welder"
  ],
  "location": "Saudi Arabia",
  "maxResults": 20,
  "includeDetails": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `jobs` (type: `string`):

All jobs saved by the run, as items of the default dataset.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "keywords": [
        "driver"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("tidyfeeds/gulfwalkin-jobs-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "keywords": ["driver"] }

# Run the Actor and wait for it to finish
run = client.actor("tidyfeeds/gulfwalkin-jobs-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "keywords": [
    "driver"
  ]
}' |
apify call tidyfeeds/gulfwalkin-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,tidyfeeds/gulfwalkin-jobs-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/DASTLeDd6fudQweth/builds/9JuTlSG9Aq7O1fn5M/openapi.json
