Untappd Beer, Brewery and Check-in Scraper at a glance
Untappd Beer, Brewery and Check-in Scraper is a ready-to-run Apify actor from abotapi for collecting web data. Its documented output includes label, name, type, change type (incremental mode) and record id, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $1.80 per 1,000 results on the Apify Free plan and from $1.00 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
- Web data
- Pricing
- $1.80 per 1,000 results (Free plan), from $1.00 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 29 options
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.
What Untappd Beer, Brewery and Check-in Scraper can do
- Four ways to find data. Search by keyword and filters, look up named breweries with their full beer list, read the site's own Top Rated chart, or paste links. No need to build addresses by hand.
- Complete brewery beer lists. A brewery's beer list is walked past the site's own per-query result ceiling by splitting the beer id range, so the whole list is reachable however large it is, not just the first page a logged-out visitor sees.
- Filters applied at the source. Beer style, minimum rating, minimum rating count, ABV band, still-in-production and exclude-homebrew are all applied by the site's own index, so the result count is narrowed before download, not after.
- Venues as first-class records. Bars, taprooms and bottle shops come back with address, categories, verification and activity, alongside beers and breweries.
- Typed fields, not raw strings. Numbers come back as numbers (abv: 5.4, rating: 3.5, totalCheckins: 1590000), with the site's own abbreviated text ("1.59M+") kept alongside rather than in place of the parsed value.
- An opt-in detail lookup. Switch on one toggle to add the prose description, the exact all-time, unique-drinker and last-four-weeks check-in counters, and the recent check-in feed, billed only for the records that actually receive the extra page request. If detail pages keep failing, the actor logs a warning and stops fetching them for the rest of the run; the remaining records come back with index fields only and are not charged for enrichment.
Choose what to collect
These inputs let you configure Untappd Beer, Brewery and Check-in Scraper. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
modestring · required | Choose 'search' to search by keyword and filters, 'brewery' to pull named breweries and their beer lists, 'topRated' to read the site's own Top Rated chart, or 'url' to scrape pasted beer, brewery, venue, search and chart links. |
entityTypestring | Only used when mode = search. Beers return name, brewery, style, ABV, IBU, rating and rating count. Breweries return type, location, beer count and popularity. Venues return address, categories and activity. Ignored in the other three modes. |
queriesarray | Only used when mode = search, ignored in the other modes. One or more keywords, for example 'hazy ipa', 'westvleteren' or 'brewpub denver'. Leave empty to browse by the filters alone. |
breweriesarray | Only used when mode = brewery, ignored in the other modes. Brewery names, numeric ids, vanity addresses such as /dogfishbeer, or full brewery links. |
includeBreweryBeersboolean | Used in brewery mode and for a brewery link pasted in url mode. On by default: the brewery row is returned together with its COMPLETE beer list, each beer carrying its own style, ABV, IBU, rating and rating count. The site's own brewery page shows only the first 25 beers to a logged out visitor, so this is the only way to read the rest. Switch off to return the brewery row alone. |
urlsarray | Only used when mode = url, ignored in the other modes. Mix freely: beer pages such as /b//, brewery pages, venue pages such as /v//, search pages and /beer/top_rated chart pages. A bare numeric beer id is also accepted. |
stylesarray | Optional. Keep only beers in these styles, written the way the site writes them, for example 'Belgian Quadrupel' or 'IPA - New England / Hazy'. Capitals, spaces and punctuation do not matter. Selecting several returns beers in any of them. Styles are checked against the site's OWN published style list every run; a style the site does not publish is reported with close matches, and if none of your styles exist the run stops rather than quietly returning unfiltered results. |
Show 22 more inputs
| Input | What it controls |
|---|---|
countrystring | Optional. Written the way the site writes it, for example 'Belgium' or 'United States'. On the Top Rated chart this is the site's own country filter. On a brewery or venue search it keeps only rows from that country. It has no effect on a beer search: the site publishes no country on a beer, only on its brewery. Checked against the site's own published country list; an unknown country stops the run with close matches. |
minRatinginteger | Optional. Keep only beers rated at or above this score on the site's own 0 to 5 scale. Applied by the site's index, so it narrows the result count at the source. Use 0 for no minimum. |
minRatingCountinteger | Optional. Keep only beers that have been rated at least this many times, which is the usual way to filter out beers whose average is based on a handful of check-ins. Applied by the site's index. Use 0 for no minimum. |
minAbvinteger | Optional. Keep only beers at or above this alcohol strength, as a percentage. Applied by the site's index. Use 0 for no minimum. |
maxAbvinteger | Optional. Keep only beers at or below this alcohol strength, as a percentage. Applied by the site's index. Leave empty for no maximum. |
inProductionOnlyboolean | Optional. Keep only beers the brewery still makes, dropping retired and one-off brews. Applied by the site's index. |
excludeHomebrewboolean | Optional. Drop beers entered as homebrew rather than as a commercial release. Applied by the site's index. |
minCheckinsinteger | Optional. Keep only records with at least this many all-time check-ins. That counter only exists on each beer, brewery or venue page, so this filter requires Fetch details and check-ins below and the run stops if it is set without it. Use 0 for no minimum. |
sortBystring | The order the site returns results in. Every value is one of the site's OWN orderings, applied at the source. Popularity is the site default and works for all three entity types. Beer name, brewery name and the two ABV orders apply to beers; recent popularity applies to venues. An ordering that does not exist for the entity you searched falls back to that entity's popularity order. |
fetchDetailsboolean | Read each record's own page to add the prose description, the exact all-time, unique and monthly check-in counters, and the recent check-in feed: who drank it, their rating, their comment, the serving style, the venue, what badges they earned, any photo and when. One extra request per record, billed as one Detail enrichment event per record returned. |
maxCheckinsPerEntityinteger | Cap on how many recent check-ins are returned per beer, brewery or venue. The description and the check-in counters are always complete regardless of this cap. Use 1 for the smallest non-empty feed; 0 means the maximum of 100, not zero check-ins; leaving the field blank uses the default of 20. The site's own page carries about 20 recent check-ins for a logged out visitor and its Show More button requires a login, so values above that return what the page has. |
maxItemsinteger | Maximum number of records to return across the whole run. This is the run's cap. Use 0 for unlimited. Note the site's own limit underneath it: one KEYWORD search returns at most 1,000 results however high you set this. A search with no keyword, and a brewery's beer list, have no such limit, because the actor walks those by splitting the id range. |
maxPagesinteger | Maximum number of result pages read per scope. 0 means no limit, which is the default: the run then stops only at Max results, at the end of the results, or at the site's own ceiling. |
resumeFromRunIdstring | Paste a previous run ID or dataset ID to continue a large pull without returning or charging for records already collected there. Use this after an interrupted run. For recurring daily monitoring of the same search, use Incremental mode below instead. |
incrementalModeboolean | Turn this on for daily or recurring monitoring. The first run returns every matching record as NEW. Later runs normally return only NEW, UPDATED and REAPPEARED records. Turn on Emit unchanged or Emit expired only when you also want those rows returned (and billed). Change detection compares the beer, brewery and venue data fields (name, rating, ratingCount, abv, style, status, location and similar); it ignores scrapedAt, sourceUrl, chartRank, popularity, the check-in feed, totalCheckins, monthlyCheckins and uniqueUsers (and their text forms), which move on every scrape. Add more with Ignore fields below. State is kept separately for each search, filter and lookup setup; use State key to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above. |
stateKeystring | Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently configured runs. Leave empty to let the actor derive a key automatically from the mode, targets and filters, so different searches never mix state with each other. |
emitUnchangedboolean | Off by default. Turn on to also return records that have not changed since the last run, marked UNCHANGED. This returns, and bills, extra rows you already have, so leave it off unless you want the full snapshot every run. |
emitExpiredboolean | Off by default. Turn on to also return records that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search, so never when Max results capped it, when Resume was used, or when a keyword hit the site's own result ceiling. This returns, and bills, extra synthetic rows, so leave it off unless you need expiry tracking. |
ignoreFieldsForChangesarray | Optional, incremental mode only. Field names that must never make a record UPDATED, for example rating or ratingCount. Use a dotted path such as checkins.rating for a field inside a list. The ignored fields stay in the output; they are only left out of the comparison and out of changedFields. Already always ignored: scrapedAt, sourceUrl, chartRank, popularity, the check-in feed and its counts, the abbreviated text counts, totalCheckins, monthlyCheckins, uniqueUsers, and per-check-in toastCount, commentCount and createdAt. |
mcpConnectorsarray | Optionally send results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize one under Apify, Settings, API & Integrations, then select it here. Notion gets a rich page-per-item export; other connectors get a best-effort write or digest. Leave empty to skip; never changes the dataset output. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com). |
notionParentPageUrlstring | URL or id of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors. |
maxNotifyListingsinteger | Cap 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.
labelImageLabel (image)nameNameentityTypeType (text)changeTypeChange type (incremental mode) (text)recordIdRecord IDbeerIdBeer IDstyleStyleabvABV %ibuIBUratingRating (0 to 5)ratingCountRatingschartRankChart rankShow 28 more fields
breweryNameBrewerybreweryUrlBrewery URL (link)breweryTypeBrewery typecountryCountrycityCitystateStatebeerCountBeerstotalCheckinsCheck-ins (all time)uniqueUsersUnique drinkersmonthlyCheckinsCheck-ins (last 4 weeks)checkinsReturnedCheck-ins returnedcheckinsRecent check-ins (array)descriptionDescriptionurlURL (link)changedFieldsChanged fields (incremental mode) (array)firstSeenAtFirst seen (incremental mode) (date)lastSeenAtLast seen (incremental mode) (date)websiteWebsite (link)parentCompanyParent companylocationTextLocationaddressTextAddressisVerifiedVerifiedbreweryIdBrewery IDaddressAddressvenueIdVenue IDprimaryCategoryPrimary categorycategoriesCategories (array)isClosedClosedExample output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"entityType": "beer",
"recordId": "beer-100000",
"beerId": 100000,
"name": "Example Wheat Ale",
"url": "https://untappd.com/b/example-brewing-example-wheat-ale/100000",
"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-100000_sm.jpeg",
"breweryId": 200000,
"breweryName": "Example Brewing Company",
"breweryUrl": "https://untappd.com/w/example-brewing-company/200000",
"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": 1,
"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",
"checkinText": "Example comment",
"checkinDate": "Fri, 28 Aug 2026 03:23:16 +0000",
"checkinPhotoUrl": null
}
],
"chartRank": null,
"sourceUrl": null,
"scrapedAt": "2026-08-28T12:00:00Z",
"scrapedTimestamp": "2026-08-28T12:00:00Z"
}Ways to use this data
- Beer catalog and inventory apps: pull a brewery's complete beer list with style, ABV, IBU and rating to power a shop, taproom or cellar-tracking catalog.
- Craft beer research and trend analysis: read the Top Rated chart by style and country to compare how styles and regions rank against each other.
- Venue discovery tools: find taprooms, bars and bottle shops with address, categories and activity for a local guide or map.
- Review and reputation monitoring: watch a beer's or brewery's rating, rating count and recent check-in comments as they move over time.
- Portfolio and competitor tracking: schedule incremental runs against a list of breweries or styles to catch new releases and rating changes as they happen.
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 Untappd Beer, Brewery and Check-in Scraper return?
The documented output for Untappd Beer, Brewery and Check-in Scraper includes label, name, type, change type (incremental mode), record id, beer id, style and abv %. Availability of each field depends on the source page and the selected mode.
How much does Untappd Beer, Brewery and Check-in Scraper cost?
It costs $1.80 per 1,000 results on the Apify Free plan and from $1.00 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 records on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only new, updated and reappeared records by default, and unchanged ones are not billed unless you turn on Emit unchanged.
Why does a brewery's beer list return a different count than the brewery's own headline figure?
The returned list is the site's own search index for that brewery id, which can carry variants, collaborations and retired brews the brewery's own summary figure counts differently. Both numbers are reported exactly as the site gives them; neither is corrected into the other.
Why did my run fail instead of returning an empty dataset?
If every request is refused after retries, the run stops with a clear error naming it, so a real block is never confused with "no results found". A search that reads fine but genuinely matches nothing still succeeds, with an empty dataset and a status message saying so.
Can I use it with AI agents or MCP?
Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.
