FairPrice Scraper
Pricing
from $3.00 / 1,000 results
FairPrice Scraper
Scrape FairPrice.com.sg (Singapore) grocery products by keyword search or exact product ID/URL. Get prices, promotions, ratings, images and specifications.
Pricing
from $3.00 / 1,000 results
Rating
0.0
(0)
Developer
Crawler Bros
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
6 days ago
Last modified
Categories
Share
Scrape grocery product data from FairPrice.com.sg -- Singapore's largest supermarket chain (NTUC FairPrice). Get product titles, prices, promotions, ratings, and images from keyword search, or fetch full detail for specific product IDs/URLs.
What does this scraper do?
- Search by keyword -- find grocery products matching any search term (e.g. "milk", "rice", "instant noodles").
- Browse by category -- collect every product listed on a FairPrice category or brand-storefront page (e.g.
fp-lion). - Get product details -- fetch full descriptions, brand, barcode, and ratings for exact product IDs or URLs.
- Filter results -- by price range, minimum rating, and promotion/discount availability.
- Sort results -- by relevance, price (low-to-high or high-to-low), or rating.
No login, cookies, or paid proxy required.
Output
Each result is a JSON record. Search results include:
| Field | Description |
|---|---|
productId | FairPrice's product ID (from the product URL) |
title | Product name |
price | Current shelf price (SGD) |
currency | Always SGD (Singapore dollar) |
originalPrice | Original price before discount, when the product is on promotion |
savingsAmount | Amount saved vs. the original price, when shown |
rating | Average customer rating (0-5) |
imageUrl | Product image URL |
productUrl | Link to the product page |
onPromo | Whether the product currently has a promotional discount |
recordType | product |
scrapedAt | UTC timestamp of when the record was scraped |
Both search and productDetails results are additionally enriched (when available) with data from FairPrice's own embedded page state -- richer than what's visible in the rendered page alone:
| Field | Description |
|---|---|
brand | Brand/manufacturer name |
barcode | GTIN/EAN barcode |
images | Full product image gallery (all angles, not just the listing thumbnail) |
countryOfOrigin | Country of manufacture/origin |
dietaryAttributes | e.g. ["Halal", "Vegetarian"] |
nutrigrade | Singapore HPB Nutri-Grade label (A-D), for applicable beverages |
displayUnit | Pack size as shown on-shelf, e.g. 2L, 500g |
packType | e.g. ["Packet"], ["Bottle"] |
storageInformation | Storage instructions, e.g. "Store at 2°C - 4°C" |
ingredients | Ingredient list, when disclosed |
supplierName | Supplier/distributor of record |
category / categoryPath | FairPrice's own category, e.g. category: "Fresh Milk", categoryPath: "Dairy, Chilled & Eggs > Fresh Milk > Fresh Milk" |
reviewCount | Number of customer reviews (also used to compute rating, more precise than the listing-page rounded value) |
inStock | Whether the product currently has stock (search mode only) |
productDetails mode additionally returns description, availability, priceValidUntil, and internalSku.
Only fields that FairPrice actually provides for a given product are included -- no blank or placeholder values. Note: price, originalPrice, savingsAmount, and onPromo are always derived from the rendered page's visible pricing (never from the enrichment data above) -- FairPrice's embedded state has a discount/mrp pair whose meaning does not reliably correspond to "was/now" pricing (confirmed live: mrp equals the current price even when discount is nonzero for many products), so it is deliberately not used for price fields.
Input options
| Field | Mode | Description |
|---|---|---|
mode | all | search, byCategory, or productDetails |
searchQuery | search | Keyword to search for |
categorySlugOrUrl | byCategory | Category slug (e.g. fp-lion) or full category URL |
productIds / productUrls | productDetails | Exact product IDs or full product URLs |
sortBy | search, byCategory | relevance, priceAsc, priceDesc, ratingDesc |
minPrice / maxPrice | search, byCategory | Price range filter in SGD |
minRating | search, byCategory | Minimum customer rating (0-5) |
promoOnly | search, byCategory | Only include products currently on promotion |
maxItems | all | Maximum number of records to return |
maxPages | search, byCategory | Maximum result pages to scan |
Example use cases
- Price monitoring -- track prices and promotions for specific products or keywords over time.
- Basket comparison -- compare grocery pricing across a shopping list of keywords.
- Deal hunting -- filter for the biggest discounts or best-rated products.
- Catalog enrichment -- pull full descriptions, barcodes, and images for a list of known product IDs.
FAQ
Does this scraper require login or cookies? No. All data is scraped from FairPrice's own publicly rendered pages.
What currency are prices in? Singapore dollars (SGD), FairPrice's home market currency.
Why do some products lack a rating or originalPrice field?
FairPrice only returns rating/promotion data for products that actually have it. Fields are omitted rather than filled with placeholder values, in line with real-data accuracy.
How is sortBy applied?
FairPrice's own search page sort control is JavaScript-driven and doesn't expose a working URL parameter, so this actor collects a page pool and sorts it client-side by the requested field -- giving the same end result without needing a browser.
How many products can I scrape per run?
Up to maxItems (default 20, max 1000) per run. Search and category browsing paginate through FairPrice's real listing results (not capped to a single page), so a broad query like "milk" can return several hundred unique products in one run -- raise maxPages alongside maxItems if you need more than the first ~20 per query.
Limitations
productDetailsmode fetches each product ID/URL as an independent page and is fully reliable for any number of IDs.categorySlugOrUrlslugs are not centrally enumerable (FairPrice does not publish a finite category list) -- browse fairprice.com.sg and copy the/category/...path segment from any category or brand-storefront page you want to scrape.