Building a clean B2B directory for the United Arab Emirates usually involves parsing fragmented regional registries or navigating directory sites with masked links and unstandardized location data. Yello UAE (yello.ae) indexes over 224,000 commercial entities across the country, but collecting records systematically requires handling search batching, outbound redirect resolution, and nested profile attributes.
The Yello UAE Scraper addresses this by querying the directory directly through search parameters or target URLs and returning normalized records.
Querying by Region and Category
The directory organizes businesses by trade and geographical zone. When querying through the scraper, you operate in one of two modes: search or detail.
In search mode, you can target specific regions using the city parameter. This supports all seven emirates—Dubai, Abu Dhabi, Sharjah, Ajman, Ras Al Khaimah, Fujairah, and Umm Al Quwain—alongside sub-city zones like al-ain, jebel-ali-free-zone, dibba, and khor-fakkan. If you leave city empty, the query runs nationwide.
Category filtering works through either the curated category field (such as restaurants, contractors, or estate-agents) or a free-text slug passed to customCategory (such as locksmiths or it-services).
Here is a standard input payload to extract up to 50 verified contractor records in Dubai:
{
"mode": "search",
"category": "contractors",
"city": "dubai",
"verifiedOnly": true,
"sortBy": "rating",
"maxItems": 50
}
Because yello.ae search endpoints do not offer server-side sort operators, parameters like sortBy (rating, name, or relevance), minRating, and verifiedOnly are evaluated client-side across the records fetched during the run.
Extracting Shallow vs. Deep Profile Payloads
A standard search run collects surface data directly from search result cards:
namecategory-
address(full address text) -
latitudeandlongitude(from map pins) -
verified(boolean status) yearsWithUs-
ratingandreviewCount
If your pipeline requires deeper metadata—such as direct contact numbers, operating schedules, or executive names—setting fetchDetails: true causes the actor to visit each profile page.
This extra step decodes outbound tracking redirects into direct website URLs and captures extended properties including:
- Structured address components:
street,city,country - Contact data:
phone,mobilePhone,fax - Operations:
workingHours[](day and hours array),establishedYear,employeeCount(e.g.,"26-50") - Organizational data:
manager,registrationCode,categories[],tags[],description - Media and assets:
logoUrl,images[],photosCount - Catalog and feedback:
products[](name, price, description) andreviews[](author, star rating, text, date)
Empty properties are omitted from the output document rather than returned as null keys.
Direct Profile Fetching with Detail Mode
When you already maintain a list of specific company profile links, you can bypass the search index entirely by using mode: "detail" and passing an array to businessUrls.
{
"mode": "detail",
"businessUrls": [
{ "url": "https://www.yello.ae/company/344843/cafe-torino" }
]
}
This mode immediately populates the full schema for each provided URL without executing category queries.
Execution Walkthrough
You can execute runs via API or the platform console:
-
Define Target Scope: Choose
mode: "search"to discover new businesses, ormode: "detail"if supplying explicitbusinessUrls. -
Configure Parameters: Set your
category(orcustomCategory), targetcity, and define amaxItemsboundary to control result volume. -
Toggle Detail Enrichment: Set
fetchDetails: trueif you require phone numbers, decoded website destinations, operating hours, or manager names. -
Execute Run and Consume Output: Inspect the generated dataset items containing normalized business objects and timestamps (
scrapedAt,registeredOn,lastUpdated).
Here is a Python example that executes a search and reads the dataset:
from apify_client import ApifyClient
client = ApifyClient("YOUR_API_TOKEN")
run_input = {
"mode": "search",
"category": "custom",
"customCategory": "solar-energy",
"city": "abu-dhabi",
"fetchDetails": True,
"maxItems": 25
}
run = client.actor("crawlerbros/yello-uae-scraper").call(run_input=run_input)
dataset_items = client.dataset(run["defaultDatasetId"]).list_items().items
for business in dataset_items:
name = business.get("name")
phone = business.get("phone", "N/A")
website = business.get("website", "N/A")
print(f"{name} | Phone: {phone} | Web: {website}")
Platform Pricing Mechanics
This actor uses a PAY_PER_EVENT pricing model. Runs are billed based on two defined event charges:
-
Actor Start (
apify-actor-start): $0.005 per GB of memory allocated to the run, billed once per execution (minimum one event). -
Result (
apify-default-dataset-item): $0.005 per extracted record returned in the default dataset under the FREE tier ($0.00433 on BRONZE, $0.00367 on SILVER, and $0.003 on GOLD, PLATINUM, and DIAMOND discount tiers).
Users also pay for the Apify platform usage the run consumes, billed separately at their plan's standard rates.
Scope Limitations
This scraper does not extract email addresses or WhatsApp contact numbers because yello.ae gates these fields behind a paid portal and contact form, meaning they are absent from publicly accessible markup.
Yello UAE Scraper - UAE Business Directory is what these steps drive. The README covers the inputs this article skipped, including the ones that change how much a run costs.
Prices quoted above are this Actor's published pay-per-event rates on the Apify Store, read from the Apify platform API on 2026-09-26. Check the Actor page for the current rates.
Top comments (1)
The client-side
sortByandverifiedOnlyfilters are an important detail: a Dubai contractors run can rank only the records it actually fetched, even if the directory lists far more businesses. I'd use search to build a candidate list, then turn onfetchDetailsonly for prospects worth the extra profile visit to get phone numbers and resolved website URLs. I'd also label "verified" as the directory's status, since it doesn't establish that the contact details are current.