# The Bash Vendor Scraper — DJs, Bands, Photographers & More (`scrapersdelight/thebash-scraper`) Actor

Scrape The Bash (thebash.com) event vendors by city & category — DJs, live bands, photographers, caterers & 100+ more — with rating, reviews, starting price, bookings & profile URL. Monitor mode + Slack/email/webhook alerts for new listings. No login or API key. From $4 per 1,000 vendors.

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

## Pricing

Pay per event

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?

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

## 🎧 The Bash Vendor Scraper — DJs, Bands, Photographers & More

**Pull every event vendor on The Bash (thebash.com, formerly GigMasters) for any US city + category — DJs, live bands, photographers, caterers, comedians, magicians, bartenders, photo booths and 100+ more — with rating, review count, starting price, verified bookings and profile URL. Optionally enrich each vendor with their full profile (geo coordinates, member-since date, price range, services, awards, and up to 10 full reviews with scores). Run it on a schedule to catch new vendors the day they list.**

No login, no API key, no HTML guessing — The Bash server-renders all vendor data as JSON, so runs are fast and reliable.

***

### Why this one

The Bash is one of the biggest US event-vendor marketplaces (it's owned by The Knot Worldwide), and no other Apify actor covers it:

- ✅ **25 full vendor records per page**, parsed from the site's own JSON — no fragile selectors
- ✅ **Starting price + price period** (e.g. `$900 per event`) — rare public pricing signal for the events niche
- ✅ **Verified bookings + days since last booking** — see who's actually active
- ✅ **Detail enrichment**: latitude/longitude, member-since, full price range, services offered, awards, full review text with 5 score dimensions
- ✅ A **new-vendor monitor** with Slack / email / webhook alerts

**Honest note:** The Bash gates vendor phone + email behind its quote form — they are not public, so this actor does not promise contact fields. It's lead-gen by profile: name, city, price, reviews, activity and a direct profile link. (Venue-type listings occasionally expose a contact; when present it's passed through as `venue_email` / `venue_phone`.)

***

### What you get (per vendor)

`name` · `category` · `city` · `state` · `rating` · `review_count` · **`starting_price`** + `price_period` · **`bookings`** · `days_since_last_booking` · `background_verified` · `membership_level` · `photo_count` / `video_count` · `description` · `thumbnail_url` · `first_video_url` · `travel_distance_miles` · `profile_url` · `is_new` · `scraped_at`

With **Fetch profile details** on, each vendor also gets: `latitude` / `longitude` · `member_since` · `date_added` · `verified_bookings` · `price_low` / `price_high` · `services[]` · `gigs_desired[]` · `awards[]` · `full_description` · `reviews[]` (text + satisfaction/recommend/professionalism/talent scores).

#### Example output

```json
{
  "member_id": 121803,
  "name": "Joel Guerrero - DJ / MC",
  "category": "DJ",
  "city": "Bay Shore",
  "state": "NY",
  "rating": 5,
  "review_count": 24,
  "starting_price": 900,
  "price_period": "per event",
  "bookings": 52,
  "days_since_last_booking": 27,
  "background_verified": false,
  "membership_level": "Basic",
  "profile_url": "https://www.thebash.com/dj/joelguerrero",
  "record_id": "thebash-121803",
  "source": "The Bash",
  "scraped_at": "2026-06-12T18:00:00.000Z"
}
```

Export to CSV/JSON/Excel or pull via the Apify API into your CRM, Clay, n8n, or Make.

***

### Input

| Field | Type | Default | What it does |
|-------|------|---------|--------------|
| `city` | string | `New York, NY` | City + state ("Austin, TX") or The Bash slug ("austin-tx"). Small towns auto-roll up to their metro. |
| `category` | string | `dj` | Friendly name (dj, band, photographer, caterer, bartender, comedian, magician, photo-booths, …) or any raw slug from thebash.com/services. |
| `maxItems` | integer | `50` | Cap on vendors per run. `0` = every vendor in the city. |
| `fetchDetails` | boolean | `false` | Fetch each profile page for geo, member-since, full reviews, awards, services. |
| `concurrency` | integer | `5` | Parallel profile fetches (detail mode). |
| `monitorMode` | boolean | `false` | Output/alert ONLY vendors not seen in prior runs (per city+category). |
| `alertOnNewListing` | boolean | `true` | In monitor mode, alert for each new vendor. |
| `webhookUrl` / `slackWebhookUrl` / `emailRecipients` | — | — | Where new-vendor alerts go. |
| `proxyConfiguration` | object | Apify proxy | Datacenter rotation worked in testing; use residential if you see 403s at scale. |

#### Quick start

```json
{ "city": "New York, NY", "category": "dj", "maxItems": 50 }
```

#### Full pull with details

```json
{ "city": "Los Angeles, CA", "category": "photographer", "maxItems": 0, "fetchDetails": true }
```

#### Daily new-vendor monitor

```json
{ "city": "Austin, TX", "category": "band", "maxItems": 0, "monitorMode": true, "slackWebhookUrl": "https://hooks.slack.com/services/%E2%80%A6" }
```

**Popular categories:** dj · wedding-dj · latin-dj · band (live bands) · jazz-band · mariachi-band · photographer · videographer · caterer · bartender · comedian · magician · photo-booths · singer · guitarist · violinist · face-painting · balloon-twister · caricaturist · santa-claus · clown — plus any raw slug from [thebash.com/services](https://www.thebash.com/services).

***

### Who it's for

- 🎯 **Event-tech / SaaS** selling to DJs, bands, photographers, caterers — build account lists with real activity + price signals
- 📣 **Agencies & lead-gen** in the events/wedding space — qualify by rating, bookings, and price tier
- 🎤 **Vendors** benchmarking competitors' pricing and reviews in their market
- 📊 **Market researchers** mapping vendor supply, pricing, and category density by city

***

### Pricing (pay-per-event)

| Event | What it covers | Price |
|-------|----------------|-------|
| `lot-scraped` | each vendor record returned | $0.004 (= $4 / 1,000) |
| `lot-detail-enriched` | each profile page enriched | $0.004 |
| `monitor-run-completed` | each scheduled watch run | $0.05 |
| `new-lot-detected` | each newly listed vendor | $0.02 |
| `alert-delivered` | each Slack/email/webhook alert | $0.005 |

A default run (50 NYC DJs, no details) costs about **$0.20**.

***

### Monitor / alert setup

1. Run once with `monitorMode: true` — this seeds the baseline (every vendor counts as new on the first run).
2. Add an **Apify Schedule** (e.g. daily) with the same input.
3. Each later run outputs and alerts **only vendors that weren't there before**. State is kept per city+category in a named key-value store (`thebash-scraper-state`), so it survives across runs — no double alerts.
4. Point `slackWebhookUrl`, `webhookUrl`, or `emailRecipients` at your channel/endpoint/inbox.

***

### FAQ

**Does it return phone numbers or emails?** No — The Bash gates vendor contact behind its quote form; nothing public exists to scrape. You get the full business profile (name, city, price, rating, reviews, activity) plus the profile URL. Venue-type listings occasionally expose a contact, which is passed through.

**Which cities work?** Any US/Canada city The Bash serves (thousands). Use "City, ST" — the site rolls small towns up to the nearest metro automatically and the actor follows.

**Which categories work?** 100+ — every slug on thebash.com/services. The friendly names above cover the big ones; any raw slug works too.

**How fresh is the data?** Live — every run hits the site directly. `days_since_last_booking` tells you how active each vendor is.

**How fast is it?** ~25 vendors per request. 50 vendors ≈ a few seconds; a full city with details ≈ a couple of minutes.

**Does monitor mode double-charge?** No — it remembers what it's seen (named store) and emits each vendor once.

**Can I get review text?** Yes — turn on `fetchDetails` for up to 10 full reviews per vendor with satisfaction/recommend/professionalism/talent scores.

**What about anti-bot?** The Bash sits behind Akamai, but it's a header-fingerprint filter, not a CAPTCHA. The actor sends a clean browser profile and paces requests; datacenter proxy worked throughout testing.

**Is this legal?** It scrapes only publicly displayed marketplace data (no login, no contact harvesting). You are responsible for how you use the data — follow The Bash's ToS and applicable laws for your use case.

**Can it do multiple cities/categories?** One city+category per run keeps monitor scopes clean — fan out with multiple scheduled runs or task copies.

# Actor input Schema

## `city` (type: `string`):

The city + state to pull vendors for. Accepts 'New York, NY' or The Bash slug 'new-york-ny'. The site auto-rolls small towns up to their metro.

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

What kind of vendor. Friendly names: dj, wedding-dj, latin-dj, band (live bands), jazz-band, mariachi-band, photographer, videographer, caterer, bartender, comedian, magician, photo-booths, singer, guitarist, violinist, face-painting, balloon-twister, caricaturist, santa-claus, clown — or any raw The Bash category slug from thebash.com/services.

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

Cap on vendors per run (25 per listing page). Set 0 to pull every vendor in the city.

## `fetchDetails` (type: `boolean`):

Also fetch each vendor's profile page: latitude/longitude, member-since date, verified bookings, full price range, services offered, awards, and up to 10 full reviews with scores. One extra request per vendor.

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

How many profile pages to fetch in parallel (detail mode).

## `monitorMode` (type: `boolean`):

Recurring watcher: diff against the prior run (per city+category scope) and output/alert ONLY new vendors. Pair with an Apify Schedule.

## `alertOnNewListing` (type: `boolean`):

In monitor mode, send an alert for each newly listed vendor.

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

POST endpoint for new-vendor alerts.

## `slackWebhookUrl` (type: `string`):

Slack incoming-webhook URL.

## `emailRecipients` (type: `array`):

Emails for the new-vendor digest (via apify/send-mail).

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

Proxy settings. The Bash sits behind Akamai but passes with a clean browser fingerprint — datacenter rotation worked in testing; switch to residential if you see 403s at scale.

## `diagnose` (type: `boolean`):

Dev only. Logs the first parsed vendor (with detail enrichment), then exits.

## Actor input object example

```json
{
  "city": "New York, NY",
  "category": "dj",
  "maxItems": 50,
  "fetchDetails": false,
  "concurrency": 5,
  "monitorMode": false,
  "alertOnNewListing": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "diagnose": false
}
```

# Actor output Schema

## `vendors` (type: `string`):

The dataset of event vendors (one item per vendor).

# 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 = {
    "city": "New York, NY",
    "category": "dj",
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapersdelight/thebash-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 = {
    "city": "New York, NY",
    "category": "dj",
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("scrapersdelight/thebash-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 '{
  "city": "New York, NY",
  "category": "dj",
  "maxItems": 50
}' |
apify call scrapersdelight/thebash-scraper --silent --output-dataset

```

## MCP server setup

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