AgriTech B2B Buyer Discovery avatar

AgriTech B2B Buyer Discovery

Under maintenance

Pricing

$29.00/month + usage

Go to Apify Store
AgriTech B2B Buyer Discovery

AgriTech B2B Buyer Discovery

Under maintenance

Find international B2B buyers for agricultural commodities on global trade directories

Pricing

$29.00/month + usage

Rating

0.0

(0)

Developer

Kundan Bhaskar

Kundan Bhaskar

Maintained by Community

Actor stats

1

Bookmarked

8

Total users

0

Monthly active users

12 days ago

Last modified

Share

๐ŸŒฟ AgriTech B2B Buyer Discovery

Find international B2B buyers for agricultural commodities across global trade directories. Built for exporters of essential oils, spices, rice, organic products and other agricultural goods.

The actor searches five live B2B platforms, extracts buyer requests and supplier listings, filters them by country, quantity and age, removes duplicates, and returns one clean dataset sorted newest-first.


What it scrapes

PlatformKeyTypeWhat it finds
Go4WorldBusinessgo4worldbusinessB2B directory๐Ÿ›’ Buying leads / RFQs from international buyers
Alibaba (RFQ)alibaba_rfqGlobal B2B๐Ÿ›’ Buying requests from global buyers
TradeIndia (products)tradeindia_productsB2B marketplace๐Ÿญ Supplier listings & price intel
IndiaMartindiamartB2B marketplace๐Ÿญ Supplier listings, prices, suppliers
Alibaba (product search)alibaba_productsGlobal B2B๐Ÿญ Supplier listings, prices, MOQs

TradeIndia buy requirements are not included. That section (/TradeLeads/buy/โ€ฆ) now renders a "Sign in to access Buy Trade Leads" wall, and the older /buy-requirement/ endpoint returns 404. There is nothing to scrape there without an account, so it is left out rather than shipped as a source that silently returns zero leads on every run.

Alibaba product search serves a captcha to datacenter IPs. It needs residential proxies to return anything; the two RFQ sources and IndiaMart work without them.

Lead types

  • ๐Ÿ›’ Buying leads (RFQs) โ€” real purchase requests. These are your hot leads.
  • ๐Ÿญ Supplier listings โ€” competitor and market intelligence: who else sells this, at what price, from where.

Buying leads are ranked above supplier listings when they are the same age.


Who it's for

  • ๐ŸŒฟ Essential oil distillers & exporters โ€” lemongrass, citronella, vetiver, eucalyptus, peppermint, tea tree
  • ๐ŸŒถ๏ธ Spice exporters โ€” turmeric, black pepper, cardamom, cumin, chilli
  • ๐Ÿš Rice & grain exporters โ€” basmati, non-basmati, organic
  • ๐ŸŒฑ Organic product exporters โ€” moringa, ashwagandha, spirulina, herbs
  • ๐Ÿญ Agricultural commodity traders
  • ๐Ÿ“Š Export consultants and trade facilitation firms
  • ๐Ÿ‘จโ€๐ŸŒพ Farmer Producer Organisations (FPOs) looking for direct international buyers

Input

ParameterTypeDefaultDescription
commodities โœ…string[]โ€”Products to search for. One search per commodity, per platform.
platformsstring[]allRestrict to specific platforms, using the keys in the table above.
maxPagesinteger3Result pages per commodity per platform (1โ€“20).
maxResultsinteger0Stop after this many leads. 0 means no limit.
buyerCountriesstring[][]Keep only these countries. Empty means worldwide.
includeUnknownCountriesbooleantrueWhen a country filter is set, whether to keep leads whose country the site did not publish.
minOrderQuantityKginteger0Drop leads below this quantity. Leads with no stated quantity are always kept.
maxLeadAgeDaysinteger90Drop leads older than this. Leads with no date are always kept.
proxyConfigproxyApify RESIDENTIALResidential proxies are strongly recommended โ€” these sites block datacenter IPs.
blockImagesbooleantrueSkip images, fonts and video. Large saving in proxy traffic and run time.
debugModebooleanfalseSave the raw HTML of every page to the key-value store.

Example input

{
"commodities": [
"lemongrass essential oil",
"citronella oil",
"basmati rice"
],
"buyerCountries": ["United States", "Germany", "Japan", "United Kingdom", "UAE"],
"includeUnknownCountries": true,
"maxPages": 3,
"maxResults": 500,
"minOrderQuantityKg": 25,
"maxLeadAgeDays": 30,
"proxyConfig": {
"useApifyProxy": true,
"apifyProxyGroups": ["RESIDENTIAL"]
}
}

Output

One dataset item per lead:

{
"rank": 1,
"leadId": "alibaba-rfq_3f8a2b1c",
"platform": "alibaba-rfq",
"leadType": "buying_lead",
"title": "Looking for Lemongrass Essential Oil - Steam Distilled, Origin India",
"description": "Natural ingredients distributor based in Frankfurt. Citral content minimum 75%.",
"commodity": "lemongrass essential oil",
"commodityMatchConfidence": "high",
"buyerCountry": "Germany",
"quantity": "500 Kilogram/Kilograms per month",
"quantityValue": 500,
"quantityUnit": "kg",
"quantityKg": 500,
"postedDate": "2025-03-15",
"postedDateRaw": "2 days ago",
"ageDays": 2,
"contactUrl": "https://sourcing.alibaba.com/rfq/...",
"sourceUrl": "https://sourcing.alibaba.com/rfq/buying_request_list.htm?searchText=...",
"scrapedAt": "2025-03-17T08:30:00.000Z",
"searchQuery": "lemongrass essential oil",
"totalLeads": 134
}

Field notes:

  • quantityKg โ€” the stated quantity converted to kilograms, or null when the unit is countable (drums, cartons) or absent. Volume units assume an oil density of ~0.9 kg/L.
  • postedDate โ€” ISO YYYY-MM-DD, or null when the site's date could not be parsed. The original text is always kept in postedDateRaw.
  • commodityMatchConfidence โ€” high when the commodity was found in the listing text, medium when the lead is attributed to the search term alone.
  • leadId โ€” stable hash used for de-duplication across pages and platforms.

A RUN_SUMMARY record is written to the key-value store with per-platform, per-country and per-filter counts for the run.


Running it

On Apify

npm install -g apify-cli
apify login
apify push

Locally

npm install
npx playwright install chromium # only needed outside the Docker image
# Edit the local input, then run:
# storage/key_value_stores/default/INPUT.json
npm start

Results land in storage/datasets/default/.

Tests

npm test # parser and filter unit tests
npm run lint

Troubleshooting

No leads in the dataset. The run log ends with a diagnosis naming the exact filter that removed everything, plus the countries that were actually found. The usual causes:

  • Country filter too narrow โ€” clear buyerCountries, or add the countries the log reports.
  • Blocked โ€” look for the ๐Ÿšซ BLOCKED by anti-bot protection block in the log. Go4WorldBusiness sits behind AWS WAF and Alibaba behind its own bot check; both refuse datacenter IPs, so a run without residential proxies will report them as blocked. This is reported separately from "no leads" on purpose: a blocked platform means the site refused the request, not that your commodity has no buyers.
  • Selectors are stale โ€” these directories redesign often. Dropped โ€” off-topic counts candidates the generic fallback found that did not mention your commodity, which is the signature of a redesign. Run with debugMode: true, open the saved HTML in the key-value store to see what the scraper actually received, then update the selectors in src/platforms.js.

Leads look like navigation links. They should not: anything produced by the generic fallback has to mention one of your commodities before it is kept, and everything else is counted under Dropped โ€” off-topic. If junk still reaches the dataset, tighten that platform's containers selector.

Run is slow or expensive. Lower maxPages, set maxResults, or narrow platforms to just the buying-lead sources (go4worldbusiness, alibaba_rfq). Concurrency is deliberately capped at 3 pages with a 15 req/min ceiling to stay under the platforms' rate limits.


How it works

src/
main.js Actor entry point: input, crawler, filtering, ranking, output
platforms.js Per-platform selectors + the shared in-browser DOM walker
utils.js Quantity, date, country and commodity parsing
countries.js Country names and aliases
utils.test.js Unit tests

Every platform is scraped by the same DOM walker, parameterised by a selector bundle. It keeps only the innermost matching containers, so nested wrappers do not duplicate leads, and falls back to a generic walker when a platform's selectors return nothing โ€” which is what happens first when a site redesigns.

Adding a platform means adding one entry to PLATFORMS in src/platforms.js; no crawler changes are needed.


This actor collects publicly available business listings. It does not log in, bypass paywalls, or collect personal data. You are responsible for complying with each platform's terms of service and with the data protection law that applies to you when contacting the buyers you find.