West Elm APIwestelm.com ↗
Search West Elm's furniture and home décor catalog via API. Get product prices, images, faceted filters, and autocomplete suggestions for any keyword.
What is the West Elm API?
The West Elm API provides 2 endpoints for searching and browsing West Elm's furniture and home décor catalog. The search_products endpoint returns up to 100 results per page with 8-plus fields per product — including lowest_price, highest_price, sale_price_min, sale_price_max, images, and descriptions — along with faceted filter options and sort controls. The autocomplete endpoint delivers live search-term suggestions and matching product previews for partial queries.
curl -X GET 'https://api.parse.bot/scraper/cb66f937-0146-4335-a7b5-6124e7217f73/search_products?page=1&query=sofa&filters=%7B%22productType%22%3A+%22Sofa%22%7D&sort_by=relevance&page_size=5&sort_order=ascending' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace westelm-com-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""West Elm product search: discover furniture with filters, sorting, and autocomplete."""
from parse_apis.west_elm_product_search_api import WestElm, Sort, SortDirection, InvalidFilter
client = WestElm()
# Search for sofas sorted by lowest price, capped at 5 results.
for product in client.products.search(query="sofa", sort_by=Sort.LOWEST_PRICE, sort_order=SortDirection.ASCENDING, limit=5):
print(product.title, product.lowest_price, product.highest_price)
# Autocomplete: get suggestions for a partial query.
result = client.products.autocomplete(query="lamp", num_products=3, num_suggestions=4)
for suggestion in result.suggestions:
print(suggestion.value)
for preview in result.products:
print(preview.title, preview.lowest_price)
# Drill into first search hit for a filtered query.
product = client.products.search(query="desk", sort_by=Sort.NEWCORE, limit=1).first()
if product:
print(product.title, product.id, product.flags)
# Typed error handling around a search with invalid filters.
try:
for p in client.products.search(query="chair", filters="not valid json", limit=3):
print(p.title)
except InvalidFilter as exc:
print(f"Filter rejected: {exc}")
print("exercised: products.search / products.autocomplete / Sort enum / SortDirection enum / InvalidFilter error")
Search for products by keyword with support for pagination, sorting, and faceted filtering. Returns product details including prices, descriptions, images, and available filter facets. Paginates via integer page counter; each page returns up to page_size products. Facets in the response enumerate the available filter names and values for refining subsequent searches.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number (1-based) |
| queryrequired | string | Search keyword (e.g., 'sofa', 'desk', 'lamp') |
| filters | string | JSON object of facet filters, e.g. {"productType": "Sofa", "fabric": "Velvet"}. Available facet names and values are returned in the facets array of search results. |
| sort_by | string | Sort field: relevance, lowestPrice, highestPrice, name, newcore. Omitting uses the site default (relevance). |
| page_size | integer | Number of results per page (1-100) |
| sort_order | string | Sort direction: ascending or descending |
{
"type": "object",
"fields": {
"page": "integer current page number",
"query": "search keyword that was used",
"facets": "array of available filter facets with name, display_name, type, and options (each with value, display_name, count)",
"products": "array of product objects with id, title, url, image_url, description, lowest_price, highest_price, sale_price_min, sale_price_max, regular_price_min, regular_price_max, flags, leader_sku, swatches_count",
"page_size": "integer results per page",
"total_pages": "integer total number of pages",
"sort_options": "array of available sort options with sort_by, display_name, sort_order",
"total_results": "integer total number of matching products"
}
}About the West Elm API
What the API Covers
The West Elm API exposes two endpoints for product discovery on westelm.com. search_products accepts a required query string and optional parameters for page, page_size (1–100), sort_by (relevance, lowestPrice, highestPrice, name, newcore), sort_order (ascending or descending), and a filters JSON object for faceted refinement. The response includes total_results, total_pages, and a products array with per-product fields: id, title, url, image_url, description, lowest_price, highest_price, sale_price_min, and sale_price_max.
Facets and Filtering
Each search_products response includes a facets array listing all filterable dimensions for that result set — things like product type, fabric, color, and style. Each facet carries a name, display_name, type, and an options array with value, display_name, and count per option. You can feed those facet values back into the filters parameter on subsequent calls to narrow results. The sort_options array in the response documents exactly which sort combinations are valid for that query.
Autocomplete
The autocomplete endpoint takes a partial query string (e.g., sof, lamp) and returns two arrays: suggestions (each with a value field representing a completed search term) and products (lightweight product previews with id, title, url, image_url, lowest_price, highest_price, and flags). Optional num_suggestions and num_products parameters control how many of each to return, making it straightforward to implement a search-as-you-type interface.
The West Elm API is a managed, monitored endpoint for westelm.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when westelm.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official westelm.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Build a price comparison tool tracking
lowest_priceandsale_price_minacross West Elm product categories. - Populate a furniture discovery app using
search_productswith facet filters for fabric, style, and product type. - Implement a search-as-you-type UI using the
autocompleteendpoint'ssuggestionsand product previews. - Monitor sale pricing changes by periodically querying
sale_price_maxandsale_price_minfor specific keywords. - Generate a structured product feed from West Elm for use in interior design or shopping aggregator platforms.
- Analyze inventory breadth by iterating paginated
search_productsresults and tallying facet option counts.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does West Elm offer an official public developer API?+
What product pricing fields does `search_products` return, and does it distinguish sale prices from regular prices?+
lowest_price, highest_price, sale_price_min, and sale_price_max. This lets you detect whether a product has a sale price range distinct from its regular price range and by how much it differs.How do facet filters work, and where do I find valid filter values?+
search_products response includes a facets array. Each facet has a name (use this as the key in the filters JSON parameter), a display_name, and an options array listing valid values with their result counts. Pass those values back as a JSON object in the filters parameter on the next request to narrow results.Does the API return product reviews or ratings?+
Is there a limit to how deep pagination can go in `search_products`?+
total_pages and total_results fields so you can determine the full depth before iterating. page_size can be set between 1 and 100. Very deep pagination on broad queries may return fewer results in later pages as the underlying catalog data thins out for that keyword.