# Bizsleuth (`ashar_malik/bizsleuth`) Actor

An AI powered lead generation tool that can extract useful information from business websites.

- **URL**: https://apify.com/ashar\_malik/bizsleuth.md
- **Developed by:** [Ashar Khan](https://apify.com/ashar_malik) (community)
- **Categories:** AI, Lead generation, Automation
- **Stats:** 12 total users, 0 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: 4.57 out of 5 stars

## Pricing

from $5.00 / 1,000 processing urls

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

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

## What's an Apify Actor?

Actors are 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

## 🕵️‍♂️ BizSleuth — AI-Powered Business Intelligence Tool

BizSleuth is an AI-powered web scraper that analyzes company websites to extract high-value business intelligence. It goes beyond simple regex matching by using Large Language Models (LLMs) to understand the content and identify specific details like business owners, operational size, and contact information.

**You define what you want to extract. BizSleuth handles the rest.**

***

### 💡 What does BizSleuth extract?

By default, BizSleuth extracts:

- Business name
- Business owner / founder name
- Business address
- Business size (small / medium / large)
- Contact email
- Phone number
- Business summary

## But you're not limited to these. The output schema is fully customizable — you can add, remove, or replace fields with anything you want.

### 🎯 Use cases

- **Lead generation** — Build prospect lists enriched with owner names, emails, and business summaries.
- **Market research** — Survey a category of businesses and pull structured data at scale.
- **Sales prospecting** — Find out which booking platforms or tools your prospects use before reaching out.
- **Directory building** — Populate or refresh a business directory straight from each company's website.

***

### ⚙️ How it works

For each URL you provide, BizSleuth runs a two-stage crawling pipeline:

**Stage 1 — Fast HTTP crawl**
The actor sends standard HTTP requests to the homepage and crawls internal pages. This is fast and handles the majority of websites.

**Stage 2 — Browser fallback**
If a URL fails in Stage 1 — because the site requires JavaScript to render — BizSleuth retries it using a full Playwright browser. This covers single-page apps and JS-heavy sites that a plain HTTP crawler would miss.

**Stage 3 - AI parsing**
Once the text is collected, it's sent to Gemini AI along with your field definitions. The AI extracts what it can find and returns a structured result for each URL.

***

### 🛠️ How to use BizSleuth

1. Click **Try for free** on the actor page.
2. Paste your URL(s) directly, or upload a `.txt` file with one URL per line.
   > Use the root homepage of each website — e.g. `https://example.com` — not a deep link. BizSleuth crawls outward from there.
3. *(Optional)* Open **Advanced Options** → **Output Fields** to customize what you want extracted.
4. Click **Run** and wait for it to finish.
5. Download your results from the **Dataset** tab as JSON, CSV, XLSX, or JSONL.

***

### 📥 Input

| Field | Type | Required | Description |
|---|---|---|---|
| `startUrls` | Array | Yes | URLs to scrape. Accepts direct entries or a `.txt` file (one URL per line). |
| `outputSchema` | Object | No | Fields to extract. Key = field name, value = plain-English description for the AI. Uses the default schema if omitted. |

```json
{
    "startUrls": [
        { "url": "https://www.example-business.com" },
        { "url": "https://another-company.com" }
    ]
}
```

***

### 📤 Output

Each item in the dataset corresponds to one successfully processed URL. The `url` field is always included.

```json
{
    "business_name": "Bloom Wellness Studio",
    "business_owner_name": "Sarah Chen",
    "business_address": "418 West 3rd Ave, Vancouver, BC V5Y 1E5",
    "business_size": "small",
    "contact_email": "hello@bloomwellness.ca",
    "phone_number": "+1-604-555-0172",
    "business_summary": "A boutique yoga and pilates studio offering small-group classes, private sessions, and corporate wellness programs.",
    "url": "https://www.bloomwellness.ca"
}
```

- Fields the AI couldn't find are returned as `"none"`.
- URLs that fail to load after both crawl stages are skipped and excluded from the output.

***

### ✏️ Customizing the output schema

The output schema is the most powerful part of BizSleuth. Each key becomes a field in your output, and the value is a plain-English description that tells the AI what to look for. You can extract practically anything that appears on a website.

Here's an example for a fitness studio lead list:

```json
{
    "startUrls": [
        { "url": "https://www.example-studio.com" }
    ],
    "outputSchema": {
        "studio_name": "The name of the studio",
        "owner_name": "The owner or founder's name",
        "class_types": "Types of fitness classes offered, e.g. yoga, pilates, HIIT, barre",
        "booking_platform": "Online booking software used, e.g. Mindbody, Vagaro, ClassPass, Jane",
        "instagram_url": "Instagram page URL of the business",
        "membership_offered": "Whether the studio offers memberships or class packs — yes or no"
    }
}
```

The more specific your descriptions, the better the results.

***

### ⚠️ Limitations

- **Homepage URL required:** Provide the root URL, not a deep link. The actor crawls from whatever URL you give it.
- **JavaScript-heavy sites:** Most are covered by the browser fallback, but heavily bot-protected or CAPTCHA-gated sites may still fail.
- **Text-only extraction:** The AI works from page text. Information that only exists in images won't be extracted.
- **AI accuracy:** The AI won't invent information — if something isn't on the site, it returns `"none"`. That said, like any LLM, it can occasionally misread complex or cluttered pages.

***

### ❓ Frequently asked questions

**What kind of URLs should I provide?**
Always use the root homepage — e.g. `https://example.com`. The actor crawls from there and discovers internal pages on its own.

**Can I upload a large list of URLs?**
Yes. Use the file upload option and provide a `.txt` file with one URL per line.

**What happens to sites that fail to load?**
They're silently skipped. You'll only see results for URLs that were successfully processed.

**How accurate is the AI extraction?**
It depends on whether the information is actually on the website. The AI won't make things up — if a field isn't there, it returns `"none"`. Writing specific descriptions in your output schema helps significantly on ambiguous pages.

**Can I use this on social media profiles?**
BizSleuth is built for business websites. Social platforms typically block scrapers or require authentication, so results there would be unreliable.

***

# Actor input Schema

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

URLs to start with

## `outputSchema` (type: `object`):

Fields to extract from each website. Key = field name, Value = description for the AI. Add, remove, or rename fields as needed.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.example.com"
    },
    {
      "url": "https://www.example.com/some-path"
    }
  ],
  "outputSchema": {
    "business_name": "The name of the business",
    "business_owner_name": "The owner or founder's name (look for titles like owner, founder, director, president)",
    "business_address": "The full business address as it appears on the website",
    "business_size": "Business size: 'small' (under 50 employees), 'medium' (50-250), or 'large' (250+)",
    "contact_email": "Primary contact email address for the business",
    "phone_number": "Primary business phone number",
    "business_summary": "One sentence describing what the business does or offers"
  }
}
```

# Actor output Schema

## `business_name` (type: `string`):

No description

## `business_owner_name` (type: `string`):

No description

## `business_address` (type: `string`):

No description

## `business_size` (type: `string`):

No description

## `contact_email` (type: `string`):

No description

## `phone_number` (type: `string`):

No description

## `business_summary` (type: `string`):

No description

## `url` (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.example.com"
        },
        {
            "url": "https://www.example.com/some-path"
        }
    ],
    "outputSchema": {
        "business_name": "The name of the business",
        "business_owner_name": "The owner or founder's name (look for titles like owner, founder, director, president)",
        "business_address": "The full business address as it appears on the website",
        "business_size": "Business size: 'small' (under 50 employees), 'medium' (50-250), or 'large' (250+)",
        "contact_email": "Primary contact email address for the business",
        "phone_number": "Primary business phone number",
        "business_summary": "One sentence describing what the business does or offers"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("ashar_malik/bizsleuth").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.example.com" },
        { "url": "https://www.example.com/some-path" },
    ],
    "outputSchema": {
        "business_name": "The name of the business",
        "business_owner_name": "The owner or founder's name (look for titles like owner, founder, director, president)",
        "business_address": "The full business address as it appears on the website",
        "business_size": "Business size: 'small' (under 50 employees), 'medium' (50-250), or 'large' (250+)",
        "contact_email": "Primary contact email address for the business",
        "phone_number": "Primary business phone number",
        "business_summary": "One sentence describing what the business does or offers",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("ashar_malik/bizsleuth").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 '{
  "startUrls": [
    {
      "url": "https://www.example.com"
    },
    {
      "url": "https://www.example.com/some-path"
    }
  ],
  "outputSchema": {
    "business_name": "The name of the business",
    "business_owner_name": "The owner or founder'\''s name (look for titles like owner, founder, director, president)",
    "business_address": "The full business address as it appears on the website",
    "business_size": "Business size: '\''small'\'' (under 50 employees), '\''medium'\'' (50-250), or '\''large'\'' (250+)",
    "contact_email": "Primary contact email address for the business",
    "phone_number": "Primary business phone number",
    "business_summary": "One sentence describing what the business does or offers"
  }
}' |
apify call ashar_malik/bizsleuth --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

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