# LawInfo Child Custody Lawyer Scraper (`jungle_synthesizer/lawinfo-scraper`) Actor

Scrape child custody and family law attorney profiles from LawInfo.com (Thomson Reuters directory) with phone, address, firm website, practice areas, languages spoken, and verified-attorney counts

- **URL**: https://apify.com/jungle\_synthesizer/lawinfo-scraper.md
- **Developed by:** [BowTiedRaccoon](https://apify.com/jungle_synthesizer) (community)
- **Categories:** Lead generation, Business, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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 a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## LawInfo Child Custody Lawyer Scraper

Scrape child custody and family law firm profiles from [LawInfo.com](https://www.lawinfo.com/), a Thomson Reuters attorney directory. Returns firm names, phone numbers, addresses, firm websites, practice areas, languages spoken, verified-attorney counts, and consultation availability for law firms across every US state.

---

### LawInfo Scraper Features

- Extracts 15+ fields per firm profile including contact info, address, practice areas, and languages spoken
- Pulls structured data from Schema.org JSON-LD embedded in each profile page -- clean and consistent
- Filters by US state and city, with automatic pagination across listing pages
- Supports three input modes: state/city browse, custom listing URLs, or direct profile URLs
- Handles Cloudflare protection with residential proxy rotation
- Outputs to JSON, CSV, or the Apify API

---

### Who Uses LawInfo Attorney Data?

- **Legal marketing agencies** -- Build targeted outreach lists of child custody and family law firms by city and state
- **CRM enrichment** -- Populate your contact database with verified firm names, phone numbers, websites, and addresses
- **Market research** -- Analyze attorney density, language coverage, and consultation availability across geographic regions
- **Competitive intelligence** -- Track which firms appear in the LawInfo directory and how they position their practice areas
- **Lead qualification** -- Filter firms by free consultation availability, years of experience, and Lead Counsel verification status

---

### How the LawInfo Scraper Works

1. **Pick a target** -- Specify a US state and city, provide custom listing URLs, or paste direct profile URLs
2. **Listing discovery** -- The scraper paginates through LawInfo listing pages and collects links to individual firm profiles
3. **Profile extraction** -- Each firm profile is parsed via its Schema.org JSON-LD block, pulling structured data without relying on brittle CSS selectors
4. **Export** -- Results land in the Apify dataset, ready to download as JSON or CSV

---

### Input

```json
{
  "state": "california",
  "city": "los-angeles",
  "maxPagesPerCity": 2,
  "maxItems": 50
}
````

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| state | string | `"california"` | US state slug, lowercase and hyphenated (e.g., `"new-york"`, `"texas"`, `"florida"`). |
| city | string | `"los-angeles"` | City slug, lowercase and hyphenated (e.g., `"san-francisco"`, `"houston"`, `"chicago"`). |
| maxPagesPerCity | integer | `2` | How many listing pages to walk per city. Each page has roughly 25 firms. |
| maxItems | integer | `50` | Maximum number of firm profiles to scrape per run. |
| listingUrls | string\[] | `[]` | Custom LawInfo listing URLs to crawl directly. Overrides state/city when provided. |
| profileUrls | string\[] | `[]` | Direct LawInfo profile URLs to fetch. Bypasses listing crawl entirely. |

#### Direct Profile URLs

Skip the listing crawl and go straight to specific firms:

```json
{
  "profileUrls": [
    "https://www.lawinfo.com/lawfirm/california/riverside/stacy-albelais-attorney-at-law/36788bf4-b4de-403b-a14a-081ff982fa77.html"
  ],
  "maxItems": 10
}
```

***

### LawInfo Scraper Output Fields

```json
{
  "firmName": "Stacy Albelais, Attorney at Law",
  "description": "Family law attorney serving Riverside, CA",
  "phone": "(951) 555-0123",
  "firmWebsite": "https://www.stacyalbelais.com",
  "streetAddress": "3801 University Ave, Suite 560",
  "city": "Riverside",
  "state": "CA",
  "postalCode": "92501",
  "country": "US",
  "practiceAreas": "Child Custody, Family Law, Divorce",
  "languagesSpoken": "English, Spanish",
  "leadCounselVerified": 1,
  "averageYearsExperience": 18,
  "freeConsultation": true,
  "imageUrl": "https://www.lawinfo.com/images/firm-photo.jpg",
  "profileUrl": "https://www.lawinfo.com/lawfirm/california/riverside/stacy-albelais-attorney-at-law/36788bf4-b4de-403b-a14a-081ff982fa77.html",
  "scrapedAt": "2026-04-14T12:00:00.000Z"
}
```

| Field | Type | Description |
|-------|------|-------------|
| firmName | string | Law firm name |
| description | string | Short firm description or tagline |
| phone | string | Primary phone number |
| firmWebsite | string | External firm website URL |
| streetAddress | string | Street address of main office |
| city | string | City of main office |
| state | string | Two-letter US state code |
| postalCode | string | ZIP / postal code |
| country | string | Country (typically US) |
| practiceAreas | string | Comma-separated practice areas the firm handles |
| languagesSpoken | string | Comma-separated languages spoken at the firm |
| leadCounselVerified | number | Number of Lead Counsel Verified attorneys at the firm |
| averageYearsExperience | number | Average years of experience across attorneys |
| freeConsultation | boolean | Whether the firm offers a free initial consultation |
| imageUrl | string | URL of the firm's profile image |
| profileUrl | string | Canonical LawInfo profile URL |
| scrapedAt | string | ISO timestamp when the profile was scraped |

***

### FAQ

#### How do I scrape attorney data from LawInfo.com?

The LawInfo Scraper handles it. Set a US state and city, configure your maxItems limit, and run the actor. It paginates through listings, visits each firm profile, and extracts structured data from the page's JSON-LD metadata.

#### What data can I get from LawInfo.com?

The LawInfo Scraper returns firm names, phone numbers, firm websites, full addresses, practice areas, languages spoken, Lead Counsel verification counts, average years of experience, free consultation flags, and profile images. That covers most of what you would want for legal lead generation or directory analysis.

#### How much does the LawInfo Scraper cost to run?

The LawInfo Scraper uses pay-per-event pricing: $0.10 per actor start plus $0.001 per record. A 50-firm run costs roughly $0.15 total. Residential proxy usage is the main variable cost for larger runs.

#### Does the LawInfo Scraper work for practice areas other than child custody?

LawInfo.com currently has active listings only for the child-custody practice area. Other practice area pages return empty results. However, the actor accepts direct listing URLs and direct profile URLs, so if LawInfo expands to other areas, you can target them without waiting for an actor update.

#### Does the LawInfo Scraper need proxies?

Yes. LawInfo.com is behind Cloudflare, so US residential proxies are required. The actor configures these automatically via Apify's proxy infrastructure.

***

### Need More Features?

Need custom fields, additional practice areas, or a scraper for a different legal directory? [File an issue](https://console.apify.com/actors/issues) or get in touch.

### Why Use the LawInfo Scraper?

- **Structured data** -- Extracts from Schema.org JSON-LD, so output is consistent and reliable across thousands of profiles
- **Flexible targeting** -- Browse by state and city, paste listing URLs, or go straight to specific profiles
- **Affordable** -- Pay-per-event pricing at $0.001 per record, with no monthly subscription

# Actor input Schema

## `sp_intended_usage` (type: `string`):

Please describe how you plan to use the data extracted by this crawler.

## `sp_improvement_suggestions` (type: `string`):

Provide any feedback or suggestions for improvements.

## `sp_contact` (type: `string`):

Provide your email address so we can get in touch with you.

## `state` (type: `string`):

US state slug (lowercase, hyphenated). Examples: california, new-york, texas, florida, illinois.

## `city` (type: `string`):

City slug (lowercase, hyphenated). Examples: los-angeles, san-francisco, new-york, houston, chicago.

## `maxPagesPerCity` (type: `integer`):

How many listing pages to walk per city. Each page has ~25 firms. Capped by maxItems.

## `listingUrls` (type: `array`):

Optional. LawInfo listing URLs to crawl directly (e.g. https://www.lawinfo.com/child-custody-lawyers/texas/houston/). Overrides state/city when provided.

## `profileUrls` (type: `array`):

Optional. LawInfo profile URLs to fetch directly (e.g. https://www.lawinfo.com/lawfirm/{state}/{city}/{slug}/{uuid}.html). Bypasses listing crawl entirely.

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

Maximum number of firm profiles to scrape per run. Set 0 for no limit. Default kept modest so first runs finish quickly.

## Actor input object example

```json
{
  "sp_intended_usage": "Describe your intended use...",
  "sp_improvement_suggestions": "Share your suggestions here...",
  "sp_contact": "Share your email here...",
  "state": "california",
  "city": "los-angeles",
  "maxPagesPerCity": 2,
  "listingUrls": [],
  "profileUrls": [],
  "maxItems": 50
}
```

# 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 = {
    "sp_intended_usage": "Describe your intended use...",
    "sp_improvement_suggestions": "Share your suggestions here...",
    "sp_contact": "Share your email here...",
    "state": "california",
    "city": "los-angeles",
    "maxPagesPerCity": 2,
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("jungle_synthesizer/lawinfo-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 = {
    "sp_intended_usage": "Describe your intended use...",
    "sp_improvement_suggestions": "Share your suggestions here...",
    "sp_contact": "Share your email here...",
    "state": "california",
    "city": "los-angeles",
    "maxPagesPerCity": 2,
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("jungle_synthesizer/lawinfo-scraper").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 '{
  "sp_intended_usage": "Describe your intended use...",
  "sp_improvement_suggestions": "Share your suggestions here...",
  "sp_contact": "Share your email here...",
  "state": "california",
  "city": "los-angeles",
  "maxPagesPerCity": 2,
  "maxItems": 50
}' |
apify call jungle_synthesizer/lawinfo-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "LawInfo Child Custody Lawyer Scraper",
        "description": "Scrape child custody and family law attorney profiles from LawInfo.com (Thomson Reuters directory) with phone, address, firm website, practice areas, languages spoken, and verified-attorney counts",
        "version": "1.0",
        "x-build-id": "6ncK9VHfTWKJAn9UO"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/jungle_synthesizer~lawinfo-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-jungle_synthesizer-lawinfo-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/jungle_synthesizer~lawinfo-scraper/runs": {
            "post": {
                "operationId": "runs-sync-jungle_synthesizer-lawinfo-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/jungle_synthesizer~lawinfo-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-jungle_synthesizer-lawinfo-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "sp_intended_usage": {
                        "title": "What is the intended usage of this data?",
                        "minLength": 1,
                        "type": "string",
                        "description": "Please describe how you plan to use the data extracted by this crawler."
                    },
                    "sp_improvement_suggestions": {
                        "title": "How can we improve this crawler for you?",
                        "minLength": 1,
                        "type": "string",
                        "description": "Provide any feedback or suggestions for improvements."
                    },
                    "sp_contact": {
                        "title": "Contact Email",
                        "minLength": 1,
                        "type": "string",
                        "description": "Provide your email address so we can get in touch with you."
                    },
                    "state": {
                        "title": "State",
                        "type": "string",
                        "description": "US state slug (lowercase, hyphenated). Examples: california, new-york, texas, florida, illinois.",
                        "default": "california"
                    },
                    "city": {
                        "title": "City",
                        "type": "string",
                        "description": "City slug (lowercase, hyphenated). Examples: los-angeles, san-francisco, new-york, houston, chicago.",
                        "default": "los-angeles"
                    },
                    "maxPagesPerCity": {
                        "title": "Max Listing Pages Per City",
                        "type": "integer",
                        "description": "How many listing pages to walk per city. Each page has ~25 firms. Capped by maxItems.",
                        "default": 2
                    },
                    "listingUrls": {
                        "title": "Custom Listing URLs",
                        "type": "array",
                        "description": "Optional. LawInfo listing URLs to crawl directly (e.g. https://www.lawinfo.com/child-custody-lawyers/texas/houston/). Overrides state/city when provided.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "profileUrls": {
                        "title": "Direct Profile URLs",
                        "type": "array",
                        "description": "Optional. LawInfo profile URLs to fetch directly (e.g. https://www.lawinfo.com/lawfirm/{state}/{city}/{slug}/{uuid}.html). Bypasses listing crawl entirely.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxItems": {
                        "title": "Max Items",
                        "type": "integer",
                        "description": "Maximum number of firm profiles to scrape per run. Set 0 for no limit. Default kept modest so first runs finish quickly.",
                        "default": 50
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
