{
  "openapi": "3.0.1",
  "info": {
    "title": "IKEA Scraper - Products, Prices, Reviews & Availability",
    "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": "O7QDUbSToJjPzOmb0"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~ikea-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-ikea-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~ikea-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-ikea-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~ikea-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-ikea-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",
              "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 are included in the detail enrichment charge, so the number you set never changes the price. 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, home delivery) to each product.",
            "default": false
          },
          "maxItems": {
            "title": "Max products",
            "minimum": 0,
            "type": "integer",
            "description": "Total products to return across all inputs — the overall run cap.",
            "default": 20
          },
          "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."
          },
          "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
          },
          "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}