{
  "openapi": "3.0.1",
  "info": {
    "title": "Untappd Beer, Brewery and Check-in Scraper",
    "description": "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.",
    "version": "1.0",
    "x-build-id": "0uvlhL7AfY2CdpEbQ"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~untappd-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-untappd-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/abotapi~untappd-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-untappd-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/abotapi~untappd-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-untappd-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "required": [
          "mode"
        ],
        "properties": {
          "mode": {
            "title": "Mode",
            "enum": [
              "search",
              "brewery",
              "topRated",
              "url"
            ],
            "type": "string",
            "description": "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.",
            "default": "search"
          },
          "entityType": {
            "title": "What to search for",
            "enum": [
              "beer",
              "brewery",
              "venue"
            ],
            "type": "string",
            "description": "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.",
            "default": "beer"
          },
          "queries": {
            "title": "Search keywords",
            "type": "array",
            "description": "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.",
            "items": {
              "type": "string"
            }
          },
          "breweries": {
            "title": "Breweries",
            "type": "array",
            "description": "Only used when mode = brewery, ignored in the other modes. Brewery names, numeric ids, vanity addresses such as /dogfishbeer, or full brewery links.",
            "items": {
              "type": "string"
            }
          },
          "includeBreweryBeers": {
            "title": "Also return every beer the brewery makes",
            "type": "boolean",
            "description": "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.",
            "default": true
          },
          "urls": {
            "title": "Site links",
            "type": "array",
            "description": "Only used when mode = url, ignored in the other modes. Mix freely: beer pages such as /b/<slug>/<id>, brewery pages, venue pages such as /v/<slug>/<id>, search pages and /beer/top_rated chart pages. A bare numeric beer id is also accepted.",
            "items": {
              "type": "string"
            }
          },
          "styles": {
            "title": "Beer styles",
            "type": "array",
            "description": "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.",
            "items": {
              "type": "string"
            }
          },
          "country": {
            "title": "Country",
            "type": "string",
            "description": "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."
          },
          "minRating": {
            "title": "Minimum rating (0 to 5)",
            "minimum": 0,
            "maximum": 5,
            "type": "integer",
            "description": "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.",
            "default": 0
          },
          "minRatingCount": {
            "title": "Minimum number of ratings",
            "minimum": 0,
            "type": "integer",
            "description": "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.",
            "default": 0
          },
          "minAbv": {
            "title": "Minimum ABV (%)",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Optional. Keep only beers at or above this alcohol strength, as a percentage. Applied by the site's index. Use 0 for no minimum.",
            "default": 0
          },
          "maxAbv": {
            "title": "Maximum ABV (%)",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Optional. Keep only beers at or below this alcohol strength, as a percentage. Applied by the site's index. Leave empty for no maximum."
          },
          "inProductionOnly": {
            "title": "Only beers still in production",
            "type": "boolean",
            "description": "Optional. Keep only beers the brewery still makes, dropping retired and one-off brews. Applied by the site's index.",
            "default": false
          },
          "excludeHomebrew": {
            "title": "Exclude homebrew",
            "type": "boolean",
            "description": "Optional. Drop beers entered as homebrew rather than as a commercial release. Applied by the site's index.",
            "default": false
          },
          "minCheckins": {
            "title": "Minimum total check-ins",
            "minimum": 0,
            "type": "integer",
            "description": "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.",
            "default": 0
          },
          "sortBy": {
            "title": "Sort by",
            "enum": [
              "popularity",
              "popularity_recent",
              "name_asc",
              "name_desc",
              "brewery_name",
              "abv_desc",
              "abv_asc"
            ],
            "type": "string",
            "description": "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.",
            "default": "popularity"
          },
          "fetchDetails": {
            "title": "Fetch details and check-ins",
            "type": "boolean",
            "description": "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.",
            "default": false
          },
          "maxCheckinsPerEntity": {
            "title": "Max check-ins per record",
            "minimum": 0,
            "type": "integer",
            "description": "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 0 to return the counters and description but no individual check-ins. The site's own page carries about 20 recent check-ins for a logged out visitor, so values above that return what the page has.",
            "default": 20
          },
          "maxItems": {
            "title": "Max results",
            "minimum": 0,
            "type": "integer",
            "description": "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.",
            "default": 20
          },
          "maxPages": {
            "title": "Max result pages per keyword, brewery or link",
            "minimum": 0,
            "type": "integer",
            "description": "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.",
            "default": 0
          },
          "resumeFromRunId": {
            "title": "Resume from a previous run",
            "type": "string",
            "description": "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."
          },
          "incrementalMode": {
            "title": "Incremental changes for scheduled runs",
            "type": "boolean",
            "description": "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). 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.",
            "default": false
          },
          "stateKey": {
            "title": "State key (optional, incremental mode only)",
            "type": "string",
            "description": "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."
          },
          "emitUnchanged": {
            "title": "Emit unchanged records (incremental mode only)",
            "type": "boolean",
            "description": "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.",
            "default": false
          },
          "emitExpired": {
            "title": "Emit expired records (incremental mode only)",
            "type": "boolean",
            "description": "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.",
            "default": false
          },
          "proxy": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Apify Proxy is recommended. The standard pool is the default and is sufficient for this site.",
            "default": {
              "useApifyProxy": true
            }
          },
          "mcpConnectors": {
            "title": "Pipe results into your apps (optional)",
            "type": "array",
            "description": "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)."
          },
          "notionParentPageUrl": {
            "title": "Notion parent page (Notion connector only)",
            "type": "string",
            "description": "URL or id of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors."
          },
          "maxNotifyListings": {
            "title": "Max items to export per connector",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Cap on items written to each connector per run. Does not affect the dataset.",
            "default": 50
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}