Menards APImenards.com ↗
Access Menards product listings, pricing, availability, and specifications via 4 endpoints. Search by keyword, browse by category ID, or fetch full product details.
What is the Menards API?
The Menards API exposes 4 endpoints covering product search, category browsing, product details, and department listings across the full Menards catalog. The search_products endpoint returns paginated results of up to 40 items per page, each including title, SKU, pricing container, availability, and a direct product link. Whether you're indexing hardware inventory or tracking lumber prices, the API provides structured access to Menards' catalog without manual browsing.
curl -X GET 'https://api.parse.bot/scraper/eb63af6a-74ff-4ce8-80af-8128a015b563/search_products?page=1&query=drill' \ -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 menards-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.menards_api import Menards, Product, ProductDetail, Department
menards = Menards()
# List all departments
for dept in menards.departments.list():
print(dept.name, dept.id)
# Construct a department and browse its products
tools = menards.department(id="13067")
for product in tools.products(limit=5):
print(product.title, product.sku, product.final_price, product.has_pickup)
# Search for products
for product in menards.products.search(query="hammer", limit=3):
print(product.title, product.item_id, product.sale_price)
# Get full product details
detail = product.details()
print(detail.name, detail.brand, detail.specifications)
Full-text search over Menards.com product catalog. Returns up to 40 products per page with pricing, availability, and product links. Paginates via integer page number; totalItems indicates how many results match the query across all pages.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number for pagination (1-based) |
| queryrequired | string | Search keyword (e.g. 'drill', 'hammer', 'lumber') |
{
"type": "object",
"fields": {
"items": "array of product objects with title, itemId, link, image, sku, basicPriceContainer, availability",
"totalItems": "integer total number of matching products"
},
"sample": {
"data": {
"items": [
{
"sku": 2419903,
"link": "/main/tools/power-tools/power-drills-impact-drivers/north-tech-reg-18-volt-cordless-3-8-drill-kit/cd111/p-1642874352528255-c-9072.htm",
"image": "https://cdn.menardc.com/main/items/media/ZHUHA001/ProductLarge/2419903.jpg",
"title": "North Tech® 18-Volt Cordless 3/8\" Drill Kit",
"itemId": "1642874352528255",
"availability": {
"hasPickup": true,
"hasDelivery": true
},
"basicPriceContainer": {
"listPrice": 16.99,
"salePrice": 16.99,
"finalPrice": {
"finalPrice": 15.12,
"unitOfMeasure": "each"
},
"rebatePrice": 1.87
}
}
],
"totalItems": 137
},
"status": "success"
}
}About the Menards API
Endpoints and What They Return
The search_products endpoint accepts a required query string (e.g. 'drill', 'lumber', 'hammer') and an optional page integer for pagination. It returns a totalItems count and an items array where each object includes title, itemId, sku, link, image, basicPriceContainer, and availability. The get_category endpoint works similarly but takes a category_id string instead of a search term — for example '9143' for Hammers or '9072' for Power Drills — making it suitable for systematic catalog browsing by department.
Product Details and Specifications
The get_product_details endpoint accepts a url path beginning with /main/ and returns two top-level objects: product_info (Schema.org Product data including name, description, sku, brand, offers, and image URLs) and specifications (a flat key-value object for product-level attributes like Handle Length or Head Weight). This structured specification data is particularly useful when comparing products programmatically or populating a product database.
Navigating the Catalog
The get_departments endpoint requires no inputs and returns an array of departments, each with a name, url, and id. Those IDs feed directly into get_category, giving you a top-down traversal path from department to product. This makes it straightforward to enumerate all top-level categories before drilling into specific listings. Both search_products and get_category paginate at 40 items per page, so totalItems divided by 40 tells you the page count for a full crawl.
The Menards API is a managed, monitored endpoint for menards.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when menards.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 menards.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?+
- Track price changes on specific SKUs using
basicPriceContainerdata returned bysearch_products. - Build a cross-retailer hardware price comparison tool using
offersfromget_product_details. - Enumerate an entire department's inventory by chaining
get_departmentswith paginatedget_categorycalls. - Populate a product database with structured specs like Handle Length and Head Weight from the
specificationsfield. - Monitor availability status across lumber and building material categories using the
availabilityfield. - Index product images and metadata using
image,title, andskufrom category or search results. - Identify category IDs for targeted catalog monitoring by parsing the
get_departmentsresponse.
| 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 Menards have an official developer API?+
What does `basicPriceContainer` contain and does it include sale or rebate pricing?+
basicPriceContainer field is returned as an object in both search_products and get_category results and reflects the price data shown on Menards product listings. The exact subfields depend on the product; sale pricing may be nested within it. The API does not currently expose a dedicated rebate field as a separate top-level value. You can fork it on Parse and revise to add a parsed rebate field if that level of detail is needed.Does `get_product_details` return customer reviews or ratings?+
product_info and spec key-value pairs via specifications. Customer reviews and star ratings are not currently returned. You can fork this API on Parse and revise it to add a reviews endpoint targeting product review data.Are there any limitations on pagination depth or category coverage?+
search_products and get_category return up to 40 items per page with a totalItems field to calculate total pages. Deep pagination (high page numbers on large result sets) may reflect the same limits that apply on the Menards site itself. Category coverage depends on what Menards surfaces under a given category_id; not all subcategories are directly addressable without first discovering IDs via get_departments.Can I retrieve store-level inventory or in-store availability by location?+
availability field in product listings, but it does not currently expose per-store stock levels or location-based inventory lookup. You can fork this API on Parse and revise it to add a store-specific availability endpoint if granular location data is required.