# Bark Scraper — Company Reviews by Category & City (`scrapersdelight/bark-scraper`) Actor

Scrape home-services companies from Bark.com by category and city: business name, services offered, aggregate rating, review count and individual reviews (author, rating, date, text). Structured JSON, no login. Note: Bark hides phone/email/address behind a lead form — not scraped.

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

## Pricing

$5.00 / 1,000 per company returneds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## Bark.com Scraper — company profiles, ratings & reviews by category and city

Turn any **Bark.com category + US city** into a structured list of local service companies,
complete with their **aggregate rating, review count and individual customer reviews**.

Bark is one of the largest home- and professional-services marketplaces. Its public
category × city pages list the companies competing in a market; each company profile carries
schema.org microdata with the business identity and its full public review history. This actor
reads that structured data directly — no browser, no private API, no guessing at selectors.

Use it for **competitive/review intelligence**: track how rivals are rated in the cities you
serve, mine review text for service gaps, size a market before you enter it, or build a
ranked shortlist of providers in a category.

> **What this actor does NOT return: phone, email and postal address.** Bark deliberately keeps
> those behind a JavaScript "Reveal" / lead-form flow, so they are not present in the page at all.
> This is a review-intelligence actor, not a contact-enrichment actor. Nothing is silently null —
> those fields are simply not offered.

### What you get

- Business identity: name, Bark profile URL, stable `barkCompanyId`, description, logo
- Services the company serves (`categoriesServed`) and the category/city it was found under
- Reputation: aggregate rating, total review count
- Up to ~50 individual reviews per company: author, star rating, date and full review text

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | string | `search` | `search` = crawl category × city listings. `startUrls` = scrape the exact Bark URLs you supply. |
| `category` | string | `accountants` | Bark category slug, e.g. `accountants`, `plumbers`, `photographers`, `personal-trainers`. |
| `locations` | array of strings | – | US cities in `City, ST` form, e.g. `["Austin, TX", "New York City, NY"]`. Both the 2-letter code and the full state name are accepted. |
| `startUrls` | array | – | Used when `mode` is `startUrls`. Accepts Bark listing URLs (`/en/us/<category>/<state>/<city>/`) and company profile URLs (`/en/us/company/<slug>/<code>/`). |
| `includeReviews` | boolean | `true` | Emit the individual reviews array per company. |
| `maxReviewsPerCompany` | integer | `20` | Cap on reviews stored per company. |
| `maxItems` | integer | `100` | Hard cap on companies per run. `0` = unlimited. |
| `proxyConfiguration` | object | Apify **RESIDENTIAL**, country **US** | Required. Bark serves a CloudFront 403 to datacenter and direct requests; residential US returns clean 200s. |

**Run it with no input at all** and the actor performs a small documented sample run —
accountants in New York City, NY, capped at 10 companies — so you always get real example rows.

### Output

One row per company:

| Field | Description |
|---|---|
| `barkCompanyId` | `<slug>/<code>` — stable dedupe key |
| `businessName` | Company name |
| `profileUrl` | Bark profile URL |
| `description` | Company's own description |
| `categoriesServed` | Services the company lists (schema.org `knowsAbout`) |
| `aggregateRating`, `reviewCount` | Aggregate reputation |
| `reviews[]`, `reviewsShown` | Individual reviews (author, rating, date, text) and how many were stored |
| `logoUrl` | Company logo |
| `scrapedAt` | ISO timestamp of the fetch |
| `searchCategory`, `searchCity`, `searchState` | The query this row was found under |
| `sourceUrl` | The listing page the company was discovered on |

Duplicates are collapsed run-wide on `barkCompanyId`, so the same company appearing in several
cities or categories is only emitted — and only charged — once.

### Reliability

- The run ends **successfully with a status message** if Bark blocks the transport or a query has
  no results; it never fails a run over a transient block. Re-running picks fresh residential IPs.
- A wall-clock budget stops the crawl before the platform's run timeout and emits everything
  already collected, rather than being killed mid-run.

### Pricing

Pay-per-event: you are charged **only for company rows actually delivered to the dataset**
(`company-scraped`). Blocked fetches, duplicates and pages that yield nothing cost you nothing.
See the Pricing tab for the current per-event price.

### Legal

Only ordinary public page loads are used. You are responsible for complying with Bark's Terms of
Service and with applicable data-protection law — review text and reviewer display names are
personal data.

# Actor input Schema

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

'search' = pick a category + locations and Bark's category/city pages are crawled for you. 'startUrls' = paste Bark listing or company-profile URLs.

## `category` (type: `string`):

Bark category slug, e.g. accountants, web-design, plumbers, electricians, photographers, personal-trainers, dog-trainers, life-coaching, marketing-agencies, cleaners. Search mode only.

## `locations` (type: `array`):

"City, ST" or "City, State Name", e.g. "New York City, NY" or "Los Angeles, California". Bark listing pages are a fixed short list per city (no pagination), so add several cities for breadth. Search mode only.

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

Bark category listing pages (https://www.bark.com/en/us/accountants/new-york/new-york-city/) and/or company profile pages (https://www.bark.com/en/us/company/<slug>/<code>/).

## `includeReviews` (type: `boolean`):

Attach each company's individual reviews (author, rating, date, text) to its record. ON by default.

## `maxReviewsPerCompany` (type: `integer`):

Cap on reviews attached per company record (Bark shows up to ~50). 0 = attach none.

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

Cost/speed guard — stops once this many company records have been returned. 0 = no cap.

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

Bark blocks datacenter and direct requests with CloudFront. Apify RESIDENTIAL + country US is required — do not change unless you know what you are doing.

## Actor input object example

```json
{
  "mode": "search",
  "category": "accountants",
  "locations": [
    "New York City, NY"
  ],
  "includeReviews": true,
  "maxReviewsPerCompany": 20,
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

## `records` (type: `string`):

The dataset of scraped Bark companies (one item per company).

# 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 = {
    "category": "accountants",
    "locations": [
        "New York City, NY"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapersdelight/bark-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 = {
    "category": "accountants",
    "locations": ["New York City, NY"],
}

# Run the Actor and wait for it to finish
run = client.actor("scrapersdelight/bark-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 '{
  "category": "accountants",
  "locations": [
    "New York City, NY"
  ]
}' |
apify call scrapersdelight/bark-scraper --silent --output-dataset

```

## MCP server setup

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