15,246 businesses from 1,400 Google Maps requests
An open-source toolkit that crawls Google Maps into a business directory. No paid API call runs without an explicit yes.
I built this toolkit as part of the SearchApi Developer Ambassador Program.
Outcomes
- Inside Dubai
- 14,981 businesses
- Categorised
- 99.5% of businesses
- Crawl errors
- Zero
The problem
A local directory needs every business in a city, but one Google Maps query stops at 200 results. Google's category labels need cleaning, and sending every business to an AI model costs more as the dataset grows. Reviews also thank staff by name, and those names must never reach a public page.
Constraints
- Never spend money by accident
- Keep the crawled dataset out of the public repo
- Honour every removal request, even after a full rebuild
What I built
- I split the crawl into 44 Dubai neighbourhood tiles and 40 business categories, so many small queries cover what one query cannot. Before any spend, the planning step estimated 1,250 to 3,170 requests, and the real run used 1,400. It found 15,246 businesses, and 14,981 of them sit inside Dubai.
- Every command that spends credits on SearchApi, a paid API for Google Maps results, refuses to run until I confirm the spend. The crawler archives every raw response before parsing it, so rebuilds never pay for a second crawl.
- I classify category labels, not businesses. The 15,246 businesses share only 1,787 distinct labels, so the AI bill grows with new labels, not new businesses. Keyword rules alone covered 95.8% of businesses with no model call. Hand mapping and Claude Haiku 4.5 took coverage to 99.5%. The model call needs the same confirmation.
- A review theme must recur across 5 or more businesses and stay on topic, which filters out staff names without a blocklist. Removal requests apply every time the data loads, so a rebuild from the archive cannot restore a removed listing.
- The suite ran 884 tests offline in September 2026, against recorded API responses, so automated checks never spend a credit. The GitHub deploy workflow signs in to AWS with a short-lived token, so GitHub stores no AWS key.
- I publish the limits beside the numbers. The live site still reads a data file bundled with the app, not the DynamoDB database. No speed or ranking numbers exist yet.
Languages
- TypeScript
Stack
- Next.js 16
- SST v4
- AWS Lambda, S3 and CloudFront
- DynamoDB (single-table)
- SQS + dead-letter queue
- SearchApi Google Maps engine
- Claude Haiku 4.5
- Vitest
Code and links
More case studies
Open source
Dirham and Riyal libraries, 65,000+ npm downloads
Two open-source libraries draw the new UAE Dirham and Saudi Riyal signs in apps, whatever fonts a device has.
Read case studyOpen source
An open-source method for governed agents
SpecForge blocks Claude Code from editing your code until you approve the spec and plan.
Read case study
Engagement
Want work like this?
I scope every engagement fresh. Request a free call to test the fit.
Most fixed-scope full-stack builds cost $15,000 to $50,000.
About AED 55,000 to 183,500.
Delivered over 4 to 12 weeks, against performance targets agreed up front.
Extra days cost $1,500 each (about AED 5,500).