Com APIfairprice.com.sg ↗
Access NTUC FairPrice meat product listings, selling prices, regular prices, pack weights, and price-per-100g via 3 structured endpoints.
What is the Com API?
The FairPrice.com.sg API exposes 3 endpoints covering NTUC FairPrice's meat and seafood catalogue in Singapore, returning selling price, regular price, pack weight in grams, and a computed price-per-100g for each product. Use list_meat_categories to discover all browsable category slugs, list_category_products to paginate a specific category, or search_products to run a keyword search across the full catalogue with optional brand and country-of-origin filters.
No input parameters required.
curl -X GET 'https://api.parse.bot/scraper/15f02241-a4e6-434b-acdc-6b15bbde8189/list_meat_categories' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace fairprice-com-sg-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: FairPrice meat products — browse categories, list products, search."""
from parse_apis.fairprice_com_sg_api import FairPrice, SortOrder, InputFormatInvalid
client = FairPrice()
# Browse meat/seafood categories and pick the first one.
cat = client.categories.list(limit=5).first()
if cat is not None:
print(f"Category: {cat.name} (storage: {cat.storage}, parent: {cat.parent_name})")
# List products in that category, cheapest first.
for product in cat.products.list(sort=SortOrder.PRICE_ASC, limit=3):
print(f" {product.name} — ${product.price:.2f} ({product.display_unit})")
if product.offers:
print(f" Offer: {product.offers[0].description}")
# Search across the whole catalogue by keyword.
try:
hit = client.products.search(query="minced beef", sort=SortOrder.PRICE_ASC, limit=1).first()
except InputFormatInvalid as e:
print(f"Search rejected by site: {e.message}")
hit = None
if hit is not None:
print(f"\nCheapest minced beef: {hit.name} by {hit.brand}")
print(f" ${hit.price:.2f} (regular ${hit.regular_price:.2f}, save ${hit.discount:.2f})")
if hit.weight_grams is not None and hit.price_per_100g is not None:
print(f" {hit.weight_grams:.0f}g — ${hit.price_per_100g:.2f}/100g")
print("\nexercised: categories.list / category.products.list / products.search")
Returns the leaf shopping categories under FairPrice's 'Meat & Seafood' department plus the 'Frozen Meat' branch of the 'Frozen' department, deduplicated by slug (a category that appears in both departments is listed once). Each row carries the category_slug accepted by list_category_products and a storage label (fresh, frozen, chilled or other) derived from the category name. One request; no pagination. Seafood leaves are included because the site groups them under the same department.
No input parameters required.
{
"type": "object",
"fields": {
"count": "integer number of category rows",
"categories": "array of category rows: category_id (integer), name, category_slug (pass to list_category_products), parent_name, top_level_name, storage (fresh|frozen|chilled|other, derived from the name), url"
},
"sample": {
"data": {
"count": 18,
"categories": [
{
"url": "https://www.fairprice.com.sg/category/frozen-chicken",
"name": "Frozen Chicken & Poultry",
"storage": "frozen",
"category_id": 2186,
"parent_name": "Frozen Meat",
"category_slug": "frozen-chicken",
"top_level_name": "Frozen"
},
{
"url": "https://www.fairprice.com.sg/category/fresh-pork",
"name": "Fresh Pork",
"storage": "fresh",
"category_id": 2129,
"parent_name": "Pork",
"category_slug": "fresh-pork",
"top_level_name": "Meat & Seafood"
}
]
},
"status": "success"
}
}About the Com API
Category Discovery
list_meat_categories returns a deduplicated list of leaf categories drawn from the Meat & Seafood department and the Frozen Meat branch of the Frozen department. Each row includes category_id, name, category_slug, parent_name, and top_level_name. The category_slug value is what you pass directly to list_category_products — no additional lookup needed.
Browsing Products by Category
list_category_products accepts a required category_slug (e.g. frozen-chicken) and optional parameters: page (1-based, 20 products per page), sort, brand, and country. The response includes title (the category heading as shown on-site), total_count, total_pages, has_more, and an array of product rows. Each product row carries product_id, name, brand, slug, url, image, category, category_slug, country_of_origin, storage_type, the selling_price (regular price minus any advertised single-unit discount, in SGD), regular_price, weight_g (parsed from the site's display unit, null if the unit is not a weight), and price_per_100g (computed, null when weight is unavailable).
Keyword Search
search_products accepts a required query string (e.g. minced beef) and the same optional filters as list_category_products: page, sort, brand, and country. The response shape is identical to list_category_products except title is always null for search results. Both endpoints report total_count and total_pages as site-reported figures, so you can paginate reliably without overshooting.
Data Notes
Pack weight is parsed from the product's display unit and will be null when the site lists a product by count or volume rather than weight. The price_per_100g field is derived from selling_price and weight_g; if either is absent the field is null. Brand and country filters match the labels as they appear in the site's filter panel — pass them exactly as shown there (e.g. Australia, not AUS).
The Com API is a managed, monitored endpoint for fairprice.com.sg — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when fairprice.com.sg changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official fairprice.com.sg API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Track weekly selling-price movements for specific meat SKUs using
product_idas a stable key. - Build a price-per-100g comparison table across fresh and frozen chicken cuts using
weight_gandprice_per_100g. - Filter Australian-origin beef products with the
countryparameter and monitor regular vs. discounted prices. - Enumerate every meat and seafood category slug with
list_meat_categoriesbefore syncing a product database nightly. - Search for a specific cut (e.g. 'pork belly') across the whole catalogue using
search_productsand surface the cheapest brand byselling_price. - Aggregate brand coverage across categories by collecting
brandfields from paginatedlist_category_productsresponses. - Compare storage type distribution (chilled vs. frozen) across a category by reading the
storage_typefield on product rows.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does NTUC FairPrice offer an official developer API?+
How does pagination work across the three endpoints?+
list_category_products and search_products both return 20 products per page. Each response includes total_count (site-reported total matching products), total_pages, and a has_more boolean. Pass the page parameter (1-based) to step through results. list_meat_categories returns all categories in a single call with no pagination.When is the `weight_g` or `price_per_100g` field null?+
selling_price and regular_price are still returned, but a per-gram comparison is not possible.