Untappd Beer, Brewery and Check-in Scraper avatar

Untappd Beer, Brewery and Check-in Scraper

Pricing

from $1.00 / 1,000 results

Go to Apify Store
Untappd Beer, Brewery and Check-in Scraper

Untappd Beer, Brewery and Check-in Scraper

Scrape Untappd beers, breweries, venues and check-ins by keyword, brewery, Top Rated chart or pasted link. Returns rating, rating count, style, ABV, IBU, brewery, check-in counters and recent check-ins with comments. Incremental mode tracks changes.

Pricing

from $1.00 / 1,000 results

Rating

0.0

(0)

Developer

Abot API

Abot API

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

9 days ago

Last modified

Categories

Share

Scrape Untappd (untappd.com): beers with their rating, rating count, style, ABV and IBU; breweries with their type, location and complete beer list; venues; and the recent check-in feed with each drinker's rating, comment, serving style, venue and badges.

Four modes, one flat record per beer, brewery or venue.


Why this one

This actorTypical Untappd scrapers on the Store
Results per keyword searchup to 1,0005 (the logged-out wall on the site's own search page)
A brewery's beer listcomplete (verified: 2,281 beers for one brewery)first 25, or brewery pages not supported at all
Top Rated chartstyle and country, both from the site's own published listsstyle only, or fixed chart
Venues (bars, taprooms, shops)yes, as first class recordsno
Filters applied at the sourcestyle, minimum rating, minimum rating count, ABV band, still in production, exclude homebrewnone, or applied after download
Numberstyped (abv: 5.4, rating: 3.5, totalCheckins: 1590000)often raw strings ("5.4%", "1.3M+")
Recurring monitoringincremental mode with NEW / UPDATED / REAPPEARED / EXPIREDno
Resume an interrupted runyesno

The 1,000 figure is the site's own per-query ceiling, not a cap this actor adds. A search with no keyword (filters only) and a brewery's beer list are not subject to it: the actor walks those by splitting the beer-id range, so the whole set is reachable however large it is.


Modes

Search the site's own beer, brewery or venue index by keyword, narrowed by the filters below.

{
"mode": "search",
"entityType": "beer",
"queries": ["hazy ipa"],
"minRatingCount": 500,
"maxItems": 50
}

Leave queries empty and use the filters alone to browse, for example every Belgian Quadrupel with at least 500 ratings:

{
"mode": "search",
"queries": [],
"styles": ["Belgian Quadrupel"],
"minRatingCount": 500,
"maxItems": 0
}

brewery

One row per brewery plus, by default, that brewery's complete beer list. Each entry is resolved against the site itself, so a brewery name, a numeric id, a vanity address or a full link all work.

{
"mode": "brewery",
"breweries": ["Dogfish Head Craft Brewery", "/dogfishbeer", "459"],
"includeBreweryBeers": true,
"maxItems": 0
}

topRated

The site's own Top Rated chart, for a style, a country, or both. Style and country names are checked against the lists the site itself publishes; an unknown one is reported with close matches rather than silently ignored.

{
"mode": "topRated",
"styles": ["Belgian Quadrupel"],
"country": "Belgium"
}

url

Paste anything: beer pages, brewery pages, venue pages, search pages, chart pages, or a bare numeric beer id. Pasted links are served first, so a brewery's large beer list can never fill maxItems and drop the links you actually named.

{
"mode": "url",
"urls": [
"https://untappd.com/b/blue-moon-brewing-company-belgian-white/3839",
"https://untappd.com/v/some-taproom/3793867",
"https://untappd.com/beer/top_rated?type=belgian-quad&country=belgium"
]
}

Check-ins and the detail toggle

Ids, name, brewery, style, ABV, IBU, rating, rating count, popularity, label images and location come back on every record at no extra cost.

Switch on Fetch details and check-ins to add, per record and at one extra request each:

  • the prose description,
  • the exact all-time, unique drinker and last four weeks check-in counters,
  • the recent check-in feed: who drank it, their rating, their comment, the serving style, the venue, where it was purchased, the badges they earned, any photo and when.

The site's own page carries about 20 recent check-ins for a logged-out visitor, so maxCheckinsPerEntity above that returns what the page has. Set it to 0 to get the counters and the description with no individual check-ins.

Only records that actually receive a page request are billed the Detail enrichment event.


Output

One flat record per beer, brewery or venue. entityType says which, and recordId is a stable key you can join on across runs.

Abridged example of a beer record (values below are illustrative):

{
"entityType": "beer",
"recordId": "beer-000000",
"beerId": 000000,
"name": "Example Wheat Ale",
"url": "https://untappd.com/b/example-brewing-example-wheat-ale/000000",
"style": "Wheat Beer - Witbier / Blanche",
"styleId": 47,
"abv": 5.4,
"ibu": 9,
"rating": 3.5,
"ratingPrecise": 3.49888,
"ratingCount": 625469,
"popularity": 1590000,
"inProduction": true,
"isHomebrew": false,
"hasCommunityAward": false,
"labelImage": "https://assets.untappd.com/site/beer_logos/beer-000000_sm.jpeg",
"breweryId": 000000,
"breweryName": "Example Brewing Company",
"breweryUrl": "https://untappd.com/w/example-brewing-company/000000",
"breweryLatitude": 39.7392,
"breweryLongitude": -104.9903,
"description": "An unfiltered wheat ale spiced with coriander and orange peel.",
"totalCheckins": 1590000,
"totalCheckinsText": "1.59M+",
"uniqueUsers": 709417,
"monthlyCheckins": 3487,
"checkinsReturned": 2,
"checkins": [
{
"checkinId": 100000001,
"checkinUrl": "https://untappd.com/user/example_user/checkin/100000001",
"userName": "Example User",
"userSlug": "example_user",
"userProfileUrl": "https://untappd.com/user/example_user",
"rating": 4,
"comment": "Great with an orange slice.",
"servingStyle": "Draft",
"venueName": "Example Taproom",
"venueUrl": "https://untappd.com/v/example-taproom/000000",
"purchasedFrom": "Example Taproom",
"badges": ["Earned the Example badge!"],
"toastCount": 2,
"commentCount": 0,
"photoUrl": null,
"createdAt": "Fri, 28 Aug 2026 03:23:16 +0000"
}
],
"chartRank": null,
"sourceUrl": null,
"scrapedAt": "2026-08-28T12:00:00Z"
}

beerCount on a brewery row is the brewery's OWN headline figure as the site publishes it, and the returned beer list can be longer than it: measured on one brewery, the site's headline says 1,434 while its search index carries 2,281 rows under the same brewery id (variants, collaborations and retired brews). Both numbers are reported as the site gives them; neither is corrected into the other.

Brewery records add breweryType, country, city, state, address, beerCount, outOfBusiness, latitude, longitude, and, with the detail toggle on, website, instagramUrl, twitterUrl, facebookUrl, parentCompany, isOfficial and the brewery's own rating.

Venue records carry address, city, state, country, categories, isVerified, isClosed, servesBeer, servesFood, servesWine, servesSpirits, popularity and popularityLast30Days.

Two fields deliberately not returned

  • User avatar images. Some of them are served by an avatar service whose address is a hash of the drinker's e-mail, so republishing that URL republishes a reversible e-mail hash. The public handle, display name and profile address are returned instead, which is what the check-in itself shows.
  • Third-party listing-directory links on a venue. The venue's own website is returned; the two outbound directory links beside it are not beer data and one of them carries a referral token.

Recurring monitoring and resume

Two separate features, both in the Resume and recurring updates section.

  • resumeFromRunId continues ONE interrupted run. Paste the run or dataset id; records already collected there are neither returned nor billed again.
  • incrementalMode is for a schedule. The first run returns everything as NEW; later runs return only NEW, UPDATED and REAPPEARED unless you also switch on emitUnchanged or emitExpired (both return, and bill, extra rows). Every row then carries changeType, changedFields, firstSeenAt and lastSeenAt.

State is keyed on the mode, targets and filters, so two different searches never share a baseline. Set stateKey to name a campaign or to deliberately share one.

EXPIRED rows are only produced after a run that fully scanned the tracked search. A run capped by maxItems, a resumed run, a run that collected nothing, and a keyword scope that hit the site's own 1,000-result ceiling all skip expiry detection rather than tombstoning records they simply did not reach.

Fields that never appear in changedFields, because they move on every fetch and would rewrite every row: checkins, checkinsReturned, popularity, chartRank, scrapedAt, sourceUrl, and the abbreviated counter strings totalCheckinsText, uniqueUsersText and monthlyCheckinsText. Nothing is lost: totalCheckins, uniqueUsers, monthlyCheckins, rating, ratingPrecise and ratingCount are all tracked, so real movement still classifies a record UPDATED and still names those fields.


Send results into your apps (MCP connectors)

Optionally pipe this run's records into Notion, Linear, Airtable or Apify through Model Context Protocol (MCP) connectors. Authorize a connector once under Apify, Settings, API & Integrations, then pick it in the connectors section of the input. Notion gets a rich page per record; the other connectors get a best-effort write or digest. The export runs after the dataset is complete and never changes what the dataset returns, so nothing is lost if you leave it off.

InputWhat it does
mcpConnectorsThe connectors this run exports into (Notion, Linear, Airtable, Apify). Leave it empty and nothing is exported.
notionParentPageUrlNotion connector only: the page under which one child page per record is created. Required to enable the Notion export, ignored by the other connectors.
maxNotifyListingsHow many records are written to each connector in one run, default 50. Caps the export only, never the dataset.

Limits, honestly

  • One keyword search returns at most 1,000 results. That is the site's own per-query ceiling. The run logs a warning naming it and suggests narrowing with a style, a minimum rating count or an ABV band. A filter-only search and a brewery's beer list are not affected.
  • The Top Rated chart is one fixed-length page per style and country. The site publishes no page 2 for it, so maxPages cannot extend it.
  • country does not narrow a beer search. The site publishes a country on a brewery and on a venue, not on a beer. It is the site's own filter on the Top Rated chart, and a result-side filter on brewery and venue searches.
  • Check-ins are the public feed a logged-out visitor sees, roughly the 20 most recent per page. This actor does not log in and returns nothing that requires an account.
  • A run that reads nothing fails. If every request is refused, the run exits with an error naming it, never as a green run with an empty dataset.

Connection

The site answers over the standard connection pool that every Apify plan includes, so that is the default and the cheapest option. It does refuse individual exits from time to time; the actor rotates to a new one and retries, with a hard cap of five attempts and a short timeout, then fails fast rather than grinding. A residential pool is available if you want one, but this site does not need it, and it is never selected for you.

Local development

python3.12 -m venv .venv
.venv/bin/pip install -r requirements.txt
.venv/bin/python -m pytest tests -q
apify run --purge