You can see every coffee shop in Austin on Google Maps. Names, ratings, phone numbers, websites, all right there on the screen. Now try to get that into a spreadsheet.
There is no export button. No “download as CSV.” The app will happily show you 200 businesses and let you save exactly none of them to a file.
So this tutorial does the obvious thing the app won’t: it calls our Google Maps scraping API , pulls the full list, and writes it to a CSV you can open in Excel or Google Sheets. The goal is simple. Learn how to export Google Maps list data to a clean spreadsheet with about 70 lines of Python, keeping every field the API returns.
The FlyByAPIs Google Maps API returns up to 200 businesses per request, each with 36 structured fields (names, ratings, phones, websites, addresses, coordinates). About 70 lines of Python paginate past the 200 limit and write every field to a CSV that opens directly in Excel or Google Sheets. No browser extension, no manual copy-paste, and only one dependency beyond the standard library.
1
API call to start
200
Businesses per request
36
Fields per business
0
Extra dependencies
FlyByAPIs is a suite of web data extraction APIs, and its Google Maps API turns any Maps search into structured JSON you can save. We run extraction infrastructure that handles millions of requests a month, so the script below is the same approach we use ourselves. By the end you will have a working exporter that turns any Maps search into a CSV: names, ratings, phones, websites, addresses.
No browser extensions. No copy-paste marathon. No scraper to babysit.
What you need:
Python 3.9 or newer, the requests package, and a free FlyByAPIs key from RapidAPI. That is the whole shopping list. Total setup time is about ten minutes.
How to export Google Maps list data with FlyByAPIs
The whole tutorial rests on one endpoint from our Google Maps Scraper API
: /locate_and_search. You hand it a plain-English query like “coffee shops in Austin,” and it resolves the location, runs the search, and returns every business with full details in one response.
No coordinates to look up. No browser to drive. Just a GET request with a query and a couple of parameters.
Here is the shape of the response, trimmed to the fields we care about:
| |
That is the whole game. Every business comes back with the data you actually want, and turning it into CSV is a few lines of Python. Let me walk through it step by step.
The one number that shapes the script:
A single request returns at most 200 businesses. That is why the script paginates. To pull a list bigger than 200, you keep asking for the next slice with the offset parameter until the results run dry.
Step 1: Get a free API key
Head to our Google Maps data API on RapidAPI and subscribe to the free Basic plan. It gives you 100 requests a month, no credit card. That is plenty to follow this tutorial and pull a few full lists.
Once you subscribe, RapidAPI shows you your X-RapidAPI-Key. Copy it. We will keep it out of the code and in an environment variable, which is the right habit for anything you might commit to git.
| |
Pro tip:
Never paste your API key directly into a script you might share or push to GitHub. Read it from an environment variable like the example above. The full code for this tutorial lives in a public repo, and that is exactly how it handles the key.
Step 2: Set up Python
You need Python 3.9 or newer and one package, requests. Everything else, including the CSV writing, uses the standard library.
Create a folder, set up a virtual environment, and install the one dependency:
| |
The virtual environment keeps this project’s package separate from your system Python. If you have never used one, think of it as a clean sandbox per project. Activate it, and pip install only touches this folder.
Step 3: Make your first request
Let’s pull a single page of results to confirm everything works. This hits /locate_and_search with our example query and prints the first few businesses.
| |
Run it. You should see five coffee shops with their ratings. If you do, your key works and the endpoint is talking back. The limit parameter controls how many results per call, up to a maximum of 200, and offset is how we will page through the rest.
Why locate_and_search?
It combines geocoding and search in one call, so you pass a plain-English query instead of looking up coordinates first. The endpoint reference lists every parameter if you want to tune language, country, or zoom.
Step 4: Paginate past the 200 limit
One request gives you up to 200 results. A busy search like “coffee shops in Austin” has more than that, so to get the full list we loop: bump the offset by the page size each round, collect results, and stop when the API runs out of new ones.
Two things matter here. First, we dedupe by google_id, because paginated map results occasionally repeat a business across page boundaries. Second, we sleep a second between calls to stay polite and within the rate limit.
| |
Notice the guard clauses. We check status before touching the data, bail out on an empty batch, and stop when a page returns fewer results than we asked for. That last condition is how you know you have hit the end of the list, because a short page means there is no next one.
Want 300 businesses? With a page size of 200, that is two requests: offset 0, then offset 200. Want 50? One request is enough, and the loop exits after the first page. The same code handles both.
Step 5: Write the list to CSV
Now the part you came for. The standard library csv module turns our list of businesses into a spreadsheet file with zero extra dependencies.
Each business comes back with 36 fields, so instead of cherry-picking, we keep them all. The only catch is that a few are nested: detailed_address is an object, categories is a list, and working_hours, about, and price_breakdown are deeper structures.
So we flatten first. The address parts each get their own column, plain lists are joined with a pipe, and the deep structures are stored as JSON so nothing is lost.
| |
That gives you a 41-column CSV: the 36 fields, with the address split into six of its own.
The encoding="utf-8" matters more than it looks. Business names love accents, emoji, and the occasional curly apostrophe, and skipping it is how you get garbled text when the file lands in Excel. The Python csv docs
cover the edge cases if you want to go deeper.
Step 6: Run the whole thing
Wire the three functions together and you have a complete exporter. Pass a query and a target count, get a CSV.
| |
| |
That is it. A few seconds later you have google_maps_list.csv with up to 300 unique coffee shops and all 41 columns per row. Double-click it and it opens straight in Excel or Google Sheets.
100 requests/month free · No credit card required
The complete, runnable script lives in our public examples repo: blog-web-scraping-code on GitHub
, in the export-google-maps-list folder. Clone it, set your key, and run.
Every field you get when you export Google Maps to CSV
You are not stuck with whatever fields Google chooses to show. Our Google Maps listings API returns 36 fields per business, clean and typed, and the script writes every one. These are the columns you will reach for most:
| CSV column | API field | Example | Why it matters |
|---|---|---|---|
| name | name | Houndstooth Coffee | Primary identifier |
| category | main_category | Coffee shop | Filter and segment |
| rating | rating | 4.6 | Prioritize quality leads |
| reviews_count | reviews_count | 1840 | Gauge size and traction |
| phone | full_phone | +15125550143 | Direct outreach |
| website | website_url | houndstoothcoffee.com | Enrichment + email lookup |
| full_address | full_address | 401 Congress Ave, Austin | Territory mapping |
| latitude / longitude | latitude, longitude | 30.2683, -97.7428 | Plot on a map or cluster |
That table is the shortlist. The script does not stop there. It writes the full response, so your CSV also carries the IDs, the owner, the opening hours, the price breakdown, and more. Here is the complete set, grouped:
Identity & IDs
Category & status
Ratings & price
Contact
Location
address_* = street, district, city, state, zip, country
Owner, hours & media
plus hotel fields when relevant
About the nested fields:
A handful of fields (working_hours, about, price_breakdown) are objects, not plain text. The script keeps them as JSON inside their cell so no data is lost. Drop those columns in Excel if you do not need them, or parse the JSON later when you do.
Need more detail on a business? Call business_details
The search response is a summary. It is deliberately lean so one request can return up to 200 businesses. When you want the full profile for a specific place, reach for a different endpoint: /business_details.
Every result from the list carries a google_id. Pass that value as the business_id parameter to /business_details and you get the deep data the search omits: the full opening hours, popular times by hour, the complete review history with no 5-review cap, every photo, the menu, and the amenities list.
It is one extra call per business, so run it on the shortlist you actually care about, not the whole export. Pull the list with /locate_and_search, filter it down, then fetch the full record only for the rows worth the spend. Our Google Maps data API
covers every field both endpoints return.
One honest caveat:
There is no email field. Google Maps does not publish business emails, so neither does any honest API. What you get is the website, which is the hook: scrape the contact page or run it through an enrichment step to find the address. Anyone promising emails straight from Maps is guessing.
What to do with your exported list
A CSV sitting on your disk is not the goal. The goal is what you do with it. Once you can scrape Google Maps business listings on demand, the data becomes the first step in a pipeline.
From list to pipeline
Step 1
Export the list
Category + city → CSV with contact data
Step 2
Filter by signal
Rating, review count, has-website
Step 3
Enrich
Company data, decision-makers, sizing
Step 4
Push to CRM + reach out
Import, assign, contact
The enrichment step is where the rest of the FlyByAPIs suite earns its keep. Once you have a website per business, you can layer in more data with a few more calls, all from the same family of APIs.
Pull funding and headcount with the Crunchbase Data API to sort the serious businesses from the side projects. Find the right person to contact by checking who they are hiring through the Jobs Search API . Check how a business ranks for its own keywords with the Google SERP API before you pitch them on visibility.
Selling to e-commerce sellers instead? The Amazon Product Data API does the same job for marketplace listings. And if your list spans countries, the Translation API handles localizing outreach across 250 languages without a human translator in the loop.
Key takeaway:
The Maps export is the first link in a chain. Pull the list once, then let each enrichment pass add a column. By the time it reaches your CRM, a row is not a pin on a map. It is a qualified lead with context.
Rate limits, troubleshooting, and staying on the right side of the rules
A few things will trip you up the first time. Let me save you the debugging.
status is false
The endpoint returns 200 with status:false on a timeout. The script already checks for this and stops. Just retry the offset that failed.
Asking for more than 200
The API caps a single response at 200 businesses. Set a higher limit and it still returns 200. To go bigger, page with offset, which the script handles for you.
Duplicate rows
Paginated map results overlap at page boundaries. The dedupe-by-google_id set in Step 4 removes them. Do not skip it.
On the legal side, be straight with yourself. Business names, addresses, ratings, and phone numbers are public information, and pulling them for research is common practice. Routing through our Google Maps data extraction tool also keeps you from poking Google’s own properties with automation, which its terms restrict.
But the data carries obligations once you hold it. If you are contacting these businesses, GDPR, CAN-SPAM, and local marketing rules still apply. Collecting a list is not the same as having permission to spam it. Treat it like the lead-research tool it is.
The complete script
Here is everything above stitched into one file. Save it as export.py, set your RAPIDAPI_KEY, and run it. It is also in our examples repo on GitHub
if you would rather clone than copy.
| |
Wrapping up
Remember the coffee shops you could see but not save? That problem is gone. One API call, a short pagination loop, and a CSV writer turn any Maps search into a spreadsheet you can actually use.
You now have a working Python exporter. Run it for coffee shops in Austin, then change two words and run it for dentists in your own city. The Google Maps data API does the heavy lifting, and your script just decides what to keep.
Grab a free key, clone the repo on GitHub , and pull your first list. If you build something useful on top of the Google Maps business data API , I would genuinely like to hear what it is.
100 requests/month free · No credit card required
P.S. The one-second sleep in the script is not paranoia, it is courtesy. Hammer any API and you will get throttled. Be a good citizen and your scripts last longer.
Oriol.
