{
  "openapi": "3.0.1",
  "info": {
    "title": "Thalia.de Scraper - Books, Prices, ISBNs & Reviews",
    "description": "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.",
    "version": "1.0",
    "x-build-id": "w5TqIylzUug67fXsZ"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~thalia-de-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-thalia-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/abotapi~thalia-de-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-thalia-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/abotapi~thalia-de-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-thalia-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",
        "required": [
          "mode"
        ],
        "properties": {
          "mode": {
            "title": "Mode",
            "enum": [
              "search",
              "url"
            ],
            "type": "string",
            "description": "'search' finds products by keyword and/or category with Thalia's own filters, including Schnäppchen (sale) items. 'url' scrapes any product, category, search-result, or sale page URL you paste, walking pagination forward automatically.",
            "default": "search"
          },
          "searchTerm": {
            "title": "Search keyword",
            "type": "string",
            "description": "Free-text keyword, title, author, or stichwort, e.g. 'krimi' or 'fantasy roman'. Combine with Category below to narrow, or leave empty and set only Category (and/or Specials only) to browse a whole department."
          },
          "category": {
            "title": "Category ID (optional)",
            "type": "string",
            "description": "A Thalia category id, e.g. '3' (Romane & Erzählungen) or '4893' (eBooks). Find it as the trailing number in a category page URL: thalia.de/kategorie/<name>-<id>/. Narrows a keyword search, or browses the whole category when Search keyword is left empty. Search mode only: URL mode reads this from the link you paste."
          },
          "urls": {
            "title": "URLs to scrape",
            "uniqueItems": true,
            "type": "array",
            "description": "Paste one or more Thalia product pages (/shop/home/artikeldetails/<id>), category pages (/kategorie/<name>-<id>/), search-result pages (/suche?sq=<term>), or the sale page (/themenwelten/sale/). Pagination continues forward automatically from any page number already in the URL. The keyword and category fields are ignored here. The fields in the Filters and sort section still apply to a pasted listing, category, search or specials URL.",
            "default": [
              "https://www.thalia.de/kategorie/romane-erzaehlungen-3/",
              "https://www.thalia.de/suche?sq=krimi",
              "https://www.thalia.de/themenwelten/sale/",
              "https://www.thalia.de/shop/home/artikeldetails/A2048591"
            ],
            "items": {
              "type": "string"
            }
          },
          "specialsOnly": {
            "title": "Specials only (Schnäppchen)",
            "type": "boolean",
            "description": "Only return items currently on sale (Thalia's own 'Schnäppchen' price-reduction facet): a real strike-through original price + discount. Combine with a keyword and/or category, or leave those empty to browse all current sale items (mirrors thalia.de/themenwelten/sale/). Applies in BOTH search mode and URL mode: the listing request is rebuilt for a pasted listing, category, search or specials URL, so the filter is sent with it. It does not narrow a pasted product URL, which returns that one product.",
            "default": false
          },
          "einband": {
            "title": "Format / binding",
            "uniqueItems": true,
            "type": "array",
            "description": "Only return this exact binding/format, e.g. 'Taschenbuch', 'gebundene Ausgabe', 'ePUB 3', 'MP3', 'Hörbuch-Download'. Match the exact value as shown on the site (visible in each result's 'format' field). Leave empty for every format. Applies in BOTH search mode and URL mode: the listing request is rebuilt for a pasted listing, category, search or specials URL, so the filter is sent with it. It does not narrow a pasted product URL, which returns that one product.",
            "items": {
              "type": "string"
            }
          },
          "minPrice": {
            "title": "Minimum price (EUR)",
            "minimum": 0,
            "type": "integer",
            "description": "Only return products priced at or above this amount. Applies in BOTH search mode and URL mode: the listing request is rebuilt for a pasted listing, category, search or specials URL, so the filter is sent with it. It does not narrow a pasted product URL, which returns that one product."
          },
          "maxPrice": {
            "title": "Maximum price (EUR)",
            "minimum": 0,
            "type": "integer",
            "description": "Only return products priced at or below this amount. Applies in BOTH search mode and URL mode: the listing request is rebuilt for a pasted listing, category, search or specials URL, so the filter is sent with it. It does not narrow a pasted product URL, which returns that one product."
          },
          "availability": {
            "title": "Availability filter",
            "enum": [
              "",
              "GL",
              "SL",
              "VB"
            ],
            "type": "string",
            "description": "Narrow by delivery/availability status. Applies in BOTH search mode and URL mode: the listing request is rebuilt for a pasted listing, category, search or specials URL, so the filter is sent with it. It does not narrow a pasted product URL, which returns that one product.",
            "default": ""
          },
          "sortBy": {
            "title": "Sort order",
            "enum": [
              "sfmd",
              "sfpa",
              "sfpd",
              "sfea",
              "sfed",
              "sfsd"
            ],
            "type": "string",
            "description": "Order of the returned results. Applies in BOTH search mode and URL mode: the listing request is rebuilt for a pasted listing, category, search or specials URL, so the filter is sent with it. It does not narrow a pasted product URL, which returns that one product.",
            "default": "sfmd"
          },
          "fetchDetails": {
            "title": "Fetch full product detail",
            "type": "boolean",
            "description": "Adds ISBN/EAN, full author list, publisher, description, flattened technical specifications (pages, language, release date, dimensions — varies per product), full breadcrumb category path, media gallery, and the format-variant matrix (e.g. Hardcover/Taschenbuch/eBook siblings of the same title). Current price, was-price/discount and rating are already included without this toggle on search/category results.",
            "default": false
          },
          "fetchReviews": {
            "title": "Fetch reviews",
            "type": "boolean",
            "description": "Fetch each product's full review history: overall rating, review count, 1-5 star rating breakdown, and per-review author/date/rating/title/body. Products with no reviews simply return an empty list.",
            "default": true
          },
          "maxReviewsPerProduct": {
            "title": "Max reviews per product",
            "minimum": 0,
            "maximum": 1000,
            "type": "integer",
            "description": "Cap on reviews fetched per product when 'Fetch reviews' is on. Leave empty for 20. A value of 0 means the maximum the actor allows, 1000 reviews per product; the largest accepted value is 1000.",
            "default": 20
          },
          "maxPages": {
            "title": "Max pages per search",
            "minimum": 0,
            "type": "integer",
            "description": "Stop after this many result pages per search/category/URL entry. Leave empty for as many pages as needed (bounded by Max products total). A value of 0 also means as many as needed. The actor never fetches more than 1000 pages per entry; larger values are lowered to 1000 with a warning in the run log."
          },
          "maxItems": {
            "title": "Max products total",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "Hard cap on total products returned across every search/category/URL entry. Leave empty for 20. A value of 0 means the maximum the actor allows, 100000 products per run; the largest accepted value is 100000.",
            "default": 20
          },
          "proxy": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Thalia refuses most datacenter connections, so runs start on the default Apify connection and move to residential when your plan includes it. No connection is guaranteed; failed runs can be retried later.",
            "default": {
              "useApifyProxy": true
            }
          },
          "resumeFromRunId": {
            "title": "Resume from an earlier run (run ID)",
            "type": "string",
            "description": "Optional. Run ID of an earlier run of this actor that did not finish. Products it already returned are not returned (or billed) again. Leave empty for a normal run."
          },
          "incrementalMode": {
            "title": "Incremental mode (recurring monitoring)",
            "type": "boolean",
            "description": "Turn this on for daily or recurring monitoring. The first run returns all matching products as NEW. Later runs compare every product against the last run (title, authors, price, original price and discount, sale flag, badges and promo label, format, category path, availability) and return only NEW and UPDATED products; an UPDATED row's changedFields names exactly what moved. Ratings, review counts, the image link and the product link are never compared, because they change without a real product change. Unchanged products are not returned, not enriched and not billed. For search, category and sale links the comparison uses the search result data, so fields only present after the optional product details (ISBN, publisher, description) do not trigger UPDATED; a pasted product link returns the full product record and that whole record (details included) is compared. State is kept separately for each search/URL/filter setup; use State key to name or share a campaign. Products that disappear are returned once as EXPIRED (see 'Return products that disappeared') and a product that comes back is returned as REAPPEARED.",
            "default": false
          },
          "stateKey": {
            "title": "State key (optional, incremental mode only)",
            "type": "string",
            "description": "Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to derive a key automatically from the search/URL and filter settings."
          },
          "emitUnchanged": {
            "title": "Also return unchanged products (incremental mode only)",
            "type": "boolean",
            "description": "Incremental mode only. Return products that did not change, 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. Off by default: unchanged products are skipped.",
            "default": false
          },
          "emitExpired": {
            "title": "Return products that disappeared (incremental mode only)",
            "type": "boolean",
            "description": "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. Each returned EXPIRED row counts as a returned result and is billed under the per-result event (no enrichment charge). Never emitted for capped, partial or resumed runs.",
            "default": true
          },
          "ignoreFieldsForChanges": {
            "title": "Ignore fields when detecting changes (incremental mode only)",
            "type": "array",
            "description": "Optional. Field names to exclude from UPDATED change detection, in addition to the built-in handling (rating, reviewCount, image and url never trigger UPDATED). Nested fields can be given as dotted paths. Ignored fields are still returned in the row.",
            "items": {
              "type": "string"
            }
          },
          "mcpConnectors": {
            "title": "Pipe results into your apps (optional)",
            "type": "array",
            "description": "Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify -> Settings -> Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON; the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com)."
          },
          "notionParentPageUrl": {
            "title": "Notion parent page (Notion connector only)",
            "type": "string",
            "description": "URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors."
          },
          "maxNotifyListings": {
            "title": "Max items to export per connector",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Cap on items written to each connector per run. Does not affect the dataset.",
            "default": 50
          }
        }
      },
      "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}