# Untappd Beer Review Scraper (`maximedupre/untappd-scraper`) Actor

Collect public beer profiles from Untappd top-rated lists, beer or brewery URLs, beer IDs, and search terms. Save ratings, ABV, IBU, brewery details, source URLs, and visible public check-ins in one dataset row per beer. Missing scalar fields stay null.

- **URL**: https://apify.com/maximedupre/untappd-scraper.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** Business, Marketing, Other
- **Stats:** 7 total users, 2 monthly users, 95.5% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.04 / 1,000 saved beers

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### 🍺 Untappd beer review data for brewery research

Breweries, beer distributors, market researchers, and bar or bottle-shop teams can collect public [Untappd](https://untappd.com/) beer profiles in one structured Apify dataset. Each saved row contains beer identity, brewery details, ratings, ABV, IBU, check-in totals, source links, and visible public check-ins when Untappd shows them. This gives you structured beer data for research, review monitoring, and planning without copying fields from public pages by hand.

This Untappd scraper is useful for brewery research, beer market analysis, review monitoring, bar or bottle-shop planning, content research, and repeatable beer datasets.

- Build an **[Untappd Beer Database](https://apify.com/maximedupre/untappd-scraper/examples/untappd-beer-database)** from public beer pages, brewery pages, IDs, and search terms.
- Collect visible public check-ins with the **[Untappd Checkin Scraper](https://apify.com/maximedupre/untappd-scraper/examples/untappd-checkin-scraper)**.
- Use **[Untappd Beer Ratings](https://apify.com/maximedupre/untappd-scraper/examples/untappd-beer-ratings)** to compare public beer ratings.
- Collect a brewery's public beer list with the **[Untappd Brewery Scraper](https://apify.com/maximedupre/untappd-scraper/examples/untappd-brewery-scraper)**.
- Save a public beer profile with the **[Untappd Beer Scraper](https://apify.com/maximedupre/untappd-scraper/examples/untappd-beer-scraper)**.
- Use the **[Untappd Scraper](https://apify.com/maximedupre/untappd-scraper/examples/untappd-scraper)** for a general public beer collection.

#### 📊 Beer profiles and visible check-ins

Each dataset row is one public beer. A row can include its name, Untappd links, brewery, style, ABV, IBU, rating, rating count, total check-ins, description, label image, and source rank. Public check-ins are nested in the `checkins` array, so beer details and check-in context stay together.

The output is built around beer rows, not separate check-in rows. That keeps exports easy to join with beer metadata while still giving you recent public check-in context when Untappd exposes it.

**Public source data**

The Actor keeps values grounded in what Untappd shows. Missing scalar values are returned as `null`, and `checkins` is an empty array when no public check-ins are shown. The Actor does not promise a complete historical check-in archive for every beer.

#### 🚀 Collect public Untappd beer data

1. Leave `targets` empty for top-rated discovery, or add public beer URLs, brewery URLs, beer IDs, and search terms.
2. Set `beerStyle` when you want to narrow top-rated discovery to a public Untappd style.
3. Set `maxRecords` to the number of beer rows you want. Leave it empty to collect all available rows until the source is exhausted.
4. Start the Actor and open the dataset in Apify Console.

For a quick first run, use one target or a small `maxRecords` value such as `25`. After you review the row shape, add more targets or raise the limit.

#### ⚙️ Input

**Input fields**

| Field | Type | What it does |
| --- | --- | --- |
| `targets` | array of strings | Mix public beer URLs, brewery URLs, beer IDs, and search terms. Leave it empty for top-rated beer discovery. |
| `beerStyle` | string | Narrows top-rated discovery to a public Untappd beer style, such as `IPA - Imperial / Double`. |
| `maxRecords` | integer | Optional limit for saved beer rows across all targets. Leave it empty to collect all available rows until the source is exhausted. |

**Target examples**

- Beer URL such as `https://untappd.com/b/the-alchemist-heady-topper/4691`
- Brewery URL such as `https://untappd.com/w/sierra-nevada-brewing-co/1142`
- Beer ID such as `4691`
- Search term such as `Pliny the Elder`

**Example input**

This is the public input from a successful default-input run:

```json
{
  "targets": [
    "https://untappd.com/b/the-alchemist-heady-topper/4691",
    "https://untappd.com/w/sierra-nevada-brewing-co/1142",
    "Pliny the Elder",
    "Bud Light",
    "Guinness Draught"
  ],
  "beerStyle": "",
  "maxRecords": 100
}
```

You can submit up to 1,000 target entries in one run.

#### 🧾 Output

**Beer row fields**

| Field | Type | What it does |
| --- | --- | --- |
| `beerId` | string | Stable Untappd ID for the beer. |
| `beerUrl` | string | Public Untappd page for the beer. |
| `beerName` | string | Beer name shown on Untappd. |
| `breweryName` | string or null | Brewery name shown on Untappd, when available. |
| `breweryUrl` | string or null | Public Untappd page for the brewery, when available. |
| `beerStyle` | string or null | Beer style shown on Untappd, when available. |
| `abvPercent` | number or null | Alcohol by volume as a percent, when available. |
| `ibu` | integer or null | Bitterness value in IBU, when available. |
| `globalRating` | number or null | Untappd beer rating from 0 to 5, when available. |
| `ratingCount` | integer or null | Number of ratings used for the beer rating, when available. |
| `totalCheckins` | integer or null | Total check-ins as a whole number, when available. |
| `totalCheckinsText` | string or null | Check-in count as shown by Untappd, including text such as `K`, `M`, or `+`. |
| `description` | string or null | Public beer description from Untappd, when available. |
| `imageUrl` | string or null | Public URL for the beer label image, when available. |
| `sourceRank` | integer or null | Position in a top-rated, search, or brewery list. It is null for direct beer targets. |
| `checkins` | array of objects | Public check-ins found for the beer. It is empty when none are shown. |
| `checkins[].checkinId` | string | Stable Untappd ID for the check-in. |
| `checkins[].checkinUrl` | string | Public Untappd page for the check-in. |
| `checkins[].checkinDate` | string or null | Date or time shown for the check-in, when available. |
| `checkins[].userName` | string or null | User name shown for the check-in, when available. |
| `checkins[].userSlug` | string or null | Untappd user name slug, when available. |
| `checkins[].userProfileUrl` | string or null | Public Untappd page for the user, when available. |
| `checkins[].userAvatarUrl` | string or null | Public URL for the user's avatar, when available. |
| `checkins[].rating` | number or null | Check-in rating from 0 to 5, when available. |
| `checkins[].comment` | string or null | Public text in the check-in, when available. |
| `checkins[].servingStyle` | string or null | Serving style such as Draft, Can, or Bottle, when available. |
| `checkins[].venueName` | string or null | Venue name on the check-in, when available. |
| `checkins[].venueUrl` | string or null | Public Untappd page for the venue, when available. |
| `checkins[].purchasedFrom` | string or null | Place where the beer was bought, when shown. |
| `checkins[].photoUrls` | array of strings | Public photo URLs attached to the check-in. |

**Example beer row**

This genuine row from a successful current-beta run is shortened. It keeps one real public check-in and uses the JSON string `"..."` to mark the omitted check-ins.

```json
{
  "beerId": "6674918",
  "beerUrl": "https://untappd.com/b/sierra-nevada-brewing-co-hoptimum-2026/6674918",
  "beerName": "Hoptimum (2026)",
  "breweryName": "Sierra Nevada Brewing Co.",
  "breweryUrl": "https://untappd.com/SierraNevada",
  "beerStyle": "IPA - Triple",
  "abvPercent": 11,
  "ibu": 75,
  "globalRating": 4.1375,
  "ratingCount": 1484,
  "totalCheckins": 1860,
  "totalCheckinsText": "1,860",
  "description": "Fancy seeing me here! After all, the place can hardly hold 11% — I’m scraping the rafters. Makes for a good view, and it’s clear when a room needs what I’ve got in spades: fruity, dank, and devilishly hoppy flavor. Your night is looking up. Savor it and don’t blink because I like to vanish in a puff of lupulin dust. Show Less",
  "imageUrl": "https://assets.untappd.com/site/beer_logos/beer-11810_1c68a_sm.jpeg",
  "sourceRank": 4,
  "checkins": [
    {
      "checkinId": "1593590563",
      "checkinUrl": "https://untappd.com/user/cdyde/checkin/1593590563",
      "checkinDate": "Wed, 12 Aug 2026 23:34:02 +0000",
      "userName": "Chris Yde",
      "userSlug": "cdyde",
      "userProfileUrl": "https://untappd.com/user/cdyde",
      "userAvatarUrl": "https://assets.untappd.com/profile/73b9a41deefd0a0d0f08e6b7f1f5a893_100x100.jpg",
      "rating": 4,
      "comment": null,
      "servingStyle": "Taster",
      "venueName": "Lowes Foods #214 - Morehead City",
      "venueUrl": "https://untappd.com/v/lowes-foods-214-morehead-city/2721997",
      "purchasedFrom": "Lowes Foods #214 - Morehead City",
      "photoUrls": [
        "https://images.untp.beer/crop?width=640&height=640&stripmeta=true&url=https://untappd.s3.amazonaws.com/photos/2026_08_12/f7935f691c9b4669af97d8a12f36cf70_c_1593590563_raw.jpg"
      ]
    },
    "..."
  ]
}
```

#### 💳 Pricing

**Saved beer**

The Actor uses pay-per-event pricing and charges for each public beer saved to the dataset. The tiered price is `$0.000075` to `$0.000018` per saved beer across Apify plans. Visible public check-ins stay inside that beer row and are not charged as separate rows.

Start with a small `maxRecords` value if you want to review a small dataset first.

#### 🔌 Integrations

**Apify workflow**

Open the dataset in Apify Console, read it through the Apify API, schedule repeat runs, or use webhooks and available Apify integrations. You can export the dataset in the formats offered by Apify.

You can export results as JSON, CSV, Excel, XML, RSS, or HTML when those formats are offered by Apify.

https://www.youtube.com/watch?v=bNACk1\_S\_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

#### ❓ FAQ

##### Do I need an Untappd account or API key?

No. The Actor reads public Untappd pages and does not ask for an Untappd account, cookies, passwords, login details, or an API key. It does not scrape private, friends-only, logged-in-only, or account-specific data.

##### What happens when I leave `targets` empty?

The Actor uses top-rated beer discovery. Add `beerStyle` if you want to narrow that discovery to a public Untappd style, such as `IPA - Imperial / Double`, `Stout - Imperial / Double`, or `Sour - Fruited`.

##### Can I mix beer URLs, brewery URLs, beer IDs, and search terms?

Yes. Add them together in `targets`. The Actor uses each value to find public beer data.

##### Are check-ins separate dataset rows?

No. The dataset saves one row per beer. Visible public check-ins are nested in the `checkins` array inside that beer row.

##### Why is a field null or a check-ins list empty?

Untappd may not show every field on every public page. The Actor keeps available values, uses `null` for missing scalar values, and uses an empty array when no check-ins are shown.

##### Can I collect beers from a brewery page?

Yes. Add a public Untappd brewery URL to `targets`. The Actor discovers public beer links from that page and saves beer rows until it reaches your limit or the source is exhausted.

##### Does this return every historical check-in for a beer?

No. It returns the visible public check-ins that Untappd exposes on the collected beer page. It does not promise a complete historical archive.

##### Why can a run return fewer beers than my limit?

Public source pages may show fewer beers, omit fields, or expose no usable data. The Actor saves available beer rows and does not guarantee a result count.

##### How can I keep a first run small?

Set `maxRecords` to a small positive number such as `25`, then review the dataset before raising the limit or adding more targets.

### 📝 Changelog

**v0.1**

- Simplified the input form.
- Included visible public check-ins by default.
- Lowered saved-beer pricing.

**v0.0**

- Initial release.

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~untappd-scraper/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Related Actors

- [Google Maps List Scraper: 30+ Fields Per Place](https://apify.com/maximedupre/google-maps-shared-list-scraper): Build a public list of breweries, bars, or bottle shops with place details.
- [Untappd Scraper - Beer Ratings & Check-ins](https://apify.com/lulzasaur/untappd-scraper): Compare public beer ratings, styles, and check-in counts.
- [Untappd Scraper](https://apify.com/automation-lab/untappd-scraper): Collect public beer and brewery fields from search terms and beer URLs.
- [Untappd Beer Review Scraper](https://apify.com/parseforge/untappd-beer-review-scraper): Collect public beer check-ins with reviewer and venue context.
- [Untappd Beer Review Scraper](https://apify.com/jungle_synthesizer/untappd-beer-review-scraper): Review public check-in ratings, comments, and serving details.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

## `targets` (type: `array`):

Paste beer URLs, brewery URLs, beer IDs, or search terms. Leave empty to collect top-rated beers.

## `beerStyle` (type: `string`):

Narrow top-rated discovery with a public Untappd beer style, such as IPA - Imperial / Double.

## `maxRecords` (type: `integer`):

Optional limit for saved beer rows across all targets. Leave it empty to collect all available rows until the source is exhausted.

## Actor input object example

```json
{
  "targets": [
    "https://untappd.com/b/the-alchemist-heady-topper/4691",
    "https://untappd.com/w/sierra-nevada-brewing-co/1142",
    "Pliny the Elder",
    "Bud Light",
    "Guinness Draught"
  ],
  "maxRecords": 100
}
```

# Actor output Schema

## `results` (type: `string`):

The default dataset has one beer row per result. It includes public check-ins when Untappd shows them.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "targets": [
        "https://untappd.com/b/the-alchemist-heady-topper/4691",
        "https://untappd.com/w/sierra-nevada-brewing-co/1142",
        "Pliny the Elder",
        "Bud Light",
        "Guinness Draught"
    ],
    "beerStyle": "",
    "maxRecords": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/untappd-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "targets": [
        "https://untappd.com/b/the-alchemist-heady-topper/4691",
        "https://untappd.com/w/sierra-nevada-brewing-co/1142",
        "Pliny the Elder",
        "Bud Light",
        "Guinness Draught",
    ],
    "beerStyle": "",
    "maxRecords": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/untappd-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "targets": [
    "https://untappd.com/b/the-alchemist-heady-topper/4691",
    "https://untappd.com/w/sierra-nevada-brewing-co/1142",
    "Pliny the Elder",
    "Bud Light",
    "Guinness Draught"
  ],
  "beerStyle": "",
  "maxRecords": 100
}' |
apify call maximedupre/untappd-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,maximedupre/untappd-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/g3jpV51Ne1gYAmUt8/builds/QSq8ICPom2rr6Yenj/openapi.json
