FairPrice Scraper – Singapore Grocery Prices & Products
Pricing
from $2.00 / 1,000 search results
FairPrice Scraper – Singapore Grocery Prices & Products
Scrape NTUC FairPrice (Singapore's largest grocery) without an API: product name, brand, price, original price, discount, promo, unit, category and stock. Bulk-paste keywords; export JSON/CSV/Excel. Ideal for grocery price monitoring and comparison.
Pricing
from $2.00 / 1,000 search results
Rating
0.0
(0)
Developer
Chad
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
FairPrice Scraper | Singapore Grocery Prices, Products & Discounts (No API, No Login)
Scrape NTUC FairPrice (fairprice.com.sg) supermarket product data: keyword-search listings, selling price, promo labels, brand, category, stock status and images. It reads FairPrice's public JSON API — no login, no API token, no browser — and outputs clean, structured snake_case data.
Singapore FMCG price intelligence is a proven B2B need — running the same set of keywords on a schedule builds a running SG supermarket price-tracking series.
What you get
Every product returns the fields below (missing values are always null — no field is dropped):
| Field | Description |
|---|---|
product_id | FairPrice product ID |
name | Product name |
brand | Brand |
price | Selling price (SGD) |
original_price | Original price (pre-promo MRP; null when there is no promotion) |
discount_pct | Discount percentage (computed from price / original price; null when there is no promotion) |
price_per_unit | Unit price (planned for v1.1, currently always null) |
unit_of_measure | Unit of measure, e.g. 1 L, 500 g |
category | Main category name |
category_path | Full category path (planned for v1.1, currently always null) |
in_stock | Whether the item is in stock |
is_express_delivery | Whether express delivery is available (planned for v1.1, currently always null) |
promo_label | Promo copy, e.g. *Buy 1* Save $0.35 |
rating | Average rating (null when there are no reviews) |
review_count | Number of reviews |
image_urls | Array of product image URLs |
product_url | Product page URL |
source_mode | Source mode (search) |
source_query | The keyword that triggered this row |
scraped_at | Scrape timestamp (ISO 8601) |
Fields marked "planned for v1.1" are already reserved in the output schema and will be populated in a future release once source data support is validated.
Modes (v1.0 has search only)
| Mode | What it does | Billing event | Price |
|---|---|---|---|
| 🔎 search | Keyword search → product listings (price, promo, stock, category, images) | search-listing (per row) | $0.002 |
Each Run also charges a one-time actor-start fee of $0.005. All charges are billed only after data is successfully written to the dataset, and the Run log prints total_items / charged / skipped for reconciliation.
Product detail (single-product page scraping) is planned for v1.1 — the search mode already returns brand, price, promo, category and image fields on every row, which covers most price-comparison and monitoring use cases in v1.0.
Input fields
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
keywords | string[] | one required (or bulkInput) | — | Search keywords; one concept per keyword works best. Up to 50 per run. |
bulkInput | string | optional | — | One per line (press Enter, no quotes or commas). Merged into keywords at runtime. Fastest is to paste a column from Google Sheets / Excel. |
storeId | string | optional | — | Specify a FairPrice store to get that store's price/stock. Leave blank to use the default online warehouse. |
maxItems | integer | optional | 50 | Max results per keyword (1-500). |
proxyConfiguration | object | optional | off | Advanced, usually left off — FairPrice has no Cloudflare / bot challenge. |
Examples
🔎 Basic keyword search
{ "keywords": ["milk"], "maxItems": 30 }
📋 Bulk keywords (one per line)
{ "keywords": ["coffee"], "bulkInput": "eggs\nrice\nolive oil", "maxItems": 20 }
🏬 Specific store
{ "keywords": ["bread"], "storeId": "165", "maxItems": 50 }
Sample output row
{"product_id": "1577586","name": "RedMan UHT Full Cream Milk 3.5%","brand": "Redman","price": 3.13,"original_price": null,"discount_pct": null,"price_per_unit": null,"unit_of_measure": "1 L","category": "UHT Milk","category_path": null,"in_stock": true,"is_express_delivery": null,"promo_label": "*Buy 1* Save $0.35","rating": null,"review_count": null,"image_urls": ["https://media.nedigital.sg/fairprice/90221204_XL1_..."],"product_url": "https://www.fairprice.com.sg/product/redman-uht-full-cream-milk-35-1577586","source_mode": "search","source_query": "milk","scraped_at": "2026-07-04T00:00:00.000Z"}
Notes
- Public data only. No login and no FairPrice account required; it never accesses anything behind authentication.
- No login / no API token. Fill in the input and run — no keys to configure. Requests go straight to FairPrice's public JSON search endpoint.
- JSON API + CheerioCrawler — no browser. Keeps compute cost low and avoids the overhead of a headless browser.
- Polite to the site. Per-domain concurrency is capped at 5, failures retry with exponential backoff up to 3 times, and it auto-stops after 5 pages with no new data — no idle burn.
- Prices and promotions reflect what FairPrice returns at scrape time and will vary by store and by time of day.
FAQ
Q: Can it capture promo pricing?
Yes — it returns the current selling price (price), the pre-promo original price (original_price), the computed discount percentage (discount_pct), and the promo copy (promo_label). When there is no active promotion, original_price and discount_pct are null.
Q: Can I scrape prices for a specific store?
Yes, set storeId. Leave it blank to use the default online warehouse.
Q: Will it get blocked? FairPrice has no Cloudflare or bot challenge; direct datacenter requests work fine and a proxy generally isn't needed.
Q: How is billing calculated?
Each Run charges actor-start once ($0.005); each product listing charges search-listing ($0.002). Both are billed only after data is written to the dataset, and the Run log prints the actual charged count.
Q: Do you support the product detail page (full single-product data)?
v1.0 ships search-listing only. If demand is proven, a detail mode is planned for v1.1.
Deploy
apify login # first time: paste your Apify token (never written to the repo)apify push # build and upload to Apify Store
After publishing, set the PPE event prices in Apify Console → Monetization:
actor-start $0.005, search-listing $0.002.
Disclaimer
This scraper only collects publicly visible FairPrice product search data, for price research and personal comparison-shopping use, not for any unauthorized commercial resale. Please ensure your use complies with FairPrice's Terms of Service and your local laws. This Actor makes no guarantee about the accuracy, timeliness or completeness of the data — always refer to the live FairPrice website for current prices and stock.
FairPrice scraper, NTUC FairPrice, Singapore grocery prices, SG supermarket data, grocery price comparison Singapore, FMCG price monitoring, Singapore retail data