# B Corp Directory Scraper (`crawlerbros/bcorp-directory-scraper`) Actor

Scrape the official Certified B Corporation directory (bcorporation.net) - search by keyword or filter by operating country, HQ country, industry, sector, company size, ownership demographics and certification status, or look up specific companies by slug/ID with full impact-score breakdown.

- **URL**: https://apify.com/crawlerbros/bcorp-directory-scraper.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** Automation, Agents, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 results

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

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#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

## B Corp Directory Scraper

Scrape the official [Certified B Corporation](https://www.bcorporation.net) directory — the global registry of companies verified to meet high standards of social and environmental performance, accountability, and transparency. Search by keyword or filter by operating country, HQ country, industry, B Corp sector, company size, ownership demographics and certification status, or look up specific companies directly by their profile slug/ID and get the full impact-score breakdown plus links to their public disclosure reports.

### What this actor does

- **Two modes:** `search` (keyword + filters across the whole directory) and `byId` (direct lookup of one or more known companies, always enriched with full profile details)
- **Eight filter dimensions:** operating country (213 values), HQ country (101 values), industry (163 upstream-defined values), B Corp sector (5 official classifications), company size bucket, ownership/demographic tags, certification status, and first-certification date range
- **Seven sort orders:** newest/oldest certified, company name (A-Z/Z-A), highest/lowest impact score, or best keyword match (relevance)
- **Optional deep enrichment:** company website URL, the full impact-score breakdown (Governance / Workers / Community / Environment / Customers, with sub-topic scores), full-time worker count, year-by-year score history across past recertification cycles, and links to the company's public disclosure reports / score-methodology & brand-list PDFs / subsidiary FAQs — always included for `byId`, optional for `search`
- **Every field omitted when unavailable** — no blank/null placeholders in the output

### Output per company

| Field | Type | Description |
|---|---|---|
| `companySlug` | string | The company's unique slug/ID on bcorporation.net |
| `companyName` | string | Legal / trading name |
| `description` | string | Company description as submitted to B Lab |
| `keywords[]` | array | Website/brand keywords the company self-tagged |
| `operatingCountries[]` | array | Every country the company operates in |
| `operatingProvinces[]` | array | Every state/province the company operates in |
| `operatingCities[]` | array | Every city the company operates in |
| `industry` | string | Upstream-defined industry classification (one of 163) |
| `sector` | string | Official B Corp sector (Manufacturing / Wholesale-Retail / Agriculture-Growers / Service with Minor Environmental Footprint / Service with Significant Environmental Footprint) |
| `hqCountry`, `hqProvince`, `hqCity`, `hqPostalCode` | string | Headquarters location |
| `companySize` | string | Employee-count bucket (e.g. `1-9`, `250-999`, `1000+`) |
| `ownershipTags[]` | array | Self-identified ownership demographics (e.g. `womenOwned`, `veteranOwned`) |
| `isCertified` | boolean | Whether the company currently holds active B Corp certification |
| `firstCertifiedDate` | string | ISO 8601 date of first certification |
| `overallImpactScore` | number | Latest verified overall B Impact Score |
| `companyLogoUrl` | string | Direct URL to the company's logo image |
| `companyUrl` | string | Canonical bcorporation.net profile URL |
| `companyWebsite` | string | The company's own external website (byId mode, or search with `includeFullDetails`) |
| `standardsVersion` | string | B Impact Assessment standards version used for the latest certification |
| `fullTimeWorkerCount` | integer | Full-time worker count from the latest assessment |
| `latestAssessmentDate` | string | ISO 8601 date/time of the latest verified assessment |
| `impactScoreBreakdown[]` | array | Per-impact-area score breakdown: `{ name, score, topics: [{ name, score }] }` for Governance, Workers, Community, Environment, and Customers |
| `scoreHistory[]` | array | Year-by-year overall B Impact Score across past recertification cycles: `{ year, score }`, newest first. Only present for companies recertified at least once (byId mode, or search with `includeFullDetails`) |
| `additionalDocuments[]` | array | Public documents published on the company's profile page — disclosure reports, score-methodology/brand-list PDFs, subsidiary FAQs, etc. Each item is `{ title, url }` linking directly to the hosted PDF (byId mode, or search with `includeFullDetails`) |
| `recordType` | string | Always `"company"` |
| `scrapedAt` | string | UTC ISO 8601 timestamp of when the record was scraped |

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | select | `search` | `search` (keyword/filter the directory) or `byId` (lookup specific companies) |
| `searchQuery` | string | *(empty)* | Free-text keyword query across company name, description, website keywords, industry, sector and location. Leave empty to browse/filter without a keyword (mode=search) |
| `companySlugs` | array | *(empty)* | Company slugs (e.g. `patagonia-inc`) or full profile URLs (mode=byId) |
| `countries` | select (multi) | *(all)* | Only include companies operating in one of these countries (mode=search) |
| `hqCountries` | select (multi) | *(all)* | Only include companies headquartered in one of these countries (mode=search) |
| `industries` | select (multi) | *(all)* | Only include companies in one of these industries (mode=search) |
| `sectors` | select (multi) | *(all)* | Only include companies in one of the 5 official B Corp sectors (mode=search) |
| `companySizes` | select (multi) | *(all)* | Only include companies in one of these employee-count buckets (mode=search) |
| `demographics` | select (multi) | *(all)* | Only include companies self-identifying with one of these ownership demographics (mode=search) |
| `certificationStatus` | select | `any` | `any` / `certifiedOnly` / `notCertifiedOnly` — a small number of directory entries are decertified or pending (mode=search) |
| `certifiedAfter` | date | *(none)* | Only include companies first certified on or after this date (mode=search) |
| `certifiedBefore` | date | *(none)* | Only include companies first certified on or before this date (mode=search) |
| `sortBy` | select | `newest` | `newest` (newest certified first) / `oldest` (oldest certified first) / `nameAsc` (A-Z) / `nameDesc` (Z-A) / `highestImpact` (highest impact score first) / `lowestImpact` (lowest impact score first) / `relevance` (best keyword match first — use with `searchQuery`) |
| `includeFullDetails` | boolean | `false` | Fetch each company's profile page for its website URL and full impact-score breakdown. One extra request per company — slower for large `maxItems`. Always enabled for `byId` |
| `maxItems` | integer | `10` | Hard cap on the number of company records emitted (1-5000) |

#### Example: keyword search with location + industry filters

```json
{
  "mode": "search",
  "searchQuery": "coffee",
  "countries": ["United States", "Canada"],
  "industries": ["Food products"],
  "sortBy": "highestImpact",
  "maxItems": 25
}
```

#### Example: browse women-owned manufacturers, newest first

```json
{
  "mode": "search",
  "sectors": ["Manufacturing"],
  "demographics": ["womenOwned"],
  "sortBy": "newest",
  "includeFullDetails": true,
  "maxItems": 50
}
```

#### Example: direct lookup with full impact-score breakdown

```json
{
  "mode": "byId",
  "companySlugs": ["patagonia-inc", "ben-and-jerrys"]
}
```

### Use cases

- **ESG / sustainability research** — build a dataset of verified socially and environmentally responsible companies by geography, industry or sector
- **Supplier / vendor sourcing** — find certified B Corps in a specific country or industry for procurement shortlists
- **Investment screening** — filter for impact-scored companies above a certification threshold, ranked by impact score
- **Market mapping** — analyze how many B Corps exist per industry, sector, or ownership demographic in a given market
- **Academic / journalistic research** — study the growth of the B Corp movement using certification dates and impact scores
- **Competitive benchmarking** — pull a competitor's full B Impact Score breakdown (Governance/Workers/Community/Environment/Customers) via `byId`

### FAQ

**What is a B Corp?**
A Certified B Corporation is a for-profit company independently verified by B Lab to meet high standards of social and environmental performance, public transparency, and legal accountability. The directory is maintained at [bcorporation.net](https://www.bcorporation.net).

**What's the difference between `sector` and `industry`?**
`sector` is B Lab's own 5-value classification used to select the right version of the B Impact Assessment (e.g. `Manufacturing`, `Wholesale/Retail`). `industry` is a finer-grained, upstream-defined classification (163 values, e.g. `Food products`, `Software publishing and SaaS platforms`) describing what the company actually does.

**Why do some companies have `isCertified: false`?**
A small number of directory entries are companies that were previously certified but have since decertified, or whose certification is pending renewal. Use `certificationStatus: "certifiedOnly"` to exclude them.

**What is the impact score breakdown?**
Every certified B Corp is scored out of a total B Impact Score across five impact areas — Governance, Workers, Community, Environment, and Customers — each broken down further into sub-topics (e.g. Governance → "Ethics & Transparency", "Mission & Engagement"). This breakdown is only available via `byId` mode or `includeFullDetails: true`, since it requires visiting the company's individual profile page.

**What is `additionalDocuments`?**
Many company profile pages publish supporting PDFs alongside their certification — most commonly a disclosure report (required for larger/public companies as part of B Lab's transparency standards), plus score-methodology & brand-list documents or subsidiary FAQs for multi-brand companies. `additionalDocuments` returns each document's title and direct hosted-PDF URL, in the order shown on the profile page. Only present when the profile actually publishes documents, and only fetched via `byId` or `includeFullDetails`.

**What is `scoreHistory`?**
Companies that have been recertified at least once show a chart of their overall B Impact Score for every past assessment cycle (e.g. 2011, 2014, 2016, 2020) on their profile page. `scoreHistory` returns each `{ year, score }` pair, newest first — useful for tracking whether a company's impact performance has improved or declined over successive certifications. Companies on their first (not-yet-renewed) certification only have a single current score, already captured in `overallImpactScore`/`latestAssessmentDate`, so `scoreHistory` is omitted for them. Only available via `byId` mode or `includeFullDetails: true`.

**Why is `includeFullDetails` off by default for search?**
Fetching the impact-score breakdown requires one extra page load per company. For large result sets this meaningfully slows the run, so it's opt-in. `byId` mode always includes it since it's meant for looking up specific, known companies.

**Can a company operate in multiple countries?**
Yes — `operatingCountries` can contain many countries (multinational companies), while `hqCountry` is always a single headquarters location. The `countries` filter matches on any operating country, not just HQ.

**How is `highestImpact`/`lowestImpact` sort computed?**
Companies are ranked by their latest verified overall B Impact Score, highest (or lowest) first, within the matched set of your keyword/filters.

**When should I use `sortBy: "relevance"`?**
Whenever you set a `searchQuery`. The default `newest` sort ranks by certification date, which can bury the best keyword matches under unrelated recently-certified companies. `relevance` ranks by text-match quality against your query instead.

**Can I filter by when a company was first certified?**
Yes — `certifiedAfter`/`certifiedBefore` filter on `firstCertifiedDate` (the date the company earned its first B Corp certification), independent of the `sortBy` order. Combine with `sortBy: "oldest"`/`"newest"` to walk a certification cohort chronologically, e.g. every company certified in a given year.

**How current is the data?**
The directory reflects B Lab's live, publicly published certification records — the same data shown on bcorporation.net at the time the actor runs.

**Is this affiliated with B Lab or bcorporation.net?**
No, this is a third-party actor that reads B Lab's publicly published directory at bcorporation.net. It is not affiliated with, endorsed by, or operated by B Lab or Certified B Corporation.

### Limitations

- **`companyUrl` and bot-management:** bcorporation.net's Cloudflare protection fingerprints automated, non-browser HTTP clients (plain `curl`, Python `requests`, etc.) and returns `403` to them regardless of the `User-Agent` header sent, while any real browser loads the page normally with `200`. `companyUrl` values in the output are real, working profile pages; they just won't return `200` to a bare `curl -I` from a non-browser client.
- **`companySlugs` (mode=byId):** slugs/URLs that don't match an existing company are silently skipped (not emitted, no error) rather than aborting the run — check the returned record count against your input list.
- **`companyWebsite`:** extracted verbatim from the company's own profile page — it is the company's real external website. The overwhelming majority (verified 15/15 in sampling) return `200` to a plain `curl`. A small number of large, well-known brands run their own independent bot-management (e.g. Akamai) on their external site and may 404/403 non-browser clients; this is the target company's own infrastructure, outside this actor's control, and does not affect the accuracy of the URL.

# Actor input Schema

## `mode` (type: `string`):

What to fetch: free-text/filtered search of the directory, or a direct lookup of specific companies by slug/ID.

## `searchQuery` (type: `string`):

Free-text keyword query across company name, description, website keywords, industry, sector and location fields. Leave empty to browse/filter without a keyword.

## `companySlugs` (type: `array`):

Company slugs (e.g. `patagonia-inc`) or full bcorporation.net profile URLs. Enriches each company with its website URL, full impact-score breakdown, full-time worker count, year-by-year score history across past recertification cycles, and any additional published documents (disclosure reports, score-methodology/brand-list PDFs, subsidiary FAQs) from the company profile page.

## `countries` (type: `array`):

Only include companies that operate in at least one of these countries. Leave empty for all countries.

## `hqCountries` (type: `array`):

Only include companies headquartered in one of these countries. Leave empty for all HQ countries.

## `industries` (type: `array`):

Only include companies in one of these upstream-defined industries. Leave empty for all industries.

## `sectors` (type: `array`):

Only include companies in one of these 5 official B Corp sector classifications. Leave empty for all sectors.

## `companySizes` (type: `array`):

Only include companies in one of these employee-count buckets. Leave empty for all sizes.

## `demographics` (type: `array`):

Only include companies self-identifying with at least one of these ownership demographics. Leave empty for all companies.

## `certifiedAfter` (type: `string`):

Only include companies first certified on or after this date (YYYY-MM-DD). Leave empty for no lower bound.

## `certifiedBefore` (type: `string`):

Only include companies first certified on or before this date (YYYY-MM-DD). Leave empty for no upper bound.

## `certificationStatus` (type: `string`):

Filter by whether the company currently holds active B Corp certification. A small number of companies in the directory are decertified or pending.

## `sortBy` (type: `string`):

Order in which matching companies are emitted. Use `relevance` when `searchQuery` is set, to rank the best keyword matches first instead of by date.

## `includeFullDetails` (type: `boolean`):

Fetch each company's profile page for its website URL, full impact-score breakdown (Governance/Workers/Community/Environment/Customers), year-by-year score history across past recertification cycles, and any additional published documents (disclosure reports, score-methodology/brand-list PDFs, subsidiary FAQs). Slower — one extra request per company. Always enabled for mode=byId.

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

Hard cap on the number of company records emitted.

## Actor input object example

```json
{
  "mode": "search",
  "searchQuery": "",
  "companySlugs": [],
  "countries": [],
  "hqCountries": [],
  "industries": [],
  "sectors": [],
  "companySizes": [],
  "demographics": [],
  "certifiedAfter": "",
  "certifiedBefore": "",
  "certificationStatus": "any",
  "sortBy": "newest",
  "includeFullDetails": false,
  "maxItems": 10
}
```

# Actor output Schema

## `companies` (type: `string`):

Dataset containing all scraped B Corp company records.

# 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 = {
    "mode": "search",
    "searchQuery": "",
    "companySlugs": [],
    "countries": [],
    "hqCountries": [],
    "industries": [],
    "sectors": [],
    "companySizes": [],
    "demographics": [],
    "certifiedAfter": "",
    "certifiedBefore": "",
    "certificationStatus": "any",
    "sortBy": "newest",
    "includeFullDetails": false,
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/bcorp-directory-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 = {
    "mode": "search",
    "searchQuery": "",
    "companySlugs": [],
    "countries": [],
    "hqCountries": [],
    "industries": [],
    "sectors": [],
    "companySizes": [],
    "demographics": [],
    "certifiedAfter": "",
    "certifiedBefore": "",
    "certificationStatus": "any",
    "sortBy": "newest",
    "includeFullDetails": False,
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/bcorp-directory-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "mode": "search",
  "searchQuery": "",
  "companySlugs": [],
  "countries": [],
  "hqCountries": [],
  "industries": [],
  "sectors": [],
  "companySizes": [],
  "demographics": [],
  "certifiedAfter": "",
  "certifiedBefore": "",
  "certificationStatus": "any",
  "sortBy": "newest",
  "includeFullDetails": false,
  "maxItems": 10
}' |
apify call crawlerbros/bcorp-directory-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=crawlerbros/bcorp-directory-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/3wIQFzAyu1CWUjUUI/builds/4aDQ5YN64y4ATqDcc/openapi.json
