# Buycycle.com — Used Bike Finder (`inovaflow/buycycle-hunter-pw`) Actor

Search Buycycle — Europe's largest used bike marketplace. Filter by brand, size, price, year, and condition. Get curated highlights, deal scores, and new-listing alerts.
Want more bike marketplaces rolled into the same Actor? Email hello@inovaflow.io and we'll add them.

- **URL**: https://apify.com/inovaflow/buycycle-hunter-pw.md
- **Developed by:** [inovaflow](https://apify.com/inovaflow) (community)
- **Categories:** E-commerce
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.01 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Buycycle Used Bike Finder & Deal Tracker 🚴

[![Apify Actor](https://apify.com/actor-badge?actor=inovaflow/buycycle-hunter-pw)](https://apify.com/inovaflow/buycycle-hunter-pw)

Search **[buycycle.com](https://buycycle.com)** — Europe's largest used bike marketplace — and pull back clean, structured listings filtered by brand, size, price, year, condition, groupset, and more. Built for cyclists hunting deals, shops tracking inventory, and price-watchers monitoring specific models.

---

### What this Actor does

Buycycle has tens of thousands of used road, gravel, MTB, and e-bikes for sale across 29 countries — but their search UI gets clunky once you're combining filters, and there's no native way to be notified when a specific bike pops up. This Actor wraps their search in a clean, schedulable interface that returns:

- **Structured JSON** for every listing (brand, model, year, size, price, MSRP, discount %, wishlist count, "high demand" flag, image, link, and more)
- **Curated highlights** so you see only the listings that matter (biggest discounts, cheapest per model, best value, popular bikes, etc.)
- **New-listing tracking** that flags bikes added since your last run — perfect for daily monitoring with email or Slack notifications

### Why use it

- **One place, every filter.** Search any combination of country, brand, frame size, price range, model year, condition, frame material, brake type, shifting type, e-bike vs analog, frameset vs complete bike, and seller type — all in a single run.
- **Spot real deals automatically.** The "Best value" highlight strategy ranks bikes by a composite score combining discount %, model freshness, and condition. The "Skip overpriced" strategy filters out anything more than 1.5× the median price for your search.
- **Get notified when new bikes show up.** The "New listings only" mode remembers what it saw last run and only returns bikes that weren't there before. Pair it with Apify's [integrations](https://apify.com/integrations) to fire a Slack or email notification only when something genuinely new appears.
- **29 countries, 3 currencies.** Buycycle ships internationally — search the German marketplace from the US, or the Swiss marketplace from Spain. Currency (EUR, USD, CHF) is preserved in the output. Proxy region is automatically matched to the marketplace you pick, which keeps Cloudflare happy and reduces blocks.

### Features

| | |
|---|---|
| 🔍 Free-text + filters | Combine keyword search with any of 14 filter categories |
| 🌍 29 marketplaces | All Buycycle countries (DE, FR, IT, ES, US, CH, …) |
| 💰 Deal scoring | Composite score combines discount %, year, condition |
| 🔔 New-listing detection | Per-search dedup memory, perfect for daily monitoring |
| 🛡️ Cloudflare-aware | Geo-matched residential proxies + browser fingerprinting |
| 📊 Two datasets | Curated `Output` for notifications, full `full-results` for analysis |
| 📝 Markdown summary | Human-readable summary stored in the run's key-value store |

### Input

All inputs are optional. The minimal valid run is no input at all (it'll search the German marketplace with default settings).

The most common inputs you'll set:

- **Search keyword** — free-text like `"canyon aeroad"`, `"tarmac sl7"`, `"pinarello"`. Leave blank to browse using filters only.
- **Country** — pick the marketplace. Defaults to Germany (largest pool). The Actor automatically routes its requests through a residential proxy in the same country — this looks like a real local shopper to Cloudflare and significantly reduces blocks.
- **Brands / Frame size / Price range / Year range / Conditions** — narrow down what you want.
- **Highlights filter** — choose how the main `Output` dataset is curated. Defaults to `None — return full list`. Switch to `New listings only` for monitoring use cases.
- **Max pages to crawl** — safety cap. Each page is roughly 50 bikes. Default is 2 (~100 bikes), max is 50 (~2500 bikes).

See the **Input** tab for the full list of fields with descriptions.

### Output

Two datasets are produced on every run:

#### `Output` (default dataset)
The curated set, filtered by the **Highlights filter** you chose. This is what notifications fire on. With the default `None — return full list` strategy, this contains every bike found.

#### `full-results` (storage dataset)
The complete, unfiltered crawl — always available regardless of highlight strategy. Use this for analysis, archival, or if you want to query results yourself.

#### Per-bike fields

```json
{
  "itemId": "182734",
  "brand": "Canyon",
  "name": "Aeroad CFR Disc Di2",
  "priceBase": 4200,
  "priceTotal": 4452,
  "buyerProtectionFee": 252,
  "currency": "EUR",
  "msrp": 7999,
  "isDiscounted": true,
  "discountPct": 44,
  "size": "M",
  "year": 2022,
  "groupset": "Shimano Dura-Ace Di2",
  "wishlistCount": 87,
  "isHighDemand": true,
  "imageUrl": "https://...",
  "productUrl": "https://buycycle.com/en-de/bike/...",
  "pageNum": 1,
  "scrapedAt": "2026-04-13T10:22:31.123Z",
  "searchKeyword": "canyon aeroad"
}
````

Additional fields appear depending on the highlight strategy:

- **`isNew`** — only present when using the `New listings only` strategy. `true` if the listing wasn't seen on the previous run with the same filters.
- **`dealScore`** — only present when using the `Best value` strategy. Composite score combining discount %, model freshness, and condition.

#### Run summary

A human-readable Markdown summary is also stored at `summary-markdown` in the key-value store, and a structured `OUTPUT` record holds the cheapest bike, biggest discount, most popular bike, and total counts.

### Highlight strategies

The **Highlights filter** is the most powerful feature. It controls which bikes land in the main `Output` dataset (and therefore which bikes trigger notifications if you've wired any up). Pick one strategy per run:

- **None — return full list.** Every bike found goes into Output. Default.
- **New listings only (vs last run).** Tracks itemIDs from the previous run with the same filters and only returns bikes that weren't there before. First run returns the full result set as the baseline. **This is the strategy to use for daily monitoring.**
- **Discounted bikes.** Only bikes with at least *N*% off MSRP. Set the threshold via the `Minimum discount %` field.
- **Cheapest per model variant.** Groups bikes by normalized name + year and returns only the cheapest of each — great for catching multiple sellers offering the same bike.
- **Best value (composite deal score).** Ranks all bikes by a weighted score combining discount %, model freshness, and condition, then returns the top 20.
- **Skip overpriced (above 1.5× median).** Drops outliers — useful when one mistitled or rare-spec listing is skewing the price range.
- **Popular.** Only bikes wishlisted by at least *N* users. Set the threshold via the `Minimum wishlist count` field.

### Use cases

**1. Daily deal alerts for a specific bike.** Set the keyword to `"canyon aeroad"`, country to your local marketplace, highlights filter to `New listings only`, schedule the actor for daily runs, and connect a [Slack integration](https://apify.com/apify/slack). You'll get a ping the moment a new Aeroad shows up.

**2. Inventory tracking for shops.** Search by brand and condition (`Brand new with guarantee`), set `Sold by` to `Shop / dealer`, and run weekly to track what your competitors have in stock.

**3. Market analysis.** Run with no keyword, max pages set to 50, and `None — return full list` to pull a 2500-bike sample of the entire marketplace. Export to CSV and analyze price distributions, popular brands, average discounts.

**4. Frame hunting.** Set `Frameset only`, pick a brand, and monitor for rare framesets in your size.

### How proxies work

Buycycle is protected by Cloudflare, so this Actor uses Apify residential proxies and automatically matches the proxy country to the marketplace country you pick. You don't need to configure anything — it just works.

### Actor permissions

When running this Actor, select **Full permissions** in the run options. The "New listings only" highlight strategy uses a named key-value store to remember which bikes it saw on previous runs — this requires Full permissions to create and access across runs. Limited permissions will cause dedup memory to reset every run, breaking the monitoring feature.

If you're not using the "New listings only" strategy, Limited permissions should work fine — but Full permissions is the safer default.

### Run time

Buycycle uses advanced bot protection. This Actor works through it using residential proxies and browser fingerprinting, which means each page load takes 15–60 seconds including retries. A typical 2-page run finishes in 1–3 minutes. This is normal — the Actor is designed to be patient rather than fast.

### Limitations

- **Detail pages aren't scraped.** Only the search-results cards. If you need full bike specs, contact info, or seller history, this Actor doesn't currently fetch those — let us know if it'd be useful.
- **The dedup memory is per-search.** If you change any filter (other than `Max pages` or the highlights strategy), you'll start a fresh baseline.
- **Only English locales.** Buycycle has localized versions, but the URL builder uses the `en-*` slug for every country to keep parsing consistent.
- **Cloudflare can still occasionally block runs.** If you see 0 results, retry — the Actor uses a fresh browser fingerprint each time and usually succeeds within 1–2 retries.

### Want more bike marketplaces?

Reach out to <hello@inovaflow.io> if you'd like to see other used-bike marketplaces (chainreactioncycles, bikeexchange, marktplaats, etc.) rolled into the same Actor — or built as separate Actors that share the same output schema. We're actively expanding this.

### Feedback & support

Built and maintained by [Inovaflow](https://inovaflow.io), a Prague-based integration engineering team. Have an idea, request, or bug report? Open an issue on the Actor page or reach out directly — feedback shapes the roadmap.

### License

ISC

# Actor input Schema

## `model` (type: `string`):

Free-text search. Try a model ('canyon aeroad'), a brand ('pinarello'), or a frame name ('tarmac sl7'). Leave blank to browse using filters only.

## `sortBy` (type: `string`):

How buycycle orders the listings before we collect them. Affects which results you get if you cap pages.

## `country` (type: `string`):

Pick the country you want to shop in. Determines the currency, the seller pool, and the residential proxy region we use to access buycycle. Buycycle ships internationally between most of these countries.

## `locationScope` (type: `string`):

Limit results by where the seller is located, relative to the country picked above. Leave empty to search worldwide.

## `brands` (type: `array`):

Pick one or more brands. Showing the most-listed brands on buycycle.

## `frameSizes` (type: `array`):

Pick one or more sizes. Sizes are based on seat tube length in centimeters.

## `priceMin` (type: `integer`):

Lower price bound in the marketplace's currency. Based on the 'incl.' price (with buyer protection fee).

## `priceMax` (type: `integer`):

Upper price bound in the marketplace's currency. Based on the 'incl.' price (with buyer protection fee).

## `yearMin` (type: `integer`):

Only show bikes from this model year or newer.

## `yearMax` (type: `integer`):

Only show bikes from this model year or older.

## `conditions` (type: `array`):

Buycycle's condition grades. 'Fair' = visible wear. 'Good' = light use. 'Very Good' = like-new. 'New' = unused. 'Brand new with guarantee' = unused with manufacturer warranty.

## `frameMaterials` (type: `array`):

Pick one or more materials.

## `brakeTypes` (type: `array`):

Pick one or more brake types.

## `shifts` (type: `array`):

Electronic = Di2 / eTap / EPS. Mechanical = traditional cable shifters.

## `isFrameset` (type: `string`):

Leave empty to include both. Pick a value to limit to one type.

## `isMotor` (type: `string`):

Leave empty to include both. Pick a value to limit to one type.

## `sellerType` (type: `array`):

Private = individuals selling their own bikes. Shop = commercial dealers and resellers.

## `highDemandOnly` (type: `boolean`):

Only return bikes with buycycle's official 'High demand' badge. Buycycle assigns this badge based on their internal signals (views, wishlists, recency). These bikes tend to sell fast.

## `maxPages` (type: `integer`):

Safety cap on pagination. Each page contains roughly 50 bikes. Increase for broader searches; keep low for faster, cheaper runs.

## `returnOnly` (type: `string`):

Pick a strategy to curate the main Output dataset. 'New listings only' tracks changes between runs — perfect for daily monitoring with notifications. The full crawl is always available in Storage → 'full-results'.

## `minDiscountPct` (type: `integer`):

Only used when Highlights filter = 'Discounted bikes'. Bikes with at least this discount off MSRP will appear in the highlights.

## `minWishlistCount` (type: `integer`):

Only used when Highlights filter = 'Popular'. Bikes wishlisted by at least this many users will appear in the highlights.

## Actor input object example

```json
{
  "model": "canyon aeroad",
  "sortBy": "lowest-price",
  "country": "de",
  "locationScope": "continent",
  "brands": [],
  "frameSizes": [],
  "conditions": [],
  "frameMaterials": [],
  "brakeTypes": [],
  "shifts": [],
  "sellerType": [],
  "highDemandOnly": false,
  "maxPages": 2,
  "returnOnly": "all",
  "minDiscountPct": 20,
  "minWishlistCount": 20
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `summary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "model": "canyon aeroad",
    "country": "de",
    "locationScope": "continent"
};

// Run the Actor and wait for it to finish
const run = await client.actor("inovaflow/buycycle-hunter-pw").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "model": "canyon aeroad",
    "country": "de",
    "locationScope": "continent",
}

# Run the Actor and wait for it to finish
run = client.actor("inovaflow/buycycle-hunter-pw").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "model": "canyon aeroad",
  "country": "de",
  "locationScope": "continent"
}' |
apify call inovaflow/buycycle-hunter-pw --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=inovaflow/buycycle-hunter-pw",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Buycycle.com — Used Bike Finder",
        "description": "Search Buycycle — Europe's largest used bike marketplace. Filter by brand, size, price, year, and condition. Get curated highlights, deal scores, and new-listing alerts.\nWant more bike marketplaces rolled into the same Actor? Email hello@inovaflow.io and we'll add them.",
        "version": "1.5",
        "x-build-id": "Q3lX5cOnFKuKdfXfZ"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/inovaflow~buycycle-hunter-pw/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-inovaflow-buycycle-hunter-pw",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/inovaflow~buycycle-hunter-pw/runs": {
            "post": {
                "operationId": "runs-sync-inovaflow-buycycle-hunter-pw",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/inovaflow~buycycle-hunter-pw/run-sync": {
            "post": {
                "operationId": "run-sync-inovaflow-buycycle-hunter-pw",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "model": {
                        "title": "Search keyword",
                        "type": "string",
                        "description": "Free-text search. Try a model ('canyon aeroad'), a brand ('pinarello'), or a frame name ('tarmac sl7'). Leave blank to browse using filters only."
                    },
                    "sortBy": {
                        "title": "Sort results by",
                        "enum": [
                            "relevance",
                            "new",
                            "lowest-price",
                            "highest-price"
                        ],
                        "type": "string",
                        "description": "How buycycle orders the listings before we collect them. Affects which results you get if you cap pages.",
                        "default": "lowest-price"
                    },
                    "country": {
                        "title": "Buycycle marketplace country",
                        "enum": [
                            "de",
                            "at",
                            "be",
                            "bg",
                            "ch",
                            "cy",
                            "cz",
                            "dk",
                            "ee",
                            "es",
                            "fi",
                            "fr",
                            "gr",
                            "hr",
                            "hu",
                            "ie",
                            "it",
                            "lt",
                            "lu",
                            "lv",
                            "nl",
                            "no",
                            "pl",
                            "pt",
                            "ro",
                            "se",
                            "si",
                            "sk",
                            "us"
                        ],
                        "type": "string",
                        "description": "Pick the country you want to shop in. Determines the currency, the seller pool, and the residential proxy region we use to access buycycle. Buycycle ships internationally between most of these countries.",
                        "default": "de"
                    },
                    "locationScope": {
                        "title": "Seller location scope",
                        "enum": [
                            "continent",
                            "country"
                        ],
                        "type": "string",
                        "description": "Limit results by where the seller is located, relative to the country picked above. Leave empty to search worldwide."
                    },
                    "brands": {
                        "title": "Brands",
                        "type": "array",
                        "description": "Pick one or more brands. Showing the most-listed brands on buycycle.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "specialized",
                                "trek",
                                "scott",
                                "giant",
                                "cannondale",
                                "orbea",
                                "bianchi",
                                "bmc",
                                "canyon",
                                "cube",
                                "pinarello",
                                "wilier",
                                "colnago",
                                "merida",
                                "ridley",
                                "cervélo",
                                "lapierre",
                                "focus",
                                "ktm",
                                "megamo",
                                "mondraker",
                                "santa cruz",
                                "bh",
                                "factor",
                                "look",
                                "3t",
                                "basso",
                                "ghost",
                                "stevens",
                                "argon 18",
                                "haibike",
                                "rose",
                                "liv",
                                "mmr",
                                "cinelli",
                                "de rosa",
                                "bottecchia",
                                "commencal",
                                "berria",
                                "olympia",
                                "felt",
                                "yt industries",
                                "pivot",
                                "rockrider",
                                "rocky mountain",
                                "peugeot",
                                "whistle",
                                "van rysel",
                                "propain",
                                "transition",
                                "corratec",
                                "bulls",
                                "fuji",
                                "bergamont",
                                "guerciotti",
                                "conway",
                                "kona",
                                "radon",
                                "gt",
                                "yeti",
                                "kross",
                                "cipollini",
                                "moustache",
                                "superior",
                                "kuota",
                                "eddy merckx",
                                "marin",
                                "time",
                                "sunn",
                                "simplon",
                                "sensa",
                                "koga",
                                "open",
                                "fondriest",
                                "torpado",
                                "norco",
                                "atala",
                                "vitus",
                                "lombardo",
                                "isaac",
                                "enve",
                                "niner",
                                "ibis",
                                "riese & müller",
                                "massi",
                                "fantic",
                                "mendiz",
                                "origine",
                                "scor",
                                "aurum",
                                "b'twin",
                                "r raymon",
                                "custom",
                                "rotwild",
                                "nukeproof",
                                "decathlon",
                                "raleigh",
                                "storck",
                                "brompton",
                                "stromer",
                                "litespeed",
                                "other brands"
                            ]
                        },
                        "default": []
                    },
                    "frameSizes": {
                        "title": "Frame size",
                        "type": "array",
                        "description": "Pick one or more sizes. Sizes are based on seat tube length in centimeters.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "xxxs",
                                "xxs",
                                "xs",
                                "s",
                                "m",
                                "l",
                                "xl",
                                "xxl",
                                "one-size-bike"
                            ],
                            "enumTitles": [
                                "XXXS (<45 cm)",
                                "XXS (45–47 cm)",
                                "XS (48–49 cm)",
                                "S (50–52 cm)",
                                "M (53–55 cm)",
                                "L (56–58 cm)",
                                "XL (59–62 cm)",
                                "XXL (>63 cm)",
                                "One-size bike"
                            ]
                        },
                        "default": []
                    },
                    "priceMin": {
                        "title": "Min price",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Lower price bound in the marketplace's currency. Based on the 'incl.' price (with buyer protection fee)."
                    },
                    "priceMax": {
                        "title": "Max price",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Upper price bound in the marketplace's currency. Based on the 'incl.' price (with buyer protection fee)."
                    },
                    "yearMin": {
                        "title": "Earliest model year",
                        "minimum": 2000,
                        "type": "integer",
                        "description": "Only show bikes from this model year or newer."
                    },
                    "yearMax": {
                        "title": "Latest model year",
                        "minimum": 2000,
                        "type": "integer",
                        "description": "Only show bikes from this model year or older."
                    },
                    "conditions": {
                        "title": "Bike condition",
                        "type": "array",
                        "description": "Buycycle's condition grades. 'Fair' = visible wear. 'Good' = light use. 'Very Good' = like-new. 'New' = unused. 'Brand new with guarantee' = unused with manufacturer warranty.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "1",
                                "2",
                                "3",
                                "4",
                                "5"
                            ],
                            "enumTitles": [
                                "Fair",
                                "Good",
                                "Very Good",
                                "New",
                                "Brand new with guarantee"
                            ]
                        },
                        "default": []
                    },
                    "frameMaterials": {
                        "title": "Frame material",
                        "type": "array",
                        "description": "Pick one or more materials.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "carbon",
                                "aluminum",
                                "steel",
                                "titanium"
                            ]
                        },
                        "default": []
                    },
                    "brakeTypes": {
                        "title": "Brake type",
                        "type": "array",
                        "description": "Pick one or more brake types.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "disc",
                                "rim",
                                "drum",
                                "coaster",
                                "other"
                            ]
                        },
                        "default": []
                    },
                    "shifts": {
                        "title": "Shifting type",
                        "type": "array",
                        "description": "Electronic = Di2 / eTap / EPS. Mechanical = traditional cable shifters.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "electronic",
                                "mechanical",
                                "other"
                            ]
                        },
                        "default": []
                    },
                    "isFrameset": {
                        "title": "Frameset or complete bike",
                        "enum": [
                            "frameset",
                            "complete"
                        ],
                        "type": "string",
                        "description": "Leave empty to include both. Pick a value to limit to one type."
                    },
                    "isMotor": {
                        "title": "E-bike or non-electric",
                        "enum": [
                            "ebike",
                            "non-ebike"
                        ],
                        "type": "string",
                        "description": "Leave empty to include both. Pick a value to limit to one type."
                    },
                    "sellerType": {
                        "title": "Sold by",
                        "type": "array",
                        "description": "Private = individuals selling their own bikes. Shop = commercial dealers and resellers.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "private",
                                "commercial"
                            ],
                            "enumTitles": [
                                "Private seller",
                                "Shop / dealer"
                            ]
                        },
                        "default": []
                    },
                    "highDemandOnly": {
                        "title": "High-demand listings only",
                        "type": "boolean",
                        "description": "Only return bikes with buycycle's official 'High demand' badge. Buycycle assigns this badge based on their internal signals (views, wishlists, recency). These bikes tend to sell fast.",
                        "default": false
                    },
                    "maxPages": {
                        "title": "Max pages to crawl",
                        "minimum": 1,
                        "maximum": 50,
                        "type": "integer",
                        "description": "Safety cap on pagination. Each page contains roughly 50 bikes. Increase for broader searches; keep low for faster, cheaper runs.",
                        "default": 2
                    },
                    "returnOnly": {
                        "title": "Highlights filter",
                        "enum": [
                            "all",
                            "new_only",
                            "with_discount",
                            "cheapest_per_model",
                            "best_value",
                            "ignore_overpriced",
                            "popular"
                        ],
                        "type": "string",
                        "description": "Pick a strategy to curate the main Output dataset. 'New listings only' tracks changes between runs — perfect for daily monitoring with notifications. The full crawl is always available in Storage → 'full-results'.",
                        "default": "all"
                    },
                    "minDiscountPct": {
                        "title": "Minimum discount %",
                        "minimum": 0,
                        "maximum": 90,
                        "type": "integer",
                        "description": "Only used when Highlights filter = 'Discounted bikes'. Bikes with at least this discount off MSRP will appear in the highlights.",
                        "default": 20
                    },
                    "minWishlistCount": {
                        "title": "Minimum wishlist count",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Only used when Highlights filter = 'Popular'. Bikes wishlisted by at least this many users will appear in the highlights.",
                        "default": 20
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
