{
  "openapi": "3.0.1",
  "info": {
    "title": "AliExpress Products Scraper — Prices, Sellers, SKUs & Stock",
    "description": "Search AliExpress by keyword or product URL and get every product as one row: sale and original price, discount, rating, orders, store and seller (id, positive rate, opened date), per-SKU prices and stock, shipping fee and delivery date. No login, no browser, no CAPTCHA solving.",
    "version": "0.1",
    "x-build-id": "rfec7r4QMGEZm9OAf"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapersdelight~aliexpress-products-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapersdelight-aliexpress-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/scrapersdelight~aliexpress-products-scraper/runs": {
      "post": {
        "operationId": "runs-sync-scrapersdelight-aliexpress-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/scrapersdelight~aliexpress-products-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-scrapersdelight-aliexpress-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": {
          "searchQueries": {
            "title": "Search keywords",
            "type": "array",
            "description": "Keywords to search on AliExpress, one per line — e.g. \"wireless earbuds\", \"phone case\", \"led strip lights\". Each keyword walks the search results 60 products per page, in the sort order chosen below, until Max products, Max products per keyword or Max pages per keyword is reached. Leave empty if you only paste product URLs.",
            "default": [
              "wireless earbuds"
            ],
            "items": {
              "type": "string"
            }
          },
          "productUrls": {
            "title": "Product URLs (optional)",
            "type": "array",
            "description": "AliExpress product pages to scrape directly, e.g. https://www.aliexpress.com/item/1005012258457853.html (aliexpress.us /item/ URLs and bare numeric product ids also work). IMPORTANT: a product URL can only be filled by the product-detail API, which AliExpress is currently challenging on every request — so unless you turn \"Enrich…\" on below AND it happens to clear, these rows come back with just the id and URL. For dependable output, use keywords instead.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "sortBy": {
            "title": "Sort order",
            "enum": [
              "default",
              "orders",
              "price_asc",
              "price_desc"
            ],
            "type": "string",
            "description": "How AliExpress orders the search results. \"Best selling\" is the dropshipping-research choice (most orders first); the two price sorts are for sourcing. Applies to keyword searches only.",
            "default": "default"
          },
          "minPrice": {
            "title": "Minimum price",
            "minimum": 0,
            "type": "number",
            "description": "Only return products whose sale price is at or above this, in the currency chosen below. Applied by AliExpress itself on the search page, so filtered-out products are never fetched or billed. Leave empty for no minimum."
          },
          "maxPrice": {
            "title": "Maximum price",
            "minimum": 0,
            "type": "number",
            "description": "Only return products whose sale price is at or below this, in the currency chosen below. Applied on the search page, so filtered-out products cost nothing. Leave empty for no maximum."
          },
          "excludeSponsored": {
            "title": "Skip sponsored (Ad) listings",
            "type": "boolean",
            "description": "AliExpress mixes paid \"Ad\" cards into every results page (measured: 60 of 240 cards across four sample searches). ON drops them before they are fetched or billed; OFF keeps them with isSponsored = true so you can filter later.",
            "default": false
          },
          "fetchProductDetails": {
            "title": "Also try AliExpress's product-detail API (currently blocked — off by default)",
            "type": "boolean",
            "description": "OFF (the default) returns everything AliExpress puts on the search results page — title, sale and original price, discount, rating, orders, selling-point tags, ad flag, listing date, the full image gallery, category id, store name, ships-from country and the delivery-days/date estimate. ON additionally calls the product-detail API for every product to try to add store id and URL, seller id and country, store opened date, positive-feedback rate, seller scores, followers, review count, per-SKU prices and stock, total stock, shipping fee and product properties. HONEST STATUS (re-measured 2026-08-27): that API is refusing every request — including the first, unsigned one from an IP that has never contacted it — on datacenter proxies, residential proxies and clean home IPs alike. It is not a rate limit, so waiting or changing proxies does not help. Leave this OFF unless you want to probe whether it has reopened; the enrichment event is charged ONLY for rows the API actually returned data for, so a failed attempt costs you nothing but run time.",
            "default": false
          },
          "shipToCountry": {
            "title": "Ship-to country",
            "type": "string",
            "description": "Two-letter country code AliExpress prices and ships to (US, GB, DE, FR, ES, IT, NL, AU, CA, BR, MX …). Prices, the delivery estimate and stock depend on it. Sent to AliExpress in a locale cookie and in the detail-API call, so it is stable regardless of which proxy IP served the request.",
            "default": "US"
          },
          "currency": {
            "title": "Currency",
            "type": "string",
            "description": "Three-letter currency code for every price in the output (USD, EUR, GBP, AUD, CAD, BRL, MXN …). Pinned via AliExpress's own locale cookie, so prices never leak the proxy's country. Price filters above are read in this currency.",
            "default": "USD"
          },
          "maxItems": {
            "title": "Max products (total)",
            "minimum": 1,
            "type": "integer",
            "description": "Stop after this many unique products across all keywords and URLs. This is your hard cost ceiling: at $0.0025 per product, 60 = $0.15, 500 = $1.25, 1,000 = $2.50. If you switch detail enrichment on, add $0.002 for each row it manages to enrich (60 = $0.27, 500 = $2.25, 1,000 = $4.50 at 100% enrichment). Duplicates are dropped before billing and never count against it.",
            "default": 60
          },
          "maxItemsPerQuery": {
            "title": "Max products per keyword",
            "minimum": 0,
            "type": "integer",
            "description": "Cap per keyword so one broad term cannot use the whole budget. 0 = no per-keyword cap (only Max products applies). AliExpress returns 60 products per page, so 120 = two pages.",
            "default": 0
          },
          "maxPagesPerQuery": {
            "title": "Max pages per keyword",
            "minimum": 1,
            "maximum": 200,
            "type": "integer",
            "description": "How deep to walk each keyword's results. 60 products per page; AliExpress advertises tens of thousands of results for common terms but a search stops on its own when a page comes back short. 20 pages ≈ 1,200 products per keyword.",
            "default": 20
          },
          "maxConcurrency": {
            "title": "Concurrent detail requests",
            "minimum": 1,
            "maximum": 8,
            "type": "integer",
            "description": "How many product-detail calls run in parallel when detail enrichment is on. Each worker owns one proxy session and retires it on the first challenge, retrying the product on a fresh one. Has no effect with enrichment off (the default), and raising or lowering it does not get past the current block, which is not rate-based. Values above 8 are rejected.",
            "default": 4
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Apify datacenter proxy (the default) is the right rung for the search pages this Actor reads: measured clean on every sample search, with an automatic capped RESIDENTIAL retry if a datacenter page comes back challenged. Switching the primary to RESIDENTIAL is worth trying only if search pages keep failing in your region — it does not help the product-detail API, which is blocked on residential, datacenter and clean home IPs alike.",
            "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
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}