# Legal 500 Scraper (`maximedupre/legal500`) Actor

Collect public Legal 500 ranked law-firm listings by jurisdiction or practice-area page. Get firm names, ranking tiers, practice areas, jurisdictions, source links, and optional editorial details, clients, and recommended lawyers.

- **URL**: https://apify.com/maximedupre/legal500.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** Business, Lead generation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.90 / 1,000 firm listings

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

### ⚖️ Build a Legal 500 law-firm ranking list

For legal researchers, business teams, and developers, this Actor collects public Legal 500 ranked law-firm listings in a structured dataset. Choose a jurisdiction or a known practice-area page, then review firm names, ranking tiers, practice areas, jurisdictions, source links, and optional detail fields.

Use it to build a firm list, compare tiers by practice area, or send ranking rows to a research workflow.

- Review **[Legal 500 UK](https://apify.com/maximedupre/legal500/examples/legal-500-uk)** pages and their saved law-firm fields.
- Collect **[Legal 500 Rankings 2026](https://apify.com/maximedupre/legal500/examples/legal-500-rankings-2026)** for a selected market and inspect the rows.
- Export a **[Legal 500 List](https://apify.com/maximedupre/legal500/examples/legal-500-list)** for later firm research.
- Start from known practice-area pages with **[Legal 500 Rankings](https://apify.com/maximedupre/legal500/examples/legal-500-rankings)** and save matching firms.
- Build a **[Legal 500 Law Firms](https://apify.com/maximedupre/legal500/examples/legal-500-law-firms)** list with profile and ranking links.

#### 📊 Legal 500 ranking rows

Each saved row is one ranked law-firm listing. The row includes the firm, its ranking tier, practice area, jurisdiction, and direct links to the firm profile and ranking-detail pages. When detail-page enrichment is enabled, it can also include editorial commentary, notable clients, and recommended lawyers when the source provides them.

#### ▶️ Choose a jurisdiction or page

**Run steps**

1. Set **Target** to `Jurisdictions` and enter one or more country or market names, or set it to `Practice-area pages` and paste full listing page URLs you already know.
2. Fill only the option section for the selected target.
3. Set **Maximum ranking records** to a positive whole number when you want a bounded run. Leave it empty to collect all available records until the source is exhausted.
4. Turn on **Include detail-page enrichment** when you want commentary, clients, and recommended lawyers from ranking-detail pages.
5. Turn on **Resume a stopped crawl** when a saved continuation point exists.
6. Start the run and open the dataset link in the run output.

#### ⚙️ Input

The input has two target modes. Only fields in the selected Target options section are used.

**Input fields**

| Field | Type | What it does |
| --- | --- | --- |
| `target` | enum string | Chooses `jurisdictions` or `practiceAreaPages`. |
| `jurisdictions` | string\[] | Lists one or more Legal 500 country or market names when `target` is `jurisdictions`. |
| `practiceAreaPages` | object\[] | Supplies full Legal 500 practice-area listing page URLs when `target` is `practiceAreaPages`. |
| `maxItems` | integer | Stops after this many ranking records. Leave it empty to collect all available records until the source is exhausted. |
| `includeDetails` | boolean | Also collects editorial commentary, notable clients, and recommended lawyers from ranking-detail pages. |
| `resume` | boolean | Continues from a saved point when one exists. If no saved point exists, the run starts a new crawl. |

**Example input**

This is the public input from a successful current-beta default-style run:

```json
{
  "target": "jurisdictions",
  "jurisdictions": [
    "London"
  ],
  "maxItems": 100,
  "includeDetails": false,
  "resume": false
}
```

#### 🧾 Output

The run output includes a link to the Apify dataset. Dataset rows use one of the two shapes below, depending on whether detail-page enrichment was requested.

**Dataset link**

| Field | Type | What it does |
| --- | --- | --- |
| `dataset` | string (URL) | Links to the dataset of ranked law-firm listings. |

**Basic ranking row**

| Field | Type | What it does |
| --- | --- | --- |
| `firmName` | string | Name of the ranked law firm. |
| `rankingTier` | string | Legal 500 ranking tier for the listing. |
| `practiceArea` | string | Legal 500 practice area for the listing. |
| `jurisdiction` | string | Country or market jurisdiction for the listing. |
| `firmProfileUrl` | string (URL) | Link to the Legal 500 profile for the firm. |
| `rankingDetailUrl` | string (URL) | Link to the Legal 500 ranking-detail page. |

**Example basic row**

This genuine row came from the successful current-beta jurisdiction run:

```json
{
  "firmName": "Addleshaw Goddard",
  "rankingTier": "Tier 1",
  "practiceArea": "Commercial contracts",
  "jurisdiction": "London",
  "firmProfileUrl": "https://www.legal500.com/firms/41-addleshaw-goddard/r-england",
  "rankingDetailUrl": "https://www.legal500.com/rankings/ranking/c-london/corporate-and-commercial/commercial-contracts/41-addleshaw-goddard"
}
```

**Enriched ranking row**

When `includeDetails` is `true`, the row can also include these fields:

| Field | Type | What it does |
| --- | --- | --- |
| `firmName` | string | Name of the ranked law firm. |
| `rankingTier` | string | Legal 500 ranking tier for the listing. |
| `practiceArea` | string | Legal 500 practice area for the listing. |
| `jurisdiction` | string | Country or market jurisdiction for the listing. |
| `firmProfileUrl` | string (URL) | Link to the Legal 500 profile for the firm. |
| `rankingDetailUrl` | string (URL) | Link to the Legal 500 ranking-detail page. |
| `editorialCommentary` | string | Legal 500 editorial text about the firm in this practice area. |
| `notableClients` | string\[] | Notable clients named on the ranking-detail page. |
| `recommendedLawyers` | string\[] | Lawyers recommended on the ranking-detail page. |

**Example enriched row**

This genuine row came from the successful current-beta practice-area-page run:

```json
{
  "firmName": "Addleshaw Goddard",
  "rankingTier": "Tier 1",
  "practiceArea": "Commercial contracts",
  "jurisdiction": "London",
  "firmProfileUrl": "https://www.legal500.com/firms/41-addleshaw-goddard/r-england",
  "rankingDetailUrl": "https://www.legal500.com/rankings/ranking/c-london/corporate-and-commercial/commercial-contracts/41-addleshaw-goddard",
  "editorialCommentary": "boasts one of the largest dedicated commercial contracts practices in the UK. Supported by teams across Manchester, Leeds, and Scotland, the London office handles a vast range of mandates, many of which are distinct from their corporate deal flow. The group advises a diverse and impressive range of clients, including a notable number of FTSE 100 companies, on the full range of commercial contract activity, including procurement, joint ventures, outsourcing, and distribution agreements. Adding to its strength in the retail and consumer sector, epitomised by long-standing partnerships with major retailers and FMCG conglomerates, the team remains a key player in high-value outsourcing and payment services arrangements, with key clients including leading domestic and international financial institutions. Leeds-based Michael Lowry heads the practice group. The London office acts as an important hub of work in this sector, with Damon Rosamond-Lanzetta and Andrew Carter, who focuses on the transport sector, leading on significant mandates. Oliver Millerchip continues to develop a practice in the retail and consumer space.",
  "notableClients": [
    "Volkswagen AG",
    "Asda Group",
    "NFU Mutual Insurance Society Limited",
    "Barclays Bank UK plc",
    "HSBC UK Bank plc",
    "Lloyds Banking Group plc",
    "Nationwide Building Society",
    "NatWest Group",
    "Northern Bank Limited (trading as Danske Bank)",
    "Santander UK plc",
    "TSB Bank plc",
    "Virgin Money",
    "Bank of Ireland (UK) plc",
    "MedAccess Guarantee Limited",
    "The Restaurant Group Plc",
    "Rathbones Plc",
    "Hitachi Europe Limited & Hitachi Rail Limited",
    "Sony Interactive Entertainment LLC",
    "United Utilities plc"
  ],
  "recommendedLawyers": [
    "Jonathan Davey",
    "Damon Rosamond-Lanzetta",
    "Andrew Carter",
    "Oliver Millerchip"
  ]
}
```

#### 💳 Pricing

**Firm listing**

This Actor uses pay-per-event pricing. Each ranked law-firm listing saved to the dataset costs `$0.0009`.

#### 🔌 Integrations

**Dataset access**

Open the Apify dataset link from the run output, export the rows, or use the Apify API for programmatic access.

https://www.youtube.com/watch?v=bNACk1\_S\_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

#### ❓ FAQ

##### Can I use a known practice-area page?

Yes. Set **Target** to `Practice-area pages` and paste one or more full Legal 500 practice-area listing URLs. This lets you start from pages you already know.

##### What happens when I leave Maximum ranking records empty?

The run returns all available records until the source is exhausted. Use a positive whole number when you want the run to stop after a set number of records.

##### What does Include detail-page enrichment add?

It asks the Actor to collect editorial commentary, notable clients, and recommended lawyers from ranking-detail pages. These fields appear when the source provides them.

##### Can I resume a stopped crawl?

Yes. Turn on **Resume a stopped crawl** when a saved point exists. If no saved point exists, the run starts a new crawl.

##### Can one run combine separate search setups?

No. Use one target setup for a run. Start another run for a different setup.

##### Does the Actor collect private Legal 500 content?

No. It is for public Legal 500 ranked-listing pages. Private, authenticated, and access-restricted content is outside its scope.

##### Which links are returned for each firm?

Each ranking row includes a firm profile URL and a ranking-detail URL when the source provides them.

##### Does this provide legal advice?

No. It returns public ranking data and source links for research. It does not give legal advice or decide whether a firm is right for a matter.

### 📝 Changelog

**0.0: Initial release**

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~legal500/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Related Actors

- [CourtListener Scraper](https://apify.com/maximedupre/courtlistener) - Search public opinions, federal dockets, and oral arguments for case research.
- [Harris County Court Records Scraper](https://apify.com/maximedupre/harris-county-court-records-scraper) - Find public Harris County probate and civil case records with parties, attorneys, and filing events.
- [Federal Register Scraper — Rules & Regulations](https://apify.com/maximedupre/federal-register) - Search public U.S. rules, notices, agencies, and official document links.
- [Legal 500 Scraper](https://apify.com/jungle_synthesizer/legal500-scraper) - Collect ranked law-firm data from Legal500.com.
- [Benchmark Litigation Rankings Scraper](https://apify.com/jungle_synthesizer/benchmark-litigation-law-firm-rankings-scraper) - Collect litigation law-firm rankings and tiered firm lists from Benchmark Litigation.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

## `target` (type: `string`):

Choose where the Legal 500 crawl starts.

## `jurisdictions` (type: `array`):

Enter one or more Legal 500 jurisdiction names when Target is set to Jurisdictions. Use country or market-level names as they appear on Legal 500.

## `practiceAreaPages` (type: `array`):

Paste one or more full Legal 500 practice-area listing page URLs when Target is set to Practice-area pages. Use this when you already know which pages to crawl.

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

Use a positive whole number to stop after that many ranking records. Leave it empty to collect all available records until the source is exhausted.

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

Also collect editorial commentary, notable clients, and recommended lawyers from each ranking-detail page.

## `resume` (type: `boolean`):

Continue from a saved point when one exists. If no saved point exists, start a new crawl.

## Actor input object example

```json
{
  "target": "jurisdictions",
  "jurisdictions": [
    "London"
  ],
  "maxItems": 100,
  "includeDetails": false,
  "resume": false
}
```

# Actor output Schema

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

Link to the dataset of ranked law-firm listings.

# 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 = {
    "target": "jurisdictions",
    "jurisdictions": [
        "London"
    ],
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/legal500").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 = {
    "target": "jurisdictions",
    "jurisdictions": ["London"],
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/legal500").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 '{
  "target": "jurisdictions",
  "jurisdictions": [
    "London"
  ],
  "maxItems": 100
}' |
apify call maximedupre/legal500 --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,maximedupre/legal500"
        }
    }
}

```

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/z1uNA1EjLW4FIwmoZ/builds/wJbRvW9NL4w6T2h9D/openapi.json
