# Bark.com Scraper — Service Provider Leads by Category (`studio-amba/bark-com-scraper`) Actor

Scrape verified service-provider profiles from bark.com: business name, category, location, rating, and review count. Category+region discovery across GB, US, AU, CA, IE, NZ, SG, ZA, DE. No login required.

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

## Pricing

from $1.20 / 1,000 result scrapeds

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/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 — Service Provider Leads by Category & Location

Scrape verified service-provider profiles from bark.com — the UK-founded services marketplace covering trades, events, business services, tutoring, fitness, and dozens of other categories across the UK, US, Australia, Canada, Ireland, and more.

### What is Bark.com?

Bark.com is a lead-generation marketplace: a customer posts a request for a plumber, photographer, tutor, or accountant, and local professionals respond with quotes. Every provider that responds to requests keeps a public profile page with a name, category tags, location, star rating, and review count — a directory of active, reviewed local service businesses.

- **Lead generation** — Build a contact list of service providers by category and region for B2B outreach
- **Market research** — Analyze category density, rating distribution, and provider count by region
- **Competitive intelligence** — Track how many active professionals compete in a given category or location
- **Directory/aggregator building** — Source structured provider listings for your own local-services product

### What data does Bark.com Scraper extract?

- Provider / business name
- Service categories (e.g. "General Plumbing", "Boiler Installation or Replacement")
- Location
- Star rating (1-5) and review count
- Elite Pro status
- Self-written business bio, when the provider filled one in
- Up to 3 recent review snippets (author, rating, date, text)
- Full profile URL

### How to scrape Bark.com data

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `country` | String | No | Bark.com locale, e.g. `gb`, `us`, `au`, `ca`, `ie`. Defaults to `gb`. |
| `category` | String | No | Category slug or keyword, e.g. `plumbers`, `electricians`, `photographer`. See `bark.com/en/gb/services/` for the full list. Defaults to `plumbers`. |
| `location` | String | No | Region slug within the category, e.g. `central-london`, `bristol`. Leave empty to walk every region listed for the category. |
| `maxResults` | Integer | No | Maximum provider profiles to return (default: 50) |
| `proxyConfiguration` | Object | No | Apify Proxy settings — automatic proxy is enough, no anti-bot bypass needed |

**How discovery works:** Bark.com has no public search API and no full paginated directory — its public site is a link graph: a category page (`/en/gb/plumbers/`) lists every region Bark has active providers in, and each category+region page (`/en/gb/plumbers/central-london/`) shows a "Popular {Category}" section of real, reviewed providers with a link to their profile. This actor walks that graph: category page → region pages → provider profiles, deduplicating providers that show up in more than one region. Leave `location` empty to walk multiple regions until `maxResults` is reached; set it to pull one specific region only.

**No login, no cookies, no anti-bot bypass required.** bark.com returns a clean 200 response to any request carrying a standard browser User-Agent — no Cloudflare, DataDome, or Akamai challenge was found on listing or profile pages.

**Public directory data only.** Phone numbers and email addresses are never public on bark.com — providers are only reachable through the site's own "Request quote" / "Contact" flow, which requires being a logged-in buyer. This actor cannot and does not return contact details.

### Output

Each provider profile is returned as a structured JSON object:

```json
{
    "providerId": "0Z8EK",
    "name": "PMCG Plumbing and Heating",
    "url": "https://www.bark.com/en/gb/company/pmcg-plumbing-and-heating/0Z8EK/",
    "scrapedAt": "2026-08-13T14:15:45.167Z",
    "categories": [
        "Boiler Installation or Replacement",
        "Boiler Repair or Maintenance",
        "General Plumbing",
        "Central Heating System Installation & Replacement",
        "Boiler Service"
    ],
    "categoryId": "1762",
    "location": "Belfast",
    "country": "GB",
    "rating": 5,
    "reviewCount": 8,
    "isElite": false,
    "bio": "For all your plumbing and heating needs contact PMCG Plumbing and Heating. We cover all Areas...",
    "avatarUrl": "https://d1k8hez1mxkuxw.cloudfront.net/s/avatar_v2/GRaAED/logo/5fad867816a44.png",
    "reviewSnippets": [
        {
            "author": "Susie Robinson",
            "ratingValue": 5,
            "date": "2023-02-11",
            "text": "Had terrible trouble with an old boiler and some previous heating engineers costing me a fortune..."
        }
    ],
    "searchCategory": "plumbers",
    "searchLocation": "belfast"
}
```

### Output fields

| Field | Type | Example |
|-------|------|---------|
| `providerId` | String | `"0Z8EK"` |
| `name` | String | `"PMCG Plumbing and Heating"` |
| `categories` | Array of String | `["General Plumbing", "Boiler Service"]` |
| `categoryId` | String | `"1762"` |
| `location` | String | `"Belfast"` |
| `country` | String | `"GB"` |
| `rating` | Number | `5` (1-5 scale; absent when the provider has no reviews yet) |
| `reviewCount` | Number | `8` |
| `isElite` | Boolean | `false` |
| `bio` | String | Self-written business description |
| `avatarUrl` | String | Profile logo/avatar image URL |
| `reviewSnippets` | Array of Object | Up to 3 recent reviews (author, rating, date, text) |
| `searchCategory` / `searchLocation` | String | Input echo — which category/region discovered this provider |
| `url` | String | Full profile URL |
| `scrapedAt` | String | ISO 8601 timestamp |

### Cost estimate

This actor makes roughly 2 requests per result (one listing-page request shared across ~10-15 providers, plus one profile-page request per provider) and uses no paid third-party unblocking service. At standard Apify pricing that's well under **1 compute unit per 20 providers** — one of the cheaper actors in the fleet to run. Usage cost only settles once a run reports **SUCCEEDED** — reading the dataset mid-run (before the run finishes) will undercount what you're actually charged.

### Limitations

- `rating`/`reviewCount` are absent for providers with zero reviews yet — bark.com doesn't render a rating block at all in that case, this is real data, not a scraping gap
- The "Popular {Category}" section per region surfaces bark.com's own featured/active providers, not every professional ever registered in that category+region — this is a directory of active, visible providers, not a guaranteed-complete registry
- `location` values are free text as shown on the profile (often a city, sometimes "Multiple locations")
- Data is scraped from the public website and may change without notice
- Respect bark.com's terms of service and use responsibly

### Frequently asked questions

**Can I get provider phone numbers or emails?**
No. bark.com never publishes contact details — they're only exchanged through the site's own lead-gen "Request quote" flow after a buyer signs in. This actor returns public directory data only.

**Why do some providers have no `rating`?**
bark.com only renders the rating/review block once a provider has at least one review. A missing `rating` means the provider is newly listed or has zero reviews — not a parsing error.

**What happens if I leave `location` empty?**
The actor fetches the category page, discovers every region bark.com lists providers under for that category, and walks region pages one by one (deduplicating providers) until `maxResults` is reached.

### Related scrapers

- [Checkatrade Scraper](https://apify.com/studio-amba/checkatrade-scraper) — UK tradesperson directory leads.
- [Local.ch Scraper](https://apify.com/studio-amba/local-ch-scraper) — Swiss local business directory.
- [Firmy.cz Scraper](https://apify.com/studio-amba/firmy-cz-scraper) — Czech business directory.
- [PagineGialle IT Scraper](https://apify.com/studio-amba/paginegialle-it-scraper) — Italian Yellow Pages directory.

### Disclaimer

This actor collects only publicly available business listing data from bark.com for legitimate use such as lead generation and market research. Respect bark.com's terms of service and applicable data-protection law (including UK GDPR/PECR rules on unsolicited contact) when using the output.

### Need this data on a schedule, or a custom version?

We run this scraper as a managed service for businesses: scheduled runs, deduplication, delta detection, and delivery to your inbox, Google Sheets, or API — maintenance included. We can also build a custom version with your exact fields and filters, or combine multiple sources into one feed.

See [studioamba.dev/services](https://studioamba.dev/services/) or email <hello@studioamba.dev> for a free data sample. We maintain 300+ European web scrapers and answer within one business day.

# Actor input Schema

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

Bark.com locale/country code to scrape, e.g. 'gb', 'us', 'au', 'ca', 'ie', 'nz', 'sg', 'za'. Leave empty for the UK site (bark.com/en/gb/).

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

Bark.com category slug or free-text keyword, e.g. 'plumbers', 'electricians', 'photographer', 'gardeners', 'dj', 'personal-trainer'. See https://www.bark.com/en/gb/services/ for the full list. Leave empty to default to 'plumbers'.

## `location` (type: `string`):

Bark.com region slug within the category, e.g. 'central-london', 'greater-manchester', 'bristol'. Leave empty to walk every region listed for the category until maxResults is reached.

## `maxResults` (type: `integer`):

Maximum number of provider profiles to return. This is a detail-page scraper (one request per profile plus a handful of listing-page requests) — keep this small for a quick test.

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

No anti-bot was found on bark.com (direct HTTP works with a standard browser User-Agent) — Apify Proxy automatic is enough. Leave the default unless you see blocking.

## Actor input object example

```json
{
  "country": "gb",
  "category": "plumbers",
  "location": "central-london",
  "maxResults": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

No description

# 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 = {
    "country": "gb",
    "category": "plumbers",
    "location": "central-london",
    "maxResults": 5,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/bark-com-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 = {
    "country": "gb",
    "category": "plumbers",
    "location": "central-london",
    "maxResults": 5,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/bark-com-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 '{
  "country": "gb",
  "category": "plumbers",
  "location": "central-london",
  "maxResults": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call studio-amba/bark-com-scraper --silent --output-dataset

```

## MCP server setup

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