Martindale.com Lawyer Directory Scraper avatar

Martindale.com Lawyer Directory Scraper

Pricing

from $2.25 / 1,000 results

Go to Apify Store
Martindale.com Lawyer Directory Scraper

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

Muhamed Didovic

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

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

How Martindale Scraper 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/.

ModeExample input
A. Paste a URLstartUrls: ["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-widesearchByCategory: ["family-lawyers"], searchByLocation: ["california"], searchByCity: []/areas-of-law/family-lawyers/california (single huge fetch)

💡 Pagination is automatic. Pasting ?page=4 will continue walking from page 5 until the source runs out or maxItems is 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 × city dropdowns (cartesian product), or combine. URLs always win.
  • Lite-only architecture, no detail fetches. Listing pages embed a @graph JSON-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=N URL — the actor walks subsequent pages until maxItems is 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

TeamWhat they build
Legal marketing / SaaS GTMOutbound lists for vendors selling to small/solo law firms — by state, city, and practice area
Lead-gen / referral networksLocal attorney directories or referral matchmaking by practice area + city
Legal-tech researchDensity maps of attorney supply per metro by practice area
Existing platforms enriching their dataPatching attorney records with verified phone, address, headshot, and firm website
Competitive intelligenceMarket 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 startUrls has 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 patternBehaviour
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=NPaginated 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-hubbell ratings subdomain
  • Direct attorney detail pages (skipped — listings already have the full row data)

🔄 How it works (technical)

  1. Resolve start URLs from the cartesian product of dropdowns + any pasted startUrls.
  2. Skip any attorney-profile URLs — Martindale's detail pages flake behind Cloudflare and add no extra fields.
  3. 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.
  4. Parse the JSON-LD @graph block — each block holds ~30 LegalService items with name, phone, image, address, firm website, and Martindale profile URL.
  5. Dedupe by Martindale attorney ID to avoid the 15-20% overlap between adjacent paginated pages.
  6. Push one row per attorney to the dataset; walk ?page=N pagination automatically.

⚙️ Input parameters

ParameterTypeDefaultDescription
startUrlsarray["https://www.martindale.com/personal-injury-lawyers/dallas/texas/"]Optional Martindale URLs. Takes precedence over dropdowns.
searchByCategoryarray (enum)["personal-injury-lawyers"]Practice-area slugs (20 options). Multi-select.
searchByLocationarray (enum)["texas"]US state slugs (51 options including DC). Multi-select.
searchByCityarray (string)["dallas"]Optional city slugs. Multi-select.
maxItemsinteger5000Hard cap on attorney rows. ~30 per listing page; pagination auto-walks until this cap.
maxConcurrency / minConcurrencyinteger5 / 1Parallel HTTP request limits.
maxRequestRetriesinteger5Retries before a request is given up.
proxyobjectApify residential, USMartindale 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

GroupFields
Identifierstype, attorneyId, id (alias), profileUrl, scrapedAt
Personname, firstName, lastName
Contacttelephone (formatted), primaryPhone (digits-only 10-digit form), address (composed), streetAddress, addressLocality / city, addressRegion / state, postalCode, addressCountry
Web presenceimage (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

🛠 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