Martindale.com Lawyer Directory Scraper
Pricing
from $2.25 / 1,000 results
Martindale.com Lawyer Directory Scraper
Scrape US attorneys from Martindale.com — name, phone, full address with city/state/zip, firm website, headshot, and Martindale profile URL. 30 attorneys per listing page (no detail-page fetches needed). JSON/CSV out, billed per result.
Pricing
from $2.25 / 1,000 results
Rating
0.0
(0)
Developer
Muhamed Didovic
Actor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Turn Martindale.com into a structured US-attorney dataset. Scrape every lawyer card from any Martindale listing URL — name (split into first/last), telephone (formatted + digits-only), full street address with city/state/zip, headshot image, firm website, and direct Martindale profile URL — all from a single fetch. ~30 attorneys per listing page; pagination auto-walked. JSON or CSV out, no compute charge per run, just per result.
How it works

🚀 Quick start
The actor is prefilled with a working demo — paste any martindale.com URL, or pick a practice area + state + city from the dropdowns. Click Start and you'll get the first 30+ attorneys for personal-injury-lawyers/dallas/texas/.
| Mode | Example input |
|---|---|
| A. Paste a URL | startUrls: ["https://www.martindale.com/personal-injury-lawyers/dallas/texas/"] |
| B. Dropdowns (cartesian) | searchByCategory: ["personal-injury-lawyers"], searchByLocation: ["texas"], searchByCity: ["dallas","austin","houston"] → 3 listing URLs |
| C. State-wide | searchByCategory: ["family-lawyers"], searchByLocation: ["california"], searchByCity: [] → /areas-of-law/family-lawyers/california (single huge fetch) |
💡 Pagination is automatic. Pasting
?page=4will continue walking from page 5 until the source runs out ormaxItemsis reached.
✨ Why use this scraper?
Building a US legal lead list? Mapping attorney density by city + practice area? Need a clean dataset of personal-injury / family / criminal-defense attorneys without paying for a CRM-vertical seat?
- 🎯 Three ways to start. Paste a Martindale URL, pick from
practice area × state × citydropdowns (cartesian product), or combine. URLs always win. - ⚡ Lite-only architecture, no detail fetches. Listing pages embed a
@graphJSON-LD with full row data for ~30 attorneys per page. No per-attorney detail-page fetches needed — keeps the bill low and skips Martindale's flaky detail-page Cloudflare gate. - 🛡 Cloudflare-aware. Martindale serves Cloudflare on every page; the 3-stack TLS race (impit + got-scraping + curl-impersonate Chrome 131) gets through. No browser automation.
- 🔁 Pagination auto-walked. Paste a base URL or a
?page=NURL — the actor walks subsequent pages untilmaxItemsis reached or the source runs out. - 🧹 De-duplicated by attorney ID. Adjacent listing pages overlap by ~15-20% on Martindale; we de-dupe by Martindale's own numeric attorney ID so you get one row per person.
- 📤 Clean exports. One row per attorney, 12 fields. JSON + CSV exported automatically.
🎯 Use cases
| Team | What they build |
|---|---|
| Legal marketing / SaaS GTM | Outbound lists for vendors selling to small/solo law firms — by state, city, and practice area |
| Lead-gen / referral networks | Local attorney directories or referral matchmaking by practice area + city |
| Legal-tech research | Density maps of attorney supply per metro by practice area |
| Existing platforms enriching their data | Patching attorney records with verified phone, address, headshot, and firm website |
| Competitive intelligence | Market mapping for new geographies / practice-area expansion |
📥 Supported inputs
The scraper accepts inputs in two mutually-exclusive modes — URLs take strict precedence over filters:
⚠️ Precedence rule. If
startUrlshas any non-empty entry, the practice-area / state / city dropdowns are completely ignored. Clear the URL list to use the dropdowns.
Mode 1 — Paste Martindale URLs (highest priority)
| URL pattern | Behaviour |
|---|---|
https://www.martindale.com/{practice-area}-lawyers/{city}/{state}/ | City listing — extracts ~30 attorneys/page, walks pagination |
https://www.martindale.com/{practice-area}-lawyers/{city}/{state}/?page=N | Paginated listing — same, but starts from page N |
https://www.martindale.com/areas-of-law/{practice-area}-lawyers/{state} | State-wide listing — single huge fetch (~5-10 MB body) |
https://www.martindale.com/attorney/{slug}-{numeric-id}/ | Skipped — detail pages flake on Cloudflare and add no fields beyond the listing data |
Mode 2 — Practice area + state (+ optional city) dropdowns
All three dropdowns are multi-select. The scraper expands the cartesian product:
{personal-injury-lawyers, family-lawyers} × {texas} × {dallas, austin, houston}→ 6 listing URLs
Edge cases:
- Practice area + state, no city →
/areas-of-law/{practice-area}-lawyers/{state}(state-wide listing — biggest possible result set per call). - Practice area, no state, no city → national listing for that practice area.
- No practice area at all → falls back to the default Dallas personal-injury listing.
Not supported:
- Martindale articles, attorney rating pages, and the
martindale-hubbellratings subdomain - Direct attorney detail pages (skipped — listings already have the full row data)
🔄 How it works (technical)
- Resolve start URLs from the cartesian product of dropdowns + any pasted
startUrls. - Skip any attorney-profile URLs — Martindale's detail pages flake behind Cloudflare and add no extra fields.
- Fetch each listing page through the 3-stack TLS race (impit + got-scraping + curl-impersonate Chrome 131). Only curl-impersonate reliably passes Martindale's CF challenge; the race makes that automatic.
- Parse the JSON-LD
@graphblock — each block holds ~30LegalServiceitems with name, phone, image, address, firm website, and Martindale profile URL. - Dedupe by Martindale attorney ID to avoid the 15-20% overlap between adjacent paginated pages.
- Push one row per attorney to the dataset; walk
?page=Npagination automatically.
⚙️ Input parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
startUrls | array | ["https://www.martindale.com/personal-injury-lawyers/dallas/texas/"] | Optional Martindale URLs. Takes precedence over dropdowns. |
searchByCategory | array (enum) | ["personal-injury-lawyers"] | Practice-area slugs (20 options). Multi-select. |
searchByLocation | array (enum) | ["texas"] | US state slugs (51 options including DC). Multi-select. |
searchByCity | array (string) | ["dallas"] | Optional city slugs. Multi-select. |
maxItems | integer | 5000 | Hard cap on attorney rows. ~30 per listing page; pagination auto-walks until this cap. |
maxConcurrency / minConcurrency | integer | 5 / 1 | Parallel HTTP request limits. |
maxRequestRetries | integer | 5 | Retries before a request is given up. |
proxy | object | Apify residential, US | Martindale serves Cloudflare on every page — a US residential pool is strongly required. |
📊 Output overview
Each scraped attorney is one single dataset row of type: "attorney". No nested objects, no padding rows — one row equals one attorney.
📦 Output sample
{"type": "attorney","attorneyId": "1640128","id": "1640128","name": "Alan Notinger","firstName": "Alan","lastName": "Notinger","telephone": "817-516-6995","primaryPhone": "8175166995","address": "2929 Carlisle Street, Suite 115, Dallas, TX","streetAddress": "2929 Carlisle Street, Suite 115","addressLocality": "Dallas","addressRegion": "TX","city": "Dallas","state": "TX","postalCode": "75204","addressCountry": "U.S.A.","image": "https://www.martindale.com/LBM_Images/Lawyers/lawyer-alan-notinger-mr-photo-5205611.png","firmWebsite": "https://www.kaplanlawgrouppllc.com/","profileUrl": "https://www.martindale.com/attorney/mr-alan-s-notinger-1640128/?pa=282","sameAs": ["https://www.martindale.com/attorney/mr-alan-s-notinger-1640128/?pa=282"],"scrapedAt": "2026-05-10T18:08:01.117Z"}
🗂 Output fields
| Group | Fields |
|---|---|
| Identifiers | type, attorneyId, id (alias), profileUrl, scrapedAt |
| Person | name, firstName, lastName |
| Contact | telephone (formatted), primaryPhone (digits-only 10-digit form), address (composed), streetAddress, addressLocality / city, addressRegion / state, postalCode, addressCountry |
| Web presence | image (headshot URL), firmWebsite, sameAs[] (full outbound link list — usually just the Martindale profile) |
❓ FAQ
Why no bio, practice areas, education, or ratings? Martindale's listing-page JSON-LD only exposes the basics (name, phone, address, image, firm website, profile URL). Richer fields — bio, practice areas, education, peer reviews, ratings — would require fetching each attorney's detail page, but those pages flake on Cloudflare often enough that we don't ship that path. For a richer attorney profile, see the Avvo Lawyer Directory Scraper instead.
Why is the Cloudflare warning in the proxy description? Martindale uses Cloudflare aggressively. We probed three HTTP stacks; only curl-impersonate Chrome 131 (real TLS fingerprint) reliably passes the challenge. impit + got-scraping trip it most of the time. The 3-stack race the actor uses tries all three in parallel, so the user doesn't need to know — but residential US proxy is essential.
How many pages does Martindale paginate?
Varies by city. Big cities (Dallas, Houston, Los Angeles) paginate to 5+ pages of 30 attorneys; small cities may have just 1 page. The actor walks pagination automatically until either (a) no Next link is present or (b) maxItems is reached.
Why are duplicate attorneys filtered out? Adjacent paginated pages on Martindale overlap by ~15-20% — the same attorney can appear on page 4 and page 5 of the same listing. We dedupe by Martindale's numeric attorney ID so the dataset has one row per person.
Can I look up an attorney by their Martindale ID?
Not via this actor's normal flow — Martindale's detail page (/attorney/{slug}-{id}/) JS-renders the rich data and flakes on CF. To find an attorney whose name you know, search the city listings.
How do I limit results?
Set maxItems. The actor stops as soon as the cap is reached.
💬 Support
- For issues or feature requests, please use the Issues tab on the actor's Apify Console page.
- Author's website: https://muhamed-didovic.github.io/
- Email: muhamed.didovic@gmail.com
🛠 Additional services
- Custom output shape, additional fields, or one-off datasets: muhamed.didovic@gmail.com
- Need a similar scraper for another legal directory (Avvo, FindLaw, Justia, Lawyers.com, Super Lawyers)? Drop an email — Avvo + FindLaw + State Bar are already shipped.
- For API access (no Apify fee, just a usage fee for the API): muhamed.didovic@gmail.com
🔎 Explore more scrapers
If this Martindale Scraper was useful, see other legal-vertical scrapers at memo23's Apify profile — Avvo (lawyer directory), FindLaw (law firms), and US State Bar (license verification).
⚠️ Disclaimer
This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Martindale.com, Internet Brands, or any of their subsidiaries or affiliates. All trademarks mentioned are the property of their respective owners.
The scraper accesses only publicly available attorney profile and listing pages on martindale.com — no authenticated endpoints, no Martindale-Hubbell rating-only features, no content behind a logged-in session. Users are responsible for ensuring their use complies with martindale.com's Terms of Service, applicable data-protection law (GDPR, CCPA, etc.), and any state-bar rules around the marketing or use of attorney data in their jurisdiction.
SEO Keywords
martindale scraper, scrape martindale, martindale.com scraper, martindale api, Apify martindale, us lawyer directory scraper, attorney directory scraper, lawyer leads scraper, legal marketing leads, attorney contact data, lawyer contact info scraper, us attorney database, attorney leads by city, lawyer leads by state, personal injury lawyer leads, family lawyer leads, criminal defense lawyer leads, avvo alternative scraper, findlaw alternative scraper, justia alternative scraper, super lawyers alternative scraper, lawyers.com alternative scraper, attorney email scraper, law firm leads, solo practitioner data, small law firm leads, attorney headshots, attorney phone number scraper, lawyer headshot data, martindale-hubbell scraper