# FranchiseDirect Scraper \[💰$1.5/1K] | Fees | Investment | Leads (`ahmed_jasarevic/franchisedirect-scraper`) Actor

Scrape franchise opportunity profiles from FranchiseDirect: brand, industry, investment range, franchise fee, royalty, minimum cash, net-worth requirement, training, financing, units, territory and FDD availability — one clean JSON row per brand, from any state or industry directory page.

- **URL**: https://apify.com/ahmed_jasarevic/franchisedirect-scraper.md
- **Developed by:** [Ahmed Jasarevic](https://apify.com/ahmed_jasarevic) (community)
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.40 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

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

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

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

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

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

# README

## FranchiseDirect Scraper — Franchise Fees, Investment Ranges & Brand Data

Scrape **franchise opportunity profiles** from [franchisedirect.com](https://www.franchisedirect.com) — brand name, industry, total investment range, franchise fee, royalty, minimum cash and net-worth requirements, training and financing support, units count, territory and FDD availability — as one clean JSON row per franchise brand. Start from any state, industry or brand directory page and paginate automatically.

Built for franchise consultants and brokers, M\&A and acquisition scouts screening brands by investment budget, franchise-development teams benchmarking competitors, and lead-gen agencies building franchise-consultant outreach lists. The default dataset is one row per franchise profile, enriched from both the directory listing card and the brand's own profile page.

### Scrape Franchise Opportunities For Lead Generation & Investment Screening

- **Franchise cost comparison** — brand, franchise fee, royalty, total investment range and minimum cash in one row, sortable for budget screening
- **Franchise lead generation** — `contactInfo`, `territory` and `availableLocations` for outreach lists
- **FDD and disclosure research** — `fddAvailability`, `unitsCount`, `yearFounded` and `businessType` per brand
- **Competitive benchmarking for franchise development** — investment ranges and unit counts across an industry
- **Building a franchise opportunity database** — the full profile grid (`financials`, `facts`) plus the mapped fields
- **Market expansion research** — available locations and territory by brand and state

### How It Works

![How the FranchiseDirect Scraper works: directory pages become franchise rows with fees, investment ranges, territory and unit counts.](https://api.apify.com/v2/key-value-stores/oeuA0kLOyhbRM4fzt/records/how-it-works-franchisedirect-scraper)

The Actor paginates server-rendered directory pages with ?p=N, reads each card's data-franchise attributes and carries them into the profile request. The profile page supplies financial details, quick facts and JSON-LD, which are merged into a single row.

Each row covers one brand with franchise fee, royalty, initial investment, investment range, cash and net-worth requirements, training, financing, territory, units, FDD availability and contact details.

1. Directory pages (industry, state and investment pages) are paginated server-side with `?p=N`; the last page is read from the `data-page-number` attribute.
2. Each franchise card exposes structured `data-franchise-*` attributes (ID, name, logo, category, status, minimum investment), which are carried into the detail request via `userData` — so no extra request is needed to know what the card said.
3. Profile pages are read from `.ProfileFinancialDetail` (franchise fee, total investment range, minimum cash), `.ProfileFacts` (locations, training, financing, business type) and the `ld+json` block (name, logo, description), then merged with the card data into one row.

Everything runs on `CheerioCrawler` (plain HTTP + HTML parsing). FranchiseDirect is server-rendered, so no browser, no headless Chrome and no JS rendering are involved — the actor stays fast and cheap.

### Input Parameters

| Field | Type | Required | Default | Notes |
| --- | --- | --- | --- | --- |
| `startUrls` | array | No | Alabama directory | Directory pages to crawl: industry, state or investment pages. Default `https://www.franchisedirect.com/usfranchises/alabama/234/`. |
| `maxItems` | integer | No | `50` | Maximum franchise profiles returned. Free-plan runs are capped at 10 items. |
| `maxRequestsPerCrawl` | integer | No | scales | Hard request cap. Leave empty to scale automatically with `maxItems` (`maxItems × 2 + 100`). Max 5000. |
| `maxConcurrency` | integer | No | `5` | Parallel requests (1–10). |
| `proxy` | object | No | off | Standard Apify proxy configuration; off by default. |

### Output Fields

One row per franchise profile in the default dataset.

| Field | Description |
| --- | --- |
| `url` | Franchise profile page URL. |
| `brandName` | Franchise brand name. |
| `industry`, `franchiseCategory` | Industry and category as listed on FranchiseDirect. |
| `franchiseId` | Internal FranchiseDirect franchise ID. |
| `logo` | Brand logo image URL. |
| `profileStatus` | Profile status, e.g. `open` or `closed`. |
| `minimumCash` | Minimum cash required as a **number** (from the listing data). |
| `liquidCapital` | Minimum cash required as the displayed **text** value. |
| `franchiseFee` | Franchise fee. |
| `royaltyFee` | Royalty fee. |
| `initialInvestment` | Initial investment. |
| `investmentRange` | Total investment range. |
| `netWorthReq` | Net worth requirement. |
| `trainingSupport` | Training provided. |
| `financingAssistance` | Financing assistance information, e.g. `3rd Party`. |
| `territory` | Territory information. |
| `availableLocations` | Available locations for the franchise. |
| `yearFounded` | Year the brand was founded. |
| `unitsCount` | Number of units. |
| `fddAvailability` | FDD (Franchise Disclosure Document) availability. |
| `businessType` | Business type, e.g. `Franchise`. |
| `contactInfo` | Contact information shown publicly on the profile. |
| `description` | Brand description. |
| `financials` | All financial detail rows as a label → value object. |
| `facts` | All profile quick facts as a label → value object. |
| `scrapedAt` | ISO timestamp when the record was scraped. |

### Example Input

Scrape a different state directory:

```json
{
  "startUrls": [
    { "url": "https://www.franchisedirect.com/usfranchises/texas/252/" }
  ],
  "maxItems": 200
}
```

### Example Output

```json
{
  "url": "https://www.franchisedirect.com/food-franchises/papa-murphys/",
  "brandName": "Papa Murphy's Take 'N' Bake Pizza",
  "industry": "Food Franchises",
  "franchiseCategory": "Food Franchises",
  "franchiseId": "1453",
  "logo": "https://www.franchisedirect.com/logos/papa-murphys.png",
  "profileStatus": "open",
  "minimumCash": 125000,
  "liquidCapital": "$125,000",
  "franchiseFee": "$25,000",
  "royaltyFee": "5%",
  "initialInvestment": "$308,469",
  "investmentRange": "$308,469 - $557,879",
  "netWorthReq": "$500,000",
  "trainingSupport": "2 weeks training",
  "financingAssistance": "3rd Party",
  "territory": "Exclusive area rights",
  "availableLocations": "United States, Canada",
  "yearFounded": "1995",
  "unitsCount": "1,300+",
  "fddAvailability": "Yes",
  "businessType": "Franchise",
  "contactInfo": "franchising@papamurphys.com",
  "description": "Take-and-bake pizza franchise.",
  "financials": {
    "Initial Investment": "$308,469 - $557,879",
    "Franchise Fee": "$25,000",
    "Royalty": "5%",
    "Minimum Cash Required": "$125,000",
    "Net Worth Required": "$500,000"
  },
  "facts": {
    "Units": "1,300+",
    "Year Founded": "1995",
    "Country": "United States"
  },
  "scrapedAt": "2026-10-17T12:00:00.000Z"
}
```

### Automate Franchise Monitoring With Schedules & Webhooks

- **Schedule the Actor** (Apify scheduler or cron) to re-crawl a directory weekly or monthly and diff new brands, changed investment ranges or new territories.
- **Webhooks** — configure a run-success webhook so each finished run POSTs to n8n, Make or Zapier and lands in a CRM or spreadsheet.
- **Apify API** — pull the dataset programmatically with the JavaScript or Python client, or export JSON / CSV / Excel from the console.
- Recurring runs are what keep a franchise database current — new brands open and investment ranges change constantly.

### Related Actors

- [BizBuySell Scraper](https://apify.com/shahidirfan/bizbuysell-scraper) — businesses for sale, franchises and brokers with valuations and contact data.
- [BizBuySell Scraper — Businesses For Sale, Brokers, Emails](https://apify.com/memo23/apify-bizbuysell-cheerio) — BizBuySell listings with optional verified contact-email enrichment.
- [Franchise Opportunities Scraper — Investment, Fees & Leads](https://apify.com/scrapers_lat/franchise-opportunities-scraper) — franchise directory opportunities with optional AI-generated investor summaries.
- [FranchiseDirect Scraper — Low-cost](https://apify.com/delectable_incubator/franchisedirect-scraper-low-cost) — the same source with a simpler URL-only input.
- [FranchiseGator Scraper](https://apify.com/ahmed_jasarevic/franchise-scraper) — franchise opportunities from FranchiseGator with brand-strength scores.

### Frequently Asked Questions

#### Why use this Actor instead of the official FranchiseDirect API?

FranchiseDirect does not publish a public developer API for reading franchise profiles. This Actor reads the same publicly visible directory and profile pages the site renders, and returns them as structured JSON with the financial grid flattened into label → value objects — no API key, login or scraping setup required.

#### What are alternatives to FranchiseDirect for franchise data?

Three routes exist. First, directories: FranchiseDirect, FranchiseGator, Franchise Direct's competitors and the International Franchise Association's franchise directory. Second, licensed franchise-data providers and FDD aggregators, which sell curated disclosure documents and come with contract terms. Third, self-serve scraping of the directories (this Actor and the ones in Related Actors). BizBuySell is the usual companion when you also want existing businesses and brokers, not just franchise opportunities.

#### Can I filter franchises by investment budget?

Not with a built-in price filter — but yes in practice. Crawl the directory pages that already encode the filter in the URL (FranchiseDirect publishes investment-range pages), or crawl a state/industry directory and sort the resulting dataset by `minimumCash` or `investmentRange`. `financials` carries every financial row so you can filter on any of them after the run.

#### Does this Actor return FDD or sold/historical franchise data?

It returns the `fddAvailability` field shown on each profile (whether a Franchise Disclosure Document is available), not the FDD contents themselves. FDDs are regulated documents obtained from the franchisor. The dataset contains currently listed, active profiles only.

#### Can an AI agent call this Actor?

Yes. It is a standard Apify Actor, so any MCP client or agent can start a run through the Apify API or the Apify MCP server, wait for it to finish, and read the dataset items. The minimal input and output field list are in the next section.

#### How much does it cost?

Pay-per-event: one `result` event per franchise profile returned ($1.50 per 1,000 profiles), plus a small Actor-start event scaled by memory. There is no charge for pages that return no profile.

### For AI Agents & LLM Apps

Purpose: return structured franchise opportunity profiles (brand, fees, investment range, minimum cash, units, territory) from franchisedirect.com as JSON rows.

Minimal input (Alabama directory, the default):

```json
{ "startUrls": [{ "url": "https://www.franchisedirect.com/usfranchises/alabama/234/" }] }
```

Variant — a state directory with a higher cap:

```json
{
  "startUrls": [{ "url": "https://www.franchisedirect.com/usfranchises/texas/252/" }],
  "maxItems": 200,
  "maxConcurrency": 5
}
```

Output fields (default dataset): `url`, `brandName`, `industry`, `franchiseCategory`, `franchiseId`, `logo`, `profileStatus`, `minimumCash`, `liquidCapital`, `franchiseFee`, `royaltyFee`, `initialInvestment`, `investmentRange`, `netWorthReq`, `trainingSupport`, `financingAssistance`, `territory`, `availableLocations`, `yearFounded`, `unitsCount`, `fddAvailability`, `businessType`, `contactInfo`, `description`, `financials`, `facts`, `scrapedAt`.

Behaviors an agent should know:

- `startUrls` drives everything — the Actor crawls exactly the directory pages you give it and paginates via `?p=N` until `maxItems` is reached. There is no keyword-search input on this Actor.
- Change the URL to change the scope: `/usfranchises/<state>/<id>/` for a state, or an industry directory page.
- `maxItems` defaults to 50 and free-plan runs are capped at 10 items.
- If `maxRequestsPerCrawl` is omitted it scales automatically with `maxItems` (`maxItems × 2 + 100`), so you usually do not need to set it.
- `financials` and `facts` are label → value objects (arbitrary keys), so read them generically rather than expecting fixed field names.
- `minimumCash` is numeric while `liquidCapital` is the displayed text — use `minimumCash` for numeric filtering.
- The proxy input is off by default; enable Apify Proxy only if the site starts refusing requests at scale.

Billing: pay-per-event — one `result` event per franchise profile returned ($1.50 / 1,000). Budget by profile count, not by page count, since listing pages return no billable record.

### Legal & Compliance Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by or sponsored by Franchise Direct. It reads only publicly visible directory and profile pages on franchisedirect.com — no login, no account and no access to private or member-only data. It does not open or purchase FDDs. Where a profile displays contact information, that information is already public on the page; you are responsible for how you use it and for complying with applicable data-protection and telemarketing law (for example GDPR and CAN-SPAM) and with FranchiseDirect's Terms of Service.

### SEO Keywords

franchisedirect scraper, franchise opportunities data, franchise fees api, franchise investment range, franchise lead generation, franchise costs comparison, franchise directory data, fdd availability data, franchise unit counts, franchise opportunity database, buy a franchise data, franchise research tool, franchise minimum cash required, franchise royalty fees, franchise territory data, franchise brand database, business acquisition data, franchise market research, franchise development data, franchisedirect api alternative, franchise opportunities scraper, us franchise data, franchise screening tool

# Actor input Schema

## `startUrls` (type: `array`):

URLs to start with.

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

Maximum number of franchise profiles to return. Free users are capped at 10 items; paying users can set any value.

## `maxRequestsPerCrawl` (type: `integer`):

Maximum number of requests that can be made by this crawler. Leave empty to scale automatically with maxItems (maxItems × 2 + 100).

## `maxConcurrency` (type: `integer`):

Maximum number of concurrent requests.

## `proxy` (type: `object`):

Select proxies to be used by your crawler.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.franchisedirect.com/usfranchises/alabama/234/"
    }
  ],
  "maxItems": 50,
  "maxConcurrency": 5,
  "proxy": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "proxy": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("ahmed_jasarevic/franchisedirect-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "proxy": { "useApifyProxy": False } }

# Run the Actor and wait for it to finish
run = client.actor("ahmed_jasarevic/franchisedirect-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "proxy": {
    "useApifyProxy": false
  }
}' |
apify call ahmed_jasarevic/franchisedirect-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ahmed_jasarevic/franchisedirect-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/JDONBnuXKXJVU2oG5/builds/r0JhEVt4Png1PwbKt/openapi.json
