Nordstrom API: Search products
Search Nordstrom products by words, price, sale status and sort order. Prices are the lowest listed price. Available sizes may be empty when a product page is unavailable.
Unofficial. Not affiliated with or endorsed by Nordstrom.
Inputs
Values from the run on Oct 31, 2026, shown under Output.
- Sort optional
sort Sort products, for example price_low_to_high.
featured (default)
One of
featured,newest,customer_rating,price_low_to_high,price_high_to_low.- Query, required
query What to find, for example white sneakers.
shampoo
- Max Price optional
max_price Maximum current price in USD, for example 150.
Not set
Number 0 or more.
- Min Price optional
min_price Minimum current price in USD, for example 50.
Not set
Number 0 or more.
- Max Results optional
max_results Maximum products to return, for example 24.
96
Whole number from 1 to 96. Default
24.- On Sale Only optional
on_sale_only Show only sale items, for example true.
false (default)
True or false.
Input as JSON
{ "query": "shampoo", "max_results": 96}Output
{ "products": [ { "name": "Gold Lust Repair & Restore Shampoo for Damaged Hair", "brand": "Oribe", "price": 23, "colours": [ "Bottle", "Refill" ], "currency": "USD", "style_id": "4513788", "image_link": "https://n.nordstrommedia.com/it/d2372255-c332-4f39-bfe4-0304cd96e365.jpeg" , "star_rating": 4.5, "product_link": "https://www.nordstrom.com/s/gold-lust-repair-restore-shampoo-for-damaged-hair/4513788" , "review_count": 3577, "original_price": null, "available_sizes": [ "33.8 Ounce Refill", "2.5 Ounce", "8.5 Ounce" ], "discount_percent": null }, { "name": "No. 4 Bond Maintenance™ Shampoo", "brand": "Olaplex", "price": 16, "colours": [ "No Color" ], "currency": "USD", "style_id": "5056283", "image_link": "https://n.nordstrommedia.com/it/76457b1e-59b3-4959-9450-76e1ae75c881.jpeg" , "star_rating": 4.4, "product_link": "https://www.nordstrom.com/s/olaplex-no-4-bond-maintenance-shampoo/5056283" , "review_count": 9324, "original_price": null, "available_sizes": [ "3.3 Ounce", "8.5 Ounce", "17.5 Ounce" ], "discount_percent": null }, { "name": "Signature Gentle Daily Shampoo for Hydration & Shine", "brand": "Oribe", "price": 19, "colours": [ "Bottle", "Refill" ], "currency": "USD", "style_id": "4515394", "image_link": "https://n.nordstrommedia.com/it/2496226b-e5c2-4f28-90b7-29c12894e30f.jpeg" , "star_rating": 4.5, "product_link": "https://www.nordstrom.com/s/signature-gentle-daily-shampoo-for-hydration-shine/4515394" , "review_count": 1256, "original_price": null, "available_sizes": [ "2.5 Ounce", "8.5 Ounce", "33.8 Ounce" ], "discount_percent": null } ]}Code
curl https://api.fous.com/v1/runs \ -H "Authorization: Bearer $FOUS_API_KEY" \ -H "Content-Type: application/json" \ -d '{"method":"nordstrom.com/search_products","input":{"query":"shampoo","max_results":96}}' # Save as fous.py, then run: python3 fous.pyimport json, os, timefrom urllib.error import HTTPErrorfrom urllib.request import Request, urlopenAPI = "https://api.fous.com/v1/runs" KEY = os.environ["FOUS_API_KEY"]HEADERS = { "Authorization": f"Bearer {KEY}", "Content-Type": "application/json" ,}def call(url, body=None): data = json.dumps(body).encode() if body else None request = Request(url, data, HEADERS) try: with urlopen(request, timeout=120) as r: return r.status, json.load(r) except HTTPError as error: message = json.load(error)["error"]["message"] raise RuntimeError(message) from errorstatus, run = call(API, { "method": "nordstrom.com/search_products" , "input": { "query": "shampoo", "max_results": 96 }})# 202: still going after 30 s. Ask again until it ends.while status == 202: time.sleep(2) status, run = call(f"{API}/{run['id']}")print(json.dumps(run["data"], indent=2))// Save as fous.mjs, then run: node fous.mjsconst api = "https://api.fous.com/v1/runs" ;const headers = { Authorization: `Bearer ${process.env.FOUS_API_KEY}`, "Content-Type": "application/json" ,};let response = await fetch(api, { method: "POST", headers, body: JSON.stringify({ "method": "nordstrom.com/search_products" , "input": { "query": "shampoo", "max_results": 96 } }), signal: AbortSignal.timeout(120_000),});let run = await response.json();// 202: still going after 30 s. Ask again until it ends.while (response.status === 202) { await new Promise((done) => setTimeout(done, 2_000)); response = await fetch(`${api}/${run.id}`, { headers }); run = await response.json();}if (!response.ok) throw new Error(run.error.message);console.log(run.data);# Connect your agent to Fous once, over MCP (Streamable HTTP):# https://api.fous.com/mcp# Set FOUS_API_KEY first: create a key at https://app.fous.com/keys.# Claude Codeclaude mcp add \ --scope user \ --transport http fous https://api.fous.com/mcp \ --header "Authorization: Bearer ${FOUS_API_KEY:?Set FOUS_API_KEY to your Fous API key}"# Codexcodex mcp add fous \ --url https://api.fous.com/mcp \ --bearer-token-env-var FOUS_API_KEY# Cursor, VS Code, Windsurf, Cline and morenpx -y add-mcp https://api.fous.com/mcp -g -n fous \ --header "Authorization: Bearer ${FOUS_API_KEY:?Set FOUS_API_KEY to your Fous API key}"# Then ask your agent:# "Use Fous to run nordstrom.com/search_products# with {"query":"shampoo","max_results":96}"Over HTTP, the answer’s data holds the output. A run still going after 30 seconds answers 202 with its id: ask GET /v1/runs/{id} until it ends.
Schema
Input schema
{ "type": "object", "required": [ "query" ], "properties": { "sort": { "enum": [ "featured", "newest", "customer_rating", "price_low_to_high", "price_high_to_low" ], "type": "string", "default": "featured", "description": "Sort products, for example price_low_to_high." }, "query": { "type": "string", "description": "What to find, for example white sneakers." }, "max_price": { "type": "number", "minimum": 0, "description": "Maximum current price in USD, for example 150." }, "min_price": { "type": "number", "minimum": 0, "description": "Minimum current price in USD, for example 50." }, "max_results": { "type": "integer", "default": 24, "maximum": 96, "minimum": 1, "description": "Maximum products to return, for example 24." }, "on_sale_only": { "type": "boolean", "default": false, "description": "Show only sale items, for example true." } }}Output schema
{ "type": "object", "required": [ "products" ], "properties": { "products": { "type": "array", "items": { "type": "object", "required": [ "name", "brand", "price", "currency", "original_price", "discount_percent", "star_rating", "review_count", "colours", "available_sizes", "image_link", "product_link", "style_id" ], "properties": { "name": { "type": "string" }, "brand": { "type": [ "string", "null" ] }, "price": { "type": [ "number", "null" ] }, "colours": { "type": "array", "items": { "type": "string" } }, "currency": { "type": "string" }, "style_id": { "type": "string" }, "image_link": { "type": [ "string", "null" ] }, "star_rating": { "type": [ "number", "null" ] }, "product_link": { "type": "string" }, "review_count": { "type": [ "integer", "null" ] }, "original_price": { "type": [ "number", "null" ] }, "available_sizes": { "type": "array", "items": { "type": "string" } }, "discount_percent": { "type": [ "number", "null" ] } }, "additionalProperties": false } } }, "additionalProperties": false}- Price
- 1 credit per completed run (1¢ with pay as you go); failed runs are free.
- Method
nordstrom.com/search_products- Returns
- name, brand, price, original price, discount, rating, reviews, colours, sizes, image, link
Use it from your agent
Give your agent this line. It reads SKILL.md, gets a Fous API key and connects the Fous MCP server. Its run then takes the method nordstrom.com/search_products with the inputs above.
Ask your agent
- Find women's black ankle boots under $200 on Nordstrom, sorted by customer rating
- Show me men's linen shirts that are currently on sale, cheapest first
- I need a cashmere crewneck sweater between $100 and $300 — what are the newest arrivals?
- Pull up to 48 Nordstrom results for kids' rain jackets on sale, with sizes and colors available
- Looking for a leather crossbody bag priced over $400, sort from most expensive
See more
Searches Macy's products in the site's order with optional USD price bounds, sale-only results and sorting. Prices for products with a range use the lowest shown price.
macys.com/search_productsSearches clothes and shoes in one Zalando country shop, with optional gender, brand, deal and sort filters. Prices and discounts are those shown on the product cards; size-dependent prices may be starting prices.
zalando.com/search_productsSearches Kohl's products in site order and returns prices, offers, ratings and links for each result.
kohls.com/search_productsSearches Sephora US beauty products in Sephora's order, with brand and USD price filters and shopper sort options. Loves counts are null when a product page cannot be loaded.
sephora.com/search_productsSearches Best Buy US products with an optional price range, sort order and page. Prices and availability come from public listings and may vary by location.
bestbuy.com/search_productsSearches Nike products in a chosen country, in Nike search order, with optional gender (men, women, kids) and sale-only filters. Prices, currency and availability reflect the selected country's Nike store.
nike.com/search_productsSearches Ulta Beauty products by keyword, brand, USD price range and sort order, and returns each product with its starting prices.
ulta.com/search_productsFinds a store on RetailMeNot by name or website and returns its current coupon codes (revealed as after Show Code), sales and cash back offers, with details, exclusions and expiration dates when stated.
retailmenot.com/get_coupons