# Salon & Spa Lead Finder - Vagaro, Boulevard, Booksy, Fresha (`seibs.co/salon-spa-lead-finder`) Actor

Enriched Google Maps leads for US independent hair salons, barbershops, nail salons, day spas, med spas, and lash/brow studios. Detects booking/POS (Vagaro, Boulevard, Booksy, Fresha, GlossGenius, Phorest, Mindbody, Square). Major franchises pre-blocked.

- **URL**: https://apify.com/seibs.co/salon-spa-lead-finder.md
- **Developed by:** [Seibs.co](https://apify.com/seibs.co) (community)
- **Categories:** Lead generation, Business, Automation
- **Stats:** 7 total users, 4 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 base lead records

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 a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## Salon & Spa Lead Finder

<!-- TOP-SELL-START -->
> **TL;DR for B2B SaaS, beauty supply, and salon-tech sales reps selling INTO independent salons, spas, barbershops, and nail salons:** Pulls US independent salons, spas, barbershops, nail salons, lash studios, and med-spas from Google Maps with detected booking and PMS software (Boulevard, Vagaro, Mindbody, Booker, Square Appointments, Booksy, GlossGenius, Phorest, Mangomint, Fresha). Compared to compass/crawler-google-places, you get vertical booking-software detection plus chains and franchises (Great Clips, Supercuts, Sport Clips, Massage Envy, European Wax Center, Hand and Stone, Drybar, Ulta, Sephora) pre-blocked. Free Apify plan returns about 1,000 leads per month on your $5 platform credit, then demo samples plus an upgrade message. Upgrade to Apify Starter ($49/mo) for unlimited volume.

### Run it in 30 seconds

```python
## Via the Apify Python SDK
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("seibs.co/salon-spa-lead-finder").call(run_input={
    "search_terms": [
        "hair salon",
        "nail salon"
    ],
    "locations": [
        "Los Angeles, CA"
    ],
    "enrichment_tier": "premium",
    "max_results_per_query": 50
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
````

Or via curl:

```bash
curl -X POST "https://api.apify.com/v2/acts/seibs.co~salon-spa-lead-finder/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"search_terms": ["hair salon", "nail salon"], "locations": ["Los Angeles, CA"], "enrichment_tier": "premium", "max_results_per_query": 50}'
```

Or click "Try for free" on this page if you prefer the no-code UI.

### What you get

Each run produces:

- A clean dataset, filterable in the Apify console and downloadable as CSV or JSON
- An OUTPUT.html dashboard preview of your top records
- A sample-output preview at [`.actor/sample-output.json`](./.actor/sample-output.json)

Per-archetype custom artifacts shipped with this actor:

- top-leads.csv (HubSpot-ready columns, sorted by confidence\_score)
- cold-email-templates.html (per-booking-software pitch with copy-to-clipboard buttons)
- stack-breakdown.csv (booking, payments, retail POS per record)

***

### What does Salon & Spa Lead Finder do?

Pulls Google Maps listings for US independent hair salons, barbershops, nail salons, day spas, med spas, and lash/brow studios, then enriches each record with website-derived signals: emails, social profiles, booking and POS platforms (Vagaro, Boulevard, Booksy, Fresha, GlossGenius, Phorest, Mindbody, Square), online booking embeds, owner names, year founded, and certifications. Major franchises are pre-blocked so the dataset stays focused on independent operators.

### Features

- Google Maps lead extraction across 8 salon / spa types
- Major franchises pre-blocked
- Three pay-as-you-go enrichment tiers (base, email, premium)
- Booking / POS detection (Vagaro, Boulevard, Booksy, Fresha, GlossGenius, Phorest, Mindbody, Square Appointments)
- Online booking embed detection (Calendly, Acuity, Vagaro, Mindbody, Schedulicity, etc.)
- Role-bucketed emails (sales, support, billing, hr, executive, marketing)
- Owner names, employee count, year founded, certifications
- Schema.org JSON-LD parsing
- Confidence score per record for quality filtering

### What you get

Real production output from a sample run on **Smooshine** (Austin, Texas):

```json
{
  "name": "Smooshine",
  "service_line": "hair_salon",
  "address": {
    "city": "Austin",
    "state": "Texas",
    "zip": "78705",
    "lat": 30.2973862,
    "lng": -97.7417076
  },
  "phone": "(512) 585-6919",
  "website": "http://www.smooshine.com/",
  "rating": 4.9,
  "reviews_count": 666,
  "enrichment": {
    "tier": "premium",
    "social": {
      "instagram": "https://www.instagram.com/mastercam.austin"
    },
    "tech_stack": [
      "fresha",
      "wix",
      "google_tag_manager"
    ],
    "year_founded": 1999,
    "homepage_title": "The X Team | Smooshine",
    "homepage_status": 200
  }
}
```

### Preview (real production data)

Single-record snapshot from the same run, rendered as a table:

| Field | Value |
|---|---|
| **Name** | Smooshine |
| **Service line** | hair\_salon |
| **Location** | Austin, Texas |
| **Phone** | (512) 585-6919 |
| **Website** | http://www.smooshine.com/ |
| **Rating** | 4.9 (666 reviews) |
| **Tech stack detected** | fresha, wix, google\_tag\_manager |
| **Year founded** | 1999 |
| **Social channels** | instagram |

***

### Pricing â€" Pay Per Event

| Event | Price | When charged |
|---|---|---|
| Base record | $0.004 | Always |
| Email enrichment | + $0.004 | Email scraped from website |
| Premium signals | + $0.007 | Booking/pos (vagaro, boulevard, booksy, fresha, glossgenius, phorest, mindbody) or marketplace presence detected |

**Effective:** $0.004 base / $0.008 with email / $0.015 fully enriched.

***

### Use cases

Find indie salons in a metro on no detected booking platform â€" that's your no-stack outbound for Vagaro, Boulevard, Booksy. Filter by city + salon type for hyper-targeted lists.

Buyers include: Vagaro, Boulevard, Booksy, Fresha, GlossGenius, Phorest, Mindbody competitors; beauty-PE rollups; product distributors.

***

### FAQ

**Q: Is this legal?**
A: Yes. Every field is sourced from publicly accessible Google Maps listings and public salon / spa websites. No logged-in scraping, no booking-platform back-end access, no data the business did not publish itself.

**Q: Why might a run fail or return zero records?**
A: The most common cause is the Apify free-plan compute / proxy credit ceiling on large premium runs. The actor soft-fails by default â€" it writes whatever was already enriched and exits cleanly rather than throwing. If a paid run errors, check the log for rate-limit or proxy-bandwidth messages.

**Q: Why are Sport Clips, Great Clips, Supercuts, Massage Envy etc excluded?**
A: We target boutique independents and small chains because that is where the booking, POS, and marketing-SaaS TAM lives. National chains run enterprise contracts at the brand level â€" individual locations cannot adopt Vagaro / Boulevard / Booksy on their own. They are pre-blocked when `exclude_chains: true`.

**Q: How fresh is the data?**
A: Live at run time. Google Maps listings reflect the current snapshot; website enrichment reflects the homepage as of `scraped_at`. No stale cache.

**Q: Can I schedule daily or weekly runs?**
A: Yes. Apify Schedules can run this actor on any cron interval. Pair with a webhook to push only new salons or changed booking platforms into your CRM.

**Q: Does it integrate with my CRM?**
A: Yes â€" via Zapier, Make, n8n, or direct webhook. Records map cleanly into HubSpot, Salesforce, Pipedrive, Clay, Apollo, and Instantly. See Integrations below.

**Q: What does it cost in practice?**
A: $0.004 base, $0.008 with email, $0.015 fully enriched. A statewide independent-salon run typically lands in the $20-50 range.

***

### Related Actors

Pair this actor with adjacent SEIB intelligence for richer beauty / wellness outbound:

- [Google Maps Reviews Pro](https://apify.com/seibs.co/google-maps-reviews-pro) â€" pull review velocity and sentiment to rank salons by growth or churn-risk
- [B2B Sales Triggers](https://apify.com/seibs.co/b2b-sales-triggers) â€" detect funding, leadership changes, and hiring spikes to time the pitch

***

### Integrations

```
- Zapier â€" push to HubSpot/Salesforce/Pipedrive/Apollo
- Make.com (formerly Integromat) â€" workflow automation
- n8n â€" self-hosted automation
- Apify webhooks â€" POST to your endpoint
- API + dataset export (JSON/CSV/Excel/XML)
- MCP / AI agents â€" call from Claude/GPT/LangChain
```

***

### Salon / spa types covered

`hair_salon | barbershop | nail_salon | day_spa | med_spa | lash_brow | tanning_salon | wellness_massage`

***

### What this actor does NOT do (v1)

- No SMTP-level email validation
- No phone validation
- No screenshots
- No non-US geographies
- No data the source business didn't make public

***

### Example: 1,000 records across major Texas metros

```json
{
  "search_terms": ["hair salon"],
  "locations": ["Austin, TX", "Dallas, TX", "Houston, TX", "San Antonio, TX", "Fort Worth, TX"],
  "max_results_per_query": 100,
  "enrichment_tier": "premium",
  "service_lines": [],
  "exclude_chains": true
}
```

Cost ceiling: 5 cities Ã- 100 = 500 raw records â†' ~350 after chain filter â†' at $0.015 fully enriched = **~$5-8 for a metro-wide independent salon / spa types list with platform stack mapped**.

***

### Input

Configure the run from the Apify Console form or via the API. Key fields:

| Field | Type | Description |
|---|---|---|
| `search_terms` | array | Google Maps queries, e.g. `["hair salon", "barbershop", "nail salon"]` |
| `locations` | array | US locations, e.g. `["Austin, TX", "78701"]` |
| `max_results_per_query` | int | Cap per (term \* location) tuple, max 500 |
| `enrichment_tier` | string | `base`, `email`, or `premium` |
| `service_lines` | array | Filter to: `hair_salon`, `barbershop`, `nail_salon`, `day_spa`, `med_spa`, `lash_brow`, `tanning_salon`, `wellness_massage` |
| `exclude_chains` | boolean | Drop major franchises (Supercuts, Great Clips, etc.) (default true) |
| `max_concurrent_enrichments` | int | Parallel website fetches, default 8 |

Sample input:

```json
{
  "search_terms": ["hair salon"],
  "locations": ["Austin, TX"],
  "max_results_per_query": 25,
  "enrichment_tier": "premium",
  "service_lines": ["hair_salon"],
  "exclude_chains": true
}
```

### Output

**Sample output:** [`.actor/sample-output.json`](./.actor/sample-output.json) â€" copy-paste-ready preview of real-looking records.

First record inline:

```json
{
  "place_id": "ChIJY2W0UySwQuOsMqKoImGkEiCgAe8",
  "name": "Velvet Petal Salon & Spa",
  "category": "Hair salon",
  "vertical": "salon_spa",
  "service_line": "hair_salon",
  "address": {
    "street": "6534 Main St",
    "city": "Scottsdale",
    "state": "AZ",
    "zip": "85251",
    "country": "US",
    "lat": 33.5272,
    "lng": -111.9381
  },
  "phone": "(480) 555-1069",
  "phone_e164": "+14805550169",
  "website": "https://velvetpetalsalon.com/",
  "google_maps_url": "https://www.google.com/maps/place/?q=place_id:ChIJY2W0UySwQuOsMqKoImGkEiCgAe8",
  "rating": 4.9,
  "reviews_count": 184,
  "hours": {
    "mon": "8:00 AM - 6:00 PM",
    "tue": "8:00 AM - 6:00 PM",
    "wed": "8:00 AM - 6:00 PM",
    "thu": "8:00 AM - 6:00 PM",
    "fri": "8:00 AM - 5:00 PM",
    "sat": "Closed",
    "sun": "Closed"
  },
  "claimed": true,
  "scraped_at": "2026-05-10T10:23:10Z",
  "confidence_score": 0.62,
  "enrichment": {
    "tier": "premium",
    "emails": [
      "info@velvetpetalsalon.com",
      "hello@velvetpetalsalon.com"
    ],
    "social": {
      "facebook": "https://www.facebook.com/velvetpetalsalon",
      "instagram": "https://www.instagram.com/velvetpetalsalon",
      "linkedin": "https://www.linkedin.com/company/velvetpetalsalon"
    },
    "tech_stack": [
      "vagaro",
      "google_tag_manager",
      "boulevard_studio",
      "stripe"
    ],
    "license_numbers": [
      "AZ-100960"
    ],
    "service_area_mentions": [
      "Scottsdale",
      "Phoenix",
      "Tempe"
    ],
    "year_founded": 2014,
    "fleet_hints": [],
    "homepage_title": "Velvet Petal Salon & Spa | Scottsdale, AZ",
    "homepage_status": 200,
    "bbb": {
      "accredited": true,
      "rating": "A+"
    },
    "open_24_7": false,
    "licensed_bonded_insured": false,
    "locations_count": 2,
    "spanish_speaking": false,
    "linkedin_company": "https://www.linkedin.com/company/velvetpetalsalon",
    "yelp_url": "https://www.yelp.com/biz/velvetpetalsalon-scottsdale",
    "third_party_reviews": [],
    "press_mentions": [],
    "awards": [],
    "team_size_hints": [
      "5 team members"
    ],
    "owner_names": [
      "Maria Chen"
    ],
    "employee_count": 8,
    "role_emails": {
      "executive": [
        "mchen@velvetpetalsalon.com"
      ],
      "billing": [
        "billing@velvetpetalsalon.com"
      ],
      "support": [
        "support@velvetpetalsalon.com"
      ],
      "generic": [
        "info@velvetpetalsalon.com"
      ]
    },
    "financing_processors": [
      "affirm",
      "klarna"
    ],
    "payment_processors": [
      "stripe"
    ],
    "hiring_signals": {
      "actively_hiring": true,
      "indicators": [
        "careers page link",
        "we're hiring banner"
      ]
    },
    "insurance_carriers_accepted": [],
    "languages_offered": [],
    "online_booking_platforms": [
      "calendly",
      "vagaro",
      "boulevard_studio"
    ],
    "customer_count_signals": {
      "customers_served": 1500,
      "reviews_count": 184,
      "projects_completed": null,
      "locations_served": null,
      "raw_matches": [
        "Trusted by 1500+ clients"
      ]
    },
    "chatbot_platforms": [
      "intercom"
    ],
    "email_marketing_platforms": [
      "mailchimp"
    ],
    "lead_capture_ctas": {
      "has_free_quote_cta": true,
      "has_get_started_cta": true,
      "has_appointment_booking": true,
      "has_callback_request": true,
      "has_contact_form": true,
      "cta_count": 3
    },
    "mobile_app_links": {
      "has_ios_app": false,
      "has_android_app": false,
      "ios_app_id": null,
      "android_app_id": null
    },
    "certifications_credentials": [
      "State Cosmetology License"
    ],
    "financing_accepted": [
      "credit_card",
      "cash",
      "bnpl"
    ],
    "growth_signals": {
      "growth_score": 0.4,
      "components": {
        "hiring": 0.6,
        "employee_scale": 0.4,
        "multi_location": 0.5
      },
      "indicators_count": 2
    },
    "jsonld": {
      "name": "Velvet Petal Salon & Spa",
      "phone": "(480) 555-1069",
      "email": "info@velvetpetalsalon.com",
      "address": {
        "street": "6534 Main St",
        "city": "Scottsdale",
        "region": "AZ",
        "zip": "85251"
      },
      "opening_hours": [
        "Mo-Fr 08:00-18:00"
      ],
      "social_urls": [
        "https://www.facebook.com/velvetpetalsalon",
        "https://www.instagram.com/velvetpetalsalon"
      ],
      "aggregate_rating": {
        "rating": 4.9,
        "count": 184
      },
      "employee_count": 8,
      "founders": [
        "Maria Chen"
      ]
    }
  }
}
```

Each dataset item is a single salon or spa with the structure shown above in **What you get**. The Apify Console renders two views: **Overview** for a quick scan of name, location, phone, rating, and key enrichment signals, and **Detailed** for every field on every record. Records can also be downloaded as CSV, JSON, Excel, or HTML from the Storage tab.

### FAQ

**Q: Where does the data come from?**
A: Public Google Maps listings plus public salon/spa website content (homepage, services, contact, about pages). No logged-in scraping.

**Q: Are the emails verified?**
A: Format-validated and TLD-filtered, but not SMTP-verified. Pipe through NeverBounce or ZeroBounce before cold outreach.

**Q: Why are some records missing enrichment fields?**
A: Enrichment is best-effort and depends on what the salon publishes on its public website. Use the confidence\_score to filter for richer records.

**Q: What is the rate limit?**
A: Throttled by Google Maps response time and the max\_concurrent\_enrichments setting (default 8). Plan ~1-2 records per second per concurrent worker.

**Q: Can I include franchise locations?**
A: Yes, set `exclude_chains: false`. Default is true.

### Save your input as an Apify Task

Apify Tasks let you save a configured input once and re-run it with a single click - no need to re-type search terms, locations, filters, or tier settings every time. Tasks are the foundation for everything that comes next: schedules, monitor mode, and webhook routing all attach to a saved Task, not to the raw actor.

Steps to save your current input as a Task:

1. On this actor's Apify Store page, click `Run` with your input fully configured.
2. Click the `Save as task` button at the top of the run page.
3. Name the task something memorable (e.g. `Salons in Brooklyn, NY - weekly`).
4. Reload the task page and click `Start` anytime to re-run with the same inputs.

Tasks unlock the next two features below: scheduling and monitor mode.

### Run this weekly with Apify Schedules

Apify Schedules cron-run any saved Task automatically. Pair this with the saved Task above and you get hands-off recurring runs with no manual clicks, no missed weeks, and a steady stream of fresh data into your CRM or warehouse.

Steps to schedule a Task:

1. Save your input as a Task (see above).
2. Go to https://console.apify.com/schedules and click `Create new schedule`.
3. Pick your Task and set the cron expression. Common patterns:
   - Daily at 9am UTC: `0 9 * * *`
   - Weekly on Mondays at 9am: `0 9 * * 1`
   - Monthly on the 1st: `0 9 1 * *`
4. Save. Apify will run your Task on that schedule automatically, push the dataset to whatever integrations you have wired up, and fire run-completion webhooks for downstream automation.

Run weekly to keep your prospect list fresh and catch newly-opened salons and spas in your service area.

### Monitor mode (v2, beta)

Monitor mode is the v2 evolution of this actor and is currently in BETA. It turns a recurring schedule into a true change-feed instead of a firehose of duplicate records.

How it works:

- When this actor runs under an Apify Schedule, monitor mode is enabled automatically.
- Instead of emitting ALL records every run, it emits ONLY records that are NEW or CHANGED since the last scheduled run.
- A digest record summarizes the delta (X new, Y changed, Z removed) at the top of every run.
- Optional: provide a Slack or email webhook URL in the `monitor_webhook_url` input field and the digest fires there too, so your team gets the delta in their inbox or channel without polling the dataset.
- Cost: a single `scheduled_delta_run` event ($0.05) per scheduled run, plus standard PPE on emitted delta records only. Predictable monthly cost, no surprise bills from re-charging for unchanged records.

Monitor mode is rolling out to the top 3 actors first (this one included if it's hotel-motel-lead-finder, google-maps-reviews-pro, or mcp-accounting-firm-leads). Full portfolio coverage by end of June.

### Support

Open an issue on this actor's GitHub or reach out via the Apify support page.

***

### More from the SEIB portfolio

Same data engine, different vertical â€" pick the one that matches your buyer:

- ðŸ"§ [Home Services Lead Finder](https://apify.com/seibs.co/home-services-lead-finder)
- ðŸ½ï¸ [Restaurants Lead Finder](https://apify.com/seibs.co/restaurant-lead-finder)
- ðŸš- [Auto Dealerships Lead Finder](https://apify.com/seibs.co/auto-dealership-lead-finder)
- ðŸ¦· [Healthcare Practices Lead Finder](https://apify.com/seibs.co/healthcare-practice-lead-finder)
- ðŸ§˜ [Fitness Studios Lead Finder](https://apify.com/seibs.co/fitness-studio-lead-finder)
- ðŸ"Š [Accounting Firms Lead Finder](https://apify.com/seibs.co/accounting-firm-lead-finder)
- ðŸ"© [Auto Repair Shops Lead Finder](https://apify.com/seibs.co/auto-repair-lead-finder)
- ðŸ-ï¸ [Construction Contractors Lead Finder](https://apify.com/seibs.co/contract-heavy-smb-lead-finder)
- ðŸ¨ [Hotels & Motels Lead Finder](https://apify.com/seibs.co/hotel-motel-lead-finder)
- âš-ï¸ [Law Firms Lead Finder](https://apify.com/seibs.co/law-firm-lead-finder)
- ðŸ¢ [Real Estate Brokerages Lead Finder](https://apify.com/seibs.co/real-estate-brokerage-lead-finder)

All 12 actors share the same Pay-Per-Event pricing ($0.004 base / $0.008 with email / $0.015 with premium signals) and output schema. Mix-and-match across verticals without translation logic. Built by [Seibs Management LLC](https://apify.com/seibs.co).

### Found this useful?

If this actor saved you time or money, please consider leaving a quick review on the Apify Store. Reviews help other buyers find work that solves their problem and let me prioritize the features paying customers actually use. Leave a review: https://apify.com/seibs.co/salon-spa-lead-finder#reviews

# Actor input Schema

## `search_terms` (type: `array`):

Google Maps search queries. Example: \['hair salon']. Up to 10 terms per run.

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

US locations. Format: 'City, ST' or ZIP. Up to 25 locations per run.

## `max_results_per_query` (type: `integer`):

Cap per (term × location) tuple. Hard ceiling 500. Hard max 100 to protect compute budget.

## `enrichment_tier` (type: `string`):

base = Maps profile only ($0.004/record). email = + scraped email ($0.008/record). premium = + platform/stack detection ($0.015/record). Default 'base' avoids per-record website-visit compute. Set 'premium' to enable deep tech-stack detection (incurs additional compute time).

## `service_lines` (type: `array`):

Restrict output to these types. Records that don't classify are dropped before enrichment.

## `exclude_chains` (type: `boolean`):

Drop records matching the built-in chain blocklist. Useful when targeting independents for SaaS sales.

## `max_concurrent_enrichments` (type: `integer`):

Parallel HTTP fetches against websites. 8 is safe.

## Actor input object example

```json
{
  "search_terms": [
    "hair salon"
  ],
  "locations": [
    "Austin, TX"
  ],
  "max_results_per_query": 50,
  "enrichment_tier": "base",
  "service_lines": [],
  "exclude_chains": true,
  "max_concurrent_enrichments": 4
}
```

# Actor output Schema

## `datasetItems` (type: `string`):

Narrow, token-efficient slice of every record. Consumer: LLM agents (Claude, GPT, LangChain tools), MCP hosts, dashboards. SDR-skim fields: name, vertical, service line, city, state, phone, email, website, confidence\_score.

## `datasetItemsDetailed` (type: `string`):

All fields for every record. Consumer: humans browsing the dataset in the Apify UI, RAG ingest pipelines, and full backups. Larger payload — not recommended as a direct LLM tool response.

## `datasetItemsUnwind` (type: `string`):

Same records, but each element of the `technologies` array is promoted to its own row. Consumer: Zapier / Make / n8n / Google Sheets users who want one row per item, and LLM agents that prefer flat rows over nested arrays.

## `datasetItemsMcp` (type: `string`):

First 50 overview records as a clean JSON array. Wrap on the agent side in an MCP tool-call response envelope, e.g. `{ "ok": true, "data": <this array>, "meta": { "actor": "salon-spa-lead-finder", "count": <len>, "view": "overview" } }`. Consumer: MCP servers, Claude Desktop, Cursor, OpenAI Assistants tool calls.

## `datasetItemsCsv` (type: `string`):

Spreadsheet-friendly export of the overview view. Consumer: humans, sales-ops teams, Excel / Google Sheets users.

# 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 = {
    "search_terms": [
        "hair salon"
    ],
    "locations": [
        "Austin, TX"
    ],
    "max_results_per_query": 50,
    "enrichment_tier": "base",
    "max_concurrent_enrichments": 4
};

// Run the Actor and wait for it to finish
const run = await client.actor("seibs.co/salon-spa-lead-finder").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 = {
    "search_terms": ["hair salon"],
    "locations": ["Austin, TX"],
    "max_results_per_query": 50,
    "enrichment_tier": "base",
    "max_concurrent_enrichments": 4,
}

# Run the Actor and wait for it to finish
run = client.actor("seibs.co/salon-spa-lead-finder").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 '{
  "search_terms": [
    "hair salon"
  ],
  "locations": [
    "Austin, TX"
  ],
  "max_results_per_query": 50,
  "enrichment_tier": "base",
  "max_concurrent_enrichments": 4
}' |
apify call seibs.co/salon-spa-lead-finder --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=seibs.co/salon-spa-lead-finder",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Salon & Spa Lead Finder - Vagaro, Boulevard, Booksy, Fresha",
        "description": "Enriched Google Maps leads for US independent hair salons, barbershops, nail salons, day spas, med spas, and lash/brow studios. Detects booking/POS (Vagaro, Boulevard, Booksy, Fresha, GlossGenius, Phorest, Mindbody, Square). Major franchises pre-blocked.",
        "version": "0.1",
        "x-build-id": "BzOekq9dNf0oSq3Jy"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/seibs.co~salon-spa-lead-finder/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-seibs.co-salon-spa-lead-finder",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/seibs.co~salon-spa-lead-finder/runs": {
            "post": {
                "operationId": "runs-sync-seibs.co-salon-spa-lead-finder",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/seibs.co~salon-spa-lead-finder/run-sync": {
            "post": {
                "operationId": "run-sync-seibs.co-salon-spa-lead-finder",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "search_terms",
                    "locations",
                    "enrichment_tier"
                ],
                "properties": {
                    "search_terms": {
                        "title": "Search terms",
                        "maxItems": 10,
                        "type": "array",
                        "description": "Google Maps search queries. Example: ['hair salon']. Up to 10 terms per run.",
                        "default": [
                            "hair salon"
                        ],
                        "items": {
                            "type": "string"
                        }
                    },
                    "locations": {
                        "title": "Locations",
                        "maxItems": 25,
                        "type": "array",
                        "description": "US locations. Format: 'City, ST' or ZIP. Up to 25 locations per run.",
                        "default": [
                            "Austin, TX"
                        ],
                        "items": {
                            "type": "string"
                        }
                    },
                    "max_results_per_query": {
                        "title": "Max results per query",
                        "minimum": 1,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Cap per (term × location) tuple. Hard ceiling 500. Hard max 100 to protect compute budget.",
                        "default": 50
                    },
                    "enrichment_tier": {
                        "title": "Enrichment tier",
                        "enum": [
                            "base",
                            "email",
                            "premium"
                        ],
                        "type": "string",
                        "description": "base = Maps profile only ($0.004/record). email = + scraped email ($0.008/record). premium = + platform/stack detection ($0.015/record). Default 'base' avoids per-record website-visit compute. Set 'premium' to enable deep tech-stack detection (incurs additional compute time).",
                        "default": "base"
                    },
                    "service_lines": {
                        "title": "Salon / spa types (optional filter)",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Restrict output to these types. Records that don't classify are dropped before enrichment.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "hair_salon",
                                "barbershop",
                                "nail_salon",
                                "day_spa",
                                "med_spa",
                                "lash_brow",
                                "tanning_salon",
                                "wellness_massage"
                            ]
                        },
                        "default": []
                    },
                    "exclude_chains": {
                        "title": "Exclude major chains / national franchises",
                        "type": "boolean",
                        "description": "Drop records matching the built-in chain blocklist. Useful when targeting independents for SaaS sales.",
                        "default": true
                    },
                    "max_concurrent_enrichments": {
                        "title": "Max concurrent website enrichments",
                        "minimum": 1,
                        "maximum": 8,
                        "type": "integer",
                        "description": "Parallel HTTP fetches against websites. 8 is safe.",
                        "default": 4
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
