Africa Business Directory Scraper — 12 Countries avatar

Africa Business Directory Scraper — 12 Countries

Pricing

from $2.50 / 1,000 businesses

Go to Apify Store
Africa Business Directory Scraper — 12 Countries

Africa Business Directory Scraper — 12 Countries

Scrape business listings across 12 African countries from the BusinessList / Yello network. Registration codes, VAT numbers, employee bands and named managers that Google Maps does not carry.

Pricing

from $2.50 / 1,000 businesses

Rating

0.0

(0)

Developer

Piquno

Piquno

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

13 days ago

Last modified

Share

Scrape business listings across twelve African national directories in one actor: Nigeria, Kenya, Ghana, Uganda, Zimbabwe, Egypt, South Africa, Tanzania, Zambia, Ethiopia, Cameroon and Rwanda.

HTTP-only, no browser, no proxy. 32 flat fields per business, ready for CSV or Excel.

$2.50 per 1,000 businesses. No charge for empty rows.


Why this one, and not Google Maps

Google Maps Scraper covers local businesses everywhere at a lower price, so a directory scraper only earns its place by carrying data Maps does not have. This one does:

FieldGoogle MapsHere
Company registration number
VAT registration
Employee band (e.g. 1-5, 51-100)
Named company manager
Establishment year
Products with local-currency prices

Those turn a list of places into a list of companies — which is what matters for B2B prospecting, supplier discovery, KYB screening and market-entry research.

Coverage that barely exists elsewhere. Only two actors on the Store touch this network, both Ghana-only, both index-page-only, and both with zero monthly users. Nigeria (131k listings), Kenya (124k), Egypt (108k), South Africa (621k), Zimbabwe, Uganda, Ethiopia, Zambia, Tanzania, Cameroon and Rwanda have no coverage at all.


Two modes, and the speed trade-off you should understand

Read this before your first run. The directory publishes Crawl-delay: 40 in its robots.txt, and this actor honours it by default. That is a deliberate choice — these are small national directories, and hammering them is both discourteous and the quickest way to get blocked.

ModeRequestsThroughput at the default 40s delay
Index only (fetchDetails: false, the default)1 per 20 businesses~1,800 businesses/hour
Full profiles (fetchDetails: true)1 per business + index pages~90 businesses/hour

Index pages already carry name, address, city, phone, verified status, logo and photo count — a complete lead-generation row with no profile fetch at all. Only turn on full profiles when you specifically need registration numbers, VAT, employee bands or managers, and keep maxResults small when you do.

requestDelaySecs is adjustable. Lowering it departs from what the site asks for, and that is your call rather than the default.


Input

{
"country": "kenya",
"indexType": "category",
"slugs": ["construction-services", "logistics"],
"maxResults": 500,
"fetchDetails": false
}

Defaults: maxResults is 20 — a single index page, which returns in seconds. Raise it for a bulk crawl and budget the time: 20 businesses per request at 40s each is roughly 1,800 per hour. Rows are written as each index page is parsed, so a run you stop early still keeps everything collected up to that point.

Find category and city slugs on each site's own browse pages. Slug style differs per country — Nigeria and Kenya use hyphens (construction-services), Ghana uses underscores (construction_services) — so take them from the host you are crawling rather than reusing another country's.

The site does not support combining a category with a city; pick one axis.


Output

{
"companyId": "260568",
"name": "The Grills Corner",
"country": "nigeria",
"countryCode": "NG",
"streetAddress": "Shop 20, King Jaja Complex Unilag",
"city": "Lagos",
"region": "Lagos",
"latitude": 6.516142,
"longitude": 3.397178,
"phone": "+234 806 264 9941",
"employeesBand": "1-5",
"companyManager": "Chisom Okoye",
"establishmentYear": 2018,
"workingHours": "Monday: 9:00am - 10:00pm; Tuesday: 9:00am - 10:00pm; …",
"listedInCategories": "Food Manufacturing | Restaurants | Seafood Restaurants",
"ratingValue": 4.6,
"reviewCount": 5,
"productCount": 3,
"verified": true,
"fieldsPopulated": 27
}

Field fill rates

FieldFill
companyId, name, city, detailUrl100%
phone~100% from index pages alone
latitude / longitude, workingHours, listedInCategorieshigh, with full profiles
employeesBand, companyManager, establishmentYearcommon, but self-reported by the business
registrationCode, vatRegistrationa minority of listings — use withRegistrationOnly if you need them

Nothing is inferred. A listing that did not publish its VAT number returns null.

Email addresses are not available. The directory hides them behind a sign-in wall, and this actor does not attempt to get around that.


Pricing

EventPrice
Business$0.0025 ($2.50 / 1,000)
Actor start$0.00005

A row is billed only if it has a company id, and it is billed before it is pushed — so you are never charged for a row you did not receive. Rows removed by your filters are never billed.


Limitations — read before you buy

  • Speed is capped by politeness, not capability. See the throughput table above. Plan bulk pulls as scheduled index-only runs rather than one enormous job.
  • Registration and VAT numbers are patchy. They are the most valuable fields here and the least consistently published. Filter on them rather than assuming them.
  • Self-reported data. Employee bands, founding years and managers come from the business's own listing and are not independently verified. The verified flag reflects only the directory's own check.
  • One axis at a time. Category and city cannot be combined; the site ignores the extra path segment.
  • Apify Proxy must stay enabled. The directory returns 403 to Apify's bare container egress but serves normally through the Apify Proxy datacenter pool — measured 0/4 without it, 20/20 with it, against 3/3 from an ordinary home connection. Datacenter proxy is included on every Apify plan, so this costs you nothing; residential is not required. It is on by default and turning it off will produce an empty run.
  • Format risk. Listings are parsed from server-rendered HTML and profiles from a mix of structured data and labelled fields. A failed profile fetch degrades to the index row rather than dropping the business.

Running locally

npm install
npm test

Tests run against captured live pages in test/fixtures/ — no network required. They assert the things that actually break this scraper: 20 records per index page, page 2 disjoint from page 1, profile fields keyed by label rather than position (the first label changes with the business category), and index-only rows never inventing profile data.