# Bark.com Scraper – Business Leads & Reviews (`b2b_leads/bark-real-time-data-scraper`) Actor

Collect Bark.com professionals by category and city: ratings, reviews, profile details, and lead enrichment with websites, emails, and social profiles. Structured JSON streamed to your dataset in real time, with optional webhook delivery to your CRM. Free plans export a small sample per run.

- **URL**: https://apify.com/b2b\_leads/bark-real-time-data-scraper.md
- **Developed by:** [Emmanuel](https://apify.com/b2b_leads) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.50 / 1,000 results

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Bark Real-Time Data

> ⚠️ **Free-tier notice:** on Apify free plans this Actor exports a small sample of results per run (2 rows by default). Upgrade to a paid Apify plan for full, unlimited exports.

Collect **Bark.com** directory data at scale: local service professionals and businesses by category and city — with full profile details and lead enrichment (business website, emails, social profiles). Structured JSON is streamed to your dataset **in real time** as each record is collected.

Bark is one of the largest local-services marketplaces, covering accountants, personal trainers, web designers, photographers, cleaners, DJs, dog trainers and 1,000+ more service categories across the US, UK, Canada, Ireland, Australia and beyond.

### Who is this for?

- **Lead-gen agencies and outreach teams** — build local prospect lists by service category and city, with contact details for CRM import.
- **Local SEO and directory researchers** — track which businesses are listed, rated and badged in each market.
- **Marketplaces and platforms** — monitor competitor supply density per category per city.
- **CRMs and data pipelines** — stream every record to a webhook (Zapier, Make, Slack, Google Sheets) the moment it is collected.
- **Franchise and sales teams** — find under-served categories and cities.
- **AI agents** — connect via the Apify MCP server and query live directory data in natural language.

### Features

| Feature | Input toggle | What you get |
| --- | --- | --- |
| 🔎 Directory search | `Directory search` (default **on**) | Professionals by service category and city. One row per search task; category + location + per-task max results. |
| 🔗 Profile URLs | `Profile URLs` | Full details for specific Bark profile URLs you already have (`/company/...` or `/b/...`). |
| 🎯 Lead details | `Enable lead details` | Enriches every row in place: all listed categories, response time, hires on Bark, public reviews, business website, contact emails and social profiles when discoverable. Nothing is filtered — rows without leads are still exported. |
| 🔔 Webhooks | `Webhook URL` + `Webhook format` | Each record POSTed to your URL in JSON or Slack format, fire-and-forget, in addition to the dataset. |
| 🌐 Connection | `Proxy settings` | Apify residential proxy (US) enabled by default. |

#### Directory search details

Each **search task** row takes:

- **Category** — any Bark service category, e.g. `Accountants`, `Personal Trainers`, `Web Design`, `Wedding Photographers`, `Dog Training`. Free text; the closest matching listing is used.
- **Location** (optional) — `City, ST` for the US (e.g. `New York, NY`, `Austin, TX`), or just `City` for other markets (e.g. `London`). Leave empty to search the category across all locations.
- **Max results** — cap for that one search task. The first number you should reach for.

A quick, useful first run: leave everything at defaults and click **Start** — you get 10 Accountants in New York, NY in seconds.

### Input reference

| Field | Type | Default | Notes |
| --- | --- | --- | --- |
| `enableSearch` | boolean | `true` | Master switch for directory search. |
| `searchTasks` | array | 1 demo task | One row per category/location search. |
| `searchTasks[].category` | string | — | Service category (required per task). |
| `searchTasks[].location` | string | — | `City, ST` (US) or `City`. Optional. |
| `searchTasks[].maxResults` | integer | — | Per-task cap. |
| `enableScrapeByUrl` | boolean | `false` | Collect full details for specific profile URLs. |
| `scrapeUrls` | string\[] | `[]` | Bark profile URLs. |
| `enableLeadDetails` | boolean | `false` | Enrich rows in place with full details + lead contacts. Adds a little extra time per record. |
| `concurrency` | integer | `2` | Parallel lead-details enrichments (1–4). |
| `webhookUrl` | string | `""` | Optional extra real-time push per record. |
| `webhookFormat` | select | `json` | `json` (full record) or `slack` (Slack message). |
| `proxyConfiguration` | proxy | Residential US | Apify proxy settings. |

#### Realistic input examples

```json
{
    "enableSearch": true,
    "searchTasks": [
        { "category": "Personal Trainers", "location": "Austin, TX", "maxResults": 25 },
        { "category": "Wedding Photographers", "location": "Chicago, IL", "maxResults": 25 }
    ],
    "enableLeadDetails": true,
    "concurrency": 3
}
```

```json
{
    "enableSearch": true,
    "searchTasks": [
        { "category": "Accountants", "location": "London", "maxResults": 20 }
    ],
    "enableLeadDetails": false
}
```

```json
{
    "enableScrapeByUrl": true,
    "scrapeUrls": [
        "https://www.bark.com/en/us/company/trans-america/ak0D1/"
    ],
    "enableLeadDetails": true
}
```

### Output field reference

One dataset row per professional. All fields may be absent unless noted.

| Field | Type | Description |
| --- | --- | --- |
| `type` | string | Always `"pro"`. |
| `platform` | string | Always `"bark"`. |
| `featureType` | string | `search` or `scrape_by_url`. |
| `name` | string | Business / professional name. |
| `profileUrl` | string | Bark profile URL. |
| `profileId` | string | Short profile id from the URL. |
| `category` | string | Category this row was collected under. |
| `description` | string | Business description (card blurb, or full About text with lead details). |
| `imageUrl` | string | Logo/avatar image URL. |
| `rating` | number | Rating 0–5. |
| `reviewCount` | integer | Number of public reviews. |
| `certificateOfExcellence` | boolean | Bark Certificate of Excellence badge. |
| `cardLocation` | string | Location line as listed on the card. |
| `city` / `state` / `country` | string | Parsed location parts. |
| `categories` | string\[] | Every service category listed on the profile (lead details). |
| `responseTime` | string | e.g. `"20 min response time"` (lead details). |
| `hiresOnBark` | integer | Completed hires on Bark (lead details). |
| `servicesRemotely` | boolean | Offers remote services (lead details). |
| `cardReviews` | array | Public review highlights: author, rating, date, text. |
| `website` | string | Business website (lead details, when discoverable). |
| `email` / `emails` | string / string\[] | Contact emails from the business website (lead details). |
| `socials` | string\[] | Social profile URLs (lead details). |
| `instagram` / `facebook` / `linkedin` / `twitter` | string | One handle per network (lead details). |
| `searchLocation` / `searchTaskIndex` / `searchTaskLabel` | mixed | Which search task produced this row. |
| `leadDetails` | boolean | Lead details pass ran for this row. |
| `detailsFetched` | boolean | Full profile details were fetched for this row. |
| `scrapedAt` | string | ISO timestamp of collection. |

Run-level metadata (totals, duration, errors, spend/paywall status) is written to the `OUTPUT` key-value store entry.

### Webhook guide

Set **Webhook URL** and each record is pushed to your URL the moment it is saved, in addition to the dataset.

**JSON format** — the full record object, exactly as stored in the dataset:

```json
{
    "type": "pro",
    "platform": "bark",
    "featureType": "search",
    "name": "Lanyap Financial Services",
    "profileUrl": "https://www.bark.com/en/us/company/lanyap-financial-services/0mJlK/",
    "category": "Accountants",
    "rating": 5,
    "reviewCount": 7,
    "city": "New York",
    "scrapedAt": "2026-09-29T12:00:00.000Z"
}
```

**Slack format** — a ready-to-post Slack message:

```json
{ "text": ":briefcase: *Lanyap Financial Services*\n*Category:* Accountants  •  *Location:* New York\n*Rating:* 5★ (7 reviews)\n<https://www.bark.com/en/us/company/lanyap-financial-services/0mJlK/|View profile>" }
```

Works with Slack incoming webhooks, Zapier, Make, n8n, Google Sheets apps and any custom receiver. Delivery failures never stop the run.

### MCP / AI-agent usage

Connect the [Apify MCP Server](https://docs.apify.com/platform/integrations/mcp) and ask:

> *"Find 10 accountants in New York with a 4.5+ rating and their websites, and put them in a table."*

The agent runs this Actor with the matching search task and lead details enabled, then reads the dataset.

### FAQ

**Do I need my own proxies?** No. Apify residential proxies (US) are used by default and are included in your platform usage. You can point the proxy settings at your own provider if you prefer.

**How fresh is the data?** Every run collects live directory data at the moment you press Start — nothing is cached between runs.

**What do free Apify plans get?** A small sample of results per run (2 rows by default). Paid plans get the full, unlimited export. The run summary always states whether a cap was applied.

**Why do some rows have no website or email?** Not every business publishes contact details on its profile or website. Rows are never filtered out — you always see every professional the search found, with whatever details are discoverable.

**Does location have to be exact?** Use `City, ST` for US cities (e.g. `New York, NY`) or a plain city name elsewhere (`London`). If a listing can't be found for a task, the run logs it clearly and moves on.

# Actor input Schema

## `enableSearch` (type: `boolean`):

Search the Bark directory by service category and city. Enabled by default. NOTE: free Apify plans are limited to a small sample of results per run — upgrade to a paid plan for full, unlimited data.

## `searchTasks` (type: `array`):

One row per search: pick a service category and give a city. Click "+ Add" for every additional search. "Max results" governs that one row; the run cap governs the whole run.

## `enableScrapeByUrl` (type: `boolean`):

Collect full details for specific Bark profile URLs instead of (or in addition to) directory searches.

## `scrapeUrls` (type: `array`):

Bark profile URLs (https://www.bark.com/en/us/company/... or /en/us/b/...).

## `enableLeadDetails` (type: `boolean`):

Enrich every result with full profile details: business website, contact emails, and social profiles when discoverable. Every result is still exported even when no lead details are found — nothing is filtered out. Adds a little extra time per result.

## `concurrency` (type: `integer`):

How many lead-details enrichments run in parallel (1–4). Higher is faster but a bit harder on rate limits.

## `webhookUrl` (type: `string`):

Every record is always saved to the run's dataset — a webhook is an ADDITIONAL real-time push. When set, each new record is also POSTed to this URL (CRM, Slack incoming webhook, Zapier, Make, Google Sheets).

## `webhookFormat` (type: `string`):

json = full record object; slack = Slack-friendly message payload.

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

Apify residential proxy (US) is enabled by default for reliable results.

## Actor input object example

```json
{
  "enableSearch": true,
  "searchTasks": [
    {
      "category": "Accountants",
      "location": "New York, NY",
      "maxResults": 10
    }
  ],
  "enableScrapeByUrl": false,
  "scrapeUrls": [],
  "enableLeadDetails": false,
  "concurrency": 3,
  "webhookUrl": "",
  "webhookFormat": "json",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

## `allResults` (type: `string`):

Complete dataset with every row from all enabled features in this run.

## `search` (type: `string`):

Rows from directory search.

## `runSummary` (type: `string`):

Run metadata: totals, duration, errors, spending-limit and free-tier (paywall) status.

# 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 = {
    "enableSearch": true,
    "searchTasks": [
        {
            "category": "Accountants",
            "location": "New York, NY",
            "maxResults": 10
        }
    ],
    "enableLeadDetails": false,
    "concurrency": 3,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("b2b_leads/bark-real-time-data-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 = {
    "enableSearch": True,
    "searchTasks": [{
            "category": "Accountants",
            "location": "New York, NY",
            "maxResults": 10,
        }],
    "enableLeadDetails": False,
    "concurrency": 3,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("b2b_leads/bark-real-time-data-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 '{
  "enableSearch": true,
  "searchTasks": [
    {
      "category": "Accountants",
      "location": "New York, NY",
      "maxResults": 10
    }
  ],
  "enableLeadDetails": false,
  "concurrency": 3,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call b2b_leads/bark-real-time-data-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,b2b_leads/bark-real-time-data-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/2CyLLXgQbaGaRaxhB/builds/cG1fxDphcoZNbrHo4/openapi.json
