Untappd Beer, Brewery and Check-in Scraper
Pricing
from $1.00 / 1,000 results
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
Maintained by CommunityActor 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 actor | Typical Untappd scrapers on the Store | |
|---|---|---|
| Results per keyword search | up to 1,000 | 5 (the logged-out wall on the site's own search page) |
| A brewery's beer list | complete (verified: 2,281 beers for one brewery) | first 25, or brewery pages not supported at all |
| Top Rated chart | style and country, both from the site's own published lists | style only, or fixed chart |
| Venues (bars, taprooms, shops) | yes, as first class records | no |
| Filters applied at the source | style, minimum rating, minimum rating count, ABV band, still in production, exclude homebrew | none, or applied after download |
| Numbers | typed (abv: 5.4, rating: 3.5, totalCheckins: 1590000) | often raw strings ("5.4%", "1.3M+") |
| Recurring monitoring | incremental mode with NEW / UPDATED / REAPPEARED / EXPIRED | no |
| Resume an interrupted run | yes | no |
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
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
websiteis 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.
resumeFromRunIdcontinues ONE interrupted run. Paste the run or dataset id; records already collected there are neither returned nor billed again.incrementalModeis for a schedule. The first run returns everything asNEW; later runs return onlyNEW,UPDATEDandREAPPEAREDunless you also switch onemitUnchangedoremitExpired(both return, and bill, extra rows). Every row then carrieschangeType,changedFields,firstSeenAtandlastSeenAt.
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.
| Input | What it does |
|---|---|
mcpConnectors | The connectors this run exports into (Notion, Linear, Airtable, Apify). Leave it empty and nothing is exported. |
notionParentPageUrl | Notion connector only: the page under which one child page per record is created. Required to enable the Notion export, ignored by the other connectors. |
maxNotifyListings | How 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
maxPagescannot extend it. countrydoes 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 -qapify run --purge