Save Mart API & Scraper
This API reads shop.savemart.com, Save Mart's online shop, live and returns it as JSON.
🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.
Prices are set per store, so every call is answered for one Save Mart store: give a ZIP code or a store_id from `stores` (without either, a fixed default store, Save Mart - 86 near 95354, is used and the response says store_defaulted: true). `search` returns the site's own ranked results (cheese: 298 products at the default store), `category` lists a collection such as Milk, `offers` returns Weekly Ad, Member Prices, Sales, `product/detail` adds ingredients, warnings and images, `categories` lists the category tree and `stores` lists Save Mart stores around a ZIP code with distance and services. The price matched the price printed on the shop.savemart.com product page for 8 of 8 products we checked.
What a Save Mart field actually contains
Fields that read differently from how they look, measured on live responses on 2026-10-18.
| Field | What it holds |
|---|---|
| price, price_display | The price at the chosen store as the shop.savemart.com product page prints it (matched on 8/8 products, e.g. Sunnyside Farms Cage Free Eggs $2.79). |
| original_price, discount_percent | The struck-through regular price on sale items and the discount computed from the two prices; null when the item is not on sale. |
| promotions, buy_one_get_one | Deals shown on the item: BOGO, multi-buy ('Buy 2 for $9.16'), member offers. They are never folded into price. |
| loyalty_price | A separate card or member price when the site shows one next to the regular price; null otherwise. |
| store, store_defaulted | The Save Mart store that priced the response (id, name, street, city). store_defaulted is true when you gave neither postal_code nor store_id. |
| unit_price_text | The unit price as the site prints it ("$0.03/fl oz"). For items sold by weight, price is the estimated package price and price_is_estimate is true. |
| stock_level, likely_out_of_stock | many_in_stock, in_stock, likely_out_of_stock or out_of_stock for that store. |
| matches_query | Whether the row shares a word with your search. The site fills a search that matches nothing with unrelated products; such pages are dropped and counted in unmatched_dropped. |
Prices differ between stores: the same 16 products cost differently on 1 of them at a store near 95814 on the same day.
Real request and response JSON
Captured from the indexed primary action, search, on .
{
"method": "POST",
"url": "https://api.reefapi.com/savemart/v1/search",
"headers": {
"x-api-key": "$REEF_KEY",
"content-type": "application/json"
},
"body": {
"query": "milk",
"postal_code": "95354"
}
}{
"ok": true,
"meta": {
"api": "savemart",
"endpoint": "search",
"mode": "live",
"latency_ms": 4743.6,
"record_count": 20,
"bytes": 186282,
"cache_hit": false,
"warnings": [
"ignored unknown parameter(s): include_pii"
],
"pagination": {
"page": 1,
"has_more": true,
"total": 194
},
"upstream_requests": 9,
"charged_credits": 3,
"version": "1.0.0",
"request_id": "a5b2bc47a28947b8",
"queue_ms": 1.6,
"fetched_at": "2026-10-18T17:45:08.457Z"
},
"data": {
"products": [
{
"product_id": "2621946",
"item_id": "items_34678-2621946",
"name": "Bayview Farms Milk",
"brand": "bayview farms",
"size": "1 gal",
"url": "https://shop.savemart.com/store/savemart/products/2621946-bayview-farms-milk-1-gl",
"image": "https://d2lnr5mha7bycj.cloudfront.net/product-image/file/large_c0b4498c-f317-44a2-84f4-ca0657393be2.jpg",
"available": true,
"stock_level": "many_in_stock",
"stock_label": "Many in stock",
"likely_out_of_stock": false,
"sold_by": "each",
"weight_option": false,
"par_weight": null,
"max_order_quantity": 500,
"on_sale": true,
"buy_one_get_one": true,
"coupon_available": false,
"store_brand": true,
"dietary": [],
"nutrition_highlights": null,
"variant_values": [
"1 gal"
],
"retailer_reference_code": null,
"retailer_lookup_code": null,
"currency": "USD",
"price": 3.69,
"price_display": "$3.69",
"original_price": 5.79,
"discount_percent": 36,
"savings": 2.1,
"loyalty_price": null,
"loyalty_label": null,
"loyalty_card_offer": false,
"unit_price_text": "$0.03/fl oz",
"size_text": "1 gal",
"price_is_estimate": false,
"estimated_weight_text": null,
"promotions": [
{
"label": "[trimmed-depth]",
"type": "[trimmed-depth]",
"coupon": "[trimmed-depth]"
}
],
"deal_terms": "Add 2 to qualify for deal (max 2 per order)",
"great_price": false,
"badge": null,
"retailer": {
"retailer_id": "294",
"slug": "savemart",
"name": "Save Mart",
"shop_id": "3056",
"service_type": "delivery",
"retailer_location_id": "34678"
},
"service_type": "delivery",
"matches_query": true
},
{
"product_id": "19553364",
"item_id": "items_34678-19553364",
"name": "Sunnyside Farms Vitamin D Milk",
"brand": "sunnyside farms",
"size": "0.5 gal",
"url": "https://shop.savemart.com/store/savemart/products/19553364-sunnyside-farms-vitamin-d-milk-64-fl-oz",
"image": "https://d2lnr5mha7bycj.cloudfront.net/product-image/file/large_d0ecefd9-b70c-4ba8-8f7d-f344d8a875d5.jpg",
"available": true,
"stock_level": "many_in_stock",
"stock_label": "Many in stock",
"likely_out_of_stock": false,
"sold_by": "each",
"weight_option": false,
"par_weight": null,
"max_order_quantity": 500,
"on_sale": false,
"buy_one_get_one": false,
"coupon_available": false,
"store_brand": true,
"dietary": [
"2%"
],
"nutrition_highlights": null,
"variant_values": [
"0.5 gal"
],
"retailer_reference_code": null,
"retailer_lookup_code": null,
"currency": "USD",
"price": 3.79,
"price_display": "$3.79",
"original_price": null,
"discount_percent": null,
"savings": null,
"loyalty_price": null,
"loyalty_label": null,
"loyalty_card_offer": false,
"unit_price_text": "$0.06/fl oz",
"size_text": "0.5 gal",
"price_is_estimate": false,
"estimated_weight_text": null,
"promotions": [],
"deal_terms": null,
"great_price": false,
"badge": null,
"retailer": {
"retailer_id": "294",
"slug": "savemart",
"name": "Save Mart",
"shop_id": "3056",
"service_type": "delivery",
"retailer_location_id": "34678"
},
"service_type": "delivery",
"matches_query": true
},
{
"product_id": "19554430",
"item_id": "items_34678-19554430",
"name": "Sunnyside Farms Vitamin D Milk",
"brand": "sunnyside farms",
"size": "128 oz",
"url": "https://shop.savemart.com/store/savemart/products/19554430-sunnyside-farms-vitamin-d-milk-128-fl-oz",
"image": "https://d2lnr5mha7bycj.cloudfront.net/product-image/file/large_2b4be8a4-b8c4-40f7-9060-6d9d942d996b.jpg",
"available": true,
"stock_level": "many_in_stock",
"stock_label": "Many in stock",
"likely_out_of_stock": false,
"sold_by": "each",
"weight_option": false,
"par_weight": null,
"max_order_quantity": 500,
"on_sale": false,
"buy_one_get_one": false,
"coupon_available": false,
"store_brand": true,
"dietary": [],
"nutrition_highlights": null,
"variant_values": [
"3.78 L"
],
"retailer_reference_code": null,
"retailer_lookup_code": null,
"currency": "USD",
"price": 6.49,
"price_display": "$6.49",
"original_price": null,
"discount_percent": null,
"savings": null,
"loyalty_price": null,
"loyalty_label": null,
"loyalty_card_offer": false,
"unit_price_text": "$0.05/oz",
"size_text": "128 oz",
"price_is_estimate": false,
"estimated_weight_text": null,
"promotions": [],
"deal_terms": null,
"great_price": false,
"badge": null,
"retailer": {
"retailer_id": "294",
"slug": "savemart",
"name": "Save Mart",
"shop_id": "3056",
"service_type": "delivery",
"retailer_location_id": "34678"
},
"service_type": "delivery",
"matches_query": true
}
],
"count": 20,
"total": 194,
"page": 1,
"per_page": 20,
"last_page": 10,
"has_more": true,
"unmatched_dropped": 0,
"next_cursor": "ACF7ImsiOiI1NDkwOGEyM2I3ZjYiLCJwIjoyLCJvIjoyMH0AKAH6ASpcVAEqYH4BKl-tASpe8wAoAfkA-l_vACgB-AAUfoUBKly8AAJF7wAApzIBMDgQAABxkgAAcaIAAX9HAAE66gAseEUBLcV6ASpfSg",
"query": "milk",
"store": {
"store_id": "34678",
"name": "Save Mart - 86",
"street": "801 Oakdale Road",
"city_state_zip": "Modesto, CA 95355",
"latitude": 37.6542021,
"longitude": -120.9587133
},
"service_type": "delivery",
"postal_code": "95354",
"store_defaulted": false,
"currency": "USD"
}
}What the Save Mart API does
| Action | Description | Concrete use case | Key params |
|---|---|---|---|
| search | Search shop.savemart.com at one Save Mart store: regular price (price list), was-price, member/card price and promotions apart, unit price, stock level, brand and size, in the site's own result order. | Pricing teams call search to search shop.savemart.com at one Save Mart store. | query, page, per_page, include_unmatched, cursor, ... |
| category | Every product of a shop.savemart.com collection (a category, a brand or a diet collection from `categories`) priced at one store. | Marketplace operators call category to get every product of a shop.savemart.com collection (a category, a brand or a diet collection fro…. | slug, page, per_page, cursor, postal_code, ... |
| product/detail | One Save Mart product: name, brand, size, category, ingredients, directions, warnings, images, rating — and its price, unit price, promotions and stock at one store. | Catalog enrichment teams call product/detail to get one Save Mart product. | product_id, postal_code, store_id |
| categories | The shop.savemart.com category tree (departments and their collections) or one collection's sub-collections; slugs feed `category`. | Retail analysts call categories to get the shop.savemart.com category tree (departments and their collections) or one collection's s…. | slug, postal_code, store_id |
| stores | Save Mart stores around a US ZIP code, nearest first, with address, coordinates, distance and which services shop.savemart.com offers there. | Pricing teams call stores to get save Mart stores around a US ZIP code, nearest first, with address, coordinates, distance and…. | postal_code, page, limit |
| offers | Save Mart's current deal lists at one store: Weekly Ad, Member Prices, Sales. | Marketplace operators call offers to get save Mart's current deal lists at one store. | type, page, per_page, cursor, postal_code, ... |
| promotions | Which Save Mart deal lists are live now at one store, each with its name and product count. | Catalog enrichment teams call promotions to get which Save Mart deal lists are live now at one store, each with its name and product count.. | postal_code, store_id |
Call search from your stack
curl -X POST https://api.reefapi.com/savemart/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"milk","postal_code":"95354"}'import requests
r = requests.post(
"https://api.reefapi.com/savemart/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"query": "milk",
"postal_code": "95354"
},
)
print(r.json()["data"])const res = await fetch("https://api.reefapi.com/savemart/v1/search", {
method: "POST",
headers: {
"x-api-key": process.env.REEF_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"query": "milk",
"postal_code": "95354"
}),
});
const { ok, data, meta, error } = await res.json();Ask your MCP-connected assistant: call reefapi.savemart.search with {"query":"milk","postal_code":"95354"}.Who uses this API and why
- Track Save Mart prices per store and ZIP code.
- Publish the Save Mart Weekly Ad and Member Prices every week.
- Compare Save Mart member deals with regular prices.
- Build a Save Mart store finder with distance from any ZIP code.
- Monitor multi-buy promotions across Save Mart stores.
Questions developers ask before integrating
Does Save Mart have a public API?
No public product API. This API reads what shop.savemart.com shows a logged-out visitor and returns it as JSON. No account is needed.
Why do I need a ZIP code?
Save Mart prices are set per store. Pass postal_code or store_id; without them a fixed default store is used and store_defaulted is true.
Do delivery, pickup and in-store prices differ?
Not in our measurement: the store's delivery, pickup and in-store price lists were identical on 16 of 16 products, so one price is returned, the one the product page prints.
Can I get the Save Mart Weekly Ad and Member Prices?
Yes. offers returns weekly_ad (Weekly Ad Oct 14 - Oct 20 on the day we measured), member_prices (Member Prices) or sales, each priced at one store. promotions lists the three with their product counts.
Is the member price in `price`?
No. price is the price the product page prints for every shopper; member deals appear as promotion labels in promotions[] (for example 'Buy 1 for $4.99' on a $5.29 item).
How do I find Save Mart stores near a ZIP code?
Call stores with postal_code. Around 95354 it returned 26 stores, nearest first, with address, coordinates, distance in miles and the services each offers. Use a store_id in any other call to price at that store.
Does search return everything the site finds?
Yes, in the site's own order, 20 per page by default (up to 40). cheese returned 298 products. The site can re-rank its list between two calls, so reading by page number can repeat or skip a product; follow next_cursor from each answer for a complete scan: it never returns a product twice and fills the page from the rest of the list.
How fresh is the data?
Every call reads shop.savemart.com live; nothing is cached on our side.
What is the Save Mart API?
Save Mart API is a ReefAPI endpoint group for shop.savemart.com prices as json per store: search, categories, weekly ad, member prices, sales, product details and the store locator. It returns live JSON through POST requests under /savemart/v1.
Is the Save Mart API free to try?
Yes. ReefAPI starts with 1,000 free credits, no card required. Save Mart calls use the same shared credit balance as every other ReefAPI engine.
Do I need a Save Mart login or account?
No login to Save Mart 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 Save Mart 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 Save Mart API use?
Save Mart actions currently cost 2-3 credits per successful call. Failed or blocked calls are free. All APIs draw from one credit pool.
Can I call Save Mart from an AI assistant or MCP client?
Yes. Connect ReefAPI once through MCP and your assistant can call savemart actions with the same key, credit pool and JSON envelope used by normal REST requests.