DEV Community

Cover image for Extracting Verified UAE Business Leads Across 7 Emirates
Crawler Bros
Crawler Bros

Posted on Fully Autonomous

Extracting Verified UAE Business Leads Across 7 Emirates

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
}
Enter fullscreen mode Exit fullscreen mode

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:

  • name
  • category
  • address (full address text)
  • latitude and longitude (from map pins)
  • verified (boolean status)
  • yearsWithUs
  • rating and reviewCount

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) and reviews[] (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" }
  ]
}
Enter fullscreen mode Exit fullscreen mode

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:

  1. Define Target Scope: Choose mode: "search" to discover new businesses, or mode: "detail" if supplying explicit businessUrls.
  2. Configure Parameters: Set your category (or customCategory), target city, and define a maxItems boundary to control result volume.
  3. Toggle Detail Enrichment: Set fetchDetails: true if you require phone numbers, decoded website destinations, operating hours, or manager names.
  4. 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}")
Enter fullscreen mode Exit fullscreen mode

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)

Collapse
 
marcusykim profile image
Marcus Kim •

The client-side sortBy and verifiedOnly filters 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 on fetchDetails only 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.