# Wisconsin Franchise Disclosure Filings Scraper (`automation-lab/wisconsin-franchise-disclosure-filings`) Actor

Search Wisconsin DFI franchise filings by franchisor and export filing numbers, legal and trade names, dates, statuses, official detail links, and public FDD provenance.

- **URL**: https://apify.com/automation-lab/wisconsin-franchise-disclosure-filings.md
- **Developed by:** [Automation Lab](https://apify.com/automation-lab) (community)
- **Categories:** Business
- **Stats:** 2 total users, 1 monthly users, 66.7% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.08 / 1,000 filing extracteds

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

## Wisconsin Franchise Disclosure Filings Scraper

Search **Wisconsin franchise disclosure filings** by franchisor name and export official Wisconsin Department of Financial Institutions (DFI) registration history as structured data.

The Actor returns filing numbers, legal and trade names, effective and expiration dates, filing status, official detail links, and public Franchise Disclosure Document (FDD) provenance when the detail page exposes it.

### What does this Actor do?

Wisconsin DFI's public search is useful for one lookup at a time.
This Actor turns repeatable name searches into a typed Apify dataset.

It can:

- search by partial legal or trade name;
- process up to 20 franchisor names in one run;
- return current and historical filings;
- filter Registered, Expired, or Pending records;
- inspect current filing details for FDD availability;
- preserve the official source and detail URLs;
- cap the output row count with `maxItems`; only saved filings are billed.

It does not download or parse the contents of an FDD.
The official filing detail page is reported as document provenance because Wisconsin's file download is a form action rather than a durable public PDF URL.

### Who is it for?

- **Franchise attorneys** verify registration history and source documents before advising a client.
- **Prospective franchisees** check whether a brand has a current Wisconsin filing before deeper diligence.
- **Brokers and analysts** refresh registration dates and statuses across a portfolio of brands.
- **Compliance teams** export filing identifiers and official links into case-management or review systems.
- **Data teams** schedule recurring searches and compare datasets for changes.

The dataset is research input, not legal advice or a substitute for confirming a filing with Wisconsin DFI.

### Why use it?

The Actor follows the official ASP.NET search workflow while preserving a coherent session.
It produces one flat row per filing, deduplicates by filing number, and fails explicitly if the portal returns an unexpected page.

Unlike an active-registration list, the search route includes historical filing numbers, dates, statuses, and official detail links.
The Actor avoids downloading large documents and page assets, keeping the workflow focused on filing metadata and provenance.

### What data can I extract?

| Field | Type | Meaning |
| --- | --- | --- |
| `filingNumber` | string | Wisconsin DFI filing identifier. |
| `legalName` | string | Franchisor legal name shown by DFI. |
| `tradeName` | string or null | Trade/DBA name when present. |
| `effectiveDate` | string or null | Displayed filing effective date. |
| `expirationDate` | string or null | Displayed registration expiration date. |
| `status` | string | Displayed status such as Registered or Expired. |
| `detailUrl` | URL or null | Official detail page when DFI exposes one. |
| `disclosureDocumentAvailable` | boolean or null | Whether the inspected detail page shows an FDD download. |
| `disclosureDocumentUploadedAt` | string or null | DFI's displayed upload timestamp. |
| `disclosureDocumentProvenance` | URL or null | Official page that establishes document provenance. |
| `searchTerm` | string | Input name that produced the filing. |
| `sourceUrl` | URL | Official Wisconsin DFI search source. |
| `scrapedAt` | ISO timestamp | Time the result was collected. |

### How to get started

1. Open the Actor's **Input** tab.
2. Enter one or more real franchisor names under **Franchisor names**.
3. Choose all filing history or one filing status.
4. Leave detail inspection enabled if you need FDD provenance.
5. Set `maxItems` to the maximum number of rows you need.
6. Click **Start**.
7. Export the default dataset as JSON, CSV, Excel, XML, or RSS.

Start with a specific name and a small limit.
Partial matching can return several related legal entities or years of history.

### Input parameters

#### `searchTerms`

Required list of 1–20 legal or trade names.
Wisconsin DFI applies its own name matching.
Empty names are rejected.

#### `status`

Optional filter:

- `ALL` returns matching filing history;
- `REGISTERED` returns current registered filings;
- `EXPIRED` returns expired filings;
- `PENDING` returns pending filings.

The default is `ALL`.

#### `includeDetails`

When `true`, the Actor opens available official detail pages and reports FDD availability and upload provenance.
Expired rows often have no detail link, so their document fields can remain `null`.

#### `maxItems`

Maximum number of unique filings saved and charged, from 1 to 5,000.
The Actor stops saving once it reaches this limit.

### Example input

```json
{
  "searchTerms": ["McDonald's"],
  "status": "REGISTERED",
  "includeDetails": true,
  "maxItems": 10
}
```

### Example output

This representative record was returned by the current implementation:

```json
{
  "filingNumber": "640986",
  "legalName": "McDonald's USA, LLC",
  "tradeName": "McDonald's",
  "effectiveDate": "4/15/2026",
  "expirationDate": "4/15/2027",
  "status": "Registered",
  "detailUrl": "https://apps.dfi.wi.gov/apps/FranchiseSearch/details.aspx?id=640986&hash=336288221&search=external&type=GENERAL",
  "disclosureDocumentAvailable": true,
  "disclosureDocumentUploadedAt": "07/01/2026 at 12:26:19",
  "disclosureDocumentProvenance": "https://apps.dfi.wi.gov/apps/FranchiseSearch/details.aspx?id=640986&hash=336288221&search=external&type=GENERAL",
  "searchTerm": "McDonald's",
  "sourceUrl": "https://apps.dfi.wi.gov/apps/FranchiseSearch/MainSearch.aspx",
  "scrapedAt": "2026-09-16T20:41:49.718Z"
}
```

Dates and source-provided values can change on later runs.

### How much does it cost to search Wisconsin franchise filings?

Pricing is pay per event:

- **$0.005** once per run for the `start` event;
- **$0.0078292** per saved filing on FREE;
- **$0.006808** per saved filing on BRONZE;
- **$0.0053102** per saved filing on SILVER;
- **$0.0040848** per saved filing on GOLD, PLATINUM, and DIAMOND.

At BRONZE rates, 10 filings cost about **$0.07308** including the start event, 25 cost about **$0.1752**, and 100 cost about **$0.6858**.
Only unique rows written to the default dataset trigger the `filing` event.
Detail inspection has no separate event charge.

These are Actor event charges.
Applicable Apify plan terms, credits, refunds, fraud adjustments, taxes, disputes, corrections, or clawbacks can affect final billing.

### Recurring due-diligence workflow

Create a saved Task containing the franchisor names your team reviews.
Schedule it weekly or monthly.
After each run, send a webhook to your database, spreadsheet, n8n, Make, or Zapier workflow.
Compare by `filingNumber`, `status`, `effectiveDate`, and `expirationDate` to identify source changes.

The Actor does not maintain hidden cross-run state or claim that a difference is legally significant.
Your downstream workflow controls retention, comparison, and alerts.

### Tips and limitations

- Use a distinctive legal or trade name to reduce broad partial matches.
- Use `REGISTERED` when you need only current registrations.
- Disable `includeDetails` for a faster metadata-only history export.
- Current detail pages can expose document provenance; historical rows may not.
- The Actor does not download FDD binaries or extract their contents.
- Wisconsin DFI controls availability, data accuracy, status terminology, and retention.
- A portal outage or changed response shape causes a failed run rather than a misleading empty success.
- Requests use a coherent US residential session because the official service is not reliably reachable through cheaper routes from the execution environment.

### Use the dataset in JavaScript

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/wisconsin-franchise-disclosure-filings').call({
  searchTerms: ["7-Eleven"],
  status: 'REGISTERED',
  includeDetails: true,
  maxItems: 10,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### Run with Python

```python
from apify_client import ApifyClient
import os

client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('automation-lab/wisconsin-franchise-disclosure-filings').call(run_input={
    'searchTerms': ['Great Clips'],
    'status': 'ALL',
    'includeDetails': True,
    'maxItems': 25,
})
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)
```

### API usage with cURL

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~wisconsin-franchise-disclosure-filings/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"searchTerms":["McDonald'\''s"],"status":"REGISTERED","includeDetails":true,"maxItems":10}'
```

Use the returned dataset ID to retrieve items from Apify's dataset API.
Never commit your Apify token to source control.

### Use with MCP and AI agents

Add this Actor to Claude Code through the hosted Apify MCP server:

```bash
claude mcp add --transport http apify \
  "https://mcp.apify.com?tools=automation-lab/wisconsin-franchise-disclosure-filings"
```

#### Claude Desktop, Cursor, and VS Code setup

Claude Desktop, Cursor, and VS Code clients that support remote MCP servers can use:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=automation-lab/wisconsin-franchise-disclosure-filings"
    }
  }
}
```

Example prompts:

- "Find current Wisconsin DFI filings for 7-Eleven and cite the official detail URL."
- "Export McDonald's Wisconsin registration history and summarize expiration dates."
- "Refresh these three brands and show which current filings expose FDD provenance."

An agent should treat the output as public-source research and preserve official links in any answer.

### Responsible use and legality

This Actor accesses public Wisconsin DFI pages without logging in.
Use the data for lawful research, compliance, due diligence, and internal analysis.
Respect applicable laws, Apify policies, Wisconsin DFI terms, and data-retention obligations.
Do not present the dataset as an official certificate, legal opinion, or guarantee that a franchise may lawfully be offered.
Confirm consequential decisions against the official source and consult qualified counsel where appropriate.

This Actor is independent and is not affiliated with, endorsed by, or sponsored by Wisconsin DFI. Run datasets and logs remain in Apify storage under the retention settings of the user's account; the Actor creates no external database or cache.

### FAQ and troubleshooting

#### Why did my search return no rows?

Check spelling and try a distinctive fragment of the legal or trade name.
The search is controlled by Wisconsin DFI, and an entity may use a name different from the consumer-facing brand.
Also try `ALL` if a filing is no longer Registered.

#### Why are disclosure-document fields null?

Wisconsin DFI does not expose a detail link on every historical row.
Keep `includeDetails` enabled and inspect a current Registered filing.
A `null` value means provenance was not inspectable from that row; it does not prove that no document ever existed.

#### Why did the run fail instead of returning an empty dataset?

The Actor validates the official page shape.
If DFI is unavailable, blocks the request, or changes the form/table contract, failing is safer than reporting a false zero-result answer.
Retry later after checking the run log and official portal.

#### Does it search all US states?

No.
This Actor is deliberately scoped to the official Wisconsin DFI franchise registry.

#### Can it parse fees, investments, or Item 19 from an FDD?

No.
It reports filing metadata and public FDD provenance, not document contents.

### Related automation-lab Actors

For broader public-company and adviser diligence, see other `automation-lab` regulatory search Actors in the Apify Store.
This Actor remains standalone for Wisconsin franchise registrations because no current automation-lab Actor exposes the same state dataset.

### Support

When reporting a reproducible problem, include the Actor run ID, a redacted input, the expected public filing, and the official source URL.
Do not include tokens, cookies, private documents, or confidential client information.

# Changelog

This Actor's version history is a separate document: https://apify.com/automation-lab/wisconsin-franchise-disclosure-filings/changelog.md

# Actor input Schema

## `searchTerms` (type: `array`):

Legal or trade names to search. Partial names are supported by Wisconsin DFI.

## `status` (type: `string`):

Return all matching history or only filings with the selected status.

## `includeDetails` (type: `boolean`):

Visit available official filing detail pages to report whether an FDD is present and its upload timestamp.

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

Maximum number of unique filing records to save and charge.

## Actor input object example

```json
{
  "searchTerms": [
    "McDonald's"
  ],
  "status": "ALL",
  "includeDetails": true,
  "maxItems": 20
}
```

# Actor output Schema

## `overview` (type: `string`):

Open the default dataset using the franchise filing overview.

# 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 = {
    "searchTerms": [
        "McDonald's"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/wisconsin-franchise-disclosure-filings").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 = { "searchTerms": ["McDonald's"] }

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/wisconsin-franchise-disclosure-filings").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 '{
  "searchTerms": [
    "McDonald'\''s"
  ]
}' |
apify call automation-lab/wisconsin-franchise-disclosure-filings --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automation-lab/wisconsin-franchise-disclosure-filings"
        }
    }
}
```

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/GmIdh24XmMXPCQUw9/builds/Zk8x2gE1euyzhl07m/openapi.json
