# FindLaw Law Firm Scraper - Attorney & Law Firm Data Extraction (`scraptivo/findlaw-scraper`) Actor

Collect FindLaw.com law firm profiles, including contact details, ratings, practice areas, and optional client reviews.

- **URL**: https://apify.com/scraptivo/findlaw-scraper.md
- **Developed by:** [Scraptivo](https://apify.com/scraptivo) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 results

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/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

**FindLaw Law Firm Scraper** collects law firm profiles from [FindLaw](https://lawyers.findlaw.com) and turns them into structured data for legal-directory research, lead generation, and competitor monitoring. Paste a FindLaw search-result URL or a firm profile URL, then export firm name, phone, address, rating, and profile URL to JSON, CSV, or Excel. Use it to build attorney lists, watch practice-area coverage, and schedule recurring collection. Pricing is **$1.00 per 1,000 firm records**.

### What can you automate with FindLaw Law Firm Scraper?

- **Build attorney and firm lists** — Start from a practice-area and city search page such as motor-vehicle accidents in Manitowoc, WI.
- **Collect contact fields** — Export phone, address, and rating when **Extract Profile Details** is on (default).
- **Attach client reviews** — Optionally nest reviews on each firm row.
- **Cap a run** — Use `maxFirms` and `maxPages` to keep a search inside your volume target.
- **Schedule recurring collection** — Run weekly and push new firms into Sheets, a CRM, or an alert workflow.

### Who is this scraper for?

| Team | Workflow |
|---|---|
| Legal-marketing agencies | Build city-and-practice lists of firms for outreach. |
| Directory and lead products | Collect phone, address, and ratings from FindLaw search pages. |
| Competitive researchers | Watch which firms appear for a practice area and location. |
| Intake teams | Combine firm profiles with optional client reviews. |

### What data can you collect from FindLaw?

| Data group | Example fields | How it helps |
|---|---|---|
| Firm identity | `wldId`, `firmName`, `url`, `title` | Identify each firm and deduplicate with `wldId` or `url`. |
| Contact | `phone`, `address`, `imageUrl` | Reach the firm and map its office. |
| Reputation | `aggregateRating`, `totalReviews` | Rank firms by published rating and review count. |
| Profile | `profile.description`, `profile.knowsAbout`, `profile.areaServed` | Read practice areas and service area when details are on. |
| Reviews | `reviews` | Appear when **Extract Reviews** is on. |

`startUrls` is required. Search-result pages paginate up to `maxPages`. Profile details are on by default. Reviews are off by default.

### How to use FindLaw Law Firm Scraper

1. Open the [FindLaw Law Firm Scraper](https://apify.com/scraptivo/findlaw-scraper) on Apify.
2. Paste one or more FindLaw search or firm-profile URLs.
3. Set **Max firms** (Console prefill is 20; `0` means unlimited) and whether to collect reviews.
4. Run the Actor — it writes one dataset row per firm.
5. Export the dataset or connect it to your workflow.

```json
{
    "startUrls": [
        {
            "url": "https://lawyers.findlaw.com/motor-vehicle-accidents-plaintiff/wisconsin/manitowoc/"
        }
    ],
    "extractProfileDetails": true,
    "extractReviews": false,
    "maxFirms": 20,
    "maxPages": 10,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": ["RESIDENTIAL"]
    }
}
```

### Example workflow

#### Build a Wisconsin personal-injury firm list

1. Schedule a monthly run with a FindLaw motor-vehicle accident search URL for each target city.
2. Keep firms with a published rating using `aggregateRating.ratingValue`.
3. Enable **Extract Reviews** on shortlisted firms when you need client comments.
4. Send new records to Google Sheets or a CRM through a webhook after each run.
5. Deduplicate user-side against `wldId` or `url`.

The Actor does not merge results across runs — those steps happen in your pipeline.

### Automate and integrate your results

- **Schedules** — Run **monthly** for directory snapshots, or **weekly** when you monitor a competitive practice area. Create a separate scheduled task per city and practice URL.
- **Webhooks** — Push completed runs into Google Sheets, Make, Zapier, Slack, or a CRM.
- **Exports and API** — Download JSON, CSV, Excel, or HTML from the Apify Console, or start a run from the API:

```shell
curl -X POST "https://api.apify.com/v2/acts/scraptivo~findlaw-scraper/runs?token=YOUR-APIFY-TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "startUrls": [{"url": "https://lawyers.findlaw.com/motor-vehicle-accidents-plaintiff/wisconsin/manitowoc/"}],
    "extractProfileDetails": true,
    "maxFirms": 20
  }'
```

Deduplicate user-side with `wldId`.

### Input reference

| Field | Type | Required | Default | What it controls |
|---|---|---:|---|---|
| `startUrls` | array | Yes | — | FindLaw search-result or firm-profile URLs. |
| `extractProfileDetails` | boolean | No | `true` | Add name, address, phone, ratings, and related profile fields. |
| `extractReviews` | boolean | No | `false` | Nest client reviews on each firm. |
| `maxFirms` | integer | No | `0` | Cap firms; Console prefill is 20. |
| `maxPages` | integer | No | `10` | Cap search-result pages per start URL; `0` is unlimited. |
| `proxyConfiguration` | object | No | Residential | Apify proxy settings. |

### Output example

```json
{
    "url": "https://lawyers.findlaw.com/lawyer/firm/example-law-firm",
    "wldId": "123456",
    "firmName": "Smith & Associates Law Firm",
    "phone": "(555) 123-4567",
    "title": "Smith & Associates Law Firm - Manitowoc, WI Personal Injury Attorneys",
    "address": {
        "streetAddress": "123 Main St",
        "addressLocality": "Manitowoc",
        "addressRegion": "WI",
        "postalCode": "54220",
        "addressCountry": "US"
    },
    "aggregateRating": {
        "ratingValue": 4.5,
        "reviewCount": 28
    }
}
```

The example above matches the Actor's documented output shape. Live field values depend on the FindLaw page you run.

### How much does it cost to scrape FindLaw?

Billing is pay-per-event. A one-time **Actor Start** fee of **$0.00005** applies per run. Each firm row is one `apify-default-dataset-item` event at **$1.00 per 1,000 firms**.

A 20-firm test costs about **$0.02** plus Actor Start. A 1,000-firm run costs about **$1.00** plus Actor Start. Reviews nest on the firm row and do not create a separate charge event. Apify plan discounts may reduce these prices. Platform compute and proxy usage are billed separately on your Apify plan.

### Reliability and responsible use

- **Proxy** — Residential proxies are recommended and are the default setting.
- **Conditional fields** — Profile extras and reviews appear only when their toggles are on. Some firms omit phone or rating.
- **Public data** — The Actor collects publicly visible firm and review information from FindLaw.
- **Responsible use** — Only use the data in ways that comply with FindLaw's terms of service and applicable law, including rules on lawyer advertising.

### Frequently asked questions

#### Can I scrape FindLaw firms by practice area and city?

Yes. Paste a FindLaw search URL that already includes the practice area and location, or paste individual firm profile URLs.

#### Can I schedule FindLaw Law Firm Scraper to run automatically?

Yes. Open the **Scheduler** tab in Apify Console and set a weekly or monthly cadence per search URL.

#### What counts as one result?

One firm written to the dataset is one billable result at **$1.00 per 1,000 firms**, plus Actor Start.

#### Why are some fields empty?

Phone, rating, and reviews are omitted when FindLaw does not publish them, or when **Extract Profile Details** / **Extract Reviews** is off.

#### How do I avoid duplicate records?

Within one run, firms are unique by profile URL / `wldId`. Across runs the Actor appends results. When you combine datasets, keep the first row for each `wldId`.

#### Do I need a proxy?

Yes. Use Apify residential proxies. If a run returns unusually few firms, confirm that `proxyConfiguration` uses the RESIDENTIAL group.

### Related Scraptivo automations

- [Clutch Scraper](https://apify.com/scraptivo/clutch-scraper) — collect agency and professional-service profiles.
- [BBB Scraper](https://apify.com/scraptivo/bbb-scraper) — add Better Business Bureau company records.
- [Leadrocks Scraper](https://apify.com/scraptivo/leadrocks-scraper) — expand B2B lead coverage beyond legal directories.
- [LinkedIn Company Scraper](https://apify.com/scraptivo/linkedin-company-scraper) — enrich FindLaw firms with LinkedIn company pages.

### Support and custom workflows

Need a different field, source, or delivery workflow? Contact Scraptivo at scraptivo@gmail.com. Include the Actor name, sample URL, required fields, and expected volume so we can assess the request.

# Actor input Schema

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

URLs to start scraping from. Enter SRP (search result) pages or individual law firm profile pages.

## `extractProfileDetails` (type: `boolean`):

Extract detailed law firm profile information from the page (name, address, phone, ratings, etc.).

## `extractReviews` (type: `boolean`):

Extract client reviews for each law firm from the reviews API.

## `maxFirms` (type: `integer`):

Maximum number of law firms to scrape (0 = unlimited).

## `maxPages` (type: `integer`):

Maximum number of search result pages to follow per starting URL (0 = unlimited).

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

Proxy settings for anti-bot protection. Apify Residential proxies are recommended for reliable scraping.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://lawyers.findlaw.com/motor-vehicle-accidents-plaintiff/wisconsin/manitowoc/"
    }
  ],
  "extractProfileDetails": true,
  "extractReviews": false,
  "maxFirms": 20,
  "maxPages": 10,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

## `run` (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://lawyers.findlaw.com/motor-vehicle-accidents-plaintiff/wisconsin/manitowoc/"
        }
    ],
    "maxFirms": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("scraptivo/findlaw-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://lawyers.findlaw.com/motor-vehicle-accidents-plaintiff/wisconsin/manitowoc/" }],
    "maxFirms": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("scraptivo/findlaw-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://lawyers.findlaw.com/motor-vehicle-accidents-plaintiff/wisconsin/manitowoc/"
    }
  ],
  "maxFirms": 20
}' |
apify call scraptivo/findlaw-scraper --silent --output-dataset

```

## MCP server setup

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