# Yellowpages-UAE Scraper - UAE Business Directory Leads (`scrapersdelight/yellowpages-uae-scraper`) Actor

From $0.40 per 1,000 rows. Export any yellowpages-uae.com trade category as B2B lead rows: business name, city, street address, PO Box, landline, mobile, e-mail, brands and branch count. 1,254 businesses in auto spare parts alone. Fill rates measured at depth and stated honestly.

- **URL**: https://apify.com/scrapersdelight/yellowpages-uae-scraper.md
- **Developed by:** [Scrapers Delight](https://apify.com/scrapersdelight) (community)
- **Categories:** Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.40 / 1,000 per business returneds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Yellowpages-UAE Scraper — UAE Business Directory Leads

Exports any trade category from **`yellowpages-uae.com`** as B2B lead rows: business name, city,
street address, PO Box, landline, mobile, e-mail, brands and branch count.

> **This is not yello.ae.** The other UAE directory scrapers on this store all target `yello.ae`,
> a different site. This one reads `yellowpages-uae.com`, and as far as the store search shows,
> nothing else does.

***

### Coverage

Measured on a live run, 2026-09-13: the **auto spare parts** category declares **1,254** businesses
and this Actor delivered **1,252 of them — 99.8%** — across 63 pages, stopping cleanly at the end of
the category rather than at an arbitrary page limit.

Category sizes vary a lot. `auto-spare-parts` runs to 63 pages; `car-rental` ends at page 39. The
Actor pages until the directory says there is nothing more, and reports what it got against what the
category declared, per category, in `RUN_SUMMARY`.

### The e-mail field, honestly

**Roughly half the e-mail addresses in this directory are the directory's own.** Listings that have
not bought a contact upgrade show `yellowpagesfreelistings@…` instead of the business's address.
Measured across two categories at depth: **54.8%** and **63.3%** of non-empty e-mails.

This Actor **removes them**. You get `email: null` and `emailWasDirectoryInbox: true`, so you can see
why the field is empty. Ship them and a buyer mail-merges hundreds of messages into the directory's
own inbox.

After removal, a genuine business e-mail is on about **40%** of listings.

### Measured fill — stratified by depth, not read off page one

**Page 1 of every category is the paid advertising tier** and is close to 100% on everything. It is
not representative, and a fill table built from it is wrong. These figures come from pages 1, 5, 20,
40 and 63 across two categories (n=153):

| field | overall | page 1 (ads) | **deeper pages** |
|---|---|---|---|
| `name` · `city` | **100%** | 100% | **100%** |
| `phone` (landline) | 88–91% | 68–70% | **97%** |
| `streetAddress` | 88–95% | 100% | **85–95%** |
| `poBox` | 72% | 36–58% | **77–90%** |
| `email` *(after removing the house address)* | ~40% | high | **low** |
| `mobile` | 32–42% | 75–100% | **10–27%** |
| `latitude` / `longitude` | 37% | 50–74% | **27–33%** |
| `phone2` | 3–20% | 10–100% | **0%** |

**The landline is the field to build on.** It is the only contact that holds up at depth, at ~97%.
If you need e-mail specifically, turn on `requireEmail` and you will be charged only for rows that
carry a real one.

Every row carries `hasEmail`, `hasMobile`, `hasPhone`, `hasGeo` and a `contactTier` (`email` /
`mobile` / `landline` / `none`), so a null is never ambiguous.

### Input

| input | default | what it does |
|---|---|---|
| `categorySlugs` | `["auto-spare-parts"]` | Slugs from the category URL, `…/uae/<slug>` |
| `emirate` | — | Optional city filter (Dubai, Sharjah, Abu Dhabi, Ajman, RAK, UAQ, Fujairah) |
| `requireEmail` | `false` | Only rows with a **real** e-mail |
| `requireAnyContact` | `false` | Only rows with an e-mail, mobile **or** landline |
| `maxRecords` | `0` (all) | Cap on delivered and charged rows |
| `proxyConfiguration` | Apify Proxy | Datacenter is fine |

One row per business, deduplicated on the directory's own branch id — so a business appearing in two
categories you requested is delivered once, not twice.

### Why a run either completes or fails

The site issues a short-lived session cookie (`ip_verified`, 30 minutes). Without it a crawl is cut
off after roughly 15 requests with a site-wide 403. The Actor mints and refreshes that cookie itself.

That matters for what you are charged. A 403 page contains no business records — so a scraper that
stops "when a page returns no new records" would end a third of the way through a category, report
success, and bill you for it. This Actor treats **any** non-200 as an error, not as the end of the
data: it re-mints the session and retries, and if it still cannot read the category it **fails the
run and delivers nothing** rather than selling you part of a directory.

It also checks its own parsing: the page's record count is compared against what was decoded, and a
mismatch fails the run.

### Pricing

Pay per event: **$0.0004 per `business-lead`** — charged only for a row delivered to your dataset.
Filters are applied before delivery, so rows they drop are never charged, and a run that returns
nothing costs nothing. The complete auto-spare-parts category, 1,252 businesses, is **$0.50**.

The whole category has to be paged before it can be filtered, so a small capped run costs us about
the same as a full one. That is why the default is the whole category — it is the setting where you
get the most for your money, not the least.

### Source and legal

`yellowpages-uae.com` is a public business directory; listings are published by the businesses
themselves to be found. `robots.txt` is a named bad-bot list (Baiduspider, PetalBot, YandexBot,
ia\_archiver, Sogou, Exabot, MojeekBot, DotBot, MJ12bot, BLEXBot and scrapy, the last of which also
carries `Disallow: /*?*`), with no blanket restriction on other agents.

The site's terms state, verbatim:

> "You may only use or reproduce the information in the Content for your own personal,
> non-commercial or educational use."

Copyright is held by Lunad Digital Portal. That is a reuse-licence restriction rather than an access
control, and it is your responsibility to decide what your intended use is before you run this. For
outreach into the UAE, the Consumer Protection Law's e-marketing rules apply, and the equivalent
wherever you are sending from.

# Actor input Schema

## `categorySlugs` (type: `array`):

The slug from the category URL - yellowpages-uae.com/uae/<slug>. For example auto-spare-parts (1,254 businesses), car-rental, building-materials. One row per business; a business listed in two categories you request is delivered once.

## `emirate` (type: `array`):

Optional, case-insensitive match on the city the directory publishes (Dubai, Sharjah, Abu Dhabi, Ajman, Ras Al Khaimah, Umm Al Quwain, Fujairah).

## `requireEmail` (type: `boolean`):

Measured at depth, roughly 40% of listings publish a genuine business e-mail. The rest show the directory's own address, which this Actor removes. Turn this on to be charged only for rows that carry a real one.

## `requireAnyContact` (type: `boolean`):

Keeps a row if it has an e-mail, a mobile OR a landline. The landline is the field that holds up best at depth (~97%).

## `maxRecords` (type: `integer`):

Hard cap on delivered - and therefore charged - rows. 0 (the default) means every match. The whole category has to be paged before it can be filtered, so a 40-row run costs us the same as a 1,252-row one - which is why the default is the full category rather than a small sample. Rows carrying a real e-mail are delivered first, so a capped run still returns the most contactable businesses.

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

Apify Proxy. Datacenter is sufficient. The site issues a short-lived session cookie and refuses a cookieless crawl after ~15 requests; the Actor mints and refreshes that cookie itself.

## Actor input object example

```json
{
  "categorySlugs": [
    "auto-spare-parts"
  ],
  "emirate": [],
  "requireEmail": false,
  "requireAnyContact": false,
  "maxRecords": 0,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `items` (type: `string`):

One row per business, deduplicated on the directory's own branch id. Identity, city, street address and PO Box, landline, mobile and e-mail, brands and branch count - with hasEmail / hasMobile / hasPhone / hasGeo flags so a null is never mistaken for an absent business.

## `runSummary` (type: `string`):

RUN\_SUMMARY: per category the declared total, pages read, records added, coverage fraction and why paging stopped; then delivered vs charged, how many rows carry each contact type, and how many rows had the directory's own inbox removed from the e-mail field.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapersdelight/yellowpages-uae-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("scrapersdelight/yellowpages-uae-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 '{}' |
apify call scrapersdelight/yellowpages-uae-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapersdelight/yellowpages-uae-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/pCeijhBpXNHbzercA/builds/UYqWtaI5uEWwfET2p/openapi.json
