DEV Community

Cover image for I Built a Restaurant Lead List for My Agency in 10 Minutes with UberEats Data
Benjamin Flores Vega
Benjamin Flores Vega

Posted on

I Built a Restaurant Lead List for My Agency in 10 Minutes with UberEats Data

If you sell to restaurants — delivery tech, marketing services, POS systems, loyalty apps — you already know the annoying first step: finding the restaurants. Not just any restaurants, but ones that actually match your ICP: a specific cuisine, in specific cities, on UberEats.

The usual workflow looks like this: open UberEats, search "pizza" in a city, scroll, copy names and URLs into a spreadsheet, switch city, repeat. For a 20-city territory, that's an afternoon gone before you've sent a single email.

I got tired of doing this by hand, so I automated it with the UberEats Stores Search by Location and Keyword actor on Apify — and turned it into a real lead-list pipeline in about 10 minutes.

The idea

The actor takes two simple inputs — a list of delivery addresses and a search keyword — and returns structured data for every matching store: name, UberEats URL, rating, rating count, estimated delivery time, city, and images. No browser, no manual scrolling, no HTML to parse.

For lead gen, that means: pick your target cities, pick your keyword (a cuisine, or even a competitor's brand name to find restaurants that don't have that tech yet), and get back a clean dataset you can filter and export straight into a CRM.

Walkthrough: Python + Apify client

Install the client:

pip install apify-client

Call the actor for a batch of target cities:

from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")

run_input = {
    "locations": [
        "85 Marsh St, Newark, NJ 07114, USA",
        "95th Ave, Ozone Park, NY 11416, USA",
        "1600 Pennsylvania Ave NW, Washington, DC 20500, USA",
    ],
    "search_keyword": "pizza",
    "max_search_results": 50,
}

run = client.actor("datacach/ubereats-stores-search-by-location-and-keyword").call(run_input=run_input)

items = list(client.dataset(run["defaultDatasetId"]).iterate_items())

Each item looks like this:

{
  "store_uuid": "35e7a890-3f2a-5948-815e-7a2a3cb77d1f",
  "name": "Pizza Near Me",
  "url": "https://www.ubereats.com/store/pizza-near-me/NeeokD8qWUiBXnoqPLd9Hw",
  "estimated_time_to_delivery": "20 min",
  "rating": 4.53,
  "rating_count": "14",
  "city": "Newark",
  "country_code": "US",
  "input": { "search_location": "85 Marsh St, Newark, NJ 07114, USA" }
}

Turning it into a lead list

Load it into a DataFrame and shape it into something a sales team can actually work:

import pandas as pd

df = pd.DataFrame(items)
df["rating_count"] = pd.to_numeric(df["rating_count"], errors="coerce")

# Underserved-but-loved: high rating, low review volume.
# These are restaurants doing well organically but with little
# marketing/tech investment behind them — prime outreach targets.
leads = df[(df["rating"] >= 4.3) & (df["rating_count"] < 50)]

leads = leads[["name", "city", "url", "rating", "rating_count", "estimated_time_to_delivery"]]
leads.to_csv("restaurant_leads.csv", index=False)

That filter is just a starting point — swap it for whatever signal matches your pitch. A few that work well in practice:

  • Slow delivery times (estimated_time_to_delivery > 40 min) → pitch for logistics/ops tooling
  • Low rating count in a big city → pitch for marketing/visibility services
  • Search by a competitor's brand name instead of a cuisine → surface every location running a specific POS or delivery-only concept, so you know exactly who's already converted and who isn't

Either way, you end up with a CSV of named, URL'd, geolocated prospects — ready to import into whatever outreach tool you're running.

Why this beats scraping it yourself

You could write your own scraper against UberEats, but you'd be maintaining anti-bot handling, pagination, and markup changes forever just to get a list of restaurant names. The actor already does that part — you just plug in cities and a keyword and get JSON back. It's also trivially repeatable: rerun it monthly per territory and you've got a self-refreshing lead pipeline instead of a one-time list that goes stale.

There's a free plan (1 location, 10 results per run) if you want to try the workflow above on your own city before scaling it across a whole territory.

Try it

If you build a lead pipeline with this, I'd love to hear what filters/signals you ended up using — drop them in the comments.

Top comments (0)