{
  "openapi": "3.0.1",
  "info": {
    "title": "IKEA Scraper Lite",
    "description": "Scrape IKEA products across 50+ markets. Extract names, prices, currencies, ratings, full reviews, colours, dimensions, images, categories, variants, badges and store availability. Supports search, category, item-number and URL inputs with filters and sorting.",
    "version": "1.0",
    "x-build-id": "aH59m4FXTaZ2mLoDV"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~ikea-scraper-lite/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-ikea-scraper-lite",
        "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~ikea-scraper-lite/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-ikea-scraper-lite",
        "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~ikea-scraper-lite/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-ikea-scraper-lite",
        "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",
              "productIds",
              "url",
              "category"
            ],
            "type": "string",
            "description": "search = keywords + filters. productIds = exact item numbers. url = paste product, category or search links, or bare category ids, and walk them.",
            "default": "search"
          },
          "market": {
            "title": "Market and language",
            "enum": [
              "us/en",
              "au/en",
              "at/de",
              "bh/ar",
              "bh/en",
              "be/nl",
              "be/fr",
              "ca/en",
              "ca/fr",
              "cl/es",
              "cn/zh",
              "co/es",
              "hr/hr",
              "cz/cs",
              "dk/da",
              "eg/ar",
              "eg/en",
              "ee/et",
              "fi/fi",
              "fi/sv",
              "fr/fr",
              "de/de",
              "hu/hu",
              "in/en",
              "ie/en",
              "il/he",
              "it/it",
              "jp/en",
              "jp/ja",
              "jo/ar",
              "jo/en",
              "kw/ar",
              "kw/en",
              "lv/lv",
              "lt/lt",
              "my/en",
              "mx/es",
              "ma/ar",
              "ma/fr",
              "nl/nl",
              "no/no",
              "om/ar",
              "om/en",
              "ph/en",
              "pl/pl",
              "pt/pt",
              "qa/ar",
              "qa/en",
              "ro/ro",
              "sa/ar",
              "sa/en",
              "rs/sr",
              "sg/en",
              "sk/sk",
              "si/sl",
              "kr/ko",
              "es/es",
              "se/sv",
              "ch/fr",
              "ch/de",
              "ch/it",
              "th/en",
              "th/th",
              "ae/ar",
              "ae/en",
              "gb/en"
            ],
            "type": "string",
            "description": "The IKEA market (and its language) to scrape. Sets prices, currency, product range and the site language. In URL mode the market is taken from each link instead.",
            "default": "us/en"
          },
          "searchTerms": {
            "title": "Search terms",
            "type": "array",
            "description": "One or more keywords to search, e.g. sofa, bookcase, desk lamp.",
            "items": {
              "type": "string"
            }
          },
          "sortBy": {
            "title": "Sort by",
            "enum": [
              "RELEVANCE",
              "PRICE_LOW_TO_HIGH",
              "PRICE_HIGH_TO_LOW",
              "NEWEST",
              "RATING",
              "MOST_POPULAR",
              "NAME_ASCENDING",
              "WIDTH",
              "HEIGHT",
              "DEPTH",
              "NAME_DESCENDING",
              "CUSTOMER_RATING"
            ],
            "type": "string",
            "description": "Order of results within each search or category listing, including a search or category link pasted in URL mode. Ignored for productIds and single product links.",
            "default": "RELEVANCE"
          },
          "productIds": {
            "title": "Item numbers",
            "type": "array",
            "description": "Exact IKEA item numbers, e.g. 20522046 — each resolves to a full product record.",
            "items": {
              "type": "string"
            }
          },
          "urls": {
            "title": "URLs",
            "type": "array",
            "description": "Paste product, category or search links from ikea.com, or a bare letter-prefixed category id (fu003, tl001, bm003) — each link's own market is used, defaulting to Market and language above for a bare id. A search or category link keeps the filters and sort it carries (for example ?filters=f-colors%3A10156&sort=PRICE_LOW_TO_HIGH): they apply to that link and take precedence over the same Facet filters key or Sort by chosen below; a page number (?page=2) is not used, every link is walked from its first page. A room or department link (e.g. ikea.com/us/en/rooms/living-room/) expands into every category that page itself lists; a link with no resolvable category (offers, new, campaigns) is reported in the log and skipped, never guessed as a keyword. Every other field in the Filters section below still applies here, to each search or category link you paste; a single product link always returns that exact item, unfiltered.",
            "default": [
              "https://www.ikea.com/us/en/p/billy-bookcase-white-20522046/",
              "https://www.ikea.com/gb/en/p/billy-bookcase-white-00263850/",
              "https://www.ikea.com/us/en/cat/bookcases-10382/",
              "https://www.ikea.com/us/en/cat/chairs-fu002/",
              "https://www.ikea.com/us/en/cat/bookcases-10382/?filters=f-colors%3A10156&sort=PRICE_LOW_TO_HIGH",
              "https://www.ikea.com/us/en/search/products/?q=bookcase",
              "https://www.ikea.com/us/en/search/?q=bookcase&sort=PRICE_LOW_TO_HIGH",
              "https://www.ikea.com/us/en/rooms/living-room/",
              "https://www.ikea.com/us/en/products/storage-furniture/bookcases/",
              "https://www.ikea.com/us/en/offers/",
              "fu003"
            ],
            "items": {
              "type": "string"
            }
          },
          "minPrice": {
            "title": "Min price",
            "minimum": 0,
            "type": "integer",
            "description": "Only keep products at or above this price (market currency)."
          },
          "maxPrice": {
            "title": "Max price",
            "minimum": 0,
            "type": "integer",
            "description": "Only keep products at or below this price (market currency)."
          },
          "minRating": {
            "title": "Min rating",
            "minimum": 0,
            "maximum": 5,
            "type": "integer",
            "description": "Only keep products with an average rating at or above this value (1-5)."
          },
          "inStockOnly": {
            "title": "In stock only",
            "type": "boolean",
            "description": "Keep only products currently sellable online.",
            "default": false
          },
          "containsKeyword": {
            "title": "Contains keyword",
            "type": "string",
            "description": "Keep only products whose name, type or description contains this text."
          },
          "specialsCategory": {
            "title": "Specials",
            "enum": [
              "none",
              "family_price",
              "last_chance"
            ],
            "type": "string",
            "description": "Show only products in one of IKEA's specials categories: IKEA Family price (loyalty-program markdown) or Last chance (clearance / limited-stock items). Off by default. Added as a facet to the same listing request.",
            "default": "none"
          },
          "filters": {
            "title": "Facet filters",
            "type": "object",
            "description": "Native IKEA facet filters for search and category listings. Keys: colors, materials, type, price, category; values are comma-separated facet ids as shown on the site's filter panel (colors e.g. 10139, price e.g. PRICE_0_10000). Unknown keys are ignored. Not applied in item-number mode or to single product links.",
            "default": {}
          },
          "fetchDetails": {
            "title": "Fetch full description & reviews",
            "type": "boolean",
            "description": "Attach the full marketing description and individual customer reviews (title, text, author, date, rating) to each product.",
            "default": true
          },
          "maxReviews": {
            "title": "Max reviews per product",
            "minimum": 0,
            "type": "integer",
            "description": "Cap on individual reviews captured per product (0 disables review text; ratings are still attached). Reviews consume additional platform usage; there is no enrichment event fee. The true limit is however many reviews IKEA includes on the product page itself; values above 100000 are treated as 100000.",
            "default": 10
          },
          "includeAvailability": {
            "title": "Include store availability",
            "type": "boolean",
            "description": "Attach national and per-store stock (quantity, click & collect, cash & carry) to each product. Leave Store IDs empty for the stores that currently hold stock (up to 25).",
            "default": false
          },
          "storeIds": {
            "title": "Store IDs or names (optional)",
            "type": "array",
            "description": "Needs Include store availability switched on. Return stock for only these stores, always one entry per store you list, even when the quantity is 0 or the item is not offered there. Use the numeric store id (919 is IKEA Logan) or a store name such as Logan (names are known for Australia). An unknown name stops the run before anything is collected.",
            "items": {
              "type": "string"
            }
          },
          "deliveryPostcode": {
            "title": "Delivery postcode (optional)",
            "pattern": "^$|^[0-9]{4}$",
            "type": "string",
            "description": "Only for market Australia / English; needs Include store availability switched on. Adds a postcode-specific yes/no to each product: does IKEA offer home delivery to this 4-digit Australian postcode (for example 4209). It is reported next to, and separately from, the store quantities. It is not a delivery date or a delivery price, and stock at a store does not prove delivery. Leave empty to skip. A postcode in another format, another market, or Include store availability off stops the run before anything is collected."
          },
          "maxItems": {
            "title": "Max products",
            "minimum": 0,
            "type": "integer",
            "description": "Total products to return across all inputs — the overall run cap.",
            "default": 20
          },
          "readProductsAtOnce": {
            "title": "Read products at once",
            "minimum": 1,
            "maximum": 8,
            "type": "integer",
            "description": "How many product pages are read in parallel to finish faster. Results, order and charges are identical at any value. Set 1 to read strictly one at a time. Reading automatically drops back to one at a time whenever the site pushes back.",
            "default": 4
          },
          "maxPages": {
            "title": "Max pages per input",
            "minimum": 0,
            "type": "integer",
            "description": "Optional safety cap on result pages walked per search or category. Leave empty or 0 for no page limit — the run stops at Max products instead.",
            "default": 0
          },
          "proxy": {
            "title": "Proxy",
            "type": "object",
            "description": "Apify Proxy configuration. Keeping Apify Proxy enabled is recommended for reliable results. Attaching the full description and individual review texts works best on a residential connection and may be skipped on limited plans.",
            "default": {
              "useApifyProxy": true
            }
          },
          "resumeFromRunId": {
            "title": "Resume from a previous run",
            "type": "string",
            "description": "Paste a previous run ID or dataset ID to continue a large crawl of products without returning or charging for products already collected there. Use this after an interrupted run, or when continuing a product catalogue pull in another run. For recurring monitoring of the same search, use Incremental mode below instead."
          },
          "incrementalMode": {
            "title": "Incremental mode",
            "type": "boolean",
            "description": "Turn this on for daily or recurring monitoring. The first run returns all matching products as NEW. Later runs normally return only NEW, UPDATED, and REAPPEARED products. Turn on \"Emit unchanged\" or \"Emit expired\" only when you also want those products returned (and billed). State is kept separately per market, mode (search/category/productIds/url), and filter setup; use State key when you want to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above.",
            "default": false
          },
          "stateKey": {
            "title": "State key (incremental mode)",
            "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 let the actor derive a key automatically from the market, mode, search/category/productIds/urls and filter settings — different setups then never mix state with each other."
          },
          "baselineDatasetId": {
            "title": "Start from an existing dataset (optional, incremental mode only)",
            "type": "string",
            "description": "Optional. Pick the dataset of an earlier full run of this Actor to use as your starting point, so your first incremental run returns only products that changed since then instead of the whole catalogue again. Pick the dataset unedited: it must be this Actor's own product output. Only used on the first run for a state key; ignored once that state key already tracks products. Cannot be combined with Resume from a previous run. If the dataset is old, everything that changed since is returned as UPDATED or NEW."
          },
          "earlierHistoryStoreId": {
            "title": "Continue from the IKEA Scraper's history (optional, incremental mode only)",
            "type": "string",
            "description": "Optional. Pick the saved-history store of the IKEA Scraper (named ikea-com-incremental-state) so your first Lite run for a State key, or for the same search settings, continues from the history that scraper already tracked, instead of returning the whole catalogue as NEW. The store is only read, never changed. Only used on the first run for a state key; ignored once that state key already tracks products, or when Start from an existing dataset or Resume is set."
          },
          "emitUnchanged": {
            "title": "Emit unchanged products",
            "type": "boolean",
            "description": "Off by default. Turn on to also return products that have not changed since the last run, marked UNCHANGED. This returns — and bills — extra rows you already have, so leave it off unless you specifically want the full snapshot every run.",
            "default": false
          },
          "emitExpired": {
            "title": "Emit expired products",
            "type": "boolean",
            "description": "Off by default. Turn on to also return products that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search/category/URLs — not when Max products capped it or when Resume was used. This returns — and bills — extra synthetic rows, so leave it off unless you need expiry tracking.",
            "default": false
          },
          "changeScope": {
            "title": "What counts as a change (incremental mode only)",
            "enum": [
              "all",
              "priceAndStock",
              "sellingPriceAndStock"
            ],
            "type": "string",
            "description": "All fields (default): any change to the product record returns an UPDATED row, exactly as before this option existed. Price and availability only: only price changes (price, was price, savings, discount and special flags, and each colour/size variant's own price) and availability changes (online sellable, the product page's stock status, national click and collect and home delivery, and in-stock, click and collect or cash and carry changes at the stores chosen in Store ids) return an UPDATED row; names, descriptions, images, badges, ratings and other details never do. Selling price and availability only: like Price and availability only, but a price change counts only when the selling price (price, for the product or a variant) or its currency moves; was prices, savings and special flags never return a row on their own. In both narrow options, unit counts, the stock level label and the in-store location alone never return a row. Changing this option on a search with no State key continues from that search's saved baseline instead of starting over.",
            "default": "all"
          },
          "compactUpdates": {
            "title": "Compact update rows (incremental mode only)",
            "type": "boolean",
            "description": "Off by default. When on, UPDATED rows (and EXPIRED rows) are short: product id, url, name, current price, online sellable flag and the availability block, plus priceChanges, variantChanges (per colour/size variant) and storeChanges (per chosen store, and the national click and collect and home delivery flags) showing the old and new value of each moved field. NEW rows always carry the complete product record. Review text is not included in compact rows. A compact row is billed exactly like the full row it replaces.",
            "default": false
          },
          "expireAfterMissedScans": {
            "title": "Expire after N missed full scans (incremental mode only)",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "Only used with Emit expired products. A product is marked EXPIRED only after it has been missing from this many full scans in a row (default 1). Raise it (e.g. 3) so a product that briefly drops out of a search or category listing is not reported as gone. A product that comes back resets the count. A scan that was capped, resumed or could not read a page never counts as a miss. Stock status itself is reported through the availability fields, not through EXPIRED.",
            "default": 1
          },
          "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 (full description, reviews and store availability already never trigger a false UPDATED when their own fetch simply didn't land this run). Use this if another field in your setup turns out to be noisy — for example priceValidFrom/priceValidTo or isBreathTaking, which IKEA can rotate without the product itself changing.",
            "items": {
              "type": "string"
            }
          },
          "mcpConnectors": {
            "title": "Export destinations",
            "type": "array",
            "description": "Optionally send results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize one under Apify then Settings then API & Integrations, then select it here. Notion gets a page-per-item export; other connectors get a best-effort write. Leave empty to skip. Supported: Notion, Linear, Airtable, Apify."
          },
          "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 only for the Notion export."
          },
          "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}