Massimo Dutti APImassimodutti.com ↗
Search Massimo Dutti's US catalogue, browse ~800 categories, and fetch full product detail including colors, sizes, composition, and pricing via 4 endpoints.
What is the Massimo Dutti API?
The Massimo Dutti API gives programmatic access to the brand's US online store across 4 endpoints: keyword search, category tree, category product listings, and full product detail. The get_product endpoint returns per-color records with size SKUs, buyability flags, composition by garment part, care instructions, model height and size, and all product images — covering both WOMEN and MEN sections with prices in US dollars.
curl -X GET 'https://api.parse.bot/scraper/0998b599-a4cc-4c4c-b8e0-fdb34459d27c/search_products?query=wool+coat' \ -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 massimodutti-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: Massimo Dutti SDK — search, browse categories, and fetch full product detail."""
from parse_apis.massimodutti_com_api import (
MassimoDutti, Section, SearchSort, InputNotFound,
)
client = MassimoDutti()
# Search for wool coats, capped at 5 results.
for item in client.product_summaries.search(query="wool coat", sort=SearchSort.RELEVANCE, limit=5):
print(item.name, item.price, item.section)
# Drill into the first search hit for full detail (colors, sizes, composition).
hit = client.product_summaries.search(query="linen shirt", section=Section.MEN, limit=1).first()
if hit is not None:
product = hit.details()
print(product.name, product.price, product.description)
for color in product.colors:
print(f" {color.color_name}: {len(color.sizes)} sizes")
for comp in color.composition:
materials = ", ".join(f"{c.material} {c.percentage}%" for c in comp.components)
print(f" {comp.part}: {materials}")
# Browse women's categories, pick the first, and list its products.
cat = client.categories.list(section=Section.WOMEN, limit=1).first()
if cat is not None:
print(f"Category: {cat.name} ({cat.path})")
for summary in cat.products.list(limit=3):
print(f" {summary.product_id} {summary.name} ${summary.price}")
# Point lookup by a known product id (from a previous search result).
if hit is not None:
try:
detail = client.products.get(product_id=hit.product_id)
print(detail.name, detail.care)
except InputNotFound:
print("Product no longer available")
print("exercised: product_summaries.search / categories.list / category.products.list / products.get / details()")
Keyword search over the US store catalogue for one section (WOMEN by default, or MEN). Returns one page of product summaries (id, name, reference, family, lowest price, per-color available sizes, main image, product URL) plus the total hit count, per-section hit counts, color/size facet counts and a continuation cursor. Pagination is cursor based: pass the returned cursor back unchanged to fetch the next page; has_more is false on the last page. limit is capped at 40 per call and each page costs two upstream requests. search_match is 'exact' when the site found keyword matches and 'suggested' when the site fell back to similar-product suggestions (a nonsense query still returns suggested products with total_results 50, so treat 'suggested' as no exact match). Only the size filter is honored by the site; facets.color_facet is informational. A result can be a styled look (is_look true): then name/price/colors are null or empty at the top level and the component garments are in look_items, each in the same summary shape. Ids the search index still lists but the catalogue no longer serves are reported in unavailable_product_ids instead of products.
| Param | Type | Description |
|---|---|---|
| size | string | Size facet id to restrict results to, taken from facets[key=size_facet].values[*].id of a previous search (e.g. xs, s, m, l, or numeric ids such as 36). Omitted = no size filter. |
| sort | string | Result ordering. |
| limit | integer | Products per page, 1-40; larger values are clamped to 40. |
| queryrequired | string | Free-text search term, e.g. one shape is 'wool coat'. |
| cursor | string | Opaque continuation cursor from a previous response's cursor field. Omitted = first page. |
| section | string | Catalogue section to search. |
{
"type": "object",
"fields": {
"query": "echo of the search term",
"cursor": "opaque continuation cursor for the next page",
"facets": "array of {key, values[] {id, label, count}} for color_facet and size_facet (empty on suggested fallbacks)",
"section": "section the results belong to (WOMEN or MEN)",
"has_more": "true when another page exists",
"products": "array of product summaries: product_id (string, use with get_product), name, reference, display_reference, section, family, subfamily, product_type, price (number, US dollars, lowest across colors/sizes), old_price (number or null when not discounted), on_special, is_buyable, description, colors[] {color_id, color_name, price, old_price, sizes_available[]}, image_url, product_url, is_look (boolean), look_items[] (component product summaries when is_look is true, otherwise empty)",
"search_match": "'exact' for keyword hits, 'suggested' when the site returned similar-product fallbacks instead",
"total_results": "integer total hits for the query in this section (as reported by the site)",
"section_counts": "array of {id, label, count} hit counts per section for this query (empty on suggested fallbacks)",
"unavailable_product_ids": "array of product ids on this page that the catalogue no longer serves (usually empty)"
},
"sample": {
"data": {
"query": "wool coat",
"cursor": "eyJjdXJzb3IiOjUsInByb3ZpZGVyIjoiQXR0cmFxdCJ9",
"facets": [
{
"key": "color_facet",
"values": [
{
"id": "comarrones",
"count": 10,
"label": "Browns"
}
]
},
{
"key": "size_facet",
"values": [
{
"id": "xs",
"count": 24,
"label": "XS"
}
]
}
],
"section": "WOMEN",
"has_more": true,
"products": [
{
"name": "Short wool-blend trench coat",
"price": 350,
"colors": [
{
"price": 350,
"color_id": "700",
"old_price": null,
"color_name": "BROWN",
"sizes_available": [
"XS",
"S",
"M",
"L"
]
}
],
"family": "COATS",
"is_look": false,
"section": "WOMEN",
"image_url": "https://static.massimodutti.net/assets/public/3149/5a53/03674e2b8ef8/da1b021ffe42/06410714700-o4/06410714700-o4.jpg?ts=1780407183341",
"old_price": null,
"reference": "06410714-I2026",
"subfamily": "",
"is_buyable": true,
"look_items": [],
"on_special": true,
"product_id": "61729802",
"description": "Short trench coat crafted from a wool-blend fabric. Designed with a shirt collar, long sleeves, and a double-breasted front closure. Two side pockets.",
"product_url": "https://www.massimodutti.com/us/short-woolblend-trench-coat-l06410714",
"product_type": "Clothing",
"display_reference": "6410/714"
}
],
"search_match": "exact",
"total_results": 40,
"section_counts": [
{
"id": "catalog01_women",
"count": 40,
"label": "Women"
},
{
"id": "catalog01_men",
"count": 7,
"label": "Men"
}
],
"unavailable_product_ids": []
},
"status": "success"
}
}About the Massimo Dutti API
Search and Browse the US Catalogue
The search_products endpoint accepts a free-text query (e.g. "wool coat") and an optional section parameter (WOMEN or MEN). Responses include total_results, a search_match field that distinguishes exact keyword hits from fallback suggestions, and section_counts showing hit counts across all sections for the same query. Facet arrays for color_facet and size_facet are returned with each response and can be passed back as size filter parameters to narrow subsequent pages. Pagination uses an opaque cursor field; has_more signals when another page is available. Each page returns up to 40 product summaries.
Category Tree and Listings
list_categories returns the flattened leaf-level menu — roughly 800 categories across both sections — with each entry carrying a category_id, display name, full menu path (e.g. "WOMEN / Knitwear / Cardigans"), section, and the public store URL. Pass any category_id to list_category_products to get an ordered, offset-paginated product listing in the same summary shape as search results. The offset and limit parameters (limit capped at 40) let you page through a category's full inventory. Both endpoints accept an optional section filter.
Full Product Detail
get_product takes a product_id from either search or category results and returns the complete record. The colors array gives each colorway its own catentry_id, reference, price, old_price, model_height, model_size, and a composition array broken down by garment part. Every size SKU within a color includes buyability status. The top-level response also exposes care instruction strings, an images array of all image URLs, a related array of grouped related-product ids, and an is_look flag for styled multi-garment looks whose component product_ids are listed under look_items.
The Massimo Dutti API is a managed, monitored endpoint for massimodutti.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when massimodutti.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 massimodutti.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-drop tracker by polling
get_productforold_pricevspricechanges across a watchlist of product ids. - Populate a size-availability dashboard using per-SKU buyability flags from the
colors[*].sizesarray inget_product. - Construct a cross-section search interface using
section_countsfromsearch_productsto let users toggle between WOMEN and MEN results. - Export the full category tree via
list_categoriesto map Massimo Dutti's taxonomy for merchandising or competitor analysis. - Sync a product feed for a fashion aggregator by paging through
list_category_productswithoffset/limitand enriching summaries withget_product. - Filter search results by size using
facets[key=size_facet].values[*].idfrom onesearch_productscall as thesizeinput in the next. - Identify garment fabric composition for sustainability labeling by extracting
compositionfields fromget_product.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Massimo Dutti have an official public developer API?+
What does `search_match` tell me, and when are `facets` empty?+
search_match is 'exact' when the query returned direct keyword hits. When the store returns similar-product fallbacks instead of exact matches, search_match is 'suggested' and both facets and section_counts are returned as empty arrays for that response.Does the API cover stores outside the United States or return prices in other currencies?+
Are customer reviews or ratings returned by any endpoint?+
How does pagination work for category listings versus search?+
list_category_products uses numeric offset and limit parameters (limit capped at 40), and has_more is true when offset + limit < total_results. search_products uses an opaque cursor string from the previous response instead of a numeric offset; omit cursor to start from the first page.