Alibaba RFQ Scraper avatar

Alibaba RFQ Scraper

Pricing

from $2.99 / 1,000 rfqs

Go to Apify Store
Alibaba RFQ Scraper

Alibaba RFQ Scraper

Extracts public buying requests from Alibaba's sourcing RFQ market using embedded page data and optional public detail pages.

Pricing

from $2.99 / 1,000 rfqs

Rating

0.0

(0)

Developer

w3crawler

w3crawler

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 hours ago

Last modified

Categories

Share

This Actor collects rich, publicly visible buying requests from Alibaba’s sourcing RFQ pages. It parses the structured window.PAGE_DATA records delivered in the public HTML and can optionally fetch public RFQ detail pages for annex links.

It is read-only. It does not sign in, submit quotations, contact buyers, access private supplier portals, or bypass CAPTCHA/anti-automation controls. When Alibaba blocks or a public request fails, the Actor records an operational issue count in OUTPUT_SUMMARY and logs details; it does not write diagnostic or placeholder dataset rows.

Dataset output

RFQ rows can contain:

  • rfqId, requestId, subject, description, sourceUrl, and detailUrl
  • buyer name, company, country, country code, location, member-since text, and verification flag
  • quantity text, normalized numeric quantity, and unit
  • requirement category, product type, target price, budget, destination, shipping terms, purchase frequency, and customization text when exposed
  • opened-time text/epoch, quote counters, RFQ quality signals, tags, primary image, and image URLs
  • optional public PDF/document annexes from detail pages

Instrumentation such as fieldCoverage, dataQuality, record IDs used only for deduplication, request counters, access metadata, and debug status fields is not emitted in dataset rows. Run metrics and operational issue counts are available under OUTPUT_SUMMARY; failure details stay in run logs.

Basic input

{
"keywords": ["wireless earbuds"],
"maxPages": 2,
"maxItems": 50,
"sortBy": "newest",
"includeDetails": true,
"includeAnnexes": true
}

Use searchUrls when you already have official public list URLs. Explicit URLs take precedence over generated keyword URLs, and each source is paginated independently.

{
"searchUrls": [
"https://sourcing.alibaba.com/rfq/rfqSearchList.htm?keywords=wireless+earbuds",
"https://sourcing.alibaba.com/rfq/rfqSearchList.htm?keywords=work+lights"
],
"startPage": 1,
"maxPages": 3,
"maxItems": 100,
"deduplicate": true
}

Filters and sorting

{
"keywords": ["private label earbuds"],
"buyerCountries": ["US", "United States"],
"requiredTags": ["verified"],
"minQuantity": 100,
"maxQuantity": 10000,
"textQuery": "charging case",
"sortBy": "quantity_desc"
}

Supported sortBy values are relevance, newest, quantity_desc, quotes_desc, quality_desc, buyer_country_asc, and subject_asc.

Developer options and proxy

The input schema groups operational controls under Developer options. Values are bounded and validated before requests are made:

  • requestTimeoutSecs (5–300), with legacy alias timeoutSecs
  • requestDelayMs (0–15,000)
  • maxConcurrency (1–5)
  • maxRequestRetries (0–10)
  • maxBytes (1,000–15,000,000)
  • optional transparent userAgent

For ordinary proxy routing, use Apify Proxy or public HTTP(S) proxy URLs. Private/local proxy addresses are rejected.

{
"keywords": ["work lights"],
"proxyConfiguration": {
"useApifyProxy": true,
"apifyProxyGroups": ["RESIDENTIAL"],
"apifyProxyCountry": "US"
},
"requestDelayMs": 1500,
"maxConcurrency": 2,
"maxRequestRetries": 3,
"requestTimeoutSecs": 45
}

Proxy routing is not a stealth or access-control bypass. Challenges remain explicit operational diagnostics outside the dataset.

Dataset example

{
"url": "https://sourcing.alibaba.com/rfq/rfqSearchList.htm?keywords=wireless+earbuds&page=1",
"source": "https://sourcing.alibaba.com",
"sourceUrl": "https://sourcing.alibaba.com/rfq/rfqSearchList.htm?keywords=wireless+earbuds&page=1",
"detailUrl": "https://rfq.alibaba.com/rfq/1846209687",
"rfqId": "1846209687",
"requestId": "encoded-1846209687",
"subject": "Bulk wireless earbuds for retail",
"description": "Need private-label earbuds with charging cases.",
"buyer": {
"name": "Demo Buyer",
"country": "United States",
"countryCode": "US"
},
"quantity": {
"value": "500",
"valueNumber": 500,
"unit": "pieces"
},
"opened": { "relative": "Opened today", "epochMs": 1760000000000 },
"quotes": { "leftCount": 4, "hasQuoteEquity": true },
"quality": { "starLevel": 4, "starMax": 5 },
"imageUrl": "https://img.alibaba.com/photo/earbuds.jpg",
"tags": ["urgent", "verified"],
"hasAnnexes": true,
"scrapedAt": "2026-09-07T07:27:49.678Z"
}

Operational issue details stay in the run logs, and numeric issue counts are kept in OUTPUT_SUMMARY; diagnostic records are never added to the dataset.

Runs with saved RFQ records and later source/detail/output issues finish as SUCCEEDED with dataStatus: PARTIAL. A readable source with no RFQs or filters that remove all observed RFQs completes with status: SUCCEEDED and dataStatus: NO_RESULTS. A blocked or genuine request/parse failure without saved records is FAILED and exits nonzero.

Offline QA and deployment

The checked-in .actor/input.json uses fixtures/sample.html, so it is reproducible without a network request:

npm install
npm test
npm run validate
apify run --input-file .actor/input.json --purge

The offline test suite uses ordered page fixtures or one fixture per source. Live Actor runs use public Alibaba pages through startUrls and do not expose local fixture overrides.

Run summaries include the required status, runStatus, and dataStatus fields. status and runStatus are SUCCEEDED when source-backed rows were saved or a run completed cleanly with no matches; they are FAILED only when a real failure occurs before any rows are saved. dataStatus is COMPLETE, PARTIAL, NO_RESULTS, or FAILED. Failure details stay in the run logs; key-value summaries retain counts only.