Ferguson APIferguson.com ↗
Search Ferguson's catalog and retrieve product details including price, specs, availability, and ratings for plumbing, HVAC, and building supplies.
What is the Ferguson API?
The Ferguson API provides 2 endpoints to search and retrieve product data from Ferguson.com, one of the largest plumbing, HVAC, and building supply distributors in the US. Use search_products to query the catalog and get paginated listings with brand, title, and part numbers, or call get_product_details with a Ferguson item number to pull full product data across more than 10 fields including price, description, images, and customer rating.
curl -X GET 'https://api.parse.bot/scraper/b025709a-11dc-4028-8c06-7ae55401ab38/search_products?page=1&query=residential+plumbing&page_size=24' \ -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 ferguson-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.
"""Walkthrough: Ferguson Plumbing Products API — search and drill into product details."""
from parse_apis.ferguson_com_api import Ferguson, ProductNotFound
client = Ferguson()
# Search for residential plumbing products with auto-pagination capped at 5 items.
for product in client.product_summaries.search(query="residential plumbing", limit=5):
print(product.brand, product.title, product.part_number)
# Drill into a single product's full details.
summary = client.product_summaries.search(query="bathroom faucet", limit=1).first()
if summary:
detail = summary.details()
print(detail.name, detail.price, detail.currency)
print("Specs:", len(detail.specifications), "items")
# Typed error handling: catch a not-found product.
fake = client.product_summaries.search(query="water heater", limit=1).first()
if fake:
try:
detail = fake.details()
print(detail.brand, detail.availability)
except ProductNotFound as exc:
print(f"Product gone: {exc}")
print("exercised: product_summaries.search / details / ProductNotFound")
Search for products on Ferguson.com. Returns paginated product listings with basic information including brand, title, part numbers, and image URL. Results are ordered by best match.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number for pagination, starting at 1. |
| queryrequired | string | Search query text (e.g. 'residential plumbing', 'bathroom faucet', 'water heater'). |
| page_size | integer | Number of products per page. Maximum 96. |
{
"type": "object",
"fields": {
"page": "integer",
"query": "string",
"products": "array of product summaries with id, brand, title, part_number, item_number, manufacturer_part_number, url, image_url, and optional collection",
"page_size": "integer",
"total_products": "integer"
},
"sample": {
"data": {
"page": 1,
"query": "residential plumbing",
"products": [
{
"id": "7172791",
"url": "https://www.ferguson.com/product/bradford-white-fvir-eco-defender-safety-system-40-gal.-tall-34-mbh-ultra-low-nox-atmospheric-vent-natural-gas-water-heater-burg140t6n394/7172791.html",
"brand": "Bradford White",
"title": "40 gal. Tall 34 MBH Ultra-Low NOx Atmospheric Vent Natural Gas Water Heater",
"image_url": "https://i.ferg-img.com/i/fergusonprod/7172791_14155561_primary?fmt=auto&w=250",
"collection": "FVIR Eco-Defender Safety System®",
"item_number": "7172791",
"part_number": "BURG140T6N394",
"manufacturer_part_number": "URG140T6N-394"
}
],
"page_size": 24,
"total_products": 2142
},
"status": "success"
}
}About the Ferguson API
Search the Ferguson Catalog
The search_products endpoint accepts a query string (for example, 'bathroom faucet' or 'water heater') and returns paginated product summaries. Each result includes a product id, brand, title, part_number, item_number, manufacturer_part_number, url, and image_url. Use page and page_size (up to 96 per page) to paginate through results, and check total_products to understand the full result count for a given query.
Full Product Details
The get_product_details endpoint takes a Ferguson product_id (the numeric id field returned by search_products) and returns a complete product record. Response fields include name, brand, price, currency, description, images (an array of image URLs), part_number, and a rating object with both rating and best_rating values. This is where you retrieve specification data and pricing for a specific SKU.
Part Number Coverage
Each product in the catalog exposes three distinct part number fields: part_number (Ferguson's internal number), item_number, and manufacturer_part_number. This makes it straightforward to cross-reference Ferguson SKUs against manufacturer catalogs or other distributor systems without additional lookups.
The Ferguson API is a managed, monitored endpoint for ferguson.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when ferguson.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 ferguson.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 product comparison tool for plumbing and HVAC contractors by querying multiple product types and comparing price and rating fields.
- Populate an internal procurement catalog with Ferguson SKUs, manufacturer part numbers, and images using search_products.
- Monitor price changes on specific Ferguson items by polling get_product_details with known product IDs.
- Cross-reference manufacturer part numbers from Ferguson listings against other supplier systems to find alternatives.
- Aggregate product images and descriptions for a building supply content site using the images and description fields.
- Build a search interface for trade professionals that surfaces Ferguson item numbers and availability data.
- Validate product catalog data by comparing Ferguson part_number and manufacturer_part_number fields against internal records.
| 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.