# B2Brazil Scraper - Suppliers, Products & RFQs (`crawloop/b2brazil-scraper`) Actor

Scrape B2Brazil B2B products, exporter profiles and Leads Central RFQs. Export prices, MOQ, incoterms, verified badges and firmographics from keywords, categories or URLs — B2Brazil API alternative.

- **URL**: https://apify.com/crawloop/b2brazil-scraper.md
- **Developed by:** [Andrej Kiva](https://apify.com/crawloop) (community)
- **Categories:** E-commerce, Lead generation, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.49 / 1,000 product listings

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## B2Brazil Scraper — Suppliers, Products & RFQs

> **Disclaimer:** Unofficial tool — not affiliated with, sponsored by, or endorsed by B2Brazil or its affiliates. Data is read from publicly accessible pages only. No login. You are responsible for complying with applicable law (including GDPR where personal data appears) and the site’s terms. No warranty on accuracy or availability. Provided for informational and research use.

> **Contact-data controls:** Phone/WhatsApp/fax fields, including masked previews, are omitted from the dataset by default. Enable `includePhones` only for contact fragments already published on public pages and only when you have a lawful basis. The Actor never unlocks gated contacts.

| Europages (Europe) | WLW (DACH) | B2Brazil (Americas) |
| :--- | :--- | :--- |
| [Europages Scraper](https://apify.com/crawloop/europages-scraper) | [WLW Scraper](https://apify.com/crawloop/wlw-scraper) | **B2Brazil Scraper** ◄── you are here |

**B2Brazil Scraper** for Apify — scrape **B2Brazil products, exporter profiles, and Leads Central RFQs** into clean JSON without a public B2Brazil API. Extract **product title, unit / FOB price, MOQ, incoterms, payment terms, capacity, packaging, company name, B2B Verified / Premium badges, country, employees, sales volume, and buy/sell leads** from keywords, category pages, hotsites, and lead URLs.

Built for **Latin America sourcing**, **Brazilian exporter discovery**, **B2B lead generation**, **price / MOQ research**, and **RFQ monitoring**. Run with **Python**, **Node.js**, **cURL**, or **MCP** / AI assistants. Fast HTTP crawl of public SSR HTML via `curl_cffi` — no headless browser and no login for public fields.

### When to use this Actor

- You need **B2Brazil supplier, product, or RFQ data** as structured dataset rows
- You want **keyword search**, **category / sector URLs**, **product PDPs**, **company hotsites**, or **Leads Central**
- You prefer a **fast, browser-free** B2Brazil crawl on Apify
- You need **Verified / Premium filters** and optional **PDP / profile enrichment**
- You want an **Americas ↔ Europe sourcing chain** with Europages / WLW siblings

### When not to use this Actor

- **Guaranteed phone or email on every row** — B2Brazil masks contacts (`+55 11********`); lead buyer details need platform credits
- **Posting RFQs or contacting suppliers** through B2Brazil forms — read-only extraction only
- **Freight quotes, SafePay, or TradeCenter** — out of scope
- **Non-B2Brazil directories** — use a source-specific Actor (e.g. Europages, WLW)

### Key features

- **Keyword search** — `/search/products?s=` when unblocked; otherwise falls back to `/{slug}` category pages (e.g. coffee → `/coffee`)
- **Category & sector URLs** — `/beverage/coffee`, `/coffee/green-coffee`, `/sectors/brazilian-coffee-brands`
- **PDP enrichment** — unit price, FOB, MOQ, incoterms, payment, capacity, packaging
- **Company hotsites** — employees, sales volume, export %, markets, business type
- **Leads Central** — public buy RFQs and sell offers (title, country, date, snippet)
- **Locales** — English, Português, Español, 中文 hosts
- **Filters** — Verified, Premium / Premium Plus, country
- **startUrls autodetect** — search, category, PDP, hotsite, lead list, lead detail
- **Deduped push** — unique by product / company / lead id within a run
- **Lightweight & resilient** — `curl_cffi` Chrome TLS; `/search/products` is often Cloudflare-blocked without RESIDENTIAL proxy (keyword runs fall back to `/{slug}` categories)

### Use cases

| Use case | What you get |
| :--- | :--- |
| **Find Brazilian exporters** | Keyword / category listings with Verified & Premium signals |
| **Qualify suppliers** | Employees, turnover band, export %, markets (with enrich) |
| **Price & MOQ research** | Unit price, FOB, MOQ, incoterms, packaging |
| **Watch inbound demand** | Leads Central RFQs by product and buyer country |
| **Track sell offers** | Public wholesale offers with plan / verified badges |

### Input parameters

| Parameter | Type | Default | Description |
| :--- | :--- | :--- | :--- |
| `searchQueries` | Array | `["coffee"]` | Keywords → B2Brazil product search. |
| `startUrls` | Array | `[]` | Search / category / PDP / hotsite / lead URLs. |
| `searchType` | Enum | `products` | `products` or unique `companies` from search cards. |
| `scrapeLeads` | Enum | `off` | `off` / `buy` / `sell` / `both`. Mixed catalog+leads runs reserve RFQ slots so `maxItems` is not filled by products only. |
| `locale` | Enum | `en` | `en` / `pt` / `es` / `zh`. |
| `maxItems` | Integer | `50` | Max dataset rows. |
| `maxPages` | Integer | `3` | Max pages per keyword / URL. |
| `enrichProducts` | Boolean | `false` | Fetch product detail pages. |
| `enrichCompanies` | Boolean | `false` | Fetch company hotsites. |
| `enrichLeads` | Boolean | `false` | Fetch lead detail pages. |
| `onlyVerified` | Boolean | `false` | Keep B2B Verified rows. |
| `onlyPremium` | Boolean | `false` | Keep Premium / Premium Plus. |
| `country` | String | — | ISO (`BR`) on search URLs and/or name filter. |
| `categoryId` | Integer | — | Facet id (e.g. `6123` Green Coffee). |
| `requestDelaySecs` | Number | `0.5` | Delay between HTTP requests. |
| `proxyConfiguration` | Object | RESIDENTIAL | **Required on Apify** — Cloudflare blocks datacenter IPs. Default is Apify Proxy RESIDENTIAL. |

#### Example — keyword product list

```json
{
  "searchQueries": ["coffee"],
  "maxItems": 100,
  "maxPages": 5,
  "onlyVerified": true,
  "country": "BR",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"]
  }
}
```

#### Example — enriched products + companies

```json
{
  "searchQueries": ["acai", "soybeans"],
  "maxItems": 40,
  "maxPages": 2,
  "enrichProducts": true,
  "enrichCompanies": true,
  "locale": "en"
}
```

#### Example — category URL + RFQs

```json
{
  "startUrls": [
    "https://b2brazil.com/beverage/coffee",
    "https://b2brazil.com/hotsite/meccomimpeexpde"
  ],
  "scrapeLeads": "buy",
  "maxItems": 50,
  "maxPages": 2,
  "enrichProducts": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"]
  }
}
```

### Output

One dataset row per listing, enriched product, company, or lead. `recordType` is `listing`, `product`, `company`, `lead`, or `error`.

#### Output fields

| Field | Description |
| :--- | :--- |
| `recordType` | `listing` | `product` | `company` | `lead` | `error` |
| `productName` / `productUrl` | Product title and hotsite PDP |
| `unitPrice` / `priceText` / `currency` | Listed unit price when published |
| `fobPrice` / `minOrderQuantity` / `incoterms` | Trade terms from the PDP |
| `paymentTypes` / `deliveryTimeframe` / `packagingDetails` | Commercial extras |
| `companyName` / `companyUrl` | Exporter name and hotsite |
| `verified` / `plan` | B2B Verified seal and Basic / Premium / Premium Plus |
| `country` / `city` / `state` | Location |
| `employees` / `salesVolumeUsd` / `exportSharePct` | Firmographics (enrich) |
| `leadType` / `title` / `date` | RFQ or sell offer |
| `phoneMasked` / `contactGated` | Contacts are public-masked / credit-gated |
| `scrapedAt` | ISO timestamp |

#### Example listing row

```json
{
  "source": "b2brazil",
  "recordType": "listing",
  "productName": "Traditional Coffee / Arabica Coffee",
  "productUrl": "https://b2brazil.com/hotsite/cafedosaltos/-traditional-coffee-arabica-coffee",
  "companyName": "Connect Comercio Internacional",
  "companyUrl": "https://b2brazil.com/hotsite/cafedosaltos",
  "country": "Brazil",
  "verified": true,
  "plan": "premium_plus",
  "phoneMasked": true,
  "searchQuery": "coffee"
}
```

#### Example product row

```json
{
  "source": "b2brazil",
  "recordType": "product",
  "productName": "Arabica Specialty High Grade Green Coffee Beans Harvested 22/23",
  "productUrl": "https://b2brazil.com/hotsite/primecoffeecompany/arabica-specialty-high-grade-green-coffe",
  "unitPrice": 418,
  "currency": "USD",
  "minOrderQuantity": "1 Bag/Bags",
  "incoterms": "CIF - Cost, Insurance and Freight",
  "paymentTypes": ["L/C (Letter of Credit)", "T/T (Wire Transfer)"],
  "companyName": "Prime Coffee Company LLC",
  "country": "United States",
  "verified": false
}
```

### Integration examples

#### Node.js

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('crawloop/b2brazil-scraper').call({
  searchQueries: ['coffee'],
  maxItems: 50,
  maxPages: 2,
  onlyVerified: true,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.slice(0, 3));
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_TOKEN")
run = client.actor("crawloop/b2brazil-scraper").call(
    run_input={
        "searchQueries": ["coffee"],
        "maxItems": 50,
        "maxPages": 2,
        "onlyVerified": True,
    }
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

#### cURL

```bash
curl -s -X POST \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"searchQueries":["coffee"],"maxItems":25,"maxPages":1}' \
  "https://api.apify.com/v2/acts/crawloop~b2brazil-scraper/runs?waitForFinish=120"
```

### MCP and AI assistants

Use this Actor from AI tools via [Apify MCP](https://docs.apify.com/platform/integrations/mcp).
Connect your Apify account, then call this Actor by its Store ID / name.

Example prompts:

- "Run B2Brazil Scraper for coffee in Brazil and return the top 20 verified rows as JSON"
- "Scrape B2Brazil açaí products with PDP enrichment and summarize MOQ and incoterms"
- "Chain B2Brazil Scraper then Europages Scraper to compare Brazilian vs EU coffee suppliers"

### Suite next step

After an Americas shortlist, enrich European alternatives with [Europages Scraper](https://apify.com/crawloop/europages-scraper) or DACH coverage with [WLW Scraper](https://apify.com/crawloop/wlw-scraper).

### FAQ

**Do I get phone numbers or buyer emails?**\
Not from the public HTML. Profiles show masked phones; Leads Central contacts need credits. Rows set `phoneMasked: true` and leads set `contactGated: true`.

**How many results per page?**\
About **20** product cards per search / category page. Coffee search paginates to tens of pages.

**Can I scrape Portuguese pages?**\
Yes — set `locale` to `pt` (b2brazil.com.br) or pass a `.com.br` start URL.

**Does this post RFQs or log in?**\
No. Read-only public pages only.

### Related Actors

- [Europages Scraper](https://apify.com/crawloop/europages-scraper) — Europe-wide B2B company directory
- [WLW Scraper](https://apify.com/crawloop/wlw-scraper) — DACH B2B companies

# Actor input Schema

## `includePhones` (type: `boolean`):

Off by default. Enable only when you have a lawful basis to process phone previews already visible on public pages. The Actor does not unlock gated contact details.

## `searchQueries` (type: `array`):

Product keywords (e.g. coffee, acai, soybeans). Resolved to /search/products?s=…

## `startUrls` (type: `array`):

B2Brazil URLs: search, category (/beverage/coffee), product PDP, company hotsite, sector, or Leads Central.

## `searchType` (type: `string`):

Keyword search emits product cards, or unique companies from those cards.

## `scrapeLeads` (type: `string`):

Also crawl public RFQs (buy) and/or sell offers. Mixed runs reserve lead slots so maxItems is not filled by products only. Contact details stay gated.

## `locale` (type: `string`):

Host used to build keyword and lead URLs.

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

Stop after this many dataset items (listings, products, companies, leads).

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

Maximum pages per keyword / category / lead list (0-based site pages).

## `enrichProducts` (type: `boolean`):

Fetch each product page for unit price, FOB, MOQ, incoterms, capacity and packaging.

## `enrichCompanies` (type: `boolean`):

Fetch hotsite profiles (firmographics, markets, business type). Separate company PPE event when billed.

## `enrichLeads` (type: `boolean`):

Open each RFQ / sell-offer page for the full public description. Buyer/seller contacts stay masked.

## `onlyVerified` (type: `boolean`):

Keep rows with the B2B Verified seal.

## `onlyPremium` (type: `boolean`):

Keep rows on a paid plan badge.

## `country` (type: `string`):

ISO code for search URLs (BR, CN, US) and/or country name filter on results.

## `categoryId` (type: `integer`):

Optional B2Brazil facet id (e.g. 6123 = Green Coffee) applied to keyword search as c\[0].

## `requestDelaySecs` (type: `number`):

Pause between HTTP requests on the same session.

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

Apify Proxy. RESIDENTIAL is required from cloud IPs — Cloudflare blocks datacenter.

## Actor input object example

```json
{
  "includePhones": false,
  "searchQueries": [
    "coffee"
  ],
  "startUrls": [
    "https://b2brazil.com/beverage/coffee"
  ],
  "searchType": "products",
  "scrapeLeads": "off",
  "locale": "en",
  "maxItems": 50,
  "maxPages": 3,
  "enrichProducts": false,
  "enrichCompanies": false,
  "enrichLeads": false,
  "onlyVerified": false,
  "onlyPremium": false,
  "requestDelaySecs": 0.5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

Default dataset items.

# 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 = {
    "searchQueries": [
        "coffee"
    ],
    "startUrls": [
        "https://b2brazil.com/beverage/coffee"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawloop/b2brazil-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 = {
    "searchQueries": ["coffee"],
    "startUrls": ["https://b2brazil.com/beverage/coffee"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("crawloop/b2brazil-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 '{
  "searchQueries": [
    "coffee"
  ],
  "startUrls": [
    "https://b2brazil.com/beverage/coffee"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call crawloop/b2brazil-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,crawloop/b2brazil-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/r8AtPcSr7UEtsnwkd/builds/jcW5C8aJosy8rw1iL/openapi.json
