{
  "openapi": "3.0.1",
  "info": {
    "title": "Tokopedia Scraper · Products, Shops & Reviews",
    "description": "Scrape Tokopedia products from keywords, search URLs, categories, shops or product links. Get IDR prices, discounts, exact sold counts, ratings, specs, every variant with its own price and stock, reviews, seller stats and TikTok Shop IDs. Monitor mode returns only price changes.",
    "version": "0.1",
    "x-build-id": "db5ZjNUQGaGdqdG2c"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/memo23~tokopedia-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-memo23-tokopedia-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/memo23~tokopedia-scraper/runs": {
      "post": {
        "operationId": "runs-sync-memo23-tokopedia-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/memo23~tokopedia-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-memo23-tokopedia-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": {
          "outputMode": {
            "title": "What each row is",
            "enum": [
              "products",
              "reviews",
              "shops"
            ],
            "type": "string",
            "description": "Products: one row per product, with optional details, nested reviews and shop stats. Reviews: one row per written review with the product it belongs to; a shop URL gives the shop's reviews across all its products. Shops: one row per shop with followers, products, items sold, transactions and rating; keywords search Tokopedia's shop tab, and shop or product URLs give that shop. Review rows are billed as reviews; shop rows are billed at the product price.",
            "default": "products"
          },
          "keywords": {
            "title": "Search keywords",
            "type": "array",
            "description": "One search per line, typed as you would in Tokopedia's search bar. Indonesian terms return the most results (sepatu, tas wanita, laptop gaming). Leave keywords and URLs empty to scrape popular products across Tokopedia.",
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "Tokopedia URLs",
            "type": "array",
            "description": "Any mix of search results (tokopedia.com/search?q=..., or ?st=shop&q=... for shop search), category pages (tokopedia.com/p/...), shops (tokopedia.com/shop-name, including its /product and /etalase/... tabs), single products (tokopedia.com/shop-name/product-name), bare product ids such as 11869486942, recommendation pages (tokopedia.com/rekomendasi/<product id>) and the home page (its \"for you\" feed). Share links (tk.tokopedia.com, vt.tokopedia.com) work too. Filters already in a URL are kept.",
            "items": {
              "type": "string"
            }
          },
          "scrapeDetails": {
            "title": "Scrape full product details",
            "type": "boolean",
            "description": "Open each product page for the description, specifications, all images and videos, every variant with its own price and stock, exact sold count, per-star rating breakdown, weight, condition, stock, wholesale tiers and flash-sale campaign. Billed as a product-detail event on top of the product. Product URLs always get full details.",
            "default": false
          },
          "maxReviewsPerProduct": {
            "title": "Reviews per product",
            "minimum": 0,
            "maximum": 1000,
            "type": "integer",
            "description": "Written reviews to attach to each product (text, star rating, variant bought, date, photos, seller reply). 0 turns reviews off. Each review is billed as a review event. In review-rows mode 0 means 100 per product.",
            "default": 0
          },
          "reviewSort": {
            "title": "Review order",
            "enum": [
              "newest",
              "most_helpful",
              "highest_rating",
              "lowest_rating"
            ],
            "type": "string",
            "description": "Which reviews come first when reviews are on. Lowest rating first is the quickest way to collect complaints.",
            "default": "newest"
          },
          "reviewStars": {
            "title": "Only reviews with these stars",
            "type": "array",
            "description": "Keep only reviews with these star ratings, e.g. 1 and 2 for complaints. Leave empty for all ratings. Allowed values: 1, 2, 3, 4, 5.",
            "items": {
              "type": "string",
              "enum": [
                "1",
                "2",
                "3",
                "4",
                "5"
              ]
            }
          },
          "reviewsWithMediaOnly": {
            "title": "Only reviews with photos or video",
            "type": "boolean",
            "description": "Keep only reviews that include buyer photos or videos.",
            "default": false
          },
          "includeShopInfo": {
            "title": "Add shop stats",
            "type": "boolean",
            "description": "Add the seller's followers, active products, total items sold, completed transactions, open-since date, district and shop rating with its per-star breakdown. Looked up once per shop and not billed separately.",
            "default": false
          },
          "includeRecommendations": {
            "title": "Add recommended products",
            "type": "boolean",
            "description": "For product URLs and product ids: also return the products Tokopedia recommends on that product's page (more from the same shop, other choices for you, brands for you), each as a normal product row with the widget it came from. Up to Maximum per source for each product.",
            "default": false
          },
          "includeRawData": {
            "title": "Add Tokopedia's raw data",
            "type": "boolean",
            "description": "Add Tokopedia's unprocessed response next to each row under `raw`: the listing card, and with details the full product page, rating and second product-page query. For fields this actor does not map. Product pages are about 100 KB each, so rows get much larger.",
            "default": false
          },
          "downloadMedia": {
            "title": "Save images and videos",
            "enum": [
              "none",
              "images",
              "images-and-videos"
            ],
            "type": "string",
            "description": "Save the product's files into the run's key-value store and list them in `mediaFiles` with a download URL. With details on, all product images; without, the main image. Image links in the rows are permanent either way; video links from product pages expire within hours, so save videos if you need them later.",
            "default": "none"
          },
          "maxMediaPerProduct": {
            "title": "Maximum images per product",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "How many images to save for each product when saving images is on.",
            "default": 10
          },
          "sortBy": {
            "title": "Sort by",
            "enum": [
              "relevance",
              "reviews",
              "newest",
              "price_high",
              "price_low"
            ],
            "type": "string",
            "description": "Tokopedia's sort order for search and category results. Tokopedia no longer offers a best-selling sort; most reviews brings the best sellers to the top.",
            "default": "relevance"
          },
          "minPrice": {
            "title": "Minimum price (IDR)",
            "minimum": 0,
            "type": "integer",
            "description": "Only products at or above this price in rupiah."
          },
          "maxPrice": {
            "title": "Maximum price (IDR)",
            "minimum": 0,
            "type": "integer",
            "description": "Only products at or below this price in rupiah."
          },
          "ratingFourPlus": {
            "title": "Rated 4 stars and up",
            "type": "boolean",
            "description": "Tokopedia's rating filter: only products rated 4 or higher.",
            "default": false
          },
          "condition": {
            "title": "Condition",
            "enum": [
              "any",
              "new",
              "used"
            ],
            "type": "string",
            "description": "New or used items.",
            "default": "any"
          },
          "shopType": {
            "title": "Seller type",
            "enum": [
              "any",
              "official_store",
              "power_shop"
            ],
            "type": "string",
            "description": "Limit results to Official Stores (brand and authorised sellers) or Power Shop sellers.",
            "default": "any"
          },
          "codOnly": {
            "title": "Cash on delivery only",
            "type": "boolean",
            "description": "Only products that can be paid on delivery (COD).",
            "default": false
          },
          "discountedOnly": {
            "title": "Discounted only",
            "type": "boolean",
            "description": "Only products with a price cut.",
            "default": false
          },
          "freeShippingOnly": {
            "title": "Free shipping only",
            "type": "boolean",
            "description": "Tokopedia's Bebas Ongkir filter on search and category results. With full details on, every product page is checked again and products without free shipping are dropped (not billed). Most products ship free now, so this trims few results.",
            "default": false
          },
          "deliveryType": {
            "title": "Delivery speed",
            "enum": [
              "any",
              "instant",
              "same_day"
            ],
            "type": "string",
            "description": "Tokopedia's delivery-speed filter: products that can arrive instantly or the same day (as seen from central Jakarta).",
            "default": "any"
          },
          "minRating": {
            "title": "Minimum rating",
            "enum": [
              "0",
              "3",
              "3.5",
              "4",
              "4.5",
              "4.8"
            ],
            "type": "string",
            "description": "Drop products rated below this. Finer than Tokopedia's own 4-star filter; applied after the search, so products without a rating are dropped too.",
            "default": "0"
          },
          "stockType": {
            "title": "Stock",
            "enum": [
              "any",
              "ready_stock",
              "preorder"
            ],
            "type": "string",
            "description": "Ready-stock items or pre-order items.",
            "default": "any"
          },
          "listedWithinDays": {
            "title": "Listed within",
            "enum": [
              "any",
              "7",
              "14",
              "30",
              "90"
            ],
            "type": "string",
            "description": "Only products added recently.",
            "default": "any"
          },
          "locations": {
            "title": "Seller location",
            "type": "array",
            "description": "Only sellers shipping from these areas: Jakarta, Jabodetabek, Bandung, Medan, Surabaya or any province. Pick several to combine them.",
            "items": {
              "type": "string",
              "enum": [
                "DKI Jakarta",
                "Jabodetabek",
                "Bandung",
                "Medan",
                "Surabaya",
                "Bali",
                "Banten",
                "Bengkulu",
                "D.I. Aceh",
                "D.I. Yogyakarta",
                "Gorontalo",
                "Jambi",
                "Jawa Barat",
                "Jawa Tengah",
                "Jawa Timur",
                "Kalimantan Barat",
                "Kalimantan Selatan",
                "Kalimantan Tengah",
                "Kalimantan Timur",
                "Kalimantan Utara",
                "Kepulauan Bangka Belitung",
                "Kepulauan Riau",
                "Lampung",
                "Maluku",
                "Maluku Utara",
                "Nusa Tenggara Barat",
                "Nusa Tenggara Timur",
                "Papua",
                "Papua Barat",
                "Riau",
                "Sulawesi Barat",
                "Sulawesi Selatan",
                "Sulawesi Tengah",
                "Sulawesi Tenggara",
                "Sulawesi Utara",
                "Sumatera Barat",
                "Sumatera Selatan",
                "Sumatera Utara"
              ]
            }
          },
          "cityIds": {
            "title": "Seller city ids (advanced)",
            "type": "string",
            "description": "Tokopedia city ids for cities not in the list above, comma separated. Apply a city filter on tokopedia.com and copy the fcity value from the address bar."
          },
          "categoryId": {
            "title": "Category id (advanced)",
            "type": "string",
            "description": "Narrow keyword searches to one Tokopedia category: the number after sc= in a filtered search URL. To scrape a whole category, paste its /p/... URL above instead."
          },
          "convertToCurrency": {
            "title": "Also show prices in",
            "enum": [
              "none",
              "USD",
              "EUR",
              "GBP",
              "SGD",
              "MYR",
              "AUD",
              "JPY",
              "CNY",
              "KRW",
              "HKD",
              "INR",
              "THB",
              "PHP",
              "CAD",
              "CHF"
            ],
            "type": "string",
            "description": "Add convertedPrice and convertedOriginalPrice in this currency, using the day's European Central Bank rate. Rupiah prices stay in price and originalPrice.",
            "default": "none"
          },
          "monitorMode": {
            "title": "Monitor mode",
            "enum": [
              "off",
              "price-changes",
              "all-changes",
              "new-only"
            ],
            "type": "string",
            "description": "The first run returns everything and saves it as the baseline. Later runs with the same monitor name return only new products and products whose watched fields changed, with the previous values and the price difference. \"New products only\" ignores changes. Stock and exact sales need full product details on.",
            "default": "off"
          },
          "monitorName": {
            "title": "Monitor name",
            "type": "string",
            "description": "Name of the baseline to compare against. Keep it the same on every scheduled run of the same watch. Left empty, a name is made from your keywords, URLs and filters, so changing any of them starts a new baseline."
          },
          "emitRemoved": {
            "title": "Report removed products",
            "type": "boolean",
            "description": "Also return one row (changeType \"removed\") for each tracked product that a later run no longer finds: delisted, sold out of the results, or no longer matching your filters. Only runs that read every keyword and URL to the end report removals; a run stopped by Maximum products, a per-source cap or Tokopedia's 6,000-result limit does not.",
            "default": false
          },
          "webhookUrl": {
            "title": "Webhook URL for changes",
            "type": "string",
            "description": "Optional. After each monitor run that found changes (never the first run), the changed products are POSTed here as JSON: Slack, Zapier, Make or your own endpoint."
          },
          "exportConnectors": {
            "title": "Apps to export to (MCP connectors)",
            "type": "array",
            "description": "Notion: one page per row under the parent page below. Airtable: one record per row in the table below, filling the columns whose names match output fields (productName, price, productUrl, soldCount...). Linear: one issue per row in the team below. Slack: one summary message per run in the channel below."
          },
          "exportNotionParentPage": {
            "title": "Notion parent page",
            "type": "string",
            "description": "URL or id of the Notion page the new pages go under. Empty: private pages in your workspace."
          },
          "exportAirtableBase": {
            "title": "Airtable base",
            "type": "string",
            "description": "Base id (appXXXXXXXXXXXXXX) or exact base name."
          },
          "exportAirtableTable": {
            "title": "Airtable table",
            "type": "string",
            "description": "Table id (tblXXXXXXXXXXXXXX) or exact table name. Create columns named like the output fields you want, e.g. productName, price, soldCount, rating, productUrl."
          },
          "exportLinearTeam": {
            "title": "Linear team",
            "type": "string",
            "description": "Team name or id the issues are created in."
          },
          "exportSlackChannel": {
            "title": "Slack channel id",
            "type": "string",
            "description": "Channel id (starts with C) the run summary is posted to."
          },
          "maxExportItems": {
            "title": "Maximum rows to export",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Rows sent to each app per run, in dataset order. In monitor mode only the changed products are rows, so this is usually plenty.",
            "default": 50
          },
          "maxItems": {
            "title": "Maximum products",
            "minimum": 1,
            "type": "integer",
            "description": "Stop after this many products across all keywords and URLs (review rows in review-rows mode). Tokopedia serves up to 6,000 results per search; split a large search by price range or location to go further.",
            "default": 100
          },
          "maxItemsPerSource": {
            "title": "Maximum products per keyword or URL",
            "minimum": 1,
            "type": "integer",
            "description": "Optional cap for each keyword or URL, so one broad search cannot use up the whole run. Leave empty for no per-source cap."
          },
          "maxConcurrency": {
            "title": "Parallel requests",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "Requests in flight at once. The default is fast and safe; lower it if you see retries in the log.",
            "default": 10
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Apify's default datacenter proxy works for Tokopedia and costs nothing extra. Switch to RESIDENTIAL only if runs start seeing retries.",
            "default": {
              "useApifyProxy": true
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}