{
  "openapi": "3.0.1",
  "info": {
    "title": "Lazada $1💰 URL | Search | Products and Reviews Scraper",
    "description": "Scrape Lazada products and reviews across SEA markets, including Malaysia, Singapore, Indonesia, Philippines, Thailand, and Vietnam. Extract structured data on pricing, inventory, ratings, sellers, media, and reviews. Ideal for cross-region analysis with consistent, analytics-ready output.",
    "version": "1.0",
    "x-build-id": "AmO2C7nyaA96s8dXr"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~lazada-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-lazada-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~lazada-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-lazada-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~lazada-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-lazada-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": "Run mode",
            "enum": [
              "search",
              "url"
            ],
            "type": "string",
            "description": "Pick how to start. 'search' runs query + filters below. 'url' walks one or more SERP / category / product URLs. Reviews-only output is a separate toggle below (works in either mode).",
            "default": "search"
          },
          "country": {
            "title": "Country site",
            "enum": [
              "sg",
              "my",
              "th",
              "vn",
              "ph",
              "id"
            ],
            "type": "string",
            "description": "Lazada has six country sites. The actor walks ONE country per run. Country also pins the residential proxy exit.",
            "default": "sg"
          },
          "queries": {
            "title": "Search queries",
            "type": "array",
            "description": "One or more search terms. The actor runs a separate paginated walk for each query. Examples: 'laptop', 'iphone case', 'kopi'. Only used when mode = search.",
            "items": {
              "type": "string"
            }
          },
          "categoryId": {
            "title": "Category ID (deprecated, no verified effect)",
            "type": "string",
            "description": "Deprecated: retired 2026-09-04 (#1553 audit). Lazada does not expose a numeric category id as a search-endpoint facet - live probes proved this field has no effect on results (a filtered run's item set was indistinguishable from the unfiltered baseline, and none of the returned items carried this id in their own category metadata). Lazada's real category browsing is a distinct URL per category (e.g. https://www.lazada.sg/shop-computers-laptops/) - use mode = url and paste that category page's URL instead. Kept hidden for backward compatibility with existing saved tasks; has no effect either way, leave empty."
          },
          "minPrice": {
            "title": "Min price",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum price in the country's local currency (SGD/MYR/THB/VND/PHP/IDR). No bound when empty."
          },
          "maxPrice": {
            "title": "Max price",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum price in local currency. No bound when empty."
          },
          "specialsOnly": {
            "title": "Flash Sale only",
            "type": "boolean",
            "description": "When ON, walks Lazada's real Flash Sale campaign feed (/tag/flash-sale/) instead of the plain catalog — a genuinely different, curated set of products with real strike-through prices, not a client-side filter. Leave queries empty to browse the whole Flash Sale grid, or set queries to search within it. Every record also carries isOnSpecial/discountAmount/promoLabel/specialsCategory regardless of this toggle (LazMall and Campaign badges are detected on any card).",
            "default": false
          },
          "sortBy": {
            "title": "Sort order",
            "enum": [
              "popularity",
              "priceAsc",
              "priceDesc",
              "ratingDesc",
              "newest",
              "bestSelling"
            ],
            "type": "string",
            "description": "Sort the search results. Lazada's own SERP only exposes 3 real sort options (verified live 2026-09-04, #1553 audit): Best match, Price low to high, Price high to low. The last three entries in this list (rating, newest, best selling) are RETIRED: Lazada silently ignores those tokens and returns default-order results, so the actor now runs them as Best match. They are kept in the list only so existing saved tasks and schedules that still pass them keep starting; pick one of the first three for a new run.",
            "default": "popularity"
          },
          "urls": {
            "title": "URLs",
            "type": "array",
            "description": "One or more URLs. SERP, category, and product URLs are all accepted. Multi-URL supported. Each URL is walked forward from its starting page. The search filters above (price, sort, specials) are baked into the URL you paste, not reapplied here. The rating filter below still applies in URL mode, and so does the free shipping filter beside it. Examples: https://www.lazada.sg/catalog/?q=iphone, https://www.lazada.sg/shop-laptops/, https://www.lazada.sg/products/some-slug-i123456.html.",
            "items": {
              "type": "string"
            }
          },
          "minRating": {
            "title": "Minimum average rating",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "Drop products whose average rating is below this value (1 to 5). Applied client-side after the SERP fetch."
          },
          "freeShippingOnly": {
            "title": "Free shipping only",
            "type": "boolean",
            "description": "Keep only items eligible for the country's free-shipping promotion, matched on each card's own Free Shipping badge. Applied client-side after the SERP fetch, so it narrows a keyword search AND a pasted search or category URL (in search mode the actor also asks Lazada's own free-shipping facet for the first pass).",
            "default": false
          },
          "reviewsOnly": {
            "title": "Output reviews only (instead of products)",
            "type": "boolean",
            "description": "When ON, the actor walks the SERP / URLs to discover product IDs but emits ONE record per review (type='review'), not one per product. Works in both search and URL modes. When mode = url AND every URL points at a /products/ page, the run is dramatically faster and ~10x cheaper.",
            "default": false
          },
          "fetchReviews": {
            "title": "Include reviews on each product",
            "type": "boolean",
            "description": "When ON and reviewsOnly is OFF, every product record additionally carries an embedded array of its top reviews (capped by maxReviewsPerProduct). Adds a small overhead per product.",
            "default": false
          },
          "maxReviewsPerProduct": {
            "title": "Max reviews per product",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Hard cap on reviews fetched per product. The reviews API ships ~10 per page; the actor walks pages forward until cap or last page. Default 100 covers ~95% of products fully. Raise for review depth analysis.",
            "default": 100
          },
          "fetchDetails": {
            "title": "Enrich each product with detail page data (slower)",
            "type": "boolean",
            "description": "When ON, the actor fetches each product's detail page after the SERP. Adds full SKU variant table, shipping + warranty, seller cluster, image gallery, breadcrumbs. Adds ~3-5 seconds per product. When OFF (default), only SERP-card fields populate (id, title, price, rating, image, seller name) at much lower cost.",
            "default": false
          },
          "maxPages": {
            "title": "Max SERP pages per query/URL",
            "minimum": 0,
            "type": "integer",
            "description": "Optional bound on SERP pages walked per starting query/URL. Lazada's SERP serves ~40 cards per page. Leave empty to walk every result page (still bounded by maxListings)."
          },
          "maxListings": {
            "title": "Max products total",
            "minimum": 0,
            "type": "integer",
            "description": "Hard cap across all queries / URLs. Set to 0 for unlimited (still bounded by maxPages). When reviewsOnly = true, this caps DISCOVERED products, not reviews; total review records can be much higher.",
            "default": 20
          },
          "resumeFromRunId": {
            "title": "Resume from a previous run",
            "type": "string",
            "description": "Paste a previous run ID or dataset ID to continue a full-catalogue walk without returning or charging for products already collected there (matched by product id). Use this after an interrupted run, or to keep extending one walk-all pull across separate runs. For recurring daily/weekly monitoring of the same search, use Incremental mode below instead."
          },
          "incrementalMode": {
            "title": "Incremental changes for scheduled runs",
            "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 mode + search/URL/filter configuration; 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 (optional, incremental mode only)",
            "type": "string",
            "description": "Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from the mode + search/URL/filter settings — different searches then never mix state with each other."
          },
          "emitUnchanged": {
            "title": "Emit unchanged products (incremental mode only)",
            "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 (incremental mode only)",
            "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 — not when Max products total capped it, when Resume was used, or in reviews-only mode. This returns — and bills — extra synthetic rows, so leave it off unless you need expiry tracking.",
            "default": false
          },
          "proxy": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Apify Residential is required for SE Asia residential exits. Country pin is forced to match the selected country site. Free-tier (Datacenter) is rejected by Lazada and the actor will warn at startup."
          },
          "mcpConnectors": {
            "title": "Pipe results into your apps (optional)",
            "type": "array",
            "description": "Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON — the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com)."
          },
          "notionParentPageUrl": {
            "title": "Notion parent page (Notion connector only)",
            "type": "string",
            "description": "URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors."
          },
          "maxNotifyListings": {
            "title": "Max items to export per connector",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Cap on items written to each connector per run. Does not affect the dataset.",
            "default": 50
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}