Migros APImigros.ch ↗
Access Migros product catalog via API: search products, browse categories, get nutritional details, and fetch current Swiss supermarket promotions.
What is the Migros API?
The Migros.ch API exposes 5 endpoints covering Switzerland's largest supermarket chain, giving you structured access to product search, category browsing, detailed product information, and live promotional offers. The get_product_details endpoint returns fields including allergens, ingredient lists, nutritional values, ratings, and pricing — all in a single response keyed by Migros product ID.
curl -X GET 'https://api.parse.bot/scraper/16789456-081c-42ac-8873-4d20dfea4592/search_products?limit=20&query=milk&offset=0' \ -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 migros-ch-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.migros_supermarket_api import Migros, ProductSummary, Product, Category, Promotion, ProductNotFound
migros = Migros()
# Search for products
for product in migros.products.search(query="chocolate", limit=5):
print(product.name, product.title, product.offer.price.effective_value)
# Browse a category by constructing it from a known ID
fruits = migros.category(id="7494732")
for item in fruits.products(offset=0, limit=3):
print(item.name, item.offer.price.advertised_display_value, item.offer.quantity)
# Get full product details from a search result
for summary in migros.products.search(query="milk", limit=1):
detail = summary.details()
print(detail.name, detail.title)
print(detail.product_information.main_information.allergens)
if detail.product_information.main_information.rating:
print(detail.product_information.main_information.rating.nb_stars, detail.product_information.main_information.rating.nb_reviews)
# List current promotions
for promo in migros.promotions.list(limit=3):
print(promo.name, promo.offer.price.effective_value)
# List categories and navigate
for cat in migros.categories.list():
print(cat.id, cat.name, cat.slug)
Full-text search over the Migros product catalog. Returns product cards with name, price, brand, images, and category breadcrumb. Pagination is offset-based via the offset parameter. Each product includes a migrosId suitable for fetching full details via get_product_details.
| Param | Type | Description |
|---|---|---|
| limit | integer | Maximum number of results to return |
| queryrequired | string | Search keyword (e.g. 'milk', 'bread', 'chocolate') |
| offset | integer | Number of results to skip for pagination |
{
"type": "object",
"fields": {
"total": "integer total number of matching products",
"facets": "category facets from search or null",
"products": "array of product objects with uid, migrosId, name, title, offer, images, breadcrumb"
},
"sample": {
"data": {
"total": 100,
"facets": null,
"products": [
{
"uid": 100006357,
"name": "Whole Milk",
"offer": {
"price": {
"effectiveValue": 1.85,
"advertisedDisplayValue": "1.85"
},
"quantity": "1l"
},
"title": "Whole Milk · Bio, 3.5% fat, pasteurized",
"images": [
{
"cdn": "rokka",
"url": "https://image.migros.ch/d/{stack}/f8645d351d6a1ce14c8d38b9523a517e1aa08ea2/bio-whole-milk-35-fat-pasteurized.jpg"
}
],
"migrosId": "204003200000",
"breadcrumb": [
{
"id": "7494731",
"name": "Dairy, eggs & fresh convenience food"
}
]
}
]
},
"status": "success"
}
}About the Migros API
Product Search and Browsing
The search_products endpoint accepts a required query string and optional limit and offset parameters for pagination. Each result in the products array includes uid, migrosId, name, title, offer (price and quantity), images, and a breadcrumb array that maps the product's category hierarchy. The total field tells you how many matches exist, and facets provides filter metadata when available.
The get_products_by_category endpoint takes a category_id (obtained from get_categories) and returns the same product shape, but also includes a subcategories array with nested children and a filters array showing available filter options with id, label, count, and type. To navigate the full category tree, call get_categories first — it returns top_categories with id, name, and slug for each top-level department.
Product Detail and Nutrition
get_product_details takes a single product_id and returns a productInformation object structured into three sections: mainInformation (allergens, labels, ratings), nutrientsInformation (per-product nutritional breakdown), and otherInformation. This endpoint is the only one that exposes allergen and ingredient data, making it the right call when you need full compliance or dietary filtering beyond what search results carry.
Promotions and Offers
The get_offers endpoint returns current promotional items with startDate and endDate for the promotion window, a weekendPromotions object with its own start date and item list, and an upcomingPromotions field (or null when none are scheduled). Promoted products include discount badges and full offer details. Pagination uses a 0-based page parameter alongside limit.
The Migros API is a managed, monitored endpoint for migros.ch — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when migros.ch 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 migros.ch 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 Migros product prices and promotional discounts over time using
get_offers - Power a recipe ingredient checker by pulling allergen and nutritional data via
get_product_details - Create a category-level inventory snapshot using
get_products_by_categorywith subcategory traversal - Monitor active Swiss supermarket promotions and their date ranges for deal-alert notifications
- Populate a product catalog or database with Migros breadcrumb categories, images, and brand titles
- Build dietary filter tooling using
mainInformationallergen and label fields from detailed product responses - Implement autocomplete or search suggestions backed by
search_productswith keyword queries
| 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 Migros have an official public developer API?+
How does pagination work across the endpoints?+
search_products and get_products_by_category both use offset and limit integer parameters. The total field in each response tells you the full result count so you can calculate how many pages remain. get_offers uses a 0-based page parameter combined with limit.Does `get_product_details` return customer reviews or review text?+
rating value inside the mainInformation object, but individual review text and reviewer details are not part of the response. You can fork this API on Parse and revise it to add an endpoint targeting per-product review content.Are store-level inventory or stock availability data included?+
How do I find the right category ID to use with `get_products_by_category`?+
get_categories first — it returns a top_categories array where each object includes an id, name, and slug. Pass that id directly to get_products_by_category. The subcategories array in that response contains child category IDs you can use for deeper traversal.