FairPrice API

FairPrice prices, deals and product labels as JSON

FairPrice is Singapore's largest supermarket chain and fairprice.com.sg its online shop.

no credit card1,000 free credits · instant API key · pay by card or crypto
Missing a FairPrice endpoint, or need a source we don't have yet?Contact us real people · same-day reply.
F
/fairprice/v1

6 active endpoints, on 1 and 2 credit tiers.

  • POST/fairprice/v1/search
  • POST/fairprice/v1/category
  • POST/fairprice/v1/promotions
  • POST/fairprice/v1/product
  • POST/fairprice/v1/categories
  • POST/fairprice/v1/store

What FairPrice endpoints does ReefAPI ship?

6 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.

6 endpoints

search

2 cr

Search NTUC FairPrice's online shop (Singapore).

required
query
optional
brand, diet, origin, promo_type, min_price, max_price, sort, page, postal_code, store_id

category

2 cr

List one FairPrice category (slug from categories, e.g.

required
category
optional
brand, diet, origin, promo_type, min_price, max_price, sort, page, postal_code, store_id

promotions

2 cr

Everything FairPrice has on promotion right now (the site's promotions page, 28,563 products…

required
—
optional
brand, diet, origin, promo_type, min_price, max_price, sort, page, postal_code, store_id

product

1 cr

One FairPrice product by the product_id a search row returns (or its slug / URL).

required
product_id
optional
postal_code, store_id

categories

2 cr

FairPrice's category tree from the shop menu (1,004 nodes on 2026-10-15).

required
—
optional
category, postal_code, store_id

store

1 cr

Which FairPrice store delivers to a Singapore postal code (the store whose range and stock th…

required
postal_code
optional
—

Every parameter, every allowed value →

FairPrice API

4 of 6 endpoints, ready to run

View docs ↗

Milk prices at FairPrice

2 credits1 required · 1 optional
POST/fairprice/v1/search
idle
// Press "Try it" and this pane shows exactly what the
// live site returned this second — including an empty
// result, if that is the truth. No key, no account.

How the FairPrice API works

FairPrice is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.

01
Authenticate
x-api-key header

No OAuth app, no request signing, no per-site account. One key covers all 530 engines.

02
Call
POST /fairprice/v1/…

Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.

03
Pay
1 or 2 credits per call

Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.

04
Read
{ ok, data, meta, error }

One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.

From a search term to a priced, labelled product

Search, narrow to a promotion programme or price band, then read the full product.

01search?query=milk&brand=marigold
GET/fairprice/v1/search?query=milk&brand=marigold

Products with price, regular price, discount, multi-buy deal, deposit, price per litre, pack size, stock level and FairPrice's own total.

02search?query=milk&promo_type=mix_and_match&max_price=5
GET/fairprice/v1/search?query=milk&promo_type=mix_and_match&max_price=5

Only the mix-and-match deals with a regular price under $5.

03product?product_id=1623656
GET/fairprice/v1/product?product_id=1623656

Barcode, price cut end date, deals, stock, category path, images and the label with ingredients, storage and nutrition.

A Singapore grocery price feed that keeps price paid, regular price, bundle deals and deposits apart.

request
curl -X POST https://api.reefapi.com/fairprice/v1/search \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"query":"milk"}'
response envelope
{
  "ok": true,
  "data": { … },
  "meta": {
    "api": "fairprice",
    "endpoint": "search",
    "mode": "live",
    "latency_ms": …,
    "record_count": …
  },
  "error": null
}

What a FairPrice field actually contains

Fields that read differently from how they look. Every row was measured against live fairprice.com.sg responses on 2026-10-15.

FieldWhat it holds
priceWhat a shopper pays for one unit now, in SGD, the price the product page prints first (Farm Fresh Milk 2 L: 6.00).
regular_price, discount_amount, discount_percentThe price before a running price cut and the cut itself (Farm Fresh Milk: 6.70, 0.70, 10.4 %). All three are empty when no cut runs; price_cut_valid_to says when the cut ends.
multibuyA bundle deal kept apart from price: "Any 2 for $6.80" gives quantity 2, total_price 6.80, price_each 3.40. mix_and_match is true when the deal covers several products, listed in any_of_product_ids.
promotionsOther deals on the product: spend and save (spend $20, get $2 off), spend and get a gift, buy and get a gift, with the minimum spend and dates.
unit_price, unit_price_unitPrice per kg, litre or piece, worked out from price and pack_size and rounded up to the cent the way FairPrice rounds its own per-piece prices (diapers, 26.06 for 50: 0.53 per piece, same as the site on 10 of 10). Empty when the pack size is not a plain measure. source_unit_price_text is FairPrice's own text where it prints one.
depositThe BCRS beverage container deposit added at checkout, for example +$0.10 per bottle. It is not part of price.
stock_level, online_stockin_stock, low or out_of_stock and the online stock count of the store the row is for.
sponsoredTrue for the paid placements FairPrice puts at the top of the first search page. The same product also appears at its own position further down.
storeWhich store's range, stock and discounts the row comes from. 'milk' had 1,445 products at the default store, 1,316 at Hyper Changi and 719 at Bedok Mall; regular prices were the same on every shared product, discounts differed on a few.

Loyalty prices that need a FairPrice or Link account are not part of the public shop listings, so they are not returned; price is what any shopper pays online.

FairPrice coverage, measured

Every number below was read from live fairprice.com.sg responses on 2026-10-15: searches in 8 product groups, 16 products checked against FairPrice's own product pages, filters, 4 stores.

Promotions

28,563 products on promotion on 2026-10-15; 1,004 categories in the shop menu.

Filters

Same minute, 'milk': 1,445 unfiltered, 37 Marigold, 46 organic, 74 from Japan, 154 mix-and-match, 141 under $3, 573 between $3 and $10.

Price accuracy

16 products, 8 of them discounted: price and regular price matched the price FairPrice's own product page prints 16 of 16 times; the search page matched 39 of 39 rows located.

Store range

'milk': 1,445 products at the default store, 1,316 at Hyper Changi, 719 at Bedok Mall; regular prices equal on every shared product.

Limits

20 products per page and at most 50 pages per listing (1,000 products); price filter by FairPrice's 5 bands only; a few product labels carry no ingredients or nutrition at the source.

What people build with FairPrice

The jobs this data is most often used for.

6

endpoints

1/2

credits per call

01

Track FairPrice prices, price cuts and multi-buy deals with their end dates.

02

Compare Singapore grocery prices per kg, litre or piece across brands and house labels.

03

Build a Singapore grocery catalogue with barcodes, brands, origin, dietary labels, ingredients and nutrition.

04

Monitor what is on promotion by programme, brand or price band.

What FairPrice data costs

The cheapest call here is 1 credit, so $15/mo (Pro) buys 10,000 of them — $1.50 per 1,000 credits. Credits roll over and never expire, and failed or blocked calls are not charged.

Full pricing →
$0.67–$1.50 / 1,000 credits
  • 1,000 free credits on signup, no card
  • One key, all 530 APIs, one credit pool
  • Failed and blocked calls are never charged
  • Credits roll over and never expire

Call it in two lines

Sign up, get 1,000 credits and one key that works on every engine. Then this is the whole protocol.

curl
curl -X POST https://api.reefapi.com/fairprice/v1/search \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"query":"milk"}'
python
import requests

r = requests.post(
    "https://api.reefapi.com/fairprice/v1/search",
    headers={"x-api-key": REEF_KEY},
    json={
  "query": "milk"
},
)
print(r.json()["data"])
FAQ

Have a question? We got answers.

The questions people actually ask before wiring up FairPrice.

Get a free key →
Do I need a FairPrice account?▾

No. Everything is read logged out: the prices, deals, stock levels and product labels any visitor sees.

What is the difference between price, regular_price and multibuy?▾

price is what one unit costs now. regular_price is the price before a running cut and is empty when no cut runs. multibuy is a bundle deal such as Any 2 for $6.80: it only applies when you buy the stated quantity, so it is never folded into price.

Is the container deposit included in the price?▾

No. Drinks under Singapore's beverage container return scheme show a separate deposit, for example +$0.10, which the API returns in deposit.

Can I filter by any price range?▾

FairPrice filters by its own bands only: under $3, $3 to $5, $5 to $10, $10 to $25 and over $25. min_price and max_price therefore take 0, 3, 5, 10 or 25, and the band is applied to the regular price. 'milk' went from 1,445 products to 141 under $3 and 573 between $3 and $10.

Which filters work?▾

brand, one dietary label, country of origin, one promotion programme and the price bands, plus sorting by price or brand. Each was checked against the unfiltered count in the same minute: 'milk' 1,445 unfiltered, 37 Marigold, 46 organic, 74 from Japan, 154 in the mix-and-match programme.

Do prices depend on the postal code?▾

The range, the stock and some discounts do, because each address is served by one store. Regular prices were the same in every store we compared. Pass postal_code (or store_id) to read the store that delivers there.

How many products per page, and how deep?▾

20 per page, FairPrice's own page size, up to page 50, so one listing shows at most 1,000 products. Narrow with filters or a category to reach the rest.

How fresh is the data?▾

Every call reads fairprice.com.sg live; nothing is cached. Price cuts and multi-buy deals come with their end dates.

What is the FairPrice API?▾

FairPrice API is a ReefAPI endpoint group for singapore supermarket prices from fairprice.com.sg: price paid and regular price, discounts, multi-buy deals, price per kg or litre, stock and product labels. It returns live JSON through POST requests under /fairprice/v1.

Is the FairPrice API free to try?▾

Yes. ReefAPI starts with 1,000 free credits, no card required. FairPrice calls use the same shared credit balance as every other ReefAPI engine.

Do I need a FairPrice login or account?▾

No login to FairPrice is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.

How fresh is the FairPrice data?▾

The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.

How many credits does the FairPrice API use?▾

FairPrice actions currently cost 1-2 credits per successful call. Failed or blocked calls are free. All APIs draw from one credit pool.

Can I call FairPrice from an AI assistant or MCP client?▾

Yes. Connect ReefAPI once through MCP and your assistant can call fairprice actions with the same key, credit pool and JSON envelope used by normal REST requests.

Need something this API does not do?

Name the endpoint, the field, or a source we do not carry yet. We ship new APIs every week and you would be first to get the key. Real people read every message and reply the same day.

0/4000

No account needed · we reply from [email protected]

Try it on your own data before you pay anything

The call above is the real endpoint, not a recording. A free key gives you 1,000 credits, the other 529 APIs, and the same envelope everywhere.

Endpoints, parameters and credit costs on this page are read from the live catalog and cannot drift from what the API accepts. Field notes were captured on 2026-10-15.