Herold.at Scraper icon

Herold.at Scraper

From $0.80/1K. Scrape Herold.at business listings across Austria into clean JSON. Extract names, addresses, GPS, phone numbers, emails, websites,…

Start using this actor on Apify ↗Need a custom scraper?Contact us ↗

Herold.at Scraper at a glance

Herold.at Scraper is a ready-to-run Apify actor from abotapi for collecting lead generation data. Its documented output includes id, url, name, category and verified, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $1.50 per 1,000 results on the Apify Free plan and from $0.12 on paid plans, with smaller per-run or optional feature charges listed on Apify.

Runs on
Apify cloud: console, API, schedules and integrations
Data type
Lead Generation, Automation, Agents
Pricing
$1.50 per 1,000 results (Free plan), from $0.12 on paid plans
Output
Documented below · JSON, CSV, Excel
Inputs
20 options

From $0.80/1K. Scrape Herold.at business listings across Austria into clean JSON. Extract names, addresses, GPS, phone numbers, emails, websites, ratings, reviews, opening hours, payment methods, and founding dates by category, city, or region.

What Herold.at Scraper can do

  • Two ways to start. Pick categories and locations from the input panel, or paste any Herold.at search URL straight from your browser.
  • Rich contact data on every listing, even without detail fetching. Name, full address, phone, email, website, rating and verified status all come from the search results page alone.
  • Optional detail enrichment. Turn on Fetch detail pages to add GPS coordinates, opening hours, payment methods, founding date and the full review list for each listing.
  • Multi-search batching. Give it several categories and several locations and it searches every combination in one run.
  • Automatic forward pagination. The actor walks result pages until it reaches the natural end of the search, or the limit you set, whichever comes first.
  • Built for recurring monitoring. Incremental mode returns only new and changed listings on repeat runs, and a refused or empty response is retried automatically with a fresh session.

Choose what to collect

These inputs let you configure Herold.at Scraper - Austrian Businesses, Contacts & Reviews. Open the actor on Apify to enter your values and review the current options.

Supported input fields
InputWhat it controls
modestring · requiredSearch mode = pick categories + locations + filters below. URL mode = paste any herold.at URL refined in a browser (recommended for filters not exposed below).

Choices: search, url

categoriesarrayCategory URL slugs as they appear on herold.at, e.g. "restaurant", "elektriker", "installateur", "frisör", "zahnarzt", "rechtsanwalt". Open https://herold.at/gelbe-seiten/ → click any category → copy the slug from the URL path. The cartesian product of categories × locations is searched.
locationsarrayAustrian city/region URL slugs (verified working combos: "wien", "salzburg", "bregenz"). Note: herold.at only generates SEO pages for some city × category combinations; cities like graz, linz, innsbruck, klagenfurt return 404 on the combined URL even though they appear in result addresses. Leave empty to search Austria-wide for each category, which always works. Open a herold.at SERP and copy the location segment from the URL path to verify before running large jobs.
urlsarrayOne or more full herold.at URLs. Tip: open herold.at in your browser, navigate to a category (e.g. /gelbe-seiten/wien/restaurant/), then paste the resulting URL here. Multi-URL supported. Category slugs and Location slugs above are ignored, they only build a Search-mode URL. The post-fetch filters below (Verified/Rated/Minimum rating) still apply to whatever this URL returns. Pagination starts at the page in the URL and walks forward. Supported: category+location, Austria-wide category, /seite/N/ pages, region (Bundesland) and sub-category pages, a single company page, and A-Z firm directory letter pages. http:// and bare herold.at are normalised to https://www. Category index pages (branchen-az) list no businesses and are skipped with a warning.
verifiedOnlybooleanKeep only listings flagged "Verifiziert" on herold.at. Applied after fetch as a client-side filter (the site does not expose a server-side URL filter for this), so it narrows whichever mode above fetched the listings.
ratedOnlybooleanKeep only listings that have at least one rating. Applied after fetch as a client-side filter, so it narrows whichever mode above fetched the listings.
minRatingintegerDrop listings with an average rating below this value (1-5). Listings without a rating are also dropped. Applied after fetch as a client-side filter, so it narrows whichever mode above fetched the listings.
Show 13 more inputs
More input fields
InputWhat it controls
maxPagesintegerHow many SERP pages to walk per category/location combination (or per pasted URL). Each page returns up to ~30 listings. Leave empty to walk every result page, the walk stops naturally once a page repeats listings already collected or herold.at signals no more pages, or sooner once Max listings is reached. Hard cap of 1000 pages per search or URL, applied even when empty.
maxListingsintegerStop after this many listings across all searches. Defaults to 20 so a run stays small unless you raise it. Hard cap of 100000 per run; 0 means that cap (still bounded by Max pages).
fetchDetailsbooleanWhen ON, also fetch each listing's detail page for GPS coordinates, opening hours, payment methods, founding date, full review list, description, and breadcrumb. SERP cards already carry name, full street address, postal code, city, region, telephone, email, website, rating, and verified status, so most use cases work fine with this OFF. Multiplies request count ~30× per SERP page when ON. Default OFF. Each delivered business whose detail page is read is charged as one detail-page event on top of the per-result charge; businesses whose detail page is refused, and businesses incremental mode suppresses as unchanged, are not charged.
maxReviewsintegerWith Fetch detail pages ON, keep at most this many reviews per listing (newest as shown on the page). Default 20, maximum 100; 0 = no reviews. The review count field still shows the site total.
resumeFromRunIdstringPaste a previous run ID or dataset ID to continue a full-catalogue walk across separate runs. Listings already collected there (matched by listing id) are skipped, so this run only saves the new ones. Leave empty for a normal fresh run. Distinct from Incremental mode below, this continues one specific interrupted run, not recurring monitoring.
incrementalModebooleanWhen ON, this actor remembers the previous run of the SAME search (see State key) and classifies each listing as NEW / UPDATED / UNCHANGED / REAPPEARED / EXPIRED. A listing is UPDATED when any compared field changed (contact data, address, rating, review count/content, opening hours, services, description...); the changed field names are listed in changedFields. Never compared (kept in the output, but never cause UPDATED): scrapedAt, position (search ranking), logoUrl, primaryImage, imageCount (image CDN URLs), and review order; add more under 'Ignore fields when detecting changes'. UNCHANGED and EXPIRED rows are not saved to the dataset unless enabled below, this is what keeps a scheduled recurring run cheap. EXPIRED is only detected after a complete scan (never when a limit was hit, a start URL begins after page 1, or Resume is used). Default OFF (every run returns every listing, as today). Combining with Resume from a previous run above is only safe on the very first incremental run (no baseline yet), once a baseline exists, remove Resume from a previous run or set a different State key.
stateKeystringManually name the incremental baseline for this search, e.g. "wien-restaurants". Leave empty to auto-derive one from mode + categories/locations/urls + the post-fetch filters + Fetch detail pages, two runs with the exact same search settings then share a baseline automatically. Set this explicitly if you want to run several DIFFERENT search configs against the SAME named baseline, or keep configs that happen to match fully separate.
emitUnchangedbooleanWhen ON, incremental mode also saves listings with no detected change (changeType="UNCHANGED") to the dataset, instead of only NEW/UPDATED/REAPPEARED. This returns, and bills for, every listing every run, defeating the point of incremental mode for most use cases. Default OFF.
emitExpiredbooleanWhen ON, incremental mode also saves a row (changeType="EXPIRED") for each previously-tracked listing that no longer appears, once this run reaches the natural end of the search results (skipped on a capped, resumed, or otherwise incomplete run, those cannot tell "gone" apart from "not reached yet"). This returns, and bills for, an extra row per disappeared listing. Default OFF.
ignoreFieldsForChangesarrayOutput field names that must NOT count as a change in incremental mode, e.g. description or reviewCount. Nested fields use a dot path, e.g. reviews.datePublished. The fields stay in the output; they just never make a listing UPDATED or appear in changedFields. Image URLs (logoUrl, primaryImage, imageCount), scrapedAt and position are always ignored. Changing this list never causes a wave of UPDATED rows.
mcpConnectorsarrayOptionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON, the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com).
notionParentPageUrlstringURL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors.
maxNotifyListingsintegerCap on items written to each connector per run. Does not affect the dataset.

Fields in the output

The documented dataset includes the fields below. Availability can depend on the source page and selected mode.

idID
urlURL (link)
nameName
categoryCategory
isVerifiedVerified
ratingValueRating
ratingCountReviews
telephonePhone
emailEmail
websiteWebsite (link)
streetAddressStreet
postalCodeZIP
Show 25 more fields
addressLocalityCity
addressRegionRegion
addressCountryCountry
latitudeLat
longitudeLng
logoUrlLogo (image)
imageCountImages
changeTypeChange
changedFieldsChanged fields
firstSeenAtFirst seen
lastSeenAtLast seen
scrapedAtScraped
detailFetcheddetailFetched
descriptionDescription
foundingDateFounded
openingHoursOpening hours
paymentAcceptedPayment methods
servicesServices
branchenTrades
breadcrumbBreadcrumb
reviewCountReviews
reviews.authorAuthor
reviews.ratingRating
reviews.datePublishedDate
reviews.bodyReview

Example output

An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.

{
  "id": "00000",
  "url": "https://www.herold.at/gelbe-seiten/wien/00000/sample-company/",
  "name": "Sample Company",
  "category": "restaurant",
  "regionSlug": "wien",
  "position": 1,
  "isVerified": true,
  "breadcrumb": [
    "Home",
    "Gelbe Seiten",
    "Restaurant",
    "Wien"
  ],
  "streetAddress": "Sample Street 1",
  "postalCode": "1010",
  "addressLocality": "Wien",
  "addressRegion": "Wien",
  "addressCountry": "AT",
  "latitude": 48,
  "longitude": 16,
  "telephone": "+43 1 0000000",
  "email": "contact@example.com",
  "website": "https://example.com",
  "logoUrl": "https://images.herold.at/optimize?url=...&width=320",
  "primaryImage": "https://images.herold.at/optimize?url=...&width=320",
  "imageCount": 1,
  "foundingDate": "2020",
  "branchCode": "00000",
  "paymentAccepted": [
    "Cash",
    "Card"
  ],
  "openingHours": [
    {
      "day": "Monday",
      "opens": "09:00",
      "closes": "18:00"
    },
    {
      "day": "Tuesday",
      "opens": "09:00",
      "closes": "18:00"
    }
  ],
  "ratingValue": 4.8,
  "ratingCount": 42,
  "reviewCount": 12,
  "bestRating": 5,
  "worstRating": 1,
  "reviews": [
    {
      "author": "Sample Reviewer",
      "body": "Sample review text.",
      "rating": 5,
      "datePublished": "2026-01-01"
    }
  ],
  "description": "Sample seller description text appears here when fetchDetails is on.",
  "scrapedAt": "2026-01-01T00:00:00.000Z"
}

Ways to use this data

  • Local lead generation: build call lists and email lists for a category and city, complete with phone numbers and websites.
  • CRM enrichment: cross-check existing company records against Herold.at for updated addresses, phone numbers and ratings.
  • Market and competitor research: measure how many businesses exist per category and region, and how they compare on ratings and reviews.
  • Directory and aggregator sites: feed a local business directory or comparison site with structured, current listings.
  • Recurring monitoring: track a category or region on a schedule and get notified only about new, changed or closed listings.

Before you run

Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.

Questions about this actor

What data does Herold.at Scraper return?

The documented output for Herold.at Scraper includes id, url, name, category, verified, rating, reviews and phone. Availability of each field depends on the source page and the selected mode.

How much does Herold.at Scraper cost?

It costs $1.50 per 1,000 results on the Apify Free plan and from $0.12 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.

Can I get only new or changed listings on a schedule?

Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only new, updated, reappeared and, if enabled, expired listings, and unchanged ones are not billed by default.

What is the difference between Resume and Incremental mode?

Resume (resumeFromRunId) continues one specific interrupted run so you don't pay to re-scrape what it already saved. Incremental mode instead monitors the same search across separate scheduled runs and reports only what changed since last time. They solve different problems and are normally used one at a time, see the "Resume and recurring updates" tip above for the exact rules on combining them.

Why did my run return zero listings for a city I know has businesses there?

Two common causes. First, not every location and category combination has its own page on Herold.at, some city and category pairs simply return no results. Leave Locations empty to search all of Austria, then filter the output by addressLocality. Second, a post-fetch filter such as Rated businesses only or Minimum average rating may be dropping every listing that was found, try running without those filters first to confirm.

Why did my run fail instead of returning an empty dataset?

A fully refused connection does not return a silent empty dataset: the run log states the reason (see Plan Requirement). The run genuinely fails only in three cases: a connection setting that cannot be set up at all, a resumeFromRunId that cannot be read, or combining Incremental mode with resumeFromRunId on a search that already has saved state.

Ready to collect with Herold.at Scraper?

Run it on Apify with your own input and export the results as JSON, CSV or Excel.