For years, PunkAPI was one of the friendliest first APIs on the internet: BrewDog published their entire DIY Dog homebrew recipe catalogue for free, someone turned it into a keyless REST API, and a thousand "build a beer finder" tutorials, bootcamp exercises, and portfolio apps were born. Search by name, filter by ABV, page through Punk IPA and Tactical Nuclear Penguin — it was a genuinely fun dataset with real numeric fields to filter on. Credit where it's due.
It announced its shutdown for May 1st, 2024. Two years on it's not just the API that's dead — the entire domain is gone (verified September 2026):
curl "https://api.punkapi.com/v2/beers?page=1"
# curl: (6) Could not resolve host: api.punkapi.com
curl https://images.punkapi.com/v2/001.png
# curl: (6) Could not resolve host: images.punkapi.com
curl https://punkapi.com/
# curl: (6) Could not resolve host: punkapi.com ← even the shutdown notice
NXDOMAIN, all three. In a browser that's a TypeError: Failed to fetch before any HTTP happens. Every tutorial that opens with that curl — and every old project whose saved beer objects embed images.punkapi.com URLs — is broken at the DNS level, with no error page left to explain why.
Alexander Ivanovsky's punkapi rebuilt the API from the DIY Dog V8 catalogue and hosts it at punkapi-alxiw.amvera.io — keyless, CORS-open (access-control-allow-origin: *), with 415 recipes (the original served 325), images included, and the classic filters intact (all verified September 2026):
curl "https://punkapi-alxiw.amvera.io/v3/beers?page=1&beer_name=punk"
# → 6 beers: Punk IPA 2007-2010, Punk Monk, Sunk Punk…
curl "https://punkapi-alxiw.amvera.io/v3/beers?page=1&abv_gt=10"
# → the strong stuff, just like the old ?abv_gt=
curl https://punkapi-alxiw.amvera.io/v3/beers/random # still a thing
curl https://punkapi-alxiw.amvera.io/v3/images/001.png # images live here now
If you just want your beer app reading live again, point it there and thank the maintainer. But porting an old tutorial, you'll meet these edges (each one live-verified):
/v3, not /v2. Swapping only the host gets you 404 {"detail":"Not Found"}.page is required. The classic bare fetch('…/beers') — and even ?beer_name=punk alone — returns 422 with a FastAPI validation object, not an array. data.map() throws.per_page clamps to 10–80. per_page=3 for a teaser row? 422: Input should be greater than or equal to 10.image_url is gone. Records now carry "image": "001.png" — relative. Old code rendering <img src={beer.image_url}> shows undefined; you must prefix /v3/images/ yourself.POST /v3/beers → 405 — fine, until the exercise adds a "rate this beer" button.The full recipes with brewing method run ~1.3MB, but the fields a beer app renders — name, tagline, description, ABV/IBU/EBC, food pairing, brewers' tips — fit in one import. Capture once, host your own copy, no signup:
for p in 1 2 3 4 5 6; do
curl -s "https://punkapi-alxiw.amvera.io/v3/beers?page=$p&per_page=80"
done | jq -s '{beers: [add[] | del(.method,.ingredients,.boil_volume,.volume)]}' > db.json
curl -s -X POST "https://mockbird.mockbird.workers.dev/api/projects/import?name=punk" \
-H 'content-type: application/json' --data-binary @db.json
# → {"id":"YOUR_ID","adminKey":"YOUR_ADMIN_KEY",
# "resources":[{"name":"beers","records":415,…}]}
Ids are preserved verbatim — /beers/1 is still Punk IPA 2007–2010, so hardcoded ids from old tutorials keep resolving. The image field survives too; hotlink https://punkapi-alxiw.amvera.io/v3/images/001.png and the bottles still render.
Every command below ran against a live import while writing this guide:
BASE=https://mockbird.mockbird.workers.dev/m/YOUR_ID
curl "$BASE/beers?name_like=punk" # 6 beers — same set as beer_name=punk
curl "$BASE/beers?abv_gte=10" # X-Total-Count: 84 — ranges, with a count
curl "$BASE/beers?q=grapefruit" # full-text: 36 beers mention grapefruit
curl "$BASE/beers?sortBy=abv&order=desc&limit=3&select=name,abv"
# → The End Of History (55%), Sink The Bismarck! (41%),
# Tactical Nuclear Penguin (32%) — numeric sort, field projection
No required page param (but ?page=2&limit=10 works, down to a teaser row of 1), X-Total-Count on every list, and writes are real:
curl -X PATCH "$BASE/beers/1" \
-H 'content-type: application/json' -d '{"favourite":true}'
# → persists; GET-back shows favourite:true — your button has a backend
curl -X POST "$BASE/beers" -H 'content-type: application/json' \
-d '{"name":"My Homebrew","tagline":"First batch.","abv":5.2}'
# → id 416 — X-Total-Count is now 416
/m/YOUR_ID/types.ts generates a TypeScript Beer interface from your records (?format=zod for Zod), and failure drills are a query param away: ?mock_delay=3000, ?mock_status=503, ?mock_ratelimit=5 — the outage story you just lived through, reproducible on demand for your error-state tests.
| PunkAPI (original) | punkapi-alxiw /v3 | Your import | |
|---|---|---|---|
| Reachable | ✘ NXDOMAIN since 2024 | ✔ keyless, CORS * | ✔ keyless, CORS * |
| Catalogue | 325 beers (was) | ✔ 415 — DIY Dog V8 | ✔ the same 415, yours |
| Bare list request | worked | ✘ 422 — page required | ✔ works |
| Name search | ?beer_name= | ✔ ?beer_name= | ✔ ?name_like=, ?q= full-text |
| ABV/IBU ranges | ?abv_gt= | ✔ ?abv_gt= | ✔ ?abv_gte= on any numeric field |
| Sorting | ✘ | ✘ | ✔ ?sortBy=abv&order=desc |
| Total count | ✘ | ✘ | ✔ X-Total-Count |
| Images | ✘ CDN dead | ✔ /v3/images/ | ✔ hotlink the successor's |
| Writes persist | ✘ | ✘ 405 | ✔ POST/PATCH/DELETE are real |
| Full brewing method | — | ✔ hops, mash, twists | ✘ trimmed to fit (by choice, above) |
The fair split: for live browsing of the full recipes — mash temperatures, hop schedules, the lot — use the successor and be glad someone rebuilt it. The moment you're building or testing a beer app — sorting by strength, paginating freely, wiring a favourites button, keeping CI green when a free-tier host has a bad day — spend the one curl and own the copy. Current status of the successor: /status/punkapi. The meta-lesson of PunkAPI's death is the lesson of this whole guides series: tutorial APIs are gifts with no uptime contract. Related: Studio Ghibli API (dead Heroku), GitHub Jobs (dead since 2021), CoinDesk BPI (dead), deterministic test data.