RH APIrh.com ↗
Access RH.com's full product catalog via API. Browse categories, search products, get pricing, dimensions, images, and related items across all RH collections.
What is the RH API?
The RH.com API provides 6 endpoints covering the full RH furniture and home décor catalog, from navigating the category tree with get_subcategories to retrieving granular product data including dimensions, feature lists, pricing tiers, and alternate images via get_product_details. It supports keyword and category-scoped search, pagination, and related product lookups — giving structured access to RH's entire product range without manual browsing.
No input parameters required.
curl -X GET 'https://api.parse.bot/scraper/ec1ebefc-f5f4-4651-8a4b-6f7160dc6a39/get_subcategories' \ -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 rh-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.
from parse_apis.rh_restoration_hardware_api import RH, Category, ProductSummary, Product, RelatedProduct, ProductNotFound
client = RH()
# Get the full category navigation tree
root = client.categories.tree()
print(root.display_name, root.id)
# Walk the child categories
for child in root.child_categories:
print(child.display_name, child.target_url)
# Construct a category by known ID and browse its products
living = client.category(id="cat160024")
for product in living.products():
print(product.display_name, product.repository_id, product.price_info.currency_symbol, product.price_info.list_prices)
break
# Search for products across the catalog
for item in client.productsummaries.search(query="sofa"):
print(item.display_name, item.image_url)
# Drill into full product details
detail = item.details()
print(detail.display_name, detail.id)
print(detail.dimensions)
print(detail.price_range_display.currency_symbol, detail.price_range_display.list_prices)
# Get related products
for related in detail.related():
print(related.display_name, related.image_url)
# Get all images
for image_url in detail.images():
print(image_url)
break
Retrieve the full navigation tree of product categories from rh.com. Returns a single root category object containing nested child categories up to 3 levels deep. Each category includes an id, displayName, targetUrl, and childCategories array. Use category IDs from this tree to filter search_products or call get_category_products.
No input parameters required.
{
"type": "object",
"fields": {
"id": "string, root category identifier",
"targetUrl": "string or null, URL path for the category",
"displayName": "string, root category display name",
"childCategories": "array of nested category objects, each with id, displayName, targetUrl, and childCategories"
},
"sample": {
"data": {
"id": "cat1696090",
"targetUrl": null,
"displayName": "Global Nav",
"childCategories": [
{
"id": "cat160024",
"targetUrl": "/catalog/category/category.jsp?categoryId=cat160024",
"displayName": "Living",
"childCategories": [
{
"id": "cat1481016",
"targetUrl": "/catalog/category/collections.jsp/cat1481016",
"displayName": "Fabric Seating",
"childCategories": [
{
"id": "cat24710015",
"targetUrl": "/catalog/category/collections.jsp/cat24710015",
"displayName": "Seating Collections"
}
]
}
]
}
]
},
"status": "success"
}
}About the RH API
Category Navigation and Product Search
The get_subcategories endpoint returns the complete RH navigation hierarchy as a nested tree — a root category object with childCategories arrays going up to 3 levels deep. Each node includes an id, displayName, and targetUrl. These category IDs feed directly into search_products (via the category_id parameter) and get_category_products for scoped browsing. The search_products endpoint accepts a free-text query (e.g., 'sofa', 'table lamp'), an optional category_id, and limit/offset integers for pagination. When a search term triggers a redirect on RH's site, the response includes a redirectUrl field indicating where the search was routed.
Product Details and Pricing
get_product_details takes a product_id obtained from search or category results and returns a detailed record: displayName, longDescription (HTML-encoded), a dimensions array, a featureList (which may contain HTML markup), and alternateImages — each with imageUrl, caption, and a lifestyleImage flag. Pricing is exposed through priceRangeDisplay, which contains separate arrays for listPrices, memberPrices, and salePrices alongside a currencySymbol. The productLineItem.availableOptions array surfaces configurable product variants such as finish, size, or fabric.
Related Products and Images
get_related_products returns an array of upsell or complementary items for a given product_id, each with id, displayName, imageUrl, and its own priceRangeDisplay object. If no related products exist, the endpoint returns an empty array rather than an error. get_product_images retrieves all image URLs for a product — the main image plus alternates — returning protocol-relative URLs suitable for use with either HTTP or HTTPS.
The RH API is a managed, monitored endpoint for rh.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when rh.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 rh.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 furniture comparison tool using priceRangeDisplay fields (listPrices, memberPrices, salePrices) from get_product_details.
- Populate an interior design app's product catalog by crawling categories via get_subcategories and fetching items with get_category_products.
- Generate SEO product pages by extracting displayName, longDescription, featureList, and dimensions from get_product_details.
- Power a recommendation widget by pairing get_product_details with get_related_products for a given product.
- Aggregate high-resolution product imagery for visual search or training datasets using get_product_images and alternateImages from get_product_details.
- Monitor RH category structure changes over time by periodically calling get_subcategories and diffing the returned navigation tree.
- Filter and index RH's catalog by product configuration options using productLineItem.availableOptions from get_product_details.
| 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.