Untappd allows you to download your checkin data in JSON and CSV formats (if you are a supporter). This is great, however they do not have an option to download the data of just your 'unique' checkins. This script will take the json file you downloaded from untappd and create both json and csv files with only your last checkins of each beer.
There are also additional parsing options detailed below. I use this to generate the beer map on my website. So this has become mostly tailored towards that.
This project uses pixi to manage its environment (Python + dev tooling from conda-forge):
pixi installOr, for a plain pip install of just the CLI:
pip install -e .untappd-parser <UNTAPPD-DATA>.jsonAvailable keys: brewery_name, venue, beer_type, photo_url, bid
untappd-parser <UNTAPPD-DATA>.json --key brewery_nameuntappd-parser <UNTAPPD-DATA>.json --split-by-visitsThis creates 3 separate CSV files:
*_1_visit.csv- venues with exactly 1 visit*_2-4_visits.csv- venues with 2-4 visits*_5+_visits.csv- venues with 5 or more visits
--no-human-keys- Keep original snake_case keys (e.g.venue_nameinstead ofVenue Name)--no-strip-backend- Keep all keys from the original JSON file--no-fancy-dates- Keep dates inYYYY-MM-DD HH:MM:SSformat instead of readable format
Open untappd.html in your browser to use the parser without installing Python.
PyScript runs the same untappd_parser package in the
browser via Pyodide — it fetches the source files directly, so there is no build
step or bundle to maintain.
- Serve the file
pixi run serve # or: python3 -m http.server 8080 - Open in browser: http://localhost:8080/untappd.html
- Drag and drop your Untappd JSON file
- Download the processed CSVs with visit distribution
All dev tasks run through pixi (see pixi.toml for the full list):
pixi run lint # ruff check
pixi run format # ruff format
pixi run typecheck # mypy
pixi run test # pytest
pixi run check # lint + typecheck + test (what CI runs)The browser interface (untappd.html) loads src/untappd_parser/ directly via
PyScript, so editing parser.py or web.py needs no rebuild — just reload the page.
MIT