AliExpress Search Scraper
Find winning products for dropshipping, track how a keyword's prices and best sellers move, or feed a product research agent. Type keywords and get the AliExpress search results as one JSON row per product: title, price, original price and discount, units sold, rating, ship-from country, delivery estimate, ad flag and the position in the results. $2.25 per 1,000 products on the free plan, and you pay only for the rows you get.
$2.25 per 1,000 products on the Free plan, down to $1.50 on higher plans
Why this actor
- Runs that finish. 38 of our 38 runs since 2026-10-21 succeeded (our scheduled and test runs, from the Apify run history). A keyword that cannot be read is a free
errorrow with acode, and the other keywords still arrive. - Up to 3,600 products per keyword, with price and shipping filters.
- Optional validation report per keyword ($0.02): price quantiles, sales spread and 12 months of Google Trends interest from the same run.
- Run it weekly with the same keywords and the
positionfield gives you a rank history. - Only product listing data, no buyer or seller personal details. Free error rows with a machine-readable
code(not_found,blocked,unavailable...), so an agent knows whether to retry.
Drop-in input
Drop-in input. Input written for kawsar/aliexpress-search-scraper (keywords, maxItems, sort, minPrice, maxPrice), zen-studio/aliexpress-scraper (keywords, maxResults, sort, priceMin, priceMax, shipFrom), devcake/aliexpress-products-scraper or thirdwatch/aliexpress-product-scraper (searchQueries/queries, maxProducts/maxResults, sortBy, shipFromCountry, freeShippingOnly) works as it is.
As stated in the actor’s README. The full list of accepted input names is on the Store page.
Switching from another actor
- From AliExpress Search Scraper kawsar/aliexpress-search-scraper, 5 input fields work as they are
What you get
| Field | What it holds |
|---|---|
productId, title, url | The product id (the number in the product link), its title and link. |
price, priceMax, currency | Current regular price. priceMax equals price unless the listing shows a range. Prices are in US dollars. On listings showing a new-user promo it is the struck-through regular price of the listed variant (empty only when none is shown). |
originalPrice, discountPercent | The crossed-out price and the discount. |
promoPrice, promoType | The new-user welcome price AliExpress shows first-time visitors (often $1.09), with promoType: "new_user". Kept apart so it never passes for the real price. |
soldText, soldMin, soldCount | Orders as the site shows them (10,000+ sold), that number as a plain figure, and the exact count when the site gives one. |
rating | Average stars. Empty for products without ratings yet. |
imageUrl | Main product image. |
shipFrom | Warehouse country code (CN, US, ...) when the listing says. |
freeShipping, deliveryText, deliveryMinDays, deliveryMaxDays | Shipping hints from the listing. Empty when it shows none. |
isChoice | The product carries the site's Choice badge. |
isAd | The row is a paid placement. |
looseMatch | true when AliExpress found few real matches and listed loosely related products instead. |
searchTerm, searchRank | The keyword and the position in the results (paid placements included). |
scrapedAt | When the row was collected. |
Sample row (from the README example; long text shortened, lists cut to two items):
{
"rowType": "product",
"platform": "aliexpress",
"productId": "1005007097199333",
"title": "Wireless LED Night Lights Motion Sensor Lights Closet Kitchen",
"url": "https://www.aliexpress.com/item/1005007097199333.html",
"price": 0.33,
"currency": "USD",
"originalPrice": 5.36,
"discountPercent": 93,
"soldText": "100K+ sold",
"soldMin": 100000,
"soldCount": 241114,
"rating": 4.9,
"shipFrom": "CN",
"isAd": false,
"searchTerm": "lamp",
"searchRank": 1
}
Price
Live Apify price on 2026-11-02, per 1,000 rows, by Apify plan. You pay only for rows delivered; error and summary rows marked free in the README cost nothing. Plus $0.001 per GB of memory when a run starts.
| Per 1,000 | Free | Bronze | Silver | Gold | Platinum | Diamond |
|---|---|---|---|---|---|---|
| Product (main) | $2.25 | $2.00 | $1.75 | $1.50 | $1.50 | $1.50 |
| Validation report | $20.00 | $20.00 | $20.00 | $20.00 | $20.00 | $20.00 |
Use cases
- Product research: sort by orders, then read the reviews of the winners.
- Price tracking: run daily on a fixed keyword list and compare
priceandsearchRankover time. - Category sizing: how many products, what price bands, how many sold. The validation report does the maths for you.
- Niche validation for dropshipping: compare 20 candidate keywords by sold median, sales concentration, ad share and Trends direction in one run.
- Supplier hunting: filter by warehouse country to find items that ship from the US.
Run it from code or an AI agent
Actor ID arcadium/aliexpress-search. Set APIFY_TOKEN to your Apify API token. The input below is the actor’s prefilled example; see the guide for every field.
curl
curl -X POST "https://api.apify.com/v2/acts/arcadium~aliexpress-search/run-sync-get-dataset-items" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"searchTerms":["phone case"],"maxResultsPerTerm":30,"sort":"relevance","freeShipping":false}'JavaScript
// npm install apify-client
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('arcadium/aliexpress-search').call({
"searchTerms": [
"phone case"
],
"maxResultsPerTerm": 30,
"sort": "relevance",
"freeShipping": false
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);Python
# pip install apify-client
import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("arcadium/aliexpress-search").call(run_input={
"searchTerms": ["phone case"],
"maxResultsPerTerm": 30,
"sort": "relevance",
"freeShipping": False,
})
items = client.dataset(run.default_dataset_id).list_items().items # apify-client 3.x returns a Run object
print(items)MCP
{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com/?tools=arcadium/aliexpress-search",
"headers": {
"Authorization": "Bearer <APIFY_TOKEN>"
}
}
}
}LangChain
# pip install langchain-apify (reads APIFY_API_TOKEN from the environment)
from langchain_apify import ApifyActorsTool
tool = ApifyActorsTool("arcadium/aliexpress-search")
rows = tool.invoke({"run_input": {
"searchTerms": ["phone case"],
"maxResultsPerTerm": 30,
"sort": "relevance",
"freeShipping": False,
}})
# or give `tool` to an agent: create_react_agent(llm, [tool])LlamaIndex
# pip install llama-index-readers-apify
import os
from llama_index.core import Document, VectorStoreIndex
from llama_index.readers.apify import ApifyActor
reader = ApifyActor(os.environ["APIFY_TOKEN"])
documents = reader.load_data(
actor_id="arcadium/aliexpress-search",
run_input={
"searchTerms": ["phone case"],
"maxResultsPerTerm": 30,
"sort": "relevance",
"freeShipping": False,
},
dataset_mapping_function=lambda item: Document(text=str(item.get("title") or ""), metadata={"url": item.get("url")}),
)
index = VectorStoreIndex.from_documents(documents)CrewAI
# pip install crewai crewai-tools langchain-apify (reads APIFY_API_TOKEN from the environment)
from crewai import Agent
from crewai_tools import ApifyActorsTool
tool = ApifyActorsTool(actor_name="arcadium/aliexpress-search")
researcher = Agent(
role="Research analyst",
goal="Answer with data collected by the tool",
backstory="Uses public web data.",
tools=[tool],
)n8n
{
"nodes": [
{
"name": "Run arcadium/aliexpress-search",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4,
"position": [
0,
0
],
"parameters": {
"method": "POST",
"url": "https://api.apify.com/v2/acts/arcadium~aliexpress-search/run-sync-get-dataset-items",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"sendBody": true,
"specifyBody": "json",
"jsonBody": "{\"searchTerms\":[\"phone case\"],\"maxResultsPerTerm\":30,\"sort\":\"relevance\",\"freeShipping\":false}",
"options": {
"timeout": 300000
}
}
}
],
"connections": {}
}Google Sheets
// Extensions > Apps Script. Store your token once: Project Settings > Script properties > APIFY_TOKEN.
function importLastRun() {
const token = PropertiesService.getScriptProperties().getProperty('APIFY_TOKEN');
const url = 'https://api.apify.com/v2/acts/arcadium~aliexpress-search/runs/last/dataset/items?status=SUCCEEDED&clean=true&format=json';
const res = UrlFetchApp.fetch(url, { headers: { Authorization: 'Bearer ' + token } });
const rows = JSON.parse(res.getContentText());
if (!rows.length) return;
const keys = Object.keys(rows[0]);
const values = rows.map((r) => keys.map((k) => (typeof r[k] === 'object' ? JSON.stringify(r[k]) : r[k])));
const sheet = SpreadsheetApp.getActiveSheet();
sheet.clearContents();
sheet.getRange(1, 1, 1, keys.length).setValues([keys]);
sheet.getRange(2, 1, values.length, keys.length).setValues(values);
}Tutorials
Limitations
- Public search results only. Nothing behind a login.
- Prices are in US dollars, in the US storefront. Other currencies and shipping destinations are not available. Every request asks for the US storefront explicitly, so the ship-from filter and the prices do not depend on the country of the proxy IP.
- AliExpress shows anonymous visitors a new-user welcome price (often $1.09) on many listings, up to most of a page. Those rows carry it in
promoPricewithpromoType: "new_user";priceholds the struck-through regular price of the listed variant, which can differ from the cheapest variant on the product page. When a promo listing shows no struck-through price,priceis empty and the report's price bands skip it. AliExpress's own price filter (minPrice/maxPrice) matches the promo price, so in a filtered search promo rows can show a regularpriceabove your maximum; filter onpriceafterwards if you need the regular price in range. - The search page does not show the store, so there is no store name or id. Delivery and ship-from are missing on some listings; those fields are empty, never guessed.
- A price filter makes AliExpress return fewer products per page, so a filtered run reads more pages for the same number of rows, and the site may run out of matches before your limit.
- The results shown for a keyword are what the site decides to show at that moment: rank and ads change from run to run.
- The same product found by two keywords is returned once per keyword (its rank is different). Within one keyword it appears once.
- A keyword AliExpress cannot match gets loosely related products; those rows have
looseMatch: true. - The validation report describes the products of this run, so it follows your
sort, filters andmaxResultsPerTerm. Sold counts are the rounded bands the site shows. Google Trends is best effort: when Google rate-limits the request the report comes withtrendsStatus: "unavailable"and is charged the same.
FAQ
How fresh is the data? It is read when you run the actor, so it matches what the site shows at that moment.
Why does soldCount differ from soldMin? The site shows rounded bands like 10,000+ sold. soldMin is that number. soldCount is the exact counter, when the listing carries it.
Why are some rows marked isAd? AliExpress mixes paid placements into its results. They are real products, so they are included by default and flagged. Set includeAds to false to leave them out.
Something looks wrong in the output. Who do I tell? Open an issue on the actor page with the run link. We read them all.
Related actors
1688 Products Scraper
1688.com wholesale products scraper, $1.80 per 1,000 search rows and $4.49 with details: price tiers, MOQ, units sold, factory and supplier scores.
$1.80 per 1,000 product (search result)s on the Free plan, down to $1.35 on higher plans
Amazon Product & Best Sellers Scraper
Amazon product search, Best Sellers ranks and Buy Box offers on 21 stores, $0.54 per 1,000 search rows vs $1 at the two most used search actors.
$0.54 per 1,000 search results
Etsy Scraper
Etsy product research: full listings for keywords or URLs, $7.20 per 1,000, 10% under the most used Etsy scraper's $8, whose input works as is.
$7.20 per 1,000 listings on the Free plan, down to $5.40 on higher plans
TikTok Shop Scraper
TikTok Shop products by product, store or category link: price, variant stock, sold count, rating, seller stats, $22.50 per 1,000.
$22.50 per 1,000 products on the Free plan, down to $13.50 on higher plans