# Thomann Product Search Scraper (`solidcode/thomann-de-scraper`) Actor

\[💰 $4 / 1K] Scrape Thomann, Europe's biggest music gear retailer. Get brand, model, numeric price, currency, discount, rating, stock and article number. Search by keyword or paste URLs, across 9 country stores in EUR, GBP, PLN or SEK plus the VAT-free International store.

- **URL**: https://apify.com/solidcode/thomann-de-scraper.md
- **Developed by:** [SolidCode](https://apify.com/solidcode) (community)
- **Categories:** E-commerce, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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/docs.md):

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.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/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

## Thomann Product Search Scraper

Pull structured product data from Thomann — Europe's largest musical-instrument and pro-audio retailer — across 10 country storefronts, with real numeric prices, currency codes, discounts, star ratings, stock levels and article numbers on every row. Search by keyword, browse a whole department, or paste any Thomann search or category page and get it back as a clean table. Built for music-gear resellers, price-monitoring analysts, and e-commerce competitor-intelligence teams who need Thomann's catalogue as analysis-ready rows instead of copying prices off a browser page one product at a time.

### Why This Scraper?

- **10 country storefronts with true local pricing** — International, Germany, United Kingdom, Austria, France, Spain, Italy, Netherlands, Poland and Sweden. The country stores price in EUR, GBP, PLN or SEK with product text and stock messages in that store's language; International quotes VAT-free export prices and picks its currency automatically, and every row carries its own `currency` and `vatRate` so you always know which you got.
- **Numbers, not price strings** — `price` is `379.0`, not `"379 €"`. `currency` is the ISO code, `rating` is a 0–5 float, `inStock` is a real boolean and `stockQuantity` an integer. Drops straight into a spreadsheet, BI tool or pricing model with no cleanup.
- **12 commercial fields most gear trackers drop** — `originalPrice` (the strike-through price), `discountPercentage`, `isOnSale`, `isBStock` (open-box units at reduced prices), `isExpressShippable`, `tags` (the store's own badges, such as "TOP SELLER"), `vatRate`, `priceIncludesVat`, `articleNumber`, `salesRank`, `globalRank` and `categoryKey`, all on the same row as the current price.
- **15 named departments you can browse without a search term** — Guitars & Basses, Keyboards & Pianos, Drums & Percussion, Studio & Recording, PA & Live Sound, Lighting & Stage, DJ Equipment, Microphones, Software, Wind Instruments, Orchestral & Traditional, Cables & Connectors, Cases & Bags, Sheet Music & Music Stands, and Accessories. Microphones alone returns 6,026 products.
- **Star-rating filter that behaves the way you'd expect** — "3 stars and up" returns 3-, 4- and 5-star products together (10,181 matches on a catalogue-wide run), not just the 159 products rated exactly three. Most rating filters on this site silently give you the narrow bucket.
- **7 sort orders that change *which* products you keep** — Popularity, Price low→high, Price high→low, Best rated, Newest, Name A–Z and Name Z–A. Combine "Price: low to high" with a 100-result cap and you get the 100 cheapest matches, not the first 100 Thomann felt like showing.
- **An in-stock filter that measurably narrows the set** — 13,591 ship-now products versus 15,321 total on the same query, so your feed never advertises a back-ordered item.
- **Paste a department landing page, get its products** — dropping in `https://www.thomann.de/gb/electric_guitars.html` returns 5,478 electric guitars. Paste a filtered search page instead and every filter you clicked in the browser is carried through untouched.
- **Up to 100 products per page fetch and zero per-product lookups** — every field above comes from the listing itself, so 300 rows across three pages finish in seconds and 100 results cost you a fraction of a minute.

### Use Cases

**Price & Promotion Monitoring**
- Track daily price movement on a watchlist of brands or article numbers
- Catch discounts the moment they appear using `originalPrice`, `discountPercentage` and `isOnSale`
- Compare the same product across EUR, GBP, PLN and SEK storefronts to spot regional pricing gaps
- Alert on price drops below a threshold using a maximum-price filter

**Competitive & Market Intelligence**
- Benchmark your own store's pricing against Europe's largest MI retailer
- Measure a brand's shelf presence by counting products per department
- Track which products climb the sales rank week over week
- Size a category before entering it — the `totalResults` field reports the full match count for any filter combination

**Reselling & Dropshipping**
- Build a ship-now catalogue with the in-stock filter and `stockQuantity`
- Find high-rated, low-priced products by combining a rating floor with price-ascending sort
- Pull article numbers for cross-referencing against distributor feeds
- Spot open-box units with `isBStock` and flag the express-delivery lines with `isExpressShippable`
- Monitor stock depletion on fast-moving accessories

**Catalog & Content Operations**
- Populate a product database with names, brands, models, images and descriptions
- Enrich existing SKUs with VAT rates, currency codes and department keys
- Source high-resolution product imagery via `imageUrl`
- Keep a localized catalogue in sync across multiple European markets

**Research & Analytics**
- Analyse rating distribution and review volume by brand or category
- Study price elasticity across instrument categories
- Build historical datasets by scheduling repeat runs
- Quantify how much of a department is discounted at any moment

### Getting Started

#### Simple keyword search

```json
{
  "searchTerms": ["shure sm7b"],
  "maxResults": 100
}
````

#### UK store, specific brands, in stock only

```json
{
  "searchTerms": ["studio microphone"],
  "storefront": "gb",
  "manufacturers": ["Shure", "Neumann"],
  "inStockOnly": true,
  "maxResults": 250
}
```

#### Browse a whole department with price and rating filters

```json
{
  "category": "MI",
  "minPrice": 100,
  "maxPrice": 500,
  "minRating": "4",
  "sortBy": "priceAsc",
  "maxResults": 500
}
```

#### Advanced — pasted URLs plus a filtered keyword search

```json
{
  "searchTerms": ["harley benton"],
  "startUrls": ["https://www.thomann.de/gb/electric_guitars.html"],
  "storefront": "gb",
  "category": "GI",
  "manufacturers": ["Harley Benton"],
  "minRating": "4",
  "minPrice": 50,
  "maxPrice": 800,
  "inStockOnly": true,
  "sortBy": "rating",
  "maxResults": 1000
}
```

### Input Reference

#### What to Scrape

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `searchTerms` | string\[] | `["shure sm7b"]` | What you are looking for, e.g. `"fender stratocaster"`. Each term runs as its own search. |
| `startUrls` | string\[] | `[]` | Thomann search or category page URLs. Any filters and sorting already built into the URL are kept as they are. |

Leave both empty and pick a department to collect that whole department.

#### Store & Currency

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `storefront` | string | `"intl"` | Which Thomann store to read — sets price currency and product language. International quotes VAT-free export prices and picks its currency automatically, so choose a country store when you need one specific currency. A pasted URL uses its own store instead. |

| Value | Store |
|-------|-------|
| `intl` | International (English, currency varies) |
| `de` | Germany (German, EUR) |
| `gb` | United Kingdom (English, GBP) |
| `at` | Austria (German, EUR) |
| `fr` | France (French, EUR) |
| `es` | Spain (Spanish, EUR) |
| `it` | Italy (Italian, EUR) |
| `nl` | Netherlands (Dutch, EUR) |
| `pl` | Poland (Polish, PLN) |
| `se` | Sweden (Swedish, SEK) |

#### Filters

All filters are optional and combine with each other. They apply to search terms and department browsing; a pasted URL always keeps its own built-in filters.

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `category` | string | `"all"` | Limit results to one Thomann department. |
| `manufacturers` | string\[] | `[]` | Only return products from these brands, e.g. `"Fender"`, `"Shure"`, `"Harley Benton"`. Spell the brand the way Thomann does. |
| `minRating` | string | `"any"` | `"any"` (Any rating), `"3"` (3 stars and up), `"4"` (4 stars and up), `"5"` (5 stars only). Products with no reviews are excluded when set. |
| `minPrice` | integer | none | Only return products at or above this amount, in the currency of the store you picked. |
| `maxPrice` | integer | none | Only return products at or below this amount, in the currency of the store you picked. |
| `inStockOnly` | boolean | `false` | Only return products Thomann can ship right now. Off also includes pre-orders, back-orders and special-order items. |
| `sortBy` | string | `"popularity"` | Order products are collected in — matters when you cap results. Newest and the two name sorts leave out products Thomann has no date or name ordering for, so they return about 4% fewer matches. |

**Department values for `category`**

| Value | Department | Value | Department |
|-------|------------|-------|------------|
| `all` | All Departments | `SW` | Software |
| `GI` | Guitars & Basses | `BL` | Wind Instruments |
| `TA` | Keyboards & Pianos | `TR` | Orchestral & Traditional Instruments |
| `DR` | Drums & Percussion | `KA` | Cables & Connectors |
| `ST` | Studio & Recording | `CA` | Cases & Bags |
| `PA` | PA & Live Sound | `NO` | Sheet Music & Music Stands |
| `LI` | Lighting & Stage | `ZU` | Accessories |
| `DJ` | DJ Equipment | `MI` | Microphones |

**Sort values for `sortBy`**

| Value | Order |
|-------|-------|
| `popularity` | Popularity (Thomann default) |
| `priceAsc` | Price: low to high |
| `priceDesc` | Price: high to low |
| `rating` | Best rated first |
| `newest` | Newest products first |
| `nameAsc` | Name: A to Z |
| `nameDesc` | Name: Z to A |

#### Limits

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `maxResults` | integer | `100` | Maximum products per search term and per pasted URL. Two terms at `100` returns up to 200 products. Results arrive a page at a time, so a run finishes the page it is on and can end slightly above this number. It can land a few short when Thomann has fewer matches than you asked for, or serves a page with a couple of items missing. Set to `0` to collect every match, which can be tens of thousands. |

### Output

```json
{
  "productId": 163398,
  "articleNumber": "163398",
  "productName": "Shure SM7B",
  "manufacturer": "Shure",
  "model": "SM7B",
  "url": "https://www.thomann.co.uk/shure_sm7b.htm",
  "imageUrl": "https://thumbs.static-thomann.de/thumb/thumb600x600/pics/bdb/163398/14721943_800.jpg",
  "categoryKey": "MIGR",
  "price": 379.0,
  "currency": "GBP",
  "currencySymbol": "£",
  "priceIncludesVat": true,
  "vatRate": 20.0,
  "originalPrice": 429.0,
  "discountPercentage": 11.66,
  "isOnSale": true,
  "isBStock": false,
  "availability": "In stock",
  "availabilityDetail": "This item is in stock and can be dispatched immediately.",
  "availabilityLabel": "available",
  "availabilityCode": 10,
  "inStock": true,
  "stockQuantity": 25,
  "isExpressShippable": true,
  "rating": 4.76,
  "ratingPercentage": 95,
  "ratingCount": 1387,
  "salesRank": 1,
  "globalRank": 12,
  "tags": ["TOP SELLER"],
  "description": "Dynamic Microphone for speech and vocals, cardioid polar pattern",
  "searchTerm": "shure sm7b",
  "sourceUrl": "https://www.thomann.de/gb/search_dir.html?sw=shure+sm7b",
  "totalResults": 18,
  "storefront": "gb",
  "scrapedAt": "2026-07-25T09:14:22.118Z"
}
```

#### Product & Identifiers

| Field | Type | Description |
|-------|------|-------------|
| `productId` | number | Thomann's internal product ID |
| `articleNumber` | string | Thomann article number — the code printed on invoices and quotes |
| `productName` | string | Brand and model joined, e.g. `"Shure SM7B"` |
| `manufacturer` | string | Brand name |
| `model` | string | Model name without the brand |
| `description` | string | Short product description in the store's language |
| `categoryKey` | string | Thomann's most specific category code for the product — narrower than the department you searched, e.g. `"MIGR"` |
| `url` | string | Direct link to the product page on the chosen storefront |
| `imageUrl` | string | Product image at 600×600 |

#### Pricing

| Field | Type | Description |
|-------|------|-------------|
| `price` | number | Current price as a number |
| `currency` | string | ISO currency code, e.g. `"GBP"` |
| `currencySymbol` | string | Symbol shown on the storefront, e.g. `"£"` |
| `originalPrice` | number | Strike-through price before the discount, `null` when not discounted |
| `discountPercentage` | number | Saving versus the original price |
| `isOnSale` | boolean | `true` when a real discount or strike-through price is present |
| `isBStock` | boolean | `true` for open-box or returned units sold at a reduced price |
| `vatRate` | number | VAT percentage applied by that storefront |
| `priceIncludesVat` | boolean | Whether the price shown already includes VAT |

#### Availability

| Field | Type | Description |
|-------|------|-------------|
| `inStock` | boolean | Whether Thomann can ship the product right now |
| `stockQuantity` | number | Units currently on hand |
| `isExpressShippable` | boolean | Whether the product qualifies for express delivery |
| `availability` | string | Short availability text, e.g. `"In stock"` |
| `availabilityDetail` | string | Full availability sentence in the store's language |
| `availabilityLabel` | string | Machine-friendly availability label |
| `availabilityCode` | number | Numeric availability code for grouping |

#### Ratings & Popularity

| Field | Type | Description |
|-------|------|-------------|
| `rating` | number | Average customer rating on a 0–5 scale |
| `ratingPercentage` | number | Same rating expressed as 0–100 |
| `ratingCount` | number | Number of customer reviews |
| `salesRank` | number | Sales rank within the product's department |
| `globalRank` | number | Sales rank across the whole catalogue |
| `tags` | string\[] | Badges Thomann shows on the listing, e.g. `["TOP SELLER"]`; empty when the product has none |

#### Run Context

| Field | Type | Description |
|-------|------|-------------|
| `searchTerm` | string | Which of your search terms produced this row, `null` for pasted URLs |
| `sourceUrl` | string | The Thomann listing page this row came from, as a link you can open — your own pasted URL, or the results page for that search term or department |
| `totalResults` | number | Total matches Thomann reports for that search, regardless of your result cap |
| `storefront` | string | Store code the row came from, e.g. `"gb"` |
| `scrapedAt` | string | ISO 8601 timestamp of collection |

### Tips for Best Results

- **Pair a sort order with your result cap.** A cap of 100 on "Price: low to high" gives you the 100 cheapest matches; on "Best rated first" it gives the 100 best-reviewed. Without a deliberate sort you get whatever Thomann ranks highest by popularity.
- **Paste a department landing page instead of hunting for its code.** Any Thomann hub URL such as `https://www.thomann.de/gb/electric_guitars.html` is resolved to its department automatically, which is the fastest way to reach a sub-department finer than the 15 top-level values.
- **Rating buckets round to the nearest star.** A 3.5-star product appears under "4 stars and up" because that is how Thomann's own facet counts it — expect the boundary to match the site, not a strict cut-off.
- **Use a non-EUR storefront for regional price comparison.** Run the same brand list against `gb`, `pl` and `se` in separate runs and compare `price` alongside `currency` — the UK, Polish and Swedish stores price independently, not by exchange rate.
- **Spell brands exactly as Thomann does.** `"Harley Benton"`, `"Neumann"`, `"t.bone"` — the brand filter matches the store's own spelling, and multiple brands combine as "any of these".
- **Start with a cap of 50–100** to confirm the fields and filters match what you need, then raise it or set it to `0` for a full department sweep.
- **Filters are skipped for pasted URLs by design.** A URL already carries its own filters, so build the filtering into the URL in your browser, or use search terms and departments when you want the filter panel above.

### Pricing

**From $4.00 per 1,000 results** — cheaper than the alternatives on the store, with far more per-row detail. Bronze, Silver and Gold subscribers pay progressively less; the table below shows total cost at each discount tier.

| Results | No discount | Bronze | Silver | Gold |
|---------|-------------|--------|--------|------|
| 100 | $0.48 | $0.45 | $0.43 | $0.40 |
| 1,000 | $4.80 | $4.50 | $4.25 | $4.00 |
| 10,000 | $48.00 | $45.00 | $42.50 | $40.00 |
| 100,000 | $480.00 | $450.00 | $425.00 | $400.00 |

A "result" is one product row in the output dataset. **No compute or time-based charges — you pay per result, plus a small fixed per-run start fee.**

### Integrations

Export data in JSON, CSV, Excel, XML, or RSS. Connect to 1,500+ apps via:

- **Zapier** / **Make** / **n8n** — Workflow automation
- **Google Sheets** — Direct spreadsheet export
- **Slack** / **Email** — Notifications on new results
- **Webhooks** — Trigger custom endpoints when a run finishes
- **Apify API** — Full programmatic access and scheduled runs

### Legal & Ethical Use

This actor collects publicly visible product listing data for legitimate price monitoring, market research, and catalogue management. It does not collect personal data or customer information. Users are responsible for complying with applicable laws and Thomann's Terms of Service, and for using the data at a reasonable volume and frequency. Do not use extracted data for spam, misrepresentation, or any unlawful purpose.

# Actor input Schema

## `searchTerms` (type: `array`):

Type what you are looking for, for example 'shure sm7b' or 'fender stratocaster'. Each term runs as its own Thomann search. Leave empty if you are pasting URLs below.

## `startUrls` (type: `array`):

Paste one or more Thomann search or category page URLs, for example https://www.thomann.de/gb/electric\_guitars.html. Any filters and sorting already built into the URL are kept as they are.

## `storefront` (type: `string`):

Which Thomann store to read. This sets the currency of the prices and the language of the product text and stock messages. The International store quotes VAT-free export prices and picks its currency automatically, so pick a country store when you need one specific currency. When you paste a URL above, that URL's own store is used for it instead.

## `category` (type: `string`):

Limit results to one Thomann department. Works alongside your search terms, or on its own to browse a whole department when you enter no search term and no URL. When you paste a URL, that URL's own department is used instead.

## `manufacturers` (type: `array`):

Only return products from these brands, for example 'Fender', 'Shure' or 'Harley Benton'. Spell the brand the way Thomann does. Leave empty for all brands.

## `minRating` (type: `string`):

Only return products customers rated at or above this level. Products with no reviews yet are excluded when you set this.

## `minPrice` (type: `integer`):

Only return products priced at or above this amount, in the currency of the store you picked above. Leave empty for no minimum.

## `maxPrice` (type: `integer`):

Only return products priced at or below this amount, in the currency of the store you picked above. Leave empty for no maximum.

## `inStockOnly` (type: `boolean`):

Only return products Thomann can ship right now. Turn this off to also include pre-orders, back-orders and special-order items.

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

The order products are collected in. This matters when you cap the number of results: 'Price: low to high' with a cap of 100 gives you the 100 cheapest matches rather than the 100 most popular. Note that 'Newest products first', 'Name: A to Z' and 'Name: Z to A' leave out the few products Thomann has nothing to order them by, so they return a slightly smaller set (about 4% fewer) than the other sorts.

## `maxResults` (type: `integer`):

Maximum number of products to collect per search term and per pasted URL. For example, 2 search terms with this set to 100 returns up to 200 products in total. Results come back a page at a time, so a run finishes the page it is on and can end slightly above this number. It can land a few short when Thomann has fewer matches than you asked for, or serves a page with a couple of items missing. Set to 0 to collect every match Thomann has, which can be tens of thousands.

## Actor input object example

```json
{
  "searchTerms": [
    "shure sm7b"
  ],
  "startUrls": [],
  "storefront": "intl",
  "category": "all",
  "manufacturers": [],
  "minRating": "any",
  "sortBy": "popularity",
  "maxResults": 100
}
```

# Actor output Schema

## `overview` (type: `string`):

Table of scraped Thomann products with brand, model, store badges, price, currency, rating, stock, express shipping and product link.

## `pricing` (type: `string`):

Price-focused view: current price, original price, discount percentage, sale and B-stock flags, VAT and stock level.

# 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 = {
    "searchTerms": [
        "shure sm7b"
    ],
    "startUrls": [],
    "storefront": "intl",
    "category": "all",
    "manufacturers": [],
    "minRating": "any",
    "inStockOnly": false,
    "sortBy": "popularity",
    "maxResults": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("solidcode/thomann-de-scraper").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 = {
    "searchTerms": ["shure sm7b"],
    "startUrls": [],
    "storefront": "intl",
    "category": "all",
    "manufacturers": [],
    "minRating": "any",
    "inStockOnly": False,
    "sortBy": "popularity",
    "maxResults": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("solidcode/thomann-de-scraper").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 '{
  "searchTerms": [
    "shure sm7b"
  ],
  "startUrls": [],
  "storefront": "intl",
  "category": "all",
  "manufacturers": [],
  "minRating": "any",
  "inStockOnly": false,
  "sortBy": "popularity",
  "maxResults": 100
}' |
apify call solidcode/thomann-de-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=solidcode/thomann-de-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Thomann Product Search Scraper",
        "description": "[💰 $4 / 1K] Scrape Thomann, Europe's biggest music gear retailer. Get brand, model, numeric price, currency, discount, rating, stock and article number. Search by keyword or paste URLs, across 9 country stores in EUR, GBP, PLN or SEK plus the VAT-free International store.",
        "version": "1.0",
        "x-build-id": "fb0Tl8MywFEe5WaMo"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/solidcode~thomann-de-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-solidcode-thomann-de-scraper",
                "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/solidcode~thomann-de-scraper/runs": {
            "post": {
                "operationId": "runs-sync-solidcode-thomann-de-scraper",
                "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/solidcode~thomann-de-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-solidcode-thomann-de-scraper",
                "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": {
                    "searchTerms": {
                        "title": "Search Terms",
                        "type": "array",
                        "description": "Type what you are looking for, for example 'shure sm7b' or 'fender stratocaster'. Each term runs as its own Thomann search. Leave empty if you are pasting URLs below.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "startUrls": {
                        "title": "Thomann URLs",
                        "type": "array",
                        "description": "Paste one or more Thomann search or category page URLs, for example https://www.thomann.de/gb/electric_guitars.html. Any filters and sorting already built into the URL are kept as they are.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "storefront": {
                        "title": "Thomann Store",
                        "enum": [
                            "intl",
                            "de",
                            "gb",
                            "at",
                            "fr",
                            "es",
                            "it",
                            "nl",
                            "pl",
                            "se"
                        ],
                        "type": "string",
                        "description": "Which Thomann store to read. This sets the currency of the prices and the language of the product text and stock messages. The International store quotes VAT-free export prices and picks its currency automatically, so pick a country store when you need one specific currency. When you paste a URL above, that URL's own store is used for it instead."
                    },
                    "category": {
                        "title": "Department",
                        "enum": [
                            "all",
                            "GI",
                            "TA",
                            "DR",
                            "ST",
                            "PA",
                            "LI",
                            "DJ",
                            "MI",
                            "SW",
                            "BL",
                            "TR",
                            "KA",
                            "CA",
                            "NO",
                            "ZU"
                        ],
                        "type": "string",
                        "description": "Limit results to one Thomann department. Works alongside your search terms, or on its own to browse a whole department when you enter no search term and no URL. When you paste a URL, that URL's own department is used instead."
                    },
                    "manufacturers": {
                        "title": "Brands",
                        "type": "array",
                        "description": "Only return products from these brands, for example 'Fender', 'Shure' or 'Harley Benton'. Spell the brand the way Thomann does. Leave empty for all brands.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "minRating": {
                        "title": "Minimum Rating",
                        "enum": [
                            "any",
                            "3",
                            "4",
                            "5"
                        ],
                        "type": "string",
                        "description": "Only return products customers rated at or above this level. Products with no reviews yet are excluded when you set this."
                    },
                    "minPrice": {
                        "title": "Minimum Price",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Only return products priced at or above this amount, in the currency of the store you picked above. Leave empty for no minimum."
                    },
                    "maxPrice": {
                        "title": "Maximum Price",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Only return products priced at or below this amount, in the currency of the store you picked above. Leave empty for no maximum."
                    },
                    "inStockOnly": {
                        "title": "In Stock Only",
                        "type": "boolean",
                        "description": "Only return products Thomann can ship right now. Turn this off to also include pre-orders, back-orders and special-order items."
                    },
                    "sortBy": {
                        "title": "Sort Results By",
                        "enum": [
                            "popularity",
                            "priceAsc",
                            "priceDesc",
                            "rating",
                            "newest",
                            "nameAsc",
                            "nameDesc"
                        ],
                        "type": "string",
                        "description": "The order products are collected in. This matters when you cap the number of results: 'Price: low to high' with a cap of 100 gives you the 100 cheapest matches rather than the 100 most popular. Note that 'Newest products first', 'Name: A to Z' and 'Name: Z to A' leave out the few products Thomann has nothing to order them by, so they return a slightly smaller set (about 4% fewer) than the other sorts."
                    },
                    "maxResults": {
                        "title": "Max Results",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum number of products to collect per search term and per pasted URL. For example, 2 search terms with this set to 100 returns up to 200 products in total. Results come back a page at a time, so a run finishes the page it is on and can end slightly above this number. It can land a few short when Thomann has fewer matches than you asked for, or serves a page with a couple of items missing. Set to 0 to collect every match Thomann has, which can be tens of thousands."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
