Gelbe Seiten Business Scraper
Pricing
from $0.95 / 1,000 results
Gelbe Seiten Business Scraper
Search Gelbe Seiten by business category and city or postal code, and collect structured business listings. Results include names, categories, addresses, phone numbers, websites and ratings; optional detail-page visits add email, opening hours and coordinates. Duplicate businesses are removed.
Pricing
from $0.95 / 1,000 results
Rating
0.0
(0)
Developer
Axiom Works
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Returns: one row per business with name, category, address, phone, website, email and sourceUrl.
Input: {"searches":[{"query":"zahnarzt","location":"muenchen"}],"maxItems":50}
Best for: local business lists, competitor mapping by city, and refreshing German business contact records.
This Gelbe Seiten scraper provides structured data for Gelbe Seiten API workflows. One real record from a local run:
{"id": "ba862339-6447-4091-92d9-50b38785b57b","name": "La Choza de la Anaconda","category": "Gaststätten und Restaurants","address": "Windscheidstraße 31, 10627 Berlin","phone": "030 54 71 08 00","website": "https://www.lachozadelaanaconda.de/","email": "Info@lachozadelaanaconda.de","sourceUrl": "https://www.gelbeseiten.de/gsbiz/ba862339-6447-4091-92d9-50b38785b57b"}
What does Gelbe Seiten Business Scraper do?
Gelbe Seiten is the German Yellow Pages. It lists shops, restaurants, doctors, craftspeople, lawyers and many other kinds of local business, sorted by category (Branche) and place. This Actor runs a search for each category and city you give it, reads the result pages page by page, and saves one clean record per business.
For every business it reads the listing card (name, category, address, phone, website, rating) and, by default, also opens the business page to add the email address, the opening hours and the map coordinates. Phone numbers and website links are stored in an encoded form on the page; the Actor decodes them for you, so you get plain readable values.
You can run several searches in one run, for example "zahnarzt" in several cities, and set one overall limit. Businesses that appear twice, such as paid listings repeated among the normal results, are saved only once.
Optionally, each business is classified as a single-location small business, a chain or franchise, or an institution. This step uses a third-party AI processor and is off by default; set enableAiEnrichment to true to opt in.
What data can you get?
| Field | Type | Description |
|---|---|---|
id | string | Gelbe Seiten business identifier (UUID), unique per record |
sourceUrl | string | Gelbe Seiten page of the business |
fax | string | Fax number from the business page, when published (needs includeDetails) |
logoUrl | string | Logo image URL from the business page, when published |
lastModified | string | Date the entry was last modified (YYYY-MM-DD) |
businessTypes | array | schema.org business types of the entry, such as Restaurant |
name | string | Business name |
category | string | Primary Gelbe Seiten category |
address | string | Street, postal code and city on one line |
street | string | Street and house number |
postalCode | string | German postal code |
city | string | City or town |
phone | string | Phone number as listed |
website | string | Business website URL |
email | string | Contact email from the business page, when published |
openingHours | array of strings | Opening hours, one entry per day or range |
rating | number | Average rating from 1 to 5, when the business has reviews |
reviewCount | number | Number of reviews |
latitude | number | Latitude of the business |
longitude | number | Longitude of the business |
companyType | string | sme, chain or institution (AI classification) |
Not every business publishes every field. In our test runs, name, category, address and coordinates were present for every record, phone numbers for nearly all, websites and emails for most, and ratings for a minority of businesses. Fields that a listing does not have are returned as null.
How to use
- Open the Actor and go to the Input tab.
- Add one or more searches. Each search has a
query(a German category or keyword such aszahnarzt,restaurants,elektriker) and alocation(a city or a postal code such asberlinor80331). - Set
maxItemsto the number of businesses you want in total. - Leave
includeDetailson if you need email, opening hours and coordinates. Turn it off for a faster run that only reads the listing cards. - Click Start. Results appear in the Output tab as soon as they are saved, and you can download them as JSON, CSV, Excel or XML.
For existing business lists, supply businessIds as an array of Gelbe Seiten UUIDs, for example {"businessIds":["ba862339-6447-4091-92d9-50b38785b57b"],"maxItems":1}. Each UUID fetches its business page even when includeDetails is false, because a UUID has no search card. IDs, URLs and searches share one overall result budget; duplicate businesses appear once.
With includeDetails: false, website URLs are decoded directly from listing cards alongside name, address, phone and ratings. This mode avoids opening each business page when you only need those fields. Email, hours, coordinates and other detail fields remain null in this mode. requireEmail forces details on; requireWebsite can filter listing-card results without detail requests.
Blocked or unresolved targets return no placeholder rows. Retries use fresh proxy sessions with backoff, and a target that cannot be fetched leaves guidance in the status message while other targets continue. Malformed URLs, invalid UUIDs, missing targets and invalid item limits fail input validation. Empty results do not mean a business has closed: check the spelling, filters and source page before interpreting absence.
You can also paste Gelbe Seiten search addresses such as https://www.gelbeseiten.de/suche/zahnarzt/muenchen into startUrls. The category and city are read from the address.
Tips for good results:
German search terms work best, so use zahnarzt rather than dentist. To cover a country-wide category, run one search per city instead of one large search. Use sortBy to get the best-rated or the closest businesses first.
Input
| Field | Type | Description |
|---|---|---|
searches | array | Objects with query and location; required unless startUrls or businessIds is supplied |
startUrls | array | Optional Gelbe Seiten search URLs (/suche/{what}/{where}) or single business URLs (/gsbiz/{id}) |
businessIds | array of strings | Business UUIDs; always reads detail pages, default empty |
sortBy | string | relevanz (default), bewertung or entfernung |
maxItems | integer | Maximum businesses over all searches, 1 to 5000, default 50 |
includeDetails | boolean | Open each business page for email, opening hours and coordinates, default true |
requireEmail | boolean | Return only businesses that publish an email address (turns detail pages on), default false |
requireWebsite | boolean | Return only businesses that list a website, default false |
requirePhone | boolean | Return only businesses that list a phone number, default false |
minRating | number | Return only businesses rated at least this value (0-5), default 0 |
maxItemsPerSearch | integer | Cap per search or search URL so one broad search cannot use the whole budget, 0 means no cap |
enableAiEnrichment | boolean | Add companyType with a third-party AI processor, default false |
proxyConfiguration | object | Apify Proxy settings, datacenter proxy by default |
Example input:
{"searches": [{ "query": "zahnarzt", "location": "muenchen" },{ "query": "restaurants", "location": "berlin" }],"maxItems": 100,"sortBy": "bewertung","includeDetails": true,"enableAiEnrichment": false,"proxyConfiguration": { "useApifyProxy": true }}
Output
Each business is one dataset item. A full example record from a "restaurants" search in Berlin (the email and company type are illustrative):
{"id": "ba862339-6447-4091-92d9-50b38785b57b","sourceUrl": "https://www.gelbeseiten.de/gsbiz/ba862339-6447-4091-92d9-50b38785b57b","name": "La Choza de la Anaconda","category": "Gaststätten und Restaurants","address": "Windscheidstraße 31, 10627 Berlin","street": "Windscheidstraße 31","postalCode": "10627","city": "Berlin","phone": "030 54 71 08 00","website": "https://www.lachozadelaanaconda.de/","email": "info@lachozadelaanaconda.de","openingHours": ["Mo 17:00-24:00", "So 12:00-24:00"],"rating": null,"reviewCount": null,"latitude": 52.50771,"longitude": 13.299127,"companyType": "sme"}
The dataset has an overview table view with the most useful columns. The id is the Gelbe Seiten identifier, so you can use it to join runs over time and detect new or removed businesses.
How much does it cost?
You pay per result: every business saved in the dataset counts as one result. Businesses that also receive the AI classification count as an enriched result. Open the Pricing tab of the Actor for the current rates. The Actor stops at maxItems; the platform maximum cost per run setting provides an additional spending limit. Switching off includeDetails and enableAiEnrichment makes a run faster.
Use with AI agents (MCP)
You can call this Actor from any MCP client through the Apify MCP server. Add this to your client configuration:
{"mcpServers": {"apify": {"url": "https://mcp.apify.com?tools=axiomworks/gelbe-seiten-business-scraper"}}}
Example prompts:
Prompt 1: "Find 30 zahnarzt practices in München and list their phone numbers and websites." Prompt 2: "Get the best rated restaurants in Berlin from Gelbe Seiten with opening hours." Prompt 3: "Build a list of elektriker in Hamburg with email addresses."
The agent fills in searches and maxItems from your request and reads the dataset when the run finishes.
Integrations and API
You can start the Actor from code with the Apify API clients.
Python:
from apify_client import ApifyClientclient = ApifyClient("<APIFY_TOKEN>")run = client.actor("axiomworks/gelbe-seiten-business-scraper").call(run_input={"searches": [{"query": "zahnarzt", "location": "muenchen"}],"maxItems": 50,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["name"], item["phone"])
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<APIFY_TOKEN>' });const run = await client.actor('axiomworks/gelbe-seiten-business-scraper').call({searches: [{ query: 'zahnarzt', location: 'muenchen' }],maxItems: 50,});const { items } = await client.dataset(run.defaultDatasetId).listItems();process.stdout.write(`${items.length} businesses\n`);
cURL:
curl -X POST "https://api.apify.com/v2/acts/axiomworks~gelbe-seiten-business-scraper/run-sync-get-dataset-items" \-H "Authorization: Bearer $APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"searches":[{"query":"zahnarzt","location":"muenchen"}],"maxItems":50}'
You can also connect the dataset to Google Sheets, Make, Zapier or n8n with the standard Apify integrations, schedule runs, and trigger webhooks when a run finishes.
FAQ
Why do I get fewer results than maxItems?
The search simply has fewer businesses. The Actor logs the total number of results the site reports for each search. Try a broader category or a larger area.
Why is email empty for some businesses?
Email addresses only exist on the business page, and not every business publishes one. Make sure includeDetails is on.
Why is rating empty for most businesses?
Ratings are returned only when the business publishes reviews. With detail pages enabled, missing listing ratings and review counts fall back to the business page’s structured aggregate rating. Direct business URLs also return these fields when published. The Actor never invents a rating.
What happens if I mistype the category or city? The run finishes with zero items and a warning in the log. No placeholder records are saved.
Can I search in English?
Category names are German, so German terms match best, for example rechtsanwalt or friseur.
How fast is it? The Actor makes about one search request per second and at most two business page requests in parallel, to be polite to the site. Twenty businesses with details take roughly twenty seconds.
What does the AI step do?
It sends the business name, category, address and website to a third-party AI processor, which answers whether the business is a small single-location business, a chain or an institution. If the processor is unavailable, the Actor continues without it and leaves companyType empty.
Is it legal to scrape Gelbe Seiten?
The Actor only collects information that is publicly shown on the website without logging in. It does not bypass logins or CAPTCHAs. Business listings can contain personal data, for example when a sole trader's name is the business name. Data protection rules such as the GDPR may apply to how you store and use it, and the site's terms of use may restrict automated access or commercial reuse. You are responsible for using the data lawfully, for example for B2B contact with a legitimate interest, and for respecting opt-out requests. This is not legal advice; ask a lawyer if you are unsure. This Actor is an independent tool and is not affiliated with or endorsed by the operators of Gelbe Seiten.
Feedback
If a field is wrong or missing for a category you care about, or you need another field, open an issue from the Actor page and include the search that reproduces it. Reports with an example input are the fastest to fix.