{
  "openapi": "3.0.1",
  "info": {
    "title": "Điện Máy Xanh Scraper - Products & Reviews",
    "description": "Scrape dienmayxanh.com home appliances and electronics with full specifications, current & original price, discount, brand, category, variants, images, description, customer rating and reviews. Search by keyword with brand, price, rating and sort filters, or paste product / category / search URLs.",
    "version": "1.0",
    "x-build-id": "D6yxgmNvTsxEL7MA1"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~dienmayxanh-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-dienmayxanh-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~dienmayxanh-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-dienmayxanh-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~dienmayxanh-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-dienmayxanh-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",
              "url"
            ],
            "type": "string",
            "description": "Choose 'search' to use keywords, or 'url' to scrape specific product, category or search URLs you paste below.",
            "default": "search"
          },
          "queries": {
            "title": "Search keywords",
            "type": "array",
            "description": "One or more keywords to search, for example 'tủ lạnh', 'máy giặt inverter' or 'tivi samsung'. Each keyword is searched separately. To browse a whole category instead, switch to URL mode and paste its link (for example https://www.dienmayxanh.com/tu-lanh).",
            "items": {
              "type": "string"
            }
          },
          "specialsOnly": {
            "title": "Flash sale only",
            "type": "boolean",
            "description": "Also browse Điện Máy Xanh's site-wide Flash Sale deals page (limited-time discounted prices), in addition to any search keywords above. Every result carries the current price plus the original price, discount % and savings where discounted. To scrape a seasonal category-specific promotion page instead (for example a 'khuyen-mai-tu-lanh' fridge deals page), switch to URL mode and paste its link.",
            "default": false
          },
          "urls": {
            "title": "Điện Máy Xanh URLs",
            "type": "array",
            "description": "Product, category, search or promotion URLs to scrape, for example https://www.dienmayxanh.com/tu-lanh/samsung-rt22m4032by-sv, https://www.dienmayxanh.com/tu-lanh, https://www.dienmayxanh.com/flashsale (site-wide Flash Sale) or https://www.dienmayxanh.com/khuyen-mai-tu-lanh (a seasonal category promotion page). Multiple URLs supported.",
            "items": {
              "type": "string"
            }
          },
          "brand": {
            "title": "Brand",
            "type": "string",
            "description": "Optional. Keep only products whose brand contains this text, for example 'Samsung', 'LG' or 'Toshiba'."
          },
          "sortBy": {
            "title": "Sort by",
            "enum": [
              "relevance",
              "priceAsc",
              "priceDesc",
              "ratingDesc",
              "reviewsDesc",
              "nameAsc"
            ],
            "type": "string",
            "description": "Ordering applied to whatever set of results was collected, whether from a keyword search or a pasted URL. This only reorders the results — it does not filter or change which items are included.",
            "default": "relevance"
          },
          "minPrice": {
            "title": "Minimum price",
            "minimum": 0,
            "type": "integer",
            "description": "Optional. Only keep products priced at or above this amount (VND)."
          },
          "maxPrice": {
            "title": "Maximum price",
            "minimum": 0,
            "type": "integer",
            "description": "Optional. Only keep products priced at or below this amount (VND)."
          },
          "minRating": {
            "title": "Minimum rating",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "Optional. Only keep products with an average customer rating at or above this value (1 to 5). Needs product details enabled."
          },
          "fetchDetails": {
            "title": "Fetch product details",
            "type": "boolean",
            "description": "Add full specifications, variants, image gallery, brand, category, description and aggregate rating for each product. This opens each product page (one extra request per product), so it is off by default — leave it off for fast, low-cost listing runs, and turn it on when you need the full detail fields.",
            "default": false
          },
          "fetchReviews": {
            "title": "Fetch customer reviews",
            "type": "boolean",
            "description": "Also collect the customer reviews shown on each product page (review text, author, date, star rating). Read from the product page, so it needs product details enabled; no extra request.",
            "default": false
          },
          "maxReviewsPerProduct": {
            "title": "Max reviews per product",
            "minimum": 0,
            "type": "integer",
            "description": "Cap on reviews collected per product when 'Fetch customer reviews' is on. Use 0 for all reviews available on the product page.",
            "default": 20
          },
          "maxItems": {
            "title": "Max products",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum number of products to return across the whole run. Use 0 for unlimited.",
            "default": 20
          },
          "maxPages": {
            "title": "Max listing pages",
            "minimum": 0,
            "type": "integer",
            "description": "Safety cap on category / search listing pages fetched per query (each page holds about 20 products). Leave empty for the default cap; the run also stops at Max products or when a listing is exhausted."
          },
          "resumeFromRunId": {
            "title": "Resume from run/dataset id",
            "type": "string",
            "description": "Paste a previous run id or dataset id to continue an interrupted crawl: products already collected there are skipped so this run returns only what's missing. A one-off continuation, distinct from Incremental mode below, which tracks a search across many scheduled runs on its own."
          },
          "incrementalMode": {
            "title": "Incremental mode",
            "type": "boolean",
            "description": "For a scheduled/recurring run of the SAME search or URLs: remembers what was collected last time and returns only NEW, UPDATED, REAPPEARED and (optionally) EXPIRED products. Off by default (returns everything, like a one-off run). Distinct from 'Resume from run/dataset id' above, which continues one specific interrupted run instead of tracking a recurring search.",
            "default": false
          },
          "stateKey": {
            "title": "State key (Incremental mode only)",
            "type": "string",
            "description": "Optional name for the saved baseline used by Incremental mode. Leave empty to auto-derive one from your search settings (mode, keywords, brand, sort, price/rating filters, Flash Sale toggle, URLs, fetch details/reviews) — two different filter setups never share a baseline. Set your own to explicitly separate or share monitoring campaigns."
          },
          "emitUnchanged": {
            "title": "Emit unchanged products (Incremental mode only)",
            "type": "boolean",
            "description": "When on, Incremental mode also returns products with no change since the last run (changeType UNCHANGED). Off by default: unchanged products are neither returned nor billed, only NEW/UPDATED/REAPPEARED/EXPIRED are. Turning this on returns — and bills — every product every run.",
            "default": false
          },
          "emitExpired": {
            "title": "Emit expired products (Incremental mode only)",
            "type": "boolean",
            "description": "When on, Incremental mode also returns products that were tracked before but are no longer found (changeType EXPIRED), once a run completes a full scan of the search. Off by default. Turning this on returns — and bills — an extra row per product that disappeared.",
            "default": false
          },
          "proxy": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Apify Proxy with residential access in Vietnam is required for reliable results and correct local pricing and stock. The run rotates fresh exits automatically. On the free plan, coverage may be limited and some runs may return no results.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ],
              "apifyProxyCountry": "VN"
            }
          },
          "mcpConnectors": {
            "title": "Pipe results into your apps (optional)",
            "type": "array",
            "description": "Optionally send results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize one under Apify, Settings, API & Integrations, then select it here. Notion gets a rich page-per-item export; other connectors get a best-effort write/digest. Leave empty to skip; never changes the dataset output. 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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}