Prices updated recently · 249 products tracked across 50 brands

Open Data Feeds

ProteinPrice publishes its full product, brand, and retailer dataset as plain JSON: free for developers, researchers, and AI search engines (Perplexity, ChatGPT, Claude) to consume. No API key. No rate limits. Just static files.

New → Full API documentation All 9 endpoints, full schemas, cURL / JS / Python examples, and use-case recipes.

The three endpoints

Products feed
249 products · ~100 KB
GET https://proteinprice.com/data/products.json

Every tracked product with price-per-retailer, size, servings, protein content, and Value Score.

# curl
curl https://proteinprice.com/data/products.json

# fetch (browser / Node)
const res  = await fetch('https://proteinprice.com/data/products.json');
const data = await res.json();
console.log(data.products[0]);

# python
import urllib.request, json
data = json.loads(urllib.request.urlopen('https://proteinprice.com/data/products.json').read())
Brands feed
50 brands · ~9 KB
GET https://proteinprice.com/data/brands.json

All tracked brands with ID, name, founding year, country, and short description.

# curl
curl https://proteinprice.com/data/brands.json

# fetch
const { brands } = await fetch('https://proteinprice.com/data/brands.json').then(r => r.json());

# python
import requests
brands = requests.get('https://proteinprice.com/data/brands.json').json()['brands']
Retailers feed
12 retailers · ~2 KB
GET https://proteinprice.com/data/retailers.json

All US retailers we track, with ID, display name, brand color, and homepage URL.

# curl
curl https://proteinprice.com/data/retailers.json

# fetch
const { retailers } = await fetch('https://proteinprice.com/data/retailers.json').then(r => r.json());

# python
retailers = requests.get('https://proteinprice.com/data/retailers.json').json()['retailers']

What you get

Feed Records Path
Products: every SKU we track, with all retailer prices 249 products /data/products.json
Brands: manufacturer metadata 50 brands /data/brands.json
Retailers: US store metadata 12 retailers /data/retailers.json

License

Free to use for any non-commercial or commercial purpose. Please attribute ProteinPrice.com when displaying our data, and link back to proteinprice.com where possible. No warranty: prices change frequently, always confirm at the retailer before purchase.

Update frequency

JSON feeds update with each price refresh: hourly. The lastUpdated field at the top of every feed is an ISO-8601 UTC timestamp. Scrapers run roughly every 2–3 hours; new prices are committed and feeds redeployed within minutes.

Schema documentation

products.json: product fields

idStable slug, unique per SKU (e.g. on-gold-standard-whey-chocolate-5lb)
brandIdForeign key to brands.json (e.g. optimum-nutrition)
nameProduct name as marketed by the brand
categoryOne of: whey-blend, whey-isolate, whey-concentrate, casein, plant, mass-gainer, collagen, clear-whey
flavorFlavor variant string
sizeG / sizeLbTub size in grams and pounds
servingsServings per container
proteinGGrams of protein per serving
servingGServing size in grams
valueScore0–100 score (g protein per $ at best retailer, normalized). Higher = better value.
pricesObject keyed by retailer ID. Each entry has price (USD) and inStock (boolean).

brands.json: brand fields

idStable slug (e.g. dymatize)
nameFull brand name
shortName2–3 letter abbreviation used in UI
descOne-line marketing description
foundedYear the brand was founded
countryISO 2-letter country code of brand HQ
tubColor / lidColor / cardBgVisual styling values (for rendering brand cards)

retailers.json: retailer fields

idStable slug, used as price key inside products (e.g. walmart, amazon)
nameDisplay name
shortNameShort label
color / bgBrand color and background tint
urlRetailer homepage URL

Questions, suggestions, or a use case to share? Email [email protected]. See also /llms.txt for the AI-readable site summary.