# AliExpress Search Scraper | USD Prices and Orders (`danthedataman/aliexpress-search-scraper`) Actor

Export AliExpress search results by keyword: USD price, original price, discount, rating, order count, shipping, ship-from and sponsored flag, with sort and filters. No login.

- **URL**: https://apify.com/danthedataman/aliexpress-search-scraper.md
- **Developed by:** [Eli J](https://apify.com/danthedataman) (community)
- **Categories:** E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.80 / 1,000 search results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

AliExpress Search Scraper collects AliExpress keyword search result cards. Supply search phrases and receive product links, images, USD prices, ratings, sold text and the page’s trade count. It reads anonymous AliExpress search pages without opening product or store pages.

### Try a keyword search

The form is prefilled with `usb c cable`. Run it to collect up to 48 card occurrences from the first results page. A prefill is a starting example; API requests with omitted or empty `keywords` perform no searches and exit successfully with guidance.

A 5-row request:

```json
{"keywords": ["usb c cable"], "maxItems": 5, "maxPages": 1}
```

### Input

| Field | Type | Default | Meaning |
| --- | --- | --- | --- |
| `keywords` | array | none | Search phrases, processed in input order. Repeated identical phrases are collapsed after whitespace normalization and counted in SUMMARY. |
| `maxItems` | integer | 48 | Rows per keyword after local filters; maximum 200. Zero collects no rows. The requested count is not guaranteed. |
| `maxPages` | integer | 1 | Pages per keyword, maximum 20. Zero collects no rows. Depth is source-limited and the requested count is not guaranteed. |
| `sort` | string | `default` | `default`, `orders`, `price_asc`, `price_desc`, `rating`. Source sorts order each delivered page. `rating` uses `default`, matching the measured leader mode, which did not return rating-ordered rows. |
| `minPrice` | number | none | Source minimum price in USD major units. |
| `maxPrice` | number | none | Source maximum price in USD major units. |
| `freeShippingOnly` | boolean | false | Source free-shipping refinement. |
| `fourStarsAndUp` | boolean | false | Source four-star refinement. |
| `choiceOnly` | boolean | false | Source Choice refinement. |
| `shipFrom` | string | none | Source ship-from refinement; `US` is the currently listed value. |
| `minRating` | number | none | Keep delivered rows with rating at least this value, from 0 to 5. Applied locally; missing ratings do not pass. |
| `minOrders` | integer | none | Keep delivered rows with page-state trade count at least this value. Applied locally; missing counts do not pass. |
| `proxyConfiguration` | object | none | Optional buyer proxy settings; default is Apify automatic datacenter, country US. Other countries are refused. |

Odd or nonsense phrases can return unrelated recommended products; a matching query does not guarantee relevant results. Filters are the source’s own refinements, except `minRating` and `minOrders`, which filter delivered cards before the row limit. `minRating` and `minOrders` are applied after each page is fetched. Restrictive values can yield few or no rows while consuming the page and time limits; `maxItems` limits delivered rows, not pages fetched.

### Output

Each row is one delivered card occurrence. Keywords retain input order, pages retain numeric order, and `position` is the card’s 1-based position on its page, before local filtering. Ranking overlap can repeat the same product on different pages; these occurrences are retained. Duplicate-free traversal is not promised.

The following excerpt is row 3 of retained run BiDOz1BkHO0oWriHj (build 0.1.4, 2026-10-19); fields not shown are omitted:

```json
{
  "keyword": "usb c cable",
  "page": 1,
  "position": 3,
  "productId": "3256812800329908",
  "price": 0.33,
  "originalPrice": 4.13,
  "currency": "USD",
  "formattedPrice": "US $0.33",
  "rating": 4.9,
  "isTopRated": true,
  "orders": 88348,
  "soldText": "50,000+ sold",
  "deliveryDays": {"min": 6, "max": 11},
  "shipFrom": "CN"
}
```

Rows also carry `scrapedAt` (UTC), `title`, `productUrl`, `imageUrl`, `additionalImages`, `discountPercent` (integer percent), `shippingText`, `tags` (card label texts), `sponsored`, and `promotionText`. Prices are major currency units, never cents. Ratings use the source’s 0–5 scale; `isTopRated` means rating at least 4.8 and is null without a rating.

Source-absent values remain null; a missing list is empty. Hidden or renderer-suppressed original prices remain null. Cards displaying “FREE with any purchase” retain that promotion with null price, currency and formatted price. An unreadable displayed field is recorded as an extraction miss rather than silently treated as absent.

`orders` is the page-state trade count and can exceed rounded `soldText`. `shipFrom` comes from each card’s encoded page data. Neither is described as a displayed label. `deliveryDays` is the page’s delivery range in days; `shippingText` preserves available shipping and delivery labels.

### Billing and partial results

Billing has an Actor Start event and one result event per delivered dataset row. The current Store pricing panel governs rates and tier discounts. Start charging is one event per GB of run memory, minimum one; the default 256 MB run incurs one start event, including when it returns no rows. There is no result charge for errors, empty answers, filtered-out cards or browser attempts. Rows obtained through our browser service are charged once, like other rows.

When the customer’s maximum charge binds, collection stops before another source request. Dataset delivery and charging failures stop collection because their outcome may be unconfirmed.

`ERRORS` in the run’s key-value store records unresolved keyword-pages, input index, page and reason, plus browser-service diagnostics carrying `message` and `step`. Errors never enter the result dataset. `SUMMARY` records rows, duplicate keywords, empty answers, price-null rows, per-keyword progress, transport activity (including first-attempt timeouts, hedge fires and spare wins) and timing phases. A partially completed run preserves its delivered rows; an all-attempts-failed run fails with guidance. True empty answers succeed without retrying them.

### Access and limits

The default run memory is 256 MB. The primary path is browserless, using anonymous US datacenter egress. A currency-preference cookie is sent, and every priced card is verified as USD. A non-USD or unknown-currency priced card rejects the entire page; values are never converted.

The session rotates its proxy label and anonymous cookies after ten reads. A fresh identity’s first read, at start and after a ten-read rotation, may start one spare after 3.75 seconds on another fresh identity; the first verified answer wins and the other request is cancelled. Each attempt has a six-second timeout. Classified challenges receive at most two fresh-label retries; identity or transport misses receive one. A refused label is never replayed. Remaining eligible misses can use our own browser service, pinned to a specific build, with a cap of three calls and 240 seconds per run. A browser attempt adds no buyer charge. Non-USD misses receive fresh-label retries and then an error; they do not currently use the browser route. The source query and page must match before rows can be delivered. Login pages are not crossed and CAPTCHAs are not solved.

Collection has a 270-second deadline after proxy setup. Remaining work is recorded as `TIME_LIMIT` or `NOT_ATTEMPTED`. Default or empty-group proxy settings use US residential egress for the browser service. An explicit DATACENTER-only restriction or custom proxy URLs cannot use that service and end with `BROWSER_PROXY_UNSUPPORTED`; their primary route is preserved. Explicit `useApifyProxy: false` keeps the browser service on direct egress.

This Actor covers keyword search on aliexpress.com in US/USD. Product details, reviews, stores, image search, category browse and other regional storefronts are outside its scope. Page results and prices reflect an anonymous snapshot and can change between reads.

AliExpress’s robots.txt has no rule for the `/w/` search path this Actor reads. AliExpress Terms of Use (version effective September 26, 2026) clause 3.2(a) states: “Systematic retrieval of Site Content from the Sites to create or compile, directly or indirectly, a collection, compilation, database or directory (whether through robots, spiders, automatic devices or manual processes) without written permission from AliExpress.com is prohibited.” The same clause states: “(b) you will not copy, reproduce, download, compile or otherwise use any Site Content for the purposes of operating a business that competes with AliExpress.com, or otherwise commercially exploiting the Site Content.” Consider those terms before use: [AliExpress Terms of Use](https://terms.alicdn.com/legal-agreement/terms/suit_bu1_aliexpress/suit_bu1_aliexpress202204182115_66077.html).

### Help

For missing results, inspect ERRORS and SUMMARY, then try another keyword or fewer filters. Report the run URL, input and expected fields in the Actor’s Issues tab. Avoid sharing credentials or custom proxy passwords.

# Actor input Schema

## `keywords` (type: `array`):

Search phrases in input order. Omitted or empty keywords perform no searches.

## `maxItems` (type: `integer`):

Maximum delivered rows per keyword after minRating and minOrders. Zero collects no rows.

## `maxPages` (type: `integer`):

Source pages to attempt per keyword. Depth is source-limited; zero collects no rows.

## `sort` (type: `string`):

Source sort. rating currently returns the same order as default; the source offers no rating sort.

## `minPrice` (type: `number`):

Source price filter in USD major units, not cents.

## `maxPrice` (type: `number`):

Source price filter in USD major units, not cents.

## `minRating` (type: `number`):

Filter delivered rows after fetching; missing values do not pass.

## `minOrders` (type: `integer`):

Filter delivered rows after fetching; missing values do not pass.

## `freeShippingOnly` (type: `boolean`):

Send the page’s own free shipping only refinement.

## `fourStarsAndUp` (type: `boolean`):

Send the page’s own four stars and up refinement.

## `choiceOnly` (type: `boolean`):

Send the page’s own choice only refinement.

## `shipFrom` (type: `string`):

Source-listed ship-from country. Only US is currently listed on the measured source filter.

## `proxyConfiguration` (type: `object`):

Optional buyer proxy settings. Default is Apify automatic datacenter with country US. Other countries are refused.

## Actor input object example

```json
{
  "keywords": [
    "usb c cable"
  ],
  "maxItems": 48,
  "maxPages": 1,
  "sort": "default",
  "freeShippingOnly": false,
  "fourStarsAndUp": false,
  "choiceOnly": false
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `errors` (type: `string`):

No description

## `summary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "keywords": [
        "usb c cable"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("danthedataman/aliexpress-search-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "keywords": ["usb c cable"] }

# Run the Actor and wait for it to finish
run = client.actor("danthedataman/aliexpress-search-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "keywords": [
    "usb c cable"
  ]
}' |
apify call danthedataman/aliexpress-search-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,danthedataman/aliexpress-search-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/N6Q2NSAyP6QERoJKR/builds/GQgfVqvHyhhckHw3I/openapi.json
