To get Ashley Furniture sale prices, read each item's price next to Ashley's own regular_price and store the price zone with it. Scavio's Ashley Furniture API returns both prices, a discount_percent and Ashley's sale, clearance and Hot Buy badges: POST /api/v1/ashley/search returns 48 products per call, /category and /deals return 30 per page, and /product returns one item in full. Every US answer carries priced_for, the ZIP and Ashley price zone it was priced for. Every US call costs 2 credits, so 100 items read daily is 6,000 credits a month, $6 on the Growth plan of $1 per 1,000 credits.
Ashley prices online by region. Its ZIP page says "Update your ZIP code for product availability, pricing, and delivery in your area", and on November 14 the same Mahoney Sofa came back at $299.99, $449.99 or $499.99 depending on the price zone of the answer. So a sale-price record needs three things per row: the price, Ashley's Regular Price and the zone. Every response in the steps below is a trimmed capture from live calls on November 14, 2026, between 09:56 and 10:25 UTC. Prices are numbers in the market's currency: 299.99 with "currency": "USD" is $299.99. Images are trimmed from every sample, and the docs list every field.
Step 1: Find the SKU
Every ashleyfurniture.com product has an item number at the end of its URL (.../p/mahoney_sofa/3100438.html is 3100438). Some are digits, others letters and digits (APK-B376-QSB, D596-35, M69731). To find them by keyword, search:
curl -s https://api.scavio.dev/api/v1/ashley/search \
-H "Authorization: Bearer $SCAVIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"query": "sofa", "country": "us"}'The first of 48 results, with one of its two color variants:
{
"query": "sofa",
"country": "us",
"language": "en",
"currency": "USD",
"source_domain": "ashleyfurniture.com",
"priced_for": { "zipcode": "76182", "price_zone": "AFHSPGZ4" },
"count": 48,
"total": 861,
"page": 1,
"page_size": 48,
"total_pages": 18,
"sort": "best_sellers",
"items": [
{
"position": 1,
"sku": "3100438",
"master_id": "3100438-Master",
"name": "Mahoney Sofa",
"brand": "Signature Design by Ashley®",
"url": "https://www.ashleyfurniture.com/p/mahoney_sofa/3100438.html",
"price": 299.99,
"regular_price": 349.99,
"discount_percent": 14,
"color": "Pebble",
"flag": null,
"badges": {
"sale": true,
"clearance": false,
"doorbuster": false,
"outlet": false,
"hot_buy": false,
"online_only": false,
"ashley_exclusive": false,
"luxe": false,
"daily_deal": false
},
"new_since": "2023-05-05",
"rating": 4.8,
"review_count": 220,
"variant_count": 2,
"variants": [
{
"sku": "3100438",
"color": "Pebble",
"url": "https://www.ashleyfurniture.com/p/mahoney_sofa/3100438.html",
"price": 299.99,
"regular_price": 349.99,
"rating": 4.8,
"review_count": 120
}
],
"promotions": [],
"sponsored": false
}
]
}total is exact here: 861 sofas. Search takes page (48 per page) and sort (best_sellers, price_asc, price_desc, newest, rating, name). Its facets are informational; to filter by facet or price, use the category endpoint in Step 4. 2 credits.
Step 2: Read one product
curl -s https://api.scavio.dev/api/v1/ashley/product \
-H "Authorization: Bearer $SCAVIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"sku": "7500838", "country": "us"}'The Darcy Sofa, with description, features, dimensions, images, reviews and Q&A cut:
{
"priced_for": { "zipcode": "78577", "price_zone": "AFHSPGZ3" },
"sku": "7500838",
"master_id": "7500538-Master",
"name": "Darcy Sofa",
"brand": "Signature Design by Ashley®",
"price": 549.99,
"regular_price": 649.99,
"discount_percent": 15,
"item_status": "Current",
"color": "Black",
"stock": {
"status": "IN_STOCK",
"quantity": 29,
"delivery_method": "home_delivery",
"delivery_message": "Delivers in 1 to 2 weeks",
"white_glove": false
},
"nearest_store": {
"name": "Pharr",
"store_type": "HomeStore",
"stock_status": "OUT_OF_STOCK",
"address": { "street": "401 N Jackson Rd", "city": "Pharr", "state": "TX", "zip": "78577" }
},
"rating": 4.6,
"review_count": 660,
"rating_histogram": { "1": 18, "2": 17, "3": 31, "4": 94, "5": 500 },
"questions_total": 31
}Product also returns options and variants (the Darcy comes in Black and Cobblestone, each its own SKU), dimensions (87 x 37 x 37 inches, 106.02 lb, plus seat depth, seat height and the minimum doorway width), materials, assembly, breadcrumbs, the first 10 reviews the page shows with date, purchase date and an incentivized flag, customer_photos and the customer questions with staff and customer answers. A set lists its components, each with its own price and Regular Price. Send url instead of sku if you have the product link. An unknown item number is a 404 and is charged. 2 credits.
Step 3: Read the price zone, and compare like with like
The Darcy above came back priced for zone AFHSPGZ3 at $549.99 against a Regular Price of $649.99. Read again a few minutes later, it came back priced for AFHSPGZ15 at $549.99 against $549.99: same price, no sale. Neither reading is wrong; they are prices for two regions. In our capture of 48 sofas read nine times, the answers landed in five zones, two answers in the same zone always agreed, and 28 of the 48 sofas had a different price in at least one zone:
| Mahoney Sofa (3100438) | price | regular_price |
|---|---|---|
| AFHSPGZ3 (ZIP 78577) | 299.99 | 449.99 |
| AFHSPGZ4 (ZIP 76182, 40422) | 299.99 | 349.99 |
| AFHSPGZ5 (ZIP 21206, 21704) | 499.99 | 549.99 |
| AFHSPGZ12 (ZIP 62650) | 449.99 | 449.99 |
| AFHSPGZ15 (ZIP 10456, 10607) | 449.99 | 449.99 |
You cannot pick the zone; the API reports the one Ashley priced the answer for. So store price_zone with every row, and when you read a history, compare a price only with earlier prices from the same zone. A drop from $499.99 to $299.99 between a zone 5 reading and a zone 4 reading is two regions, not a sale. Over a few weeks of daily reads, each item collects readings from several zones, and each zone becomes its own price series. The best Ashley Furniture sale price APIs has the full five-zone result.
Step 4: Watch a whole category
To watch many items for few credits, read a category grid, 30 products per call, with sorts and filters:
curl -s https://api.scavio.dev/api/v1/ashley/category \
-H "Authorization: Bearer $SCAVIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"path": "furniture/living-room/sofas", "sort": "price_asc", "country": "us"}'{
"category": {
"path": "furniture/living-room/sofas",
"name": "Sofas and Couches",
"url": "https://www.ashleyfurniture.com/c/furniture/living-room/sofas/"
},
"priced_for": { "zipcode": "10456", "price_zone": "AFHSPGZ15" },
"count": 30,
"total": 343,
"page": 1,
"page_size": 30,
"total_pages": 12,
"sort": "price_asc",
"requested_filters": {},
"items": [
{
"position": 1,
"sku": "U600004249",
"name": "HOMLUX Single Convertible Full Sleeper Sofa",
"brand": "HOMLUX",
"upc": "769643230556",
"category": "Furniture/Living Room Furniture/Sleeper Sofas",
"price": 145.99,
"regular_price": 149.99,
"discount_percent": 3,
"flag": null,
"rating": 3.5,
"review_count": 6,
"stock_text": "In Stock",
"delivery_method": "direct_ship"
}
]
}The 30 came back in price order. The cheapest "sofa" was a sleeper from another brand sold on ashleyfurniture.com: eight of the first nine came from other brands, and the one Ashley-label sofa among them was 6th. The path is the part after /c/ in a category URL; category_url takes the whole URL. filters takes facet values from the answer's facets (for example {"facetUpholsteryDesign": "Chaise"}), and price_min / price_max apply to Ashley's own price list, so an item priced for another zone can sit just outside the range. 2 credits.
Step 5: Black Friday, clearance and Hot Buys
Ashley's Black Friday event was already running on November 14. The deals endpoint reads three event grids, black_friday, clearance and hot_buys:
curl -s https://api.scavio.dev/api/v1/ashley/deals \
-H "Authorization: Bearer $SCAVIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"event": "black_friday", "country": "us"}'{
"event": "black_friday",
"event_name": "Black Friday Furniture Deals",
"event_url": "https://www.ashleyfurniture.com/c/deals/black-friday/furniture/",
"priced_for": { "zipcode": "40422", "price_zone": "AFHSPGZ4" },
"count": 30,
"total": 238,
"page": 1,
"total_pages": 8,
"sort": "best_sellers",
"items": [
{
"position": 1,
"sku": "84905S13-Master",
"name": "Ella Grove 5-Piece Sectional with Chaise",
"brand": "Ashley",
"price": 2899.99,
"regular_price": 3499.99,
"discount_percent": 17,
"flag": "ASHLEY EXCLUSIVE",
"rating": null,
"review_count": null,
"stock_text": "In Stock"
}
]
}238 products in 8 pages, 16 credits for the whole grid. On the first page the Rowanbeck Dining Table and 4 Chairs was $1,229.99 against $2,599.99, 53% off, and the deepest discount was 69%, on an outdoor rocking lounge chair. Some grid SKUs end in -Master; the product endpoint accepts them and answers with the default variant (B814B23-Master returned B814B23), so key your table on the SKU the product call returns. Black Friday is November 27, 2026 and Cyber Monday November 30; read your watchlist more often in that week, say every six hours from November 23. 2 credits a page.
Step 6: Poll every day and store the rows
This script reads a watchlist once and stores one row per SKU per day in SQLite, with the zone. Run it from cron each morning:
import sqlite3, datetime, json, requests
API = "https://api.scavio.dev/api/v1/ashley/product"
HEADERS = {"Authorization": "Bearer YOUR_SCAVIO_API_KEY"}
SKUS = ["3100438", "7500838", "1080329", "B130-581", "D596-35", "M69731"]
db = sqlite3.connect("ashley_prices.db")
db.execute("""CREATE TABLE IF NOT EXISTS prices (
day TEXT, sku TEXT, zipcode TEXT, price_zone TEXT, price REAL, regular_price REAL,
badges TEXT, stock_status TEXT, PRIMARY KEY (day, sku))""")
day = datetime.date.today().isoformat()
for sku in SKUS:
r = requests.post(API, headers=HEADERS, timeout=180, json={"sku": sku, "country": "us"})
if r.status_code != 200:
print(sku, r.status_code, r.text[:120]) # 502/503 are not charged: retry later
continue
p = r.json()["data"]
zone = p["priced_for"] or {}
on = [k for k, v in p["badges"].items() if v is True]
db.execute("INSERT OR REPLACE INTO prices VALUES (?,?,?,?,?,?,?,?)",
(day, p["sku"], zone.get("zipcode"), zone.get("price_zone"), p["price"],
p["regular_price"], json.dumps(on), (p.get("stock") or {}).get("status")))
print(day, p["sku"], zone.get("price_zone"), zone.get("zipcode"), p["price"], p["regular_price"], on)
db.commit()Its first run, on November 14, 2026:
| day | sku | product | price_zone | zipcode | price | regular_price | badges |
|---|---|---|---|---|---|---|---|
| 2026-11-14 | 3100438 | Mahoney Sofa | AFHSPGZ15 | 10607 | 449.99 | 449.99 | none |
| 2026-11-14 | 7500838 | Darcy Sofa | AFHSPGZ15 | 10607 | 549.99 | 549.99 | none |
| 2026-11-14 | 1080329 | Nerviano Manual Recliner | AFHSPGZ5 | 21704 | 299 | 399.99 | sale |
| 2026-11-14 | B130-581 | Dolante Queen Upholstered Bed | AFHSPGZ15 | 10456 | 349.99 | 349.99 | none |
| 2026-11-14 | D596-35 | Haddigan Extendable Dining Table | AFHSPGZ5 | 21206 | 549.99 | 649.99 | sale |
| 2026-11-14 | M69731 | Chime 12 Inch Plush Hybrid Mattress | AFHSPGZ5 | 21704 | 349 | 349 | online_only |
Twelve credits a day. One run landed in two zones, which is normal. To find drops, group by sku and price_zone and compare each row with the previous row of the same pair:
SELECT sku, price_zone, day, price, regular_price,
LAG(price) OVER (PARTITION BY sku, price_zone ORDER BY day) AS prev_price
FROM prices ORDER BY sku, price_zone, day;A drop is a row whose price is below prev_price; a sale that appears only because the zone changed never shows up, because it has no earlier row in that zone. For a category, store every item of each daily grid read the same way.
Step 7: Know what Regular Price means, and what the online price covers
Ashley defines its reference price in its Terms and Conditions, under "Pricing Policy": "Regular Price is our highest advertised price in store and online. Regular Price is offered to customers using special long-term financing. Discounts from Regular Price may apply based on payment method and terms, which may be considered a finance charge." So regular_price is the financing price, not the previous day's price, and in our capture it differed between zones on 24 of 48 sofas.
Three more rules from Ashley's own pages shape what a tracker can tell a buyer:
- Online and store prices are separate. "Advertised pricing and promotions are available online only. In-store pricing and promotions do not apply to online pricing." All Ashley stores are independently owned and operated, and the API returns online prices.
- Price adjustment, with an exception. If an item bought on AshleyFurniture.com in the last 30 days is "now listed at a lower price, tell us and we'll adjust it", but "Black Friday, Cyber Week and any special/holiday promotions are excluded".
- Price match is Amazon-only. "If you find a lower price on Amazon.com for an identical, in-stock product, tell us and we'll match it", sold and fulfilled by Amazon.com, and matches "from Thanksgiving Day through Cyber Week are at our discretion".
Step 8: Find stores and their hours
Stores take a latitude and longitude, not a ZIP, and return store ids:
curl -s https://api.scavio.dev/api/v1/ashley/stores \
-H "Authorization: Bearer $SCAVIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"lat": 40.7506, "lng": -73.9972, "radius": 25, "country": "us"}'{
"latitude": 40.7506,
"longitude": -73.9972,
"radius_miles": 25,
"stores": [
{ "store_id": "us/new-york/bronx/340-baychester-ave/luxe", "name": "Bronx Ashley Store", "url": "https://stores.ashleyfurniture.com/store/us/new-york/bronx/340-baychester-ave/luxe/" },
{ "store_id": "us/new-york/brooklyn/241-37th-st/luxe", "name": "Brooklyn Ashley Store", "url": "https://stores.ashleyfurniture.com/store/us/new-york/brooklyn/241-37th-st/luxe/" },
{ "store_id": "us/new-jersey/fairfield/561-us-46", "name": "Fairfield Ashley Store", "url": "https://stores.ashleyfurniture.com/store/us/new-jersey/fairfield/561-us-46/" }
],
"count": 10
}Ten stores within 25 miles of Midtown Manhattan, listed alphabetically rather than by distance. For one store's address and hours, send its id:
curl -s https://api.scavio.dev/api/v1/ashley/store \
-H "Authorization: Bearer $SCAVIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"store_id": "us/new-york/brooklyn/241-37th-st/luxe", "country": "us"}'{
"store_id": "us/new-york/brooklyn/241-37th-st/luxe",
"name": "Ashley Store Brooklyn, NY",
"address": { "street": "241 37th St, 2nd Fl", "city": "Brooklyn", "state": "NY", "zip": "11232", "country": "US" },
"latitude": 40.65599,
"longitude": -74.008204,
"hours": [
{ "day": "monday", "opens": "10:00AM", "closes": "09:00PM" },
{ "day": "sunday", "opens": "11:00AM", "closes": "07:00PM" }
],
"payment_accepted": ["cash", "credit card", "debit card"],
"services": ["Financing", "White Glove Delivery"],
"rating": 4.8
}The store also returns phone, url, image and map_url; the sample shows two of its seven days. Store prices are set by the store, not by the website, so neither endpoint returns them. 2 credits each.
Step 9: Ashley's licensed storefronts
Add country for Ashley's licensed storefronts. Search returns up to 10 best matches (Turkey its first results page of 36) with a handle; product takes that handle or a URL, not a SKU. Prices come in the market's currency and are never converted. From our playground samples, captured from the live API the same morning:
- Canada (
ca, ashleyhomestore.ca): "sofa" returned 10 items in CAD; the first, the Aviemore Sofa, at CAD 879.99 with a Regular Price of 879.99. Product with{"handle": "aviemore-sofa", "country": "ca"}returned SKUAFHS-2430438. - Mexico (
mx): "sofa" returned the Cashton Sofa first at MXN 26,866, in Spanish. - Philippines (
ph): "sofa" returned the Bixler Sofa first at PHP 58,200. - Saudi Arabia (
sa): "sofa" returned a Stonemeade Queen Sofa Sleeper first at SAR 6,465, in English. - Turkey (
tr): "koltuk" returned 36 items in TRY, in Turkish; the first at 286,906 against a Regular Price of 573,812, 50% off.
These storefronts have no priced_for, no paging and no sort. Canada, the Philippines, Saudi Arabia and Turkey cost 1 credit a call; Mexico 2. Category, deals and stores are US-only.
All Ashley Furniture endpoints
| Endpoint | What it returns | Credits |
|---|---|---|
POST /api/v1/ashley/search | Products for a keyword: 48 a page in the US with the exact total, price, Regular Price, badges, rating, variants and priced_for; up to 10 matches on the licensed storefronts | US and Mexico 2; Canada, Philippines, Saudi Arabia, Turkey 1 |
POST /api/v1/ashley/product | One product by SKU, URL or handle: prices, stock, nearest store, options, set components, dimensions, rating histogram, the first 10 reviews, Q&A | Same as search |
POST /api/v1/ashley/category | A category grid by path or URL, 30 a page, with sorts, facet filters and a price range | 2 (US only) |
POST /api/v1/ashley/deals | The Black Friday, clearance or Hot Buys grid, 30 a page | 2 (US only) |
POST /api/v1/ashley/stores | Stores near a latitude and longitude: id, name and URL | 2 (US only) |
POST /api/v1/ashley/store | One store: address, phone, hours, services | 2 (US only) |
Failed calls (502, 503) are not charged; an item, category or store that does not exist is.
Getting started
- Sign up for 50 free credits, no card, and copy your API key.
- Run one search in the playground and pick your SKUs.
- Save the Step 6 script with your key and SKUs, and schedule it daily.
- After a week, query the table by
skuandprice_zonefor prices that fell.
The money math on the Growth plan of $1 per 1,000 credits: 100 SKUs read daily cost 6,000 credits a month, $6; six search pages of 48 items read daily cost 360 credits a month, $0.36; the Hobby plan, $15 a month for 3,000 credits, covers 50 SKUs a day. The best Ashley Furniture sale price APIs compares five options, and the Ashley Furniture API page lists every field.
Reference: Ashley Furniture API overview · search docs · product docs · category docs · deals docs · stores docs · store docs · best Ashley Furniture sale price APIs · is Ashley furniture really that bad? · how to get Wayfair price history · how to get ALDI prices by store
Frequently asked questions
Does Ashley Furniture have an API?
Ashley's official Product Syndication API is for Ashley dealers, behind AshleyDirect credentials and an approved Ashley customer account, and it returns that account's wholesale prices. Scavio's Ashley Furniture API returns the public ashleyfurniture.com search results, products, category and deal grids and stores as JSON, 2 credits a call.
Can I choose the ZIP code Ashley prices are read for?
No. Each US answer is priced for the region Ashley assigns to the request, and the API reports that ZIP and price zone in priced_for. Two calls can land in different zones, so store the zone with every price and compare a price only with earlier readings from the same zone.
What does Ashley's Regular Price mean?
Ashley's Terms and Conditions say: "Regular Price is our highest advertised price in store and online. Regular Price is offered to customers using special long-term financing." The API returns it as regular_price next to price. It is not the previous day's price, and in our November 14 capture it also differed between price zones.
Can I get a price adjustment if an Ashley item drops after Black Friday?
Ashley adjusts an online price that drops within 30 days of purchase, but its FAQ says "Black Friday, Cyber Week and any special/holiday promotions are excluded". Black Friday 2026 is November 27 and Cyber Monday November 30, so a record of prices before you buy is the way to know whether a sale price is new.
Which Ashley sites does the API cover?
ashleyfurniture.com in USD on all six endpoints, plus search and product on Ashley's licensed storefronts: ashleyhomestore.ca in CAD, Mexico in MXN (Spanish), the Philippines in PHP, Saudi Arabia in SAR and Turkey in TRY (Turkish). Calls cost 2 credits in the US and Mexico and 1 credit in the other four.