# FranchiseGator Franchise Data Scraper (`ahmed_jasarevic/franchise-scraper`) Actor

Scrapes franchise opportunities from Franchise Gator: investment ranges, franchise fees, liquid capital & net worth requirements, territory availability, training, financing options, units count and request-info lead links.

- **URL**: https://apify.com/ahmed\_jasarevic/franchise-scraper.md
- **Developed by:** [Ahmed Jasarevic](https://apify.com/ahmed_jasarevic) (community)
- **Categories:** Developer tools, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

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

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### What does Franchise Scraper do?

[Franchise Scraper](https://apify.com) extracts structured franchise opportunity data from [Franchise Gator](https://www.franchisegator.com/) — one of the largest franchise directories on the web. For every franchise profile you get the **investment range, franchise fee, liquid capital and net worth requirements, territory availability, training and financing options, year founded, units count**, and the **request-info lead link** — everything a franchise broker, consultant, SBA lender, finance broker or prospective franchisee needs to qualify an opportunity, in clean JSON/CSV/Excel.

The actor runs on Apify's infrastructure with **proxy rotation included**, so your own IP is never exposed and runs are repeatable on a schedule.

### Why use Franchise Scraper?

- **Lead generation for brokers & consultants** — pull fresh franchise profiles with financial requirements and reach out to matching candidates.
- **Market mapping for lenders & finance brokers** — compare liquid capital, net worth and investment thresholds across hundreds of brands to pre-qualify SBA/loan candidates.
- **Competitive research for multi-unit investors** — track units counts, royalty fees and agreement terms across categories.
- **Structured output** — download as JSON, CSV, Excel or consume via API, webhooks, or direct integrations (Google Sheets, Zapier, Make, n8n).

### How to use Franchise Scraper

1. Open the actor and go to the **Input** tab.
2. Leave **Start URLs** at the default (the full Franchise Gator profiles sitemap) or paste your own URLs:
   - franchise profile pages (`https://www.franchisegator.com/franchises/<slug>/`),
   - listing pages (categories, states, A-Z directory) — these also unlock the internal-JSON enrichment,
   - any `.xml` sitemap.
3. Set **Max Items** and click **Start**.
4. Download results from the **Output** tab in your preferred format.

### Input

| Field | Type | Description |
|---|---|---|
| `startUrls` | array | Profile URLs, listing/category/state/directory URLs, or sitemap XMLs. Default: full profiles sitemap (~4,700 franchises). |
| `maxItems` | integer | Maximum number of franchise profiles per run (default 50). |
| `enrichWithInternalJson` | boolean | When a franchise's internal ID was captured from a listing page, query Franchise Gator's internal JSON endpoint too — adds franchise fee, year founded, royalty fee, agreement term, industry detail. Default: true. |
| `proxyConfiguration` | object | Apify proxy settings. **UNBLOCKER group by default** — required, see FAQ. |

#### Example input

```json
{
    "startUrls": [
        { "url": "https://www.franchisegator.com/states/texas-franchises/" },
        { "url": "https://www.franchisegator.com/franchises/1-800-got-junk/" }
    ],
    "maxItems": 100
}
```

### Output

One dataset item per franchise:

```json
{
    "url": "https://www.franchisegator.com/franchises/1-800-got-junk/",
    "franchiseName": "1-800-GOT-JUNK?",
    "category": "Cleaning & Maintenance",
    "investmentRange": "$90,000 - $150,000",
    "franchiseFee": null,
    "liquidCapitalRequired": "$80,000 - $90,000",
    "netWorthRequired": "$150,000",
    "territoryAvailability": "Franchises are available in select U.S. states, including Colorado, Florida, Georgia, Maryland, New Jersey, and Texas.",
    "trainingDetails": "Training: Available",
    "financingOptions": "Financing: Available",
    "yearFounded": null,
    "unitsCount": "170+",
    "requestInfoLeadLink": "https://www.franchisegator.com/franchises/1-800-got-junk/",
    "description": "A 1-800-GOT-JUNK? franchise is an outstanding opportunity...",
    "logoUrl": "https://assets.franchisegator.com/images/sponsors/1056/1800GotJunk_Logo.jpg",
    "fboId": null,
    "dataSource": "profile-page",
    "scrapedAt": "2026-08-25T07:00:00.000Z"
}
```

You can download the dataset in JSON, HTML, CSV or Excel from the Output tab.

### Data table

| Field | Description |
|---|---|
| `franchiseName` | Brand name of the franchise |
| `category` | Primary category/industry from the profile breadcrumb |
| `investmentRange` | Total investment min–max |
| `franchiseFee` | Up-front franchise fee (from internal JSON when available) |
| `liquidCapitalRequired` | Minimum liquid capital (cash) requirement |
| `netWorthRequired` | Minimum net worth requirement |
| `territoryAvailability` | Where the franchise is currently awarding territories |
| `trainingDetails` | Training availability/details |
| `financingOptions` | Financing availability/details |
| `yearFounded` | Year the brand was established (internal JSON when available) |
| `unitsCount` | Total units/locations |
| `requestInfoLeadLink` | Profile URL where prospects can request free information |
| `royaltyFee`, `agreementTerm`, `industry`, `industrySubsector`, `incorporatedName`, `alternateName`, `franchisingSince` | Extra fields from internal JSON enrichment |
| `fboId`, `dataSource`, `scrapedAt` | Provenance metadata |

### How much does it cost to scrape Franchise Gator?

Franchise Gator is protected by **AWS WAF**. This actor routes all traffic through the **Apify Unblocker proxy group**, which reliably bypasses the WAF challenges. Unblocker usage is billed by Apify as proxy usage (roughly $0.45 per 1,000 pages on top of compute) and is included in many plans' monthly allowance. A 500-franchise run typically costs well under $1 in total platform usage. Free Apify users get a **10-item preview per run**; paid plans run up to the `maxItems` cap.

### Tips and advanced options

- **Want complete data (fees + founding years)?** Include at least one *listing* URL (state, category or A-Z directory) in Start URLs — listing pages expose the internal IDs that unlock fee/founding-year enrichment. Sitemap-only runs skip enrichment for most items.
- **Target a niche**: use category URLs like `https://www.franchisegator.com/categories/sba-approved-franchises/` or industry URLs such as `.../industries/food-restaurant-franchises/`.
- **Keep runs cheap**: lower `maxItems`; the actor stops as soon as the cap is reached.
- **Scheduling**: run weekly via Scheduler to keep your franchise database current.

### FAQ, disclaimers and support

- **Why can't I use plain datacenter proxies?** AWS WAF serves CAPTCHA challenges to datacenter and standard residential IPs. The Unblocker group solves them automatically. If your plan lacks Unblocker access, contact Apify support or upgrade.
- **Why is `franchiseFee` sometimes null?** Fees live in Franchise Gator's internal JSON endpoint, which requires the franchise's internal ID. IDs are only published on listing pages, so sitemap-only runs may miss them. Add a listing URL to maximize coverage.
- **Is this legal?** The actor only reads publicly available pages and respects robots.txt disallowed paths. It never submits request-info forms on anyone's behalf — `requestInfoLeadLink` is provided so *you* can contact the franchisor directly.
- **Feedback or a custom feature?** Open an issue on the actor's Issues tab.

# Actor input Schema

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

Franchise profile URLs, listing pages (categories/states/A-Z directory), or sitemap XML URLs from franchisegator.com. Defaults to the full profiles sitemap.

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

Maximum number of franchise profiles to scrape per run.

## `enrichWithInternalJson` (type: `boolean`):

When a franchise's internal ID was captured from a listing page, also query Franchise Gator's internal JSON endpoint to add franchise fee, year founded, royalty fee and agreement term.

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

Apify proxy settings. The site is protected by AWS WAF — the UNBLOCKER group is required for reliable access; plain datacenter/residential groups receive CAPTCHA challenges.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.franchisegator.com/sitemap-profiles.xml"
    }
  ],
  "maxItems": 50,
  "enrichWithInternalJson": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "UNBLOCKER"
    ]
  }
}
```

# 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 = {
    "startUrls": [
        {
            "url": "https://www.franchisegator.com/sitemap-profiles.xml"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("ahmed_jasarevic/franchise-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 = { "startUrls": [{ "url": "https://www.franchisegator.com/sitemap-profiles.xml" }] }

# Run the Actor and wait for it to finish
run = client.actor("ahmed_jasarevic/franchise-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 '{
  "startUrls": [
    {
      "url": "https://www.franchisegator.com/sitemap-profiles.xml"
    }
  ]
}' |
apify call ahmed_jasarevic/franchise-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ahmed_jasarevic/franchise-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/gzWaFjxoeMsJziyWN/builds/Gx11o3VgdsmGpuFC5/openapi.json
