Thalia.de Scraper - Books, Prices, ISBNs & Reviews
Pricing
from $1.50 / 1,000 product results
Thalia.de Scraper - Books, Prices, ISBNs & Reviews
Scrape Thalia.de books, eBooks, audiobooks, toys and stationery. Search by keyword or category, browse Schnäppchen deals, or paste product and listing URLs. Get prices, original prices, discounts, ISBN/EAN, author, publisher, format, ratings and full reviews.
Pricing
from $1.50 / 1,000 product results
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
1
Bookmarked
4
Total users
2
Monthly active users
40 minutes ago
Last modified
Categories
Share
Thalia Scraper: Books, eBooks, Audiobooks & Media with Prices, Discounts & Reviews
Thalia Scraper turns Thalia (thalia.de), Germany's books and media retailer, into structured product data. Every record carries the current price and, on a discounted item, the exact strike through original price with the computed discount amount and percentage, plus ISBN and EAN, author and publisher, format, the product's own technical specifications, and Thalia's own customer review history with the star rating breakdown. Search by keyword and category with the site's real filters, browse the Schnäppchen sale collection on its own, or paste product, category, search, or sale page links directly, then export the results to JSON, CSV, or Excel, or pull them straight into your app through the API.
Why This Scraper?
- Real was-price and discount, never fabricated. On a Schnäppchen (sale) item, both the current price and the strike through original price come back, plus the discount amount and percentage computed from them; a full price item simply carries no discount fields.
- A dedicated Specials filter.
specialsOnlymaps to Thalia's own price reduction facet, store wide or scoped to a keyword and/or category, the same collection shown at thalia.de/themenwelten/sale/. - Rich bibliographic identity. ISBN and EAN, the full author list, publisher, and the exact format/binding (Taschenbuch, gebundene Ausgabe, ePUB, MP3, Hoerbuch-Download, and more).
- Full technical specifications as clean key value pairs. Each product's own "Produktdetails" table (pages, language, release date, dimensions, weight; varies per category) comes back structured, plus the full breadcrumb category path.
- Format variant matrix. Other editions of the same title, for example the Hardcover and eBook of one novel, come back linked to each other.
- Complete native review history. Overall rating, review count, a full 1 to 5 star rating breakdown, and individual reviews (20 per product by default; set Max reviews per product up to 1000, or 0 for the 1000 maximum) with author, date, rating, format, title, and body text, all from Thalia's own review system.
- Two ways in. Keyword and/or category search with the site's real filters (format, price range, availability, specials, sort), or paste any product, category, search, or sale link and let pagination continue automatically.
Use Cases
- Price and discount tracking: monitor a title, category, or the whole Schnäppchen collection for price drops and build a was-price history over time.
- Bibliographic data feeds: pull ISBN, EAN, author, publisher, and format details into a catalog, metadata store, or library system.
- Review and rating research: collect star distributions and full review text to study reader sentiment on specific titles or formats.
- Competitive pricing analysis: compare current and discounted prices, formats, and availability against other book and media retailers.
- Content and merchandising tools: build bestseller trackers, format comparison pages, or category based reading lists from search and category browses.
Data You Get
Sample shape: values are illustrative placeholders, not from a live product.
| Field | Example |
|---|---|
productId | A2048591 |
title | Sample Title |
authors | ["Sample Author"] |
url | https://www.thalia.de/shop/home/artikeldetails/A2048591 |
price / currency | 9.99, EUR |
originalPrice | 14.99 |
discountAmount / discountPercent | 5.0, 33.4 |
isOnSpecial | true |
promoLabel | - 33% |
format | Buch (Taschenbuch) |
categoryPath | ["Buch (dtsch)", "Buecher", "Romane & Erzaehlungen"] |
availabilityText / availabilityStatus | Sofort lieferbar, gruen |
rating / reviewCount | 4.3, 128 |
image | https://images.thalia.media/-/BF2000-2000/sample/sample-cover.jpeg |
isbn / ean | 978-3-000-00000-0, 9783000000000 |
specifications (fetchDetails) | {"Verlag": "Sample Verlag", "Seitenzahl": "288", "Erscheinungsdatum": "12.03.2024"} |
variants (fetchDetails) | [{"format": "Hardcover", "url": "https://www.thalia.de/shop/home/artikeldetails/A2048592"}] |
images (fetchDetails) | ["https://images.thalia.media/-/BF2000-2000/sample/sample-1.jpeg"] |
description (fetchDetails) | Sample blurb text describing the book. |
reviews.averageRating / reviews.totalReviewCount | 4.3, 128 |
reviews.ratingDistribution | [{"rating": 5, "count": 75}, {"rating": 4, "count": 30}, {"rating": 3, "count": 13}] |
reviews.items[] | [{"reviewId": "9000001", "author": "Sample User", "authorLocation": "aus Wien", "rating": 5.0, "date": "03.02.2025", "title": "Sample title", "body": "Sample review text."}] |
Fields marked (fetchDetails) only appear when Fetch full product detail is on for a search or category result; a pasted single product link always returns the full detail fields, and carries the detail-enrichment surcharge regardless of that toggle (except in incremental mode, where an unchanged product link is skipped, or returned with Emit unchanged products, without the enrichment charge). The review breakdown and per review list appear whenever Fetch reviews is on, which is the default; a product with no reviews simply returns an empty list. On a full price item, originalPrice, discountAmount, discountPercent, and promoLabel are null, derived only from the site's own strike through price and sale badge, never estimated.
How to Use
- Pick a mode:
search(keyword and/or category with real filters) orurl(paste product, category, search, or sale links). - For search mode, set a keyword and/or category, and switch on Specials only to browse just the Schnäppchen sale facet.
- Turn on Fetch full product detail and/or Fetch reviews for the enrichment you need, and set Max products total to control run size and cost.
- Click Start, then download the dataset as JSON, CSV, or Excel, or read it through the API.
Basic keyword search:
{"mode": "search","searchTerm": "krimi","maxItems": 20}
Search narrowed by category, format, and price, with specials:
{"mode": "search","searchTerm": "krimi","category": "3","einband": ["Taschenbuch"],"minPrice": 5,"maxPrice": 20,"specialsOnly": true,"sortBy": "sfpa","maxItems": 30}
Category browse with full detail and review enrichment:
{"mode": "search","category": "3","fetchDetails": true,"fetchReviews": true,"maxReviewsPerProduct": 50,"maxItems": 50}
Paste product, category, search, or sale links:
{"mode": "url","urls": ["https://www.thalia.de/shop/home/artikeldetails/A2048591","https://www.thalia.de/kategorie/romane-erzaehlungen-3/","https://www.thalia.de/themenwelten/sale/"],"maxItems": 30}
Output tabs
The run's Output tab offers Products (overview), Reviews (rating breakdown and review items), Product details (ISBN, publisher, description, specifications, variants, media) and Changes (incremental) (changeType and changedFields, for incremental runs).
Incremental mode (recurring monitoring)
Turn on incrementalMode to run the same search or links repeatedly (for example daily) and receive only what changed. Each returned row gets changeType (NEW, UPDATED, REAPPEARED or EXPIRED), changedFields (empty for NEW), firstSeenAt and lastSeenAt. Products are tracked by productId.
- Compared: title, authors, price, original price and discount, sale flag, badges and promo label, format, category path, availability.
- Never compared (still returned): rating, review count, image link, product link, reviews. Use
ignoreFieldsForChangesto exclude more. - For search, category and sale links the comparison uses the search-result data of each product; fields that only exist after product details (ISBN, publisher, description) do not trigger
UPDATED. A pasted product link always returns the full product record, and that whole record (details included) is compared, so a changed description or ISBN there can produceUPDATED. - Unchanged products are skipped before enrichment: they are not pushed, so they are not billed as results and never trigger the detail enrichment event. Billing is otherwise unchanged: every returned row is a result, and the enrichment event applies once per returned row whose detail or review fetch completed, and it is charged one unit per product immediately after that row is saved, so an interrupted run is only billed for rows already delivered.
- A product that was in an earlier run but is no longer listed is returned once with
changeTypeEXPIRED(switchemitExpiredoff to skip these). A product that comes back later is returned asREAPPEARED.EXPIREDrows are only produced when a run walked its whole search to the end; capped, partial or resumed runs never produce them. - Every
UNCHANGEDrow (emitUnchanged) and everyEXPIREDrow that is returned counts as a returned result and is billed under the per-result event like any other row; neither carries the enrichment charge.
Run it from your code
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("abotapi/thalia-de-scraper").call(run_input={"mode": "search", "searchTerm": "krimi", "maxItems": 20})for product in client.dataset(run["defaultDatasetId"]).iterate_items():print(product["title"], product["price"], product["currency"])
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('abotapi/thalia-de-scraper').call({ mode: 'search', searchTerm: 'krimi', maxItems: 20 });const { items } = await client.dataset(run.defaultDatasetId).listItems();
Or connect it to Make, Zapier, n8n, Google Sheets, or webhooks from the Integrations tab.
Caps and filter scope
With the URLs field left untouched, URL mode scrapes one example link per shape (a category, a search, the sale page and a product), split under your Max products cap; replace or clear them to scrape your own links.
Max products total (maxItems) is the hard ceiling across every search or every pasted link in one run; in URL mode it is split evenly across the pasted links. Max pages per search (maxPages) caps pages before that (the actor never fetches more than 1000 pages; empty means as many as needed up to Max products). Max products defaults to 20 when left empty; a value of 0 means the most the actor allows, 100000 products per run, which is also the largest accepted value. Max reviews per product accepts up to 1000 (0 means 1000). Larger Max pages per search values (limit 1000) are lowered to 1000 with a warning in the run log. In URL mode, Specials only, Format/binding, price range, availability, and Sort order are not search only filters: pasting a category, search, or sale link rebuilds that listing request through your filter values, so the same filtered result comes back; filters set in the pasted link's own query string are not kept, set them in the input instead. The one exception is a pasted product link, which always returns that single product in full, with the enrichment surcharge applied regardless of any filter or the detail/review toggles (except in incremental mode, where an unchanged product link is skipped, or returned with Emit unchanged products, without that surcharge).
Send results into your apps (MCP connectors)
Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape: the Apify dataset is never changed.
What gets written to the connector: a condensed, human-readable summary of each record, not the full JSON. Each item becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.
- Authorize a connector once under Apify -> Settings -> Integrations (Notion, Linear, Airtable, or Apify).
- Select it in the "Pipe results into your apps" input field. (If the picker is empty, you have not authorized a connector yet.)
- For Notion, also set
notionParentPageUrlto the page where items should be created.
The connection is mediated by Apify's MCP proxy, so this actor never sees your third party credentials. Leave the field empty to skip.
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | string | search | search (keyword/category with filters) or url (paste links). |
searchTerm | string | (none; prefill krimi) | Free text keyword, title, author, or ISBN for search mode. |
category | string | (none) | A category id, e.g. 3. Narrows a keyword search or browses a whole category alone. |
urls | array | one example per shape (category, search, sale, product) | Product, category, search, or sale links for URL mode. |
specialsOnly | boolean | false | Only Schnäppchen (sale) items, a real strike through price and discount. |
einband | array | (none; prefill empty) | Only these exact binding/format values, e.g. Taschenbuch, ePUB 3. |
minPrice | integer | (none) | Minimum price in EUR. |
maxPrice | integer | (none) | Maximum price in EUR. |
availability | string | (empty: any) | GL (lieferbar), SL (sofort lieferbar), or VB (vorbestellbar). |
sortBy | string | sfmd | sfmd (best match), sfpa/sfpd (price asc/desc), sfea/sfed (release date asc/desc), sfsd (top rated). |
fetchDetails | boolean | false | Adds ISBN/EAN, full author list, publisher, description, flattened specifications, breadcrumb path, media gallery, and the format variant matrix. |
fetchReviews | boolean | true | Fetches each product's full review history. |
maxReviewsPerProduct | integer | 20 | Cap on reviews per product; empty uses 20, 0 means the limit of 1000; maximum 1000. |
maxPages | integer | (none) | Cap on result pages per search/URL entry; empty or 0 means the limit of 1000; larger values are lowered to 1000 with a warning. |
maxItems | integer | 20 | Cap on total products; empty uses 20, 0 means the limit of 100000; maximum 100000. |
proxy | object | Apify default connection | Proxy & connection configuration. Your own proxy URLs are used as given. |
resumeFromRunId | string | (none) | Run ID of an earlier unfinished run of this actor; products it already returned are not returned (or billed) again. |
incrementalMode | boolean | false | Recurring monitoring: the first run returns every match as NEW; later runs return only NEW and UPDATED products. Unchanged products are not returned, not enriched and not billed. |
stateKey | string | (derived) | Optional name for the monitoring campaign; by default derived from the search/URL and filter setup. |
emitUnchanged | boolean | false | Incremental mode only: also return unchanged products as plain rows (no reviews fetch, no enrichment charge). Each returned UNCHANGED row counts as a returned result and is billed under the per-result event. |
emitExpired | boolean | true | Incremental mode only: when a run walks its whole search to the end, return products seen earlier that are no longer listed, with changeType EXPIRED (no enrichment charge; each returned EXPIRED row counts as a returned result under the per-result event). Never emitted for capped, partial or resumed runs. |
ignoreFieldsForChanges | array | (none) | Field names (dotted paths for nested ones) excluded from change detection, still returned in the row. rating, reviewCount, image and url are always excluded. |
mcpConnectors | array | (none) | Optional MCP connectors to also receive results. |
notionParentPageUrl | string | (none) | Required only when a Notion connector is selected. |
maxNotifyListings | integer | 50 | Cap on items sent to each connector. |
Output Example
Sample shape: values are illustrative placeholders, not from a live product.
{"productId": "A2048591","title": "Sample Title","authors": ["Sample Author"],"url": "https://www.thalia.de/shop/home/artikeldetails/A2048591","price": 4.99,"currency": "EUR","originalPrice": 9.99,"discountAmount": 5.0,"discountPercent": 50.1,"isOnSpecial": true,"promoLabel": "- 50%","format": "eBook (ePUB 3)","categoryPath": ["Ebooks", "eBooks", "Krimis & Thriller"],"availabilityText": "Sofort per Download lieferbar","availabilityStatus": "gruen","rating": 4.3,"reviewCount": 128,"isbn": "978-3-000-00000-0","specifications": {"Format": "ePUB 3","Verlag": "Sample Verlag","Seitenzahl": "288 (Printausgabe)","Erscheinungsdatum": "12.03.2024"},"variants": [{ "format": "Hardcover", "url": "https://www.thalia.de/shop/home/artikeldetails/A2048592" },{ "format": "Taschenbuch", "url": "https://www.thalia.de/shop/home/artikeldetails/A2048593" }],"images": ["https://images.thalia.media/-/BF2000-2000/sample/sample-cover.jpeg"],"reviews": {"averageRating": 4.3,"totalReviewCount": 128,"ratingDistribution": [{ "rating": 5, "count": 75 },{ "rating": 4, "count": 30 },{ "rating": 3, "count": 13 },{ "rating": 2, "count": 4 },{ "rating": 1, "count": 6 }],"items": [{"reviewId": "9000001","author": "Sample User","authorLocation": "aus Wien","rating": 5.0,"date": "03.02.2025","format": "eBook (ePUB 3)","title": "Sample review title","body": "Sample review text describing the reading experience."}]}}
Plan Requirement
Thalia refuses most datacenter connections, and residential exits are accepted only on some attempts, so a run starts on the default Apify connection, moves to residential when your plan includes it, and falls back to a backup connection when the others are refused. No connection is guaranteed to be accepted: expect occasional slow or failed runs, and retry a failed run a few minutes later. Apify free plans do not include residential proxies. If a run logs "The selected connection is unavailable to this run", it continues on the backup connection and some pages may still be unavailable. To use your own proxies, add custom proxy URLs under Proxy & connection.
FAQ
How much does it cost?
You pay a small start fee per run, plus a fee per product returned, plus a second, smaller surcharge for detail and review enrichment billed once per product whenever full product detail and/or the review history was actually fetched for it. A search or category result carries this by default because Fetch reviews defaults to on; turn it off if you only need the base catalog fields. A pasted single product link always carries the full detail fields and this surcharge, whatever the toggles say, except that in incremental mode an unchanged product link is skipped (or returned with Emit unchanged products) without the surcharge. The Pricing tab shows the current rates, and Max products total caps the size, and therefore the cost, of any run.
Is it legal to scrape Thalia?
This actor collects only publicly available product and review data. You are responsible for how you use it: follow Thalia's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Prices, availability, and bibliographic facts like ISBN are generally facts, but review text and product images may carry their own rights.
Can I get only new or changed products on a schedule?
Yes. Turn on incrementalMode (see Incremental mode above) and schedule the actor from the Schedules tab. The first run returns every match as NEW; later runs return only NEW and UPDATED products with changedFields, and unchanged products are neither returned nor billed. ignoreFieldsForChanges excludes fields you do not care about.
What's the most common point of confusion?
That the filters (Specials only, Format/binding, price range, availability, sort) are not search only. In URL mode they still apply: pasting a category, search, or sale link rebuilds that listing request through your filter values, so you get the same filtered result. The one exception is a pasted product link, which always returns that single product regardless of any filter you set.
Why did my run fail instead of returning an empty dataset?
If the site refuses every result or product page in a run, the run stops with a clear error instead of quietly finishing with zero items, so an empty result from a real search is never confused with a run the site blocked outright. Run it again in a few minutes, or supply your own proxy URLs under Proxy & connection. The error text says whether the proxy connection was refused for your account (a paid plan is required), whether residential access was unavailable, or whether the pages simply failed to load. If only some pages were blocked, you still get what was found.
Can I use it with AI agents or MCP?
Yes. Call it from any Apify integration or MCP client, and use the connector field to push a summary of each result into Notion, Linear, or Airtable.
🔗 Want more e-commerce data?
Pair this actor with these related scrapers from the same team:
| 🥦 Kaufland.de Scraper Scrape Kaufland.de, Germany's hypermarket and online marketplace: keyword/category/brand... | 🛒 OBI.de Scraper Scrape OBI (obi.de) DIY/home-improvement products: current + strike-through original... |
| 🛒 HORNBACH Products, Prices & Reviews Scraper Scrape HORNBACH (hornbach.de) DIY, building & garden products: current + strike-through... | 🛒 dm.de Scrape dm-drogerie markt (dm.de) products: current + strike-through Ausverkauf price with... |
| 🛒 ROSSMANN.de Scraper Scrape ROSSMANN (rossmann.de) drugstore products: current + original strike-through price... | 🛒 Douglas Germany Scraper Scrape Douglas.de beauty and fragrance products by keyword, category, brand, or URL... |
💬 Support
- 🐞 Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
- 🛠️ Need another site, extra fields or a private build? Email contact@abotapi.com.
- ⭐ Enjoying it? A quick review on the actor page helps other users find it.