Bike-Discount APIbike-discount.de ↗
Access e-bike product listings, technical specs, motor info, frame geometry, and pricing from bike-discount.de across 9 endpoints.
What is the Bike-Discount API?
The Bike-Discount.de API exposes 9 endpoints for retrieving e-bike product data from one of Europe's larger online cycling retailers. Use get_ebike_product_detail to pull full specs, motor descriptions, frame geometry tables, pricing, and variant information for any product in the catalog. Additional endpoints cover category browsing, keyword search, brand filtering, and focused spec extraction — giving structured access to the full product data set without manual page parsing.
curl -X GET 'https://api.parse.bot/scraper/4ceb9c0b-2187-44f1-a33c-0e32726674d0/get_ebike_category_listing?n=24&o=1&p=1' \ -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 bike-discount-de-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.bike_discount.de_e_bike_api import BikeDiscount, Sort, ProductNotFound
client = BikeDiscount()
# Browse e-bikes sorted by price ascending
for bike in client.products.list(o=Sort.PRICE_ASC, limit=5):
print(bike.name, bike.price_sale, bike.url)
# Search and drill into full details plus focused sub-views
result = client.products.search(query="Radon", limit=1).first()
if result:
detail = result.details()
print(detail.name, detail.price_sale, detail.motor_info[:80])
print(detail.data_layer.product_category, detail.data_layer.product_price)
# Focused specs and pricing views
specs = result.specifications()
print(specs.specs.get("Motor", "N/A"))
pricing = result.pricing()
print(pricing.price_sale, pricing.data_layer.product_currency)
# List all available brands from the filter panel
for brand in client.brands.list(limit=5):
print(brand.name)
# List subcategories from the e-bike navigation
for cat in client.subcategories.list(limit=5):
print(cat.name, cat.url)
# Typed error handling for a missing product
try:
bad = client.products.search(query="nonexistent_xyz_00", limit=1).first()
if bad:
bad.details()
except ProductNotFound as exc:
print(f"Product not found: {exc.url_slug}")
print("exercised: products.list / products.search / details / specifications / pricing / brands.list / subcategories.list")
Retrieve a paginated list of e-bikes from the category page. Returns product cards with name, price, URL, and image. Sort options control ordering: 1=topseller, 2=price ascending, 3=price descending, 4=newest. Each page returns up to n items.
| Param | Type | Description |
|---|---|---|
| n | integer | Items per page. |
| o | integer | Sort order: 1=topseller, 2=price ascending, 3=price descending, 4=newest. |
| p | integer | Page number (1-based). |
{
"type": "object",
"fields": {
"page": "string page number requested",
"products": "array of ProductSummary objects with name, brand, url, price_sale, price_uvp, image_url",
"total_on_page": "integer count of products returned on this page"
},
"sample": {
"data": {
"page": "1",
"products": [
{
"url": "https://www.bike-discount.de/de/scott-voltage-eride-900-tuned-eu-raw-carbon/purple-marble",
"name": "Scott Voltage eRide 900 Tuned",
"brand": "",
"image_url": "https://www.bike-discount.de/media/a9/ed/05/1767744177/293294-voltage-eride-900-tuned-eu-1.jpg",
"price_uvp": "",
"price_sale": "UVP* 10.999,00 € 4.299,00 €"
}
],
"total_on_page": 48
},
"status": "success"
}
}About the Bike-Discount API
Browsing and Search
get_ebike_category_listing returns paginated product cards from the main e-bike category, each containing name, brand, url, price_sale, price_uvp, and image_url. The o parameter controls sort order (1=topseller, 2=price ascending, 3=price descending, 4=newest), while p and n control pagination and page size. search_products accepts a query string and returns the same ProductSummary shape across the full catalog — including bikes, parts, and accessories. get_ebike_subcategories lists sidebar navigation links so you can enumerate available e-bike types and model-year groupings, and get_brands_list returns all brand names from the Marke filter panel.
Product Detail and Specifications
get_ebike_product_detail is the most data-dense endpoint. Supply a url_slug (the /de/... path from any listing URL) to get back specs (a key-value object with fields like Rahmen, Motor, Akku, Gabel, Bremsen), geometry (an array of tables, each an array of row arrays), variants, motor_info, both price_sale and price_uvp, and a dataLayer object containing productID, productSku, productPrice, productCurrency, and productCategory. If you only need one of these sub-sets, dedicated endpoints exist: get_ebike_specifications returns just the specs object, get_ebike_motor_info returns the motor description text, and get_ebike_geometry returns the geometry tables alone.
Pricing and Stock Metadata
get_ebike_pricing_and_stock returns the price_sale, price_uvp, and the full dataLayer object for a given product slug. The dataLayer fields (productPrice, productCurrency, productID, productCategory, productSku) come from the site's structured product metadata layer and reflect the net price and product classification used by the retailer. Note that stock-level granularity (e.g. units remaining) is not surfaced — the endpoint reflects price and product identity data rather than warehouse inventory counts.
Coverage Notes
All nine endpoints target the German-language (/de/) product surface of bike-discount.de. Product URLs from get_ebike_category_listing or search_products can be passed directly as url_slug values to any detail endpoint. Geometry data is product-dependent — some listings do not publish frame geometry, in which case get_ebike_geometry returns an empty array.
The Bike-Discount API is a managed, monitored endpoint for bike-discount.de — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when bike-discount.de 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 bike-discount.de 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-tracking tool comparing
price_salevsprice_uvpacross multiple e-bike models over time. - Aggregate motor and battery spec data from
specsfields (Motor, Akku) to compare drive systems across brands. - Generate a brand catalog by combining
get_brands_listwithget_ebike_category_listingfiltered per brand. - Populate a frame geometry comparison table for bike-fit tools using
get_ebike_geometryrow arrays. - Index e-bike product names, SKUs, and categories from
dataLayerfields for a cycling product search engine. - Monitor new listings by sorting
get_ebike_category_listingwitho=4(newest) and diffing results periodically. - Enrich search results from
search_productswith full specs by chaining intoget_ebike_product_detailon each returned URL.
| 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 bike-discount.de offer an official developer API?+
What does `get_ebike_pricing_and_stock` actually return for stock status?+
price_sale, price_uvp, and the dataLayer object (productPrice, productCurrency, productID, productCategory, productSku). It does not return a numeric stock count or an explicit in-stock/out-of-stock flag — only price and product identity metadata are exposed.Does the API cover accessories, parts, and clothing sold on bike-discount.de, or only e-bikes?+
search_products does return matching results across the full catalog including parts and accessories, but there are no dedicated category-listing or specification endpoints for those product types. You can fork this API on Parse and revise it to add category listing endpoints for parts, clothing, or other sections of the site.Is there a way to filter `get_ebike_category_listing` by brand or price range?+
n (items per page), o (sort order), and p (page number) as inputs. Brand and price-range filtering parameters are not currently exposed. You can fork this API on Parse and revise it to add those filter inputs.Some products return an empty array from `get_ebike_geometry`. Why?+
get_ebike_geometry returns an empty array rather than an error. Check the geometry field in get_ebike_product_detail as well — it returns the same data alongside other product fields in a single call.