{
  "openapi": "3.0.1",
  "info": {
    "title": "Ozon Products Scraper",
    "description": "Scrape Ozon.ru products by keyword, category, seller or brand URL: card price, price without Ozon card, old price, rating, reviews, seller, stock. Optional full product page, reviews, Q&A, other sellers and price tracking. Export to JSON, CSV or Excel.",
    "version": "0.0",
    "x-build-id": "7hzb0LnYALYG0482h"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/nice_dev~ozon-products-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-nice_dev-ozon-products-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/nice_dev~ozon-products-scraper/runs": {
      "post": {
        "operationId": "runs-sync-nice_dev-ozon-products-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/nice_dev~ozon-products-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-nice_dev-ozon-products-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "startUrls": {
            "title": "Start URLs",
            "maxItems": 1000,
            "type": "array",
            "description": "Ozon.ru URLs: search (`https://www.ozon.ru/search/?text=...`), category (`/category/...`), seller (`/seller/...`), brand (`/brand/...`), or product (`/product/...`). Filters and sorting set on the site are kept, pagination is automatic. When this list is not empty, **Search keyword** and **More search keywords** are ignored; caps, post-filters and monitoring still apply. Max 1 000 URLs.",
            "default": [],
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "query": {
            "title": "Search keyword",
            "maxLength": 200,
            "type": "string",
            "description": "Search text, as typed in the Ozon search bar (Russian or English, e.g. `наушники` or `iphone 15`)."
          },
          "searchQueries": {
            "title": "More search keywords",
            "maxItems": 100,
            "uniqueItems": true,
            "type": "array",
            "description": "Several keywords in one run: one search per keyword, added to **Search keyword**. A product found by several searches is saved once.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "productIds": {
            "title": "Product SKUs",
            "maxItems": 1000,
            "uniqueItems": true,
            "type": "array",
            "description": "Ozon product numbers (SKU, the `Артикул` shown on a product page, e.g. `1234567890`). Each one is read like a product URL. Max 1 000.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "maxItems": {
            "title": "Max products",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "Maximum number of products to save for the whole run (after deduplication and filters). 0 = no limit.",
            "default": 100
          },
          "maxItemsPerQuery": {
            "title": "Max products per search",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "Cap for EACH search (keyword, or search / category / seller URL), so that the first search cannot use up the whole **Max products** budget. 0 = no per-search cap.",
            "default": 0
          },
          "sortBy": {
            "title": "Sort by",
            "enum": [
              "score",
              "rating",
              "price",
              "price_desc",
              "new",
              "discount"
            ],
            "type": "string",
            "description": "Order of the search results on Ozon. Ignored for the URLs that already carry a sorting. **Only new products** does not change it: with *Newest first* a monitoring run stops reading once it meets a long run of products it already delivered.",
            "default": "score"
          },
          "minPrice": {
            "title": "Min price (RUB)",
            "minimum": 0,
            "maximum": 100000000,
            "type": "integer",
            "description": "Lowest Ozon Card price, in roubles."
          },
          "maxPrice": {
            "title": "Max price (RUB)",
            "minimum": 1,
            "maximum": 100000000,
            "type": "integer",
            "description": "Highest Ozon Card price, in roubles. Leave empty for no maximum."
          },
          "hasDiscount": {
            "title": "Discounted products only",
            "type": "boolean",
            "description": "Ozon filter `Товары со скидкой`: only products with a crossed-out price.",
            "default": false
          },
          "onSale": {
            "title": "Sale products only",
            "type": "boolean",
            "description": "Ozon filter `Распродажа`: only products in the current sale.",
            "default": false
          },
          "brandCertified": {
            "title": "Verified brand only",
            "type": "boolean",
            "description": "Ozon filter `Бренд проверен`: the seller guarantees original products of this brand.",
            "default": false
          },
          "officialStoresOnly": {
            "title": "Official brand stores only",
            "type": "boolean",
            "description": "Ozon filter `Официальные магазины бренда`.",
            "default": false
          },
          "sellerIds": {
            "title": "Seller IDs",
            "maxItems": 50,
            "uniqueItems": true,
            "type": "array",
            "description": "Only products sold by these sellers (Ozon seller id, the number at the end of a `/seller/...` URL; `0` = Ozon itself).",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "brandIds": {
            "title": "Brand IDs",
            "maxItems": 50,
            "uniqueItems": true,
            "type": "array",
            "description": "Only products of these brands (Ozon brand id, the number at the end of a `/brand/...` URL).",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "delivery": {
            "title": "Delivery time",
            "enum": [
              "any",
              "express",
              "today",
              "tomorrow",
              "3days",
              "7days"
            ],
            "type": "string",
            "description": "Ozon filter `Срок доставки`: only products delivered within this time (to the **Delivery city**).",
            "default": "any"
          },
          "isInstallment": {
            "title": "Instalments only",
            "type": "boolean",
            "description": "Ozon filter `Рассрочка`: only products that can be paid in parts.",
            "default": false
          },
          "language": {
            "title": "Language",
            "enum": [
              "az-Latn",
              "en",
              "hy",
              "kk",
              "mn",
              "ru",
              "tk",
              "tr",
              "uz-Latn",
              "zh-Hans"
            ],
            "type": "string",
            "description": "Language Ozon shows the product texts in (title, description, characteristics). Ozon translates what it can.",
            "default": "ru"
          },
          "currency": {
            "title": "Currency",
            "enum": [
              "RUB",
              "USD",
              "BYN",
              "KZT",
              "ILS",
              "AMD",
              "UZS",
              "KGS",
              "AZN",
              "GEL",
              "MNT",
              "AUD",
              "DKK",
              "JPY",
              "CAD",
              "CNY",
              "MDL",
              "NOK",
              "PLN",
              "SGD",
              "TRY",
              "UAH",
              "GBP",
              "CZK",
              "SEK",
              "CHF"
            ],
            "type": "string",
            "description": "Currency the prices are given in. Ozon shows approximate amounts in any currency but the rouble (the order itself is charged in roubles).",
            "default": "RUB"
          },
          "deliveryCity": {
            "title": "Delivery city",
            "maxLength": 100,
            "type": "string",
            "description": "City whose pickup point Ozon uses for the prices, delivery dates and stock, as written on Ozon (e.g. `Новосибирск`). Empty = Moscow (set on every IP, whatever city the IP is in)."
          },
          "extractDetails": {
            "title": "Full product page",
            "type": "boolean",
            "description": "Open each product page (2 extra requests) for the seller, stock left, all characteristics, description, category path, brand, variants (colour / size with their SKUs), video, questions count and the cheapest offer of another seller. Charged per product read this way (event `product-details`).",
            "default": false
          },
          "includeOtherSellers": {
            "title": "Other sellers (buy box)",
            "type": "boolean",
            "description": "Needs **Full product page**. The offers of the same product by other sellers (the 100 cheapest the site lists): seller with rating and legal details, price, delivery date, link. 1 extra request per product; charged per product that has other offers (event `other-sellers`).",
            "default": false
          },
          "includeReviews": {
            "title": "Customer reviews",
            "type": "boolean",
            "description": "Needs **Full product page**. Customer reviews of each product: rating, text, pros, cons, date, author first name, photos, videos, likes, star counts. 1 extra request per 30 reviews. Charged per review delivered (event `review`).",
            "default": false
          },
          "maxReviewsPerProduct": {
            "title": "Max reviews per product",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Used with **Customer reviews** (30 reviews per page read).",
            "default": 20
          },
          "reviewSort": {
            "title": "Reviews order",
            "enum": [
              "usefulness_desc",
              "score_desc",
              "score_asc"
            ],
            "type": "string",
            "description": "Used with **Customer reviews**: which reviews come first (Ozon sorting).",
            "default": "usefulness_desc"
          },
          "includeReviewComments": {
            "title": "Review comments",
            "type": "boolean",
            "description": "Needs **Customer reviews** (ignored without it). Adds the comments under each review, with the seller's answer: `sellerResponse` and `comments`. At most 30 comment requests per product and 50 comments per review (the rest of a product's reviews, or of a review, is saved without them; the run summary says so). 1 extra request per review that has comments; charged per review whose comments are delivered (event `review-comment`).",
            "default": false
          },
          "includeQuestions": {
            "title": "Customer questions",
            "type": "boolean",
            "description": "Needs **Full product page**. Customer questions of each product with the answers shown under them (seller or buyers): text, author, date, likes, best answer. 1 extra request per 10 questions; charged per question delivered (event `question`). Ozon shows questions in Russian only: with another **Language** there are none.",
            "default": false
          },
          "maxQuestionsPerProduct": {
            "title": "Max questions per product",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Used with **Customer questions**.",
            "default": 10
          },
          "includeSellerProfile": {
            "title": "Seller profile",
            "type": "boolean",
            "description": "Needs **Full product page**. Opens the page of each seller once per run for its profile: followers and reviews count (`sellerFollowers`, `sellerReviewCount`), Premium mark, badges, time on Ozon and verified brands. The next products of the same seller get the profile at no charge. Charged per seller read (event `seller-profile`).",
            "default": false
          },
          "includePriceHistory": {
            "title": "Price history",
            "type": "boolean",
            "description": "Needs **Full product page**. For a product Ozon marks `Стало дешевле`: the price now and the average price of the month before (`priceHistory`). Ozon gives no full price curve. 1 extra request per product; charged per product that has it (event `price-history`).",
            "default": false
          },
          "excludeKeywords": {
            "title": "Exclude keywords",
            "maxItems": 50,
            "uniqueItems": true,
            "type": "array",
            "description": "Drop the products whose title contains one of these words (case and accents ignored).",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "minRating": {
            "title": "Min rating",
            "minimum": 0,
            "maximum": 5,
            "type": "number",
            "description": "Drop the products rated below this (1-5 stars). Products with no rating yet are dropped too."
          },
          "minReviews": {
            "title": "Min reviews count",
            "minimum": 0,
            "maximum": 10000000,
            "type": "integer",
            "description": "Drop the products with fewer reviews than this."
          },
          "minDiscount": {
            "title": "Min discount %",
            "minimum": 0,
            "maximum": 99,
            "type": "integer",
            "description": "Drop the products whose discount is below this percent (crossed-out price vs Ozon Card price). Products with no discount are dropped too."
          },
          "includeKeywords": {
            "title": "Required keywords",
            "maxItems": 50,
            "uniqueItems": true,
            "type": "array",
            "description": "Keep only the products whose title contains at least one of these words (case and accents ignored).",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "onlyNew": {
            "title": "Only new products",
            "type": "boolean",
            "description": "Skip the products that a previous run (same **Memory key**) already delivered: they are not saved and not charged, and their page is not even opened. First run = everything is new.",
            "default": false
          },
          "includePriceChanges": {
            "title": "Report price changes",
            "type": "boolean",
            "description": "Needs **Only new products**. A product already delivered under this **Memory key** comes back when its search-result price has changed since the run that delivered it: `previousPrice`, `priceChange`, `priceChangePct` and `priceChangedAt` are filled. It comes back as its search-result card: its product page and the extras (reviews, questions, other sellers, seller profile, price history) are not read or charged again. Charged per product as **Price change**, on top of the product; a product whose price did not move is skipped and costs nothing. The first run after you tick it learns the prices and reports no change.",
            "default": false
          },
          "minPriceChangePct": {
            "title": "Min price change %",
            "minimum": 0,
            "maximum": 100,
            "type": "number",
            "description": "Used with **Report price changes**: smaller moves (up or down, in percent) are ignored. 0 = every change.",
            "default": 0
          },
          "stateKey": {
            "title": "Memory key",
            "pattern": "^[a-zA-Z0-9_-]{1,64}$",
            "maxLength": 64,
            "type": "string",
            "description": "Name of the memory used by **Only new products**. Give each schedule / task its own key (e.g. `headphones-watch`) so that they do not share their memory. Letters, digits, `-` and `_`.",
            "default": "default"
          },
          "resetState": {
            "title": "Reset the memory",
            "type": "boolean",
            "description": "Forget everything remembered under this **Memory key** before the run: this run returns (and charges) every product again. Untick it afterwards.",
            "default": false
          },
          "proxyConfiguration": {
            "title": "Proxy configuration (included proxy: paying users only)",
            "type": "object",
            "description": "Keep **Apify Proxy**: the Actor reaches Ozon through Russian IP addresses, included in the price (the proxy group, the country and **No proxy** chosen here are ignored). Your own proxies (`proxyUrls`), if you give some, must be Russian. On the Apify free plan the included proxy is not available: add your own proxy URLs, or the run stops at once with a message.",
            "default": {
              "useApifyProxy": true
            }
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Ozon pages read in parallel.",
            "default": 4
          },
          "maxRequestsPerMinute": {
            "title": "Max requests per minute",
            "minimum": 10,
            "maximum": 600,
            "type": "integer",
            "description": "Most requests to Ozon in any 60 seconds, all of them counted: results pages, product pages, reviews and other sellers. A budget, not an even pace (spread them with the minimum delay below). Lower it if the log shows Ozon turning requests away.",
            "default": 120
          },
          "minRequestIntervalMs": {
            "title": "Min delay between requests",
            "minimum": 0,
            "maximum": 60000,
            "type": "integer",
            "description": "Smallest gap between two requests, in milliseconds. 0 = no gap.",
            "default": 0
          },
          "maxRequestRetries": {
            "title": "Max request retries",
            "minimum": 0,
            "maximum": 20,
            "type": "integer",
            "description": "Retries per request before it is marked as failed. A request Ozon turns away is also retried on a new proxy session up to 10 times without using up these retries.",
            "default": 5
          },
          "debugLog": {
            "title": "Debug log",
            "type": "boolean",
            "description": "Include debug messages in the run log.",
            "default": false
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}