# Vet Practice M\&A Targets — buyer-mapped acquisition leads (`kazkn/vet-mna-actor`) Actor

50-state US vet practice acquisition leads. Each scored 1-10 on M\&A readiness, mapped to its most likely PE buyer (NVA / VetCor / BluePearl / Mars / Regional). ~14K independent clinics. Pay-per-result. The only vet-vertical M\&A actor on Apify Store.

- **URL**: https://apify.com/kazkn/vet-mna-actor.md
- **Developed by:** [KazKN](https://apify.com/kazkn) (community)
- **Categories:** Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $1,000.00 / 1,000 qualified vet practice (score ≥ 7)s

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## 🐾 Vet Practice M&A Targets — buyer-mapped acquisition leads

> The Apify Actor for **veterinary private equity** acquisition teams. Delivers scored, PE-buyer-mapped vet practice acquisition leads across all 50 US states + DC in one run — ~14,000 independent veterinary clinics, ranked 1-10 on M&A readiness, with confidence-scored acquirer mapping (NVA / VetCor / BluePearl / Mars / Regional PE).

![Sample dataset output — vet practice M&A targets scored 1-10 and PE-buyer-mapped](https://api.apify.com/v2/key-value-stores/iRmWtLRmMAI0v8AC3/records/03-dataset-sample)

---

### 🎯 What does this Actor do?

This actor finds **independent veterinary practices that are likely acquisition targets** for private-equity-backed vet rollups, and scores each one on how "ready" it is to sell.

In a single run you get:

- ✅ **Practice name + full street address** for thousands of US vet clinics
- ✅ **M&A readiness score** (1-10) based on chain status, website presence, name pattern, location, opening hours
- ✅ **PE buyer match** — which acquirer (NVA / VetCor / BluePearl / Mars / Regional) is most likely to bid, with confidence + reasoning
- ✅ **Chain exclusion** — already-acquired clinics (VCA, Banfield, NVA, VetCor, BluePearl, Ethos) are flagged out automatically
- ✅ **Lat/lon, phone, website** when available in OpenStreetMap
- ✅ **All 50 states + DC** coverage day-1 via one federated OSM Overpass query

The input is dead simple — just pick which states to scan. Run it on the prefilled 5-state defaults (FL/TX/CA/NY/IL) to see your first 150 leads in under 2 minutes.

---

### 💼 Why veterinary private equity teams use this actor

The US veterinary market is in the middle of a decade-long private equity consolidation wave. **~25% of US vet practices are now corporate-owned**, up from ~10% in 2017. Five buyer groups drive 80% of dealflow:

- **NVA** (JAB Holdings) — 1500+ hospitals
- **VetCor** (Oak Hill Capital) — 850+ practices
- **BluePearl / Ethos** (Mars Petcare) — specialty / 24-hr / emergency
- **Mars Direct** (VCA + Banfield) — 2000+ multi-location
- **Regional PE rollups** — Innovetive, Pathway, Thrive, Compassion First, Vetnique, etc.

For PE associates, corporate development teams, and search funds, the bottleneck is **finding the right targets**. [Grata](https://grata.com) charges $50K-$150K/year for a generic M&A target database covering every industry. For a vet-vertical PE rollup, that's 90% features you don't use, at 5x the price.

**This actor is purpose-built for the vet vertical**, at ~1/5 the cost of Grata, with:

- Federation across OpenStreetMap → 14K US vet clinics in one query (vs scraping 100+ state portals)
- Proprietary buyer-mapping algorithm trained on the 5 major rollup playbooks
- M&A readiness scoring tuned to the signals PE associates actually act on
- Pay-per-event pricing — you pay $0.20 per borderline lead, $1.00 per qualified, $5 per state refresh

---

### 🔧 How to scrape vet practice acquisition data — 3-step tutorial

#### 3-step tutorial

1. **Pick your states.** Default is FL/TX/CA/NY/IL — the top 5 M&A markets. Add or remove via the "States to scan" field.
2. **(Optional) Set filters.** Restrict to a specific buyer profile (NVA-fit, VetCor-fit, etc.) or raise the minimum readiness score to qualified-only ($1.00/lead).
3. **Click Start.** Results stream into the dataset as the actor scans each state. A 5-state run finishes in ~2 minutes; full 50-state run in ~8 minutes.

You can download the dataset extracted by Vet Practice M&A Targets in various formats such as **JSON, CSV, Excel, or HTML** via the Apify Console or API.

#### How to integrate with your CRM

Use Apify's built-in integrations to push results directly into HubSpot, Salesforce, Pipedrive, Google Sheets, Airtable, or Slack. Or hit the Apify API with your CRM's webhook handler.

#### How to schedule weekly runs

Apify Schedules let you re-run the actor weekly with `refreshMode: "delta"` to only get new or changed practices since the last run — perfect for keeping your pipeline fresh without re-paying for known leads.

---

### 💰 Pricing — how much does veterinary practice acquisition data cost?

**Pay-Per-Event (PPE)** — you pay only for results you receive.

| Event | Price | When it fires |
|---|---|---|
| 🟢 Qualified target | **$1.00** | Practice scores ≥ 7 on M&A readiness (needs reviews + state portal data) |
| 🟡 Borderline target | **$0.20** | Practice scores 4-6.99 (OSM-confirmed, lighter signal) |
| 🔵 State refresh | **$5.00** | One per state per run (covers infrastructure) |

#### Cost examples (verified on real runs)

| Scope | Targets | Total cost |
|---|---|---|
| 5 states, 30 targets/state | ~150 borderline | **~$55** ($25 state refresh + $30 borderline) |
| 10 states, 100 targets/state | ~1000 borderline | **~$250** ($50 state + $200 borderline) |
| **All 50 states + DC, 30 targets/state** | **~1300 borderline** | **~$510** ($255 state + $260 borderline) |

This is **1/20th the cost of Grata** for vet-vertical PE associates, with deeper buyer-mapping intelligence.

![Run analytics — buyer distribution, state coverage, runtime, PPE cost](https://api.apify.com/v2/key-value-stores/iRmWtLRmMAI0v8AC3/records/04-run-analytics)

---

### 📥 Input

Vet Practice M&A Targets has the following input options. Click on the input tab for the auto-generated UI:

- **States to scan** (required) — array of US state codes
- **Max targets per state** — default 30, max 5000
- **Minimum readiness score** — default 4 (captures all borderline + qualified)
- **Include borderline targets** — default `true`
- **Buyer filter** — optional, restrict to NVA / VetCor / BluePearl / Mars / Regional
- **Refresh mode** — full scan vs delta (only changes since last run)
- **Enable Yelp/Google enrichment** — optional, off by default
- **Proxy configuration** — Apify Residential US recommended

#### Input example

```json
{
    "states": ["FL", "TX", "CA", "NY", "IL"],
    "maxTargetsPerState": 30,
    "minReadinessScore": 4,
    "includeBorderline": true,
    "refreshMode": "full",
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": ["RESIDENTIAL"]
    }
}
````

***

### 📤 Output

Each dataset record is a single scored vet practice. Here's a simplified example:

```json
{
  "id": "552df40acd0ce8d0",
  "practice_name": "Hyde Park Veterinary Clinic",
  "practice_address": "1111 W Swann Ave, Tampa, FL, 33606",
  "practice_city": "Tampa",
  "practice_state": "FL",
  "practice_zip": "33606",
  "is_in_chain": false,
  "phone": "+1 813-555-0100",
  "website": "https://www.hydeparkvet.com/",
  "opening_hours": "Mo-Fr 08:00-18:00",
  "lat": 27.9374785,
  "lon": -82.4715167,
  "ma_readiness_score": 6.5,
  "ma_readiness_reasoning": "OSM-mapped practice; has website; opening_hours listed",
  "buyer_match": {
    "buyer_match_primary": "VetCor",
    "buyer_match_primary_confidence": 0.78,
    "buyer_match_reasoning": "top25 metro, 142 reviews — classic VetCor profile"
  },
  "is_qualified": false,
  "is_borderline": true,
  "scraped_at": "2026-05-21T05:43:25Z"
}
```

You can download the full dataset in **JSON, CSV, Excel, HTML, or RSS** via the Apify Console or API.

#### Key-value store records (run analytics)

- **`RUN_SUMMARY`** — totals: states scanned, practices found, qualified vs borderline counts, duration, PPE cost
- **`BUYER_DISTRIBUTION`** — leads per buyer category
- **`STATE_COVERAGE`** — per-state breakdown (verify all 50 states returned data)
- **`EXCLUDE_STATS`** — chain-exclude counts per chain

***

### ⚙️ Tips and advanced options

- **Start small to test scoring.** Run on 3-5 states with `maxTargetsPerState: 30` to see real records before committing to a 50-state run.
- **Filter by buyer to focus your pipeline.** A PE associate at NVA can set `buyerFilter: ["NVA"]` to receive only NVA-fit leads.
- **Use delta mode for weekly refreshes.** After your first full scan, switch `refreshMode: "delta"` to only pay for new leads.
- **Combine with Apify integrations.** Pipe results straight into HubSpot, Salesforce, Google Sheets, or Slack via Apify Integrations.
- **Schedule full USA runs monthly.** Vet practice churn is slow — monthly refresh captures 95% of new acquisitions.

***

### ❓ FAQ

#### Who are the largest private equity buyers of veterinary practices?

Five PE-backed groups drive ~80% of US vet practice acquisitions: **NVA** (1500+ hospitals, owned by JAB Holdings), **VetCor** (850+ practices, Oak Hill Capital), **BluePearl + Ethos** (specialty / 24-hr, Mars Petcare), **Mars Direct** (VCA + Banfield, 2000+ multi-location), and **regional PE rollups** like Innovetive, Pathway, Thrive, and Compassion First. Each has a distinct acquisition profile that this actor maps automatically.

#### How much does a veterinary practice sell for?

US vet practice M\&A multiples typically range from **6× to 12× EBITDA**, with specialty/24-hr practices and multi-doctor groups commanding the highest end. Single-doctor general-practice clinics in mid-tier metros usually sell at 6-8×. Large PE buyers (NVA, VetCor) typically pay 8-10× on adjusted EBITDA for clean, growing practices. The actor flags signals (chain status, multi-vet, hours, location) that drive readiness scoring.

#### How do I find independent veterinary practices to acquire?

Run this actor with your target states selected. It pulls ~14,000 OSM-confirmed independent US vet practices, **automatically excludes the 6 major chains** (VCA, Banfield, NVA, VetCor, BluePearl, Ethos) and scores the remainder on M\&A readiness. A 50-state run costs ~$510 and finishes in ~8 minutes — vs $50K-$150K/year for Grata's generic enterprise database.

#### What private equity firms own veterinary clinics?

NVA (JAB Holdings), VetCor (Oak Hill Capital), BluePearl + Ethos (Mars Petcare), VCA + Banfield (Mars Direct), and regional rollups Innovetive Petcare, Pathway Vet Alliance, Thrive Pet Healthcare, Compassion First Pet Hospitals, MedVet, and Vetnique. Together they own ~25% of US vet practices (up from ~10% in 2017). The actor maps each independent clinic to its most likely future acquirer.

#### Is it legal to scrape vet practice data?

Yes. All data comes from **publicly available sources**: OpenStreetMap (open-data, ODbL license) for vet clinic listings, public sitemap files for chain hospital networks. The actor does not scrape private user data, contact emails, or non-public records. Used for B2B M\&A research, it is fully GDPR-compliant. You should still use your own judgment on outreach practices.

#### How is this different from Grata?

| Capability | Grata | Vet M\&A Targets |
|---|---|---|
| **Coverage** | All industries (generic) | Vet vertical only (deep) |
| **Pricing** | $50K-$150K/year | Pay-per-event ($0.20-$1/lead) |
| **Buyer mapping** | Generic CRM tags | NVA/VetCor/BluePearl/Mars/Regional with confidence + reasoning |
| **Chain exclusion** | Manual | Auto (6 chains via sitemap + name pattern) |
| **M\&A readiness score** | None | 1-10 on 8 signals |
| **Coverage geography** | USA + Europe | USA (50 states + DC) |
| **Setup time** | 1-2 weeks sales cycle | 30 seconds (click Start) |

#### Where does the data come from?

Primary source: **OpenStreetMap Overpass API** (`amenity=veterinary` tag). OSM is a crowd-sourced map database with ~14,000 US vet practice entries verified by local contributors. Optional enrichment via Apify community actors for Yelp + Google Maps when `enableEnrichment: true`.

#### How accurate is the buyer mapping?

The algorithm uses the **publicly documented acquisition playbooks** of the 5 buyer groups. Accuracy is in the 60-80% range for buyer-primary match (a PE associate would still triage). Confidence scores let you filter to the most certain matches.

#### Why aren't the leads "qualified" (score ≥ 7) by default?

Qualified scoring requires state-portal data (LLC formation date, registered agent) + reviews + AVMA membership — most US state portals are Cloudflare-protected or SPA-rendered, making bulk scraping difficult. The actor falls back to OSM-only data which scores 4-6 (borderline). Enable `enableEnrichment: true` to chase qualified scores via paid community actors.

#### How do I get support or troubleshoot a run?

**Failed run?** Check the run log in Apify Console — the actor logs a one-line cause for every failure (Overpass timeout, state-portal Cloudflare block, OSM proxy 429, etc.). Most issues resolve on retry with `proxyConfiguration.useApifyProxy: true` and `apifyProxyGroups: ["RESIDENTIAL"]`. **No results for a state?** Verify the state code is uppercase ISO (e.g., `FL` not `Florida`). **Pricing surprise?** Set `maxTargetsPerState: 5` for a $5 sanity check before scaling. For all other issues, open a question on the Apify Actor page or contact [@kazkn](https://apify.com/kazkn) — usual reply time < 24h. Custom buyer mapping for specific PE firms available on request.

***

### 🔗 Other Actors by KazKN

Looking for more data products? Check out my other Actors:

- 🕰️ [**Watch Arbitrage Tracker**](https://apify.com/kazkn/watch-arbitrage-mcp?fpr=8fp2od) — Cross-platform luxury watch arbitrage tracker (Rolex, Patek, AP across 13 dealer marketplaces). MCP server mode for Claude / Cursor integration.
- 🛍️ [**Vinted Smart Scraper**](https://apify.com/kazkn/vinted-smart-scraper?fpr=8fp2od) — Vinted listings + alert engine for resellers and arbitrage flippers.

***

### 📄 License

Apify Actor source is closed-source for the scoring + buyer-mapping algorithm. Custom integrations available on request.

# Actor input Schema

## `states` (type: `array`):

US state codes to include. Example: <code>FL</code>, <code>TX</code>, <code>CA</code>. Leave empty to scan <b>all 50 states + DC</b>.<br><br><b>Tip:</b> start small (3-5 states) to validate output before running USA-wide. Full 50-state run = ~8 minutes + ~$510 PPE.

## `maxTargetsPerState` (type: `integer`):

Cap the number of records emitted per state. Useful for trial runs and PPE cost control.<br><br><b>Cost math:</b> at 30/state × 50 states × $0.20 borderline ≈ $300/run.<br><b>Default 30</b> gives you a representative sample; raise to 500 for full state coverage.

## `minReadinessScore` (type: `integer`):

Only emit targets scoring at or above this on the 1-10 readiness scale.<br><br><b>7+</b> = qualified (charged $1.00 / target) — full state-portal data + reviews<br><b>4-6.99</b> = borderline (charged $0.20 / target) — OSM-only practices<br><b>1-3.99</b> = low signal (free, dataset only if you set min=1)<br><br><b>Tip:</b> leave at default 4 to capture all borderline targets day-1.

## `includeBorderline` (type: `boolean`):

When <b>on</b>, you receive practices scored 4-7 (OSM-confirmed, but lacking reviews / state-portal data).<br>When <b>off</b>, only qualified ($1.00) targets are emitted — fewer leads, but higher confidence.

## `buyerFilter` (type: `array`):

Restrict output to specific likely-acquirer types. Leave empty (<b>recommended</b>) to receive all buyer matches.<br><br><b>NVA</b> = small-animal solo-vet, top metros (JAB Holdings)<br><b>VetCor</b> = aging owner, 15+ yr LLC, suburban (Oak Hill Capital)<br><b>BluePearl</b> = specialty / 24-hr / multi-vet (Mars Petcare)<br><b>Mars</b> = multi-location, multi-state (VCA / Banfield)<br><b>Regional</b> = everything else (Innovetive, Pathway, Thrive, etc.)

## `refreshMode` (type: `string`):

<b>Full scan</b> (default) = rebuild target list from scratch.<br><b>Delta</b> = only new or changed practices since last run for the same state.

## `enableEnrichment` (type: `boolean`):

When <b>on</b>, the actor enriches each OSM record with Yelp + Google Maps + AVMA data (reviews, photos, hours, board certifications). This unlocks score 7+ qualified targets but adds ~3-5 min per state and may consume paid Apify Google Maps Scraper credits.<br><br>Leave <b>off</b> for OSM-only data — faster, cheaper, still produces 1300+ borderline targets across 50 states.

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

Apify Proxy is recommended for sitemap fetches on rate-limited chains (BluePearl, Ethos). Residential US proxies work best.

## Actor input object example

```json
{
  "states": [
    "FL",
    "TX",
    "CA",
    "NY",
    "IL"
  ],
  "maxTargetsPerState": 30,
  "minReadinessScore": 4,
  "includeBorderline": true,
  "buyerFilter": [],
  "refreshMode": "full",
  "enableEnrichment": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

One record per scored vet practice. Includes practice name + full address, M\&A readiness score 1-10, PE buyer match (NVA/VetCor/BluePearl/Mars/Regional) with confidence + reasoning, lat/lon coordinates, phone, website, and OSM-confirmation flag. Export as JSON, CSV, Excel, or HTML.

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

States scanned, total practices found, qualified count (score ≥ 7), borderline count (4-7), chain-excluded count, run duration, total PPE cost.

## `buyerDistribution` (type: `string`):

Count of targets per PE buyer category — NVA / VetCor / BluePearl / Mars Direct / Regional. Useful for spotting which acquirer dominates your pipeline.

## `stateCoverage` (type: `string`):

Per-state breakdown: was this state successfully scraped, how many practices were found, how many qualified. Use this to verify all 50 states returned data.

## `excludeStats` (type: `string`):

How many practices were filtered out per chain (VCA / Banfield / NVA / VetCor / BluePearl / Ethos). Sanity-check that the exclude list is correctly removing already-acquired clinics.

# 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 = {
    "states": [
        "FL",
        "TX",
        "CA",
        "NY",
        "IL"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("kazkn/vet-mna-actor").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 = {
    "states": [
        "FL",
        "TX",
        "CA",
        "NY",
        "IL",
    ],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("kazkn/vet-mna-actor").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 '{
  "states": [
    "FL",
    "TX",
    "CA",
    "NY",
    "IL"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call kazkn/vet-mna-actor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=kazkn/vet-mna-actor",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Vet Practice M&A Targets — buyer-mapped acquisition leads",
        "description": "50-state US vet practice acquisition leads. Each scored 1-10 on M&A readiness, mapped to its most likely PE buyer (NVA / VetCor / BluePearl / Mars / Regional). ~14K independent clinics. Pay-per-result. The only vet-vertical M&A actor on Apify Store.",
        "version": "0.1",
        "x-build-id": "sffNaGRzZBZvj0Ja7"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/kazkn~vet-mna-actor/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-kazkn-vet-mna-actor",
                "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/kazkn~vet-mna-actor/runs": {
            "post": {
                "operationId": "runs-sync-kazkn-vet-mna-actor",
                "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/kazkn~vet-mna-actor/run-sync": {
            "post": {
                "operationId": "run-sync-kazkn-vet-mna-actor",
                "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": [
                    "states"
                ],
                "properties": {
                    "states": {
                        "title": "States to scan",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "US state codes to include. Example: <code>FL</code>, <code>TX</code>, <code>CA</code>. Leave empty to scan <b>all 50 states + DC</b>.<br><br><b>Tip:</b> start small (3-5 states) to validate output before running USA-wide. Full 50-state run = ~8 minutes + ~$510 PPE.",
                        "items": {
                            "type": "string",
                            "pattern": "^(AL|AK|AZ|AR|CA|CO|CT|DE|DC|FL|GA|HI|ID|IL|IN|IA|KS|KY|LA|ME|MD|MA|MI|MN|MS|MO|MT|NE|NV|NH|NJ|NM|NY|NC|ND|OH|OK|OR|PA|RI|SC|SD|TN|TX|UT|VT|VA|WA|WV|WI|WY)$"
                        }
                    },
                    "maxTargetsPerState": {
                        "title": "Max targets per state",
                        "minimum": 5,
                        "maximum": 5000,
                        "type": "integer",
                        "description": "Cap the number of records emitted per state. Useful for trial runs and PPE cost control.<br><br><b>Cost math:</b> at 30/state × 50 states × $0.20 borderline ≈ $300/run.<br><b>Default 30</b> gives you a representative sample; raise to 500 for full state coverage.",
                        "default": 30
                    },
                    "minReadinessScore": {
                        "title": "Minimum M&A readiness score",
                        "minimum": 1,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Only emit targets scoring at or above this on the 1-10 readiness scale.<br><br><b>7+</b> = qualified (charged $1.00 / target) — full state-portal data + reviews<br><b>4-6.99</b> = borderline (charged $0.20 / target) — OSM-only practices<br><b>1-3.99</b> = low signal (free, dataset only if you set min=1)<br><br><b>Tip:</b> leave at default 4 to capture all borderline targets day-1.",
                        "default": 4
                    },
                    "includeBorderline": {
                        "title": "Include borderline targets ($0.20 each)",
                        "type": "boolean",
                        "description": "When <b>on</b>, you receive practices scored 4-7 (OSM-confirmed, but lacking reviews / state-portal data).<br>When <b>off</b>, only qualified ($1.00) targets are emitted — fewer leads, but higher confidence.",
                        "default": true
                    },
                    "buyerFilter": {
                        "title": "Buyer match filter",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Restrict output to specific likely-acquirer types. Leave empty (<b>recommended</b>) to receive all buyer matches.<br><br><b>NVA</b> = small-animal solo-vet, top metros (JAB Holdings)<br><b>VetCor</b> = aging owner, 15+ yr LLC, suburban (Oak Hill Capital)<br><b>BluePearl</b> = specialty / 24-hr / multi-vet (Mars Petcare)<br><b>Mars</b> = multi-location, multi-state (VCA / Banfield)<br><b>Regional</b> = everything else (Innovetive, Pathway, Thrive, etc.)",
                        "items": {
                            "type": "string",
                            "enum": [
                                "NVA",
                                "VetCor",
                                "BluePearl",
                                "Mars",
                                "Regional"
                            ],
                            "enumTitles": [
                                "🏢 NVA (JAB Holdings)",
                                "🏥 VetCor (Oak Hill Capital)",
                                "💙 BluePearl / Ethos (Mars Petcare)",
                                "🐾 Mars Direct (VCA / Banfield)",
                                "🌎 Regional PE rollups"
                            ]
                        },
                        "default": []
                    },
                    "refreshMode": {
                        "title": "Refresh mode",
                        "enum": [
                            "full",
                            "delta"
                        ],
                        "type": "string",
                        "description": "<b>Full scan</b> (default) = rebuild target list from scratch.<br><b>Delta</b> = only new or changed practices since last run for the same state.",
                        "default": "full"
                    },
                    "enableEnrichment": {
                        "title": "Enable Yelp + Google Maps enrichment",
                        "type": "boolean",
                        "description": "When <b>on</b>, the actor enriches each OSM record with Yelp + Google Maps + AVMA data (reviews, photos, hours, board certifications). This unlocks score 7+ qualified targets but adds ~3-5 min per state and may consume paid Apify Google Maps Scraper credits.<br><br>Leave <b>off</b> for OSM-only data — faster, cheaper, still produces 1300+ borderline targets across 50 states.",
                        "default": false
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Apify Proxy is recommended for sitemap fetches on rate-limited chains (BluePearl, Ethos). Residential US proxies work best.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ]
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
