Martindale Scraper [$0.95/1K💰] | Attorney Leads & Ratings avatar

Martindale Scraper [$0.95/1K💰] | Attorney Leads & Ratings

Pricing

from $0.93 / 1,000 results

Go to Apify Store
Martindale Scraper [$0.95/1K💰] | Attorney Leads & Ratings

Martindale Scraper [$0.95/1K💰] | Attorney Leads & Ratings

Scrape martindale.com attorney profiles in bulk and export name, firm, practice areas, address, phone, website, peer and client ratings as clean JSON. ~30 attorneys per request, no browser. Built for legal lead-gen and CRM enrichment.

Pricing

from $0.93 / 1,000 results

Rating

0.0

(0)

Developer

Ahmed Jasarevic

Ahmed Jasarevic

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Share

Martindale Scraper — Attorney Directory & Legal Leads API

Extract attorney leads from martindale.com — name, firm, practice areas, address, phone, website and peer/client ratings — scraped from directory listing pages in bulk at roughly 30 attorneys per HTTP request. Built for legal lead generation, B2B data vendors and CRM/intake enrichment teams.

Main use cases

  • Legal lead generation — build attorney/law-firm lead lists by city, state or practice area.
  • CRM and data enrichment — append firm, phone, website, geo-coordinates and ratings to existing records.
  • Law firm data research — map firms and their attorneys across a market for competitive or recruiting analysis.
  • Legal directory database — assemble a structured attorney directory for a SaaS, marketplace or data product.
  • Compliance and credential checks — collect peer ratings, client ratings and awards (e.g. AV Preeminent) at scale.

How it works

Give the actor one or more start URLs:

  • Directory listings — city pages (/all-lawyers/{city}/{state}/), practice×state pages (/areas-of-law/{practice}-lawyers/{state}/) and state indexes (/by-location/{state}-lawyers/). Each listing page embeds a JSON-LD @graph with ~30 LegalService items, so the actor reads the attorneys straight from it and follows pagination (?page=N / rel="next", capped by Max listing pages) — roughly 50 attorneys in about 10 seconds.
  • Profile pages directly (/attorney/{name-slug-id}/) — scraped immediately, no listing crawl needed. These yield the extra fields listings do not carry: practice areas, job title, fax, awards, education, the peer/client rating split and geo-coordinates.

It is a CheerioCrawler (plain HTTP, 256 MB) — no browser is needed because every target field is in the raw served HTML.

Attorneys coming from listings carry the fields present in the embedded JSON-LD: name, firm, firm URL, city/state, phone and card-level peer rating. Attorneys scraped from profile pages additionally fill practiceAreas, jobTitle, fax, awards, alumni, the peer/client rating split and latitude/longitude. If you need those extra fields, list the profile URLs directly as start URLs.

Recon order was: embedded JSON → third-party search backend → internal JSON API → static HTML → browser.

  • Embedded JSON-LD blob (USED — primary). Every profile page ships an application/ld+json block with @type: LegalService containing name, legalName (firm), full postal address, geo, telephone/faxNumber, knowsAbout (practice areas), aggregateRating (ratingValue + reviewCount), award (AV Preeminent), job title and education. Listing pages embed the same @graph (~30 items/page), with the fields inverted vs profile pages: sameAs carries the /attorney/ profile URL while url carries the firm's website.
  • Third-party search backend (NONE FOUND). The bundles were grepped for Algolia, Meilisearch, TypeSense, Elasticsearch, Coveo, Solr and AppSearch markers — none present.
  • Internal/XHR JSON API (NONE FOUND). No /api/, /graphql, /_next/data/ or mobile-app JSON endpoints appear in the served HTML.
  • Static HTML via CheerioCrawler (USED — supplementary). Listing cards (.card__content) carry name, firm, location, tel: phone and card-level peer rating; the profile DOM (.rating-item / .review-title / .review-line) splits the peer vs client rating that the JSON blob only aggregates.
  • Playwright (NOT NEEDED). Rejected — all target fields exist in raw served HTML, keeping compute at the 256 MB tier.

Anti-bot (Cloudflare). Verified access matrix (Oct 2026 smoke tests):

  • Direct connection (Apify datacenter IP): HTTP 403, blocked.
  • Apify Proxy, RESIDENTIAL group, non-US exit: HTTP 403, blocked.
  • Apify Proxy, RESIDENTIAL group + country US: works — full profile + listing pages return HTTP 200.

Required production setting: enable "Use Apify Proxy", group RESIDENTIAL, country US (this is the default prefill). The actor detects challenge/block pages and fails fast with a message pointing at this setting. It crawls politely: concurrency capped at 2 with ~600 ms between same-domain requests; failed requests back off exponentially (1 s, 2 s, 4 s) and rotate the pinned proxy session so the retry rides a fresh US residential exit IP.

Input Parameters

FieldTypeRequiredDefaultNotes
startUrlsarray (requestListSources)Yescity + profile prefillsDirectory listing pages and/or individual /attorney/{slug}/ profile URLs.
maxAttorneysintegerNo50Max profiles to save (max 5000). Free users capped at 10 regardless.
maxListingPagesintegerNo10Max pagination pages to follow per listing (?page=N).
maxRequestsPerCrawlintegerNo200Safety cap on total HTTP requests (listings + profiles).
proxyobject (proxy)NouseApifyProxy: true, RESIDENTIAL, USCloudflare blocks datacenter IPs — keep the US residential default.

Free users get a 10-attorney preview; paid runs go up to the configured caps.

Output Fields

One dataset item per attorney (24 fields):

FieldTypeDescription
profileUrlstringCanonical attorney profile URL.
namestring / nullAttorney full name.
firmstring / nullLaw firm / employer name.
firmUrlstring / nullLink to the firm page on martindale.com.
jobTitlestring / nullTitle at the firm (e.g. Associate Principal).
practiceAreasarrayAreas of practice (from structured data + page section).
citystring / nullOffice city.
statestring / nullOffice state code.
streetAddressstring / nullOffice street address.
postalCodestring / nullOffice ZIP code.
phonestring / nullOffice phone number.
faxstring / nullOffice fax number.
websitestring / nullAttorney/firm external website.
photoUrlstring / nullProfile photo URL.
peerRatingstring / nullMartindale-Hubbell peer review score (out of 5).
peerReviewCountnumber / nullNumber of peer reviews.
clientRatingstring / nullClient review score (out of 5), when present.
clientReviewCountnumber / nullNumber of client reviews.
overallRatingstring / nullAggregate rating value.
overallReviewCountnumber / nullAggregate review count.
awardsarrayRatings/awards (e.g. AV Preeminent).
alumniarrayLaw schools / education.
latitudestring / nullOffice latitude.
longitudestring / nullOffice longitude.

Example Input And Output

Input

{
"startUrls": [
{ "url": "https://www.martindale.com/all-lawyers/abilene/texas/" },
{ "url": "https://www.martindale.com/attorney/a-gabe-sybesma-3146937/" }
],
"maxAttorneys": 50,
"maxListingPages": 10,
"proxy": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "US" }
}

Output (one dataset row)

{
"profileUrl": "https://www.martindale.com/attorney/a-gabe-sybesma-3146937/",
"name": "A. Gabe Sybesma",
"firm": "Sybesma Legal, PLLC",
"firmUrl": "https://www.martindale.com/organization/sybesma-legal-pllc-..../",
"jobTitle": "Member",
"practiceAreas": ["Business Law", "Real Estate"],
"city": "Abilene",
"state": "TX",
"streetAddress": "123 Main St",
"postalCode": "79601",
"phone": "(325) 555-0100",
"fax": "(325) 555-0101",
"website": "https://example-firm.com",
"photoUrl": "https://www.martindale.com/....jpg",
"peerRating": "4.8",
"peerReviewCount": 12,
"clientRating": "5.0",
"clientReviewCount": 4,
"overallRating": "4.8",
"overallReviewCount": 16,
"awards": ["AV Preeminent"],
"alumni": ["Texas Tech University School of Law"],
"latitude": "32.4487",
"longitude": "-99.7331"
}

Integrations & Automation

Every Apify actor is reachable through the Apify API, and this one plugs into webhooks, Zapier and Make so new attorneys can flow into a CRM, Google Sheet or Airtable enrichments queue. For market coverage, run it on a schedule — a weekly pass over your target cities or practice areas keeps a legal-directory database fresh, and recurring runs also improve the actor's Store recommendation signals.

FAQ

Does Martindale have an API?

Martindale does not publish an open API for its public directory. This actor reads the embedded JSON-LD that Martindale itself publishes on listing and profile pages, so you get structured attorney data without an API key.

What are the alternatives to this actor / this data source?

For US legal-directory data you can combine this with Avvo and Super Lawyers scrapers. Martindale-Hubbell is the oldest US legal directory and its peer-rating data is distinctive, so it complements the other directories rather than duplicating them.

Pass a city page (/all-lawyers/{city}/{state}/) or a practice×state page (/areas-of-law/{practice}-lawyers/{state}/) as a start URL and set maxAttorneys. The actor paginates the listing automatically and returns each attorney's name, firm, phone and rating.

How do I get practice areas, job title, fax and awards?

Those fields live on individual profile pages. List the /attorney/{slug}/ URLs directly as start URLs and the actor fills practiceAreas, jobTitle, fax, awards, alumni and the peer/client rating split.

Why does it need a US residential proxy?

Martindale is Cloudflare-protected and blocks datacenter IPs. Testing showed direct datacenter IPs and non-US residential exits both return HTTP 403, while residential + country US returns HTTP 200. That setting is the default prefill and is required for a successful run.

How fast is a run?

Listing pages yield about 30 attorneys per request — roughly 50 attorneys in about 10 seconds — and profile pages add the extra fields. Concurrency is capped at 2 with ~600 ms between same-domain requests to stay polite.

SEO Keywords

martindale, martindale hubbell, martindale scraper, attorney directory, lawyer directory, legal leads, lawyer leads, attorney data api, legal lead generation, law firm data enrichment, attorney peer rating, avvo scraper, super lawyers scraper, us attorney data, legal directory database

For AI Agents & LLM Apps

Purpose: return one structured attorney row per martindale.com profile, from a listing or profile start URL.

Minimal working input:

{ "startUrls": [{ "url": "https://www.martindale.com/all-lawyers/abilene/texas/" }], "maxAttorneys": 50 }

Variant (profile URLs for the full field set):

{ "startUrls": [{ "url": "https://www.martindale.com/attorney/a-gabe-sybesma-3146937/" }], "maxAttorneys": 50 }

Output fields: profileUrl, name, firm, firmUrl, jobTitle, practiceAreas, city, state, streetAddress, postalCode, phone, fax, website, photoUrl, peerRating, peerReviewCount, clientRating, clientReviewCount, overallRating, overallReviewCount, awards, alumni, latitude, longitude.

Behaviors an agent should know:

  • startUrls is required (no default keyword mode).
  • If maxAttorneys is left unset it defaults to 50; free-plan runs are capped at 10 regardless.
  • A proxy is required in practice: keep the default US residential proxy — datacenter and non-US residential exits return HTTP 403.
  • Attorneys found via listing pages have profile-only fields (practiceAreas, jobTitle, fax, awards, alumni, rating split, geo) as null; pass their profile URLs directly to fill them.
  • Profiles without reviews return null rating/count fields — not an error.

Billing: pay-per-event — $0.00095 per result ($0.95 / 1,000 results) plus a $0.00005 actor-start event.

This actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Martindale or Martindale-Hubbell. It accesses only publicly available martindale.com pages; it does not log in, bypass authentication, or solve CAPTCHAs on anyone's behalf. Users are responsible for ensuring their use complies with Martindale's Terms of Service and with applicable data-protection law. Output contains professional contact data (names, firm phone numbers, addresses); where personal contact data is present it must not be used for unsolicited commercial outreach in violation of applicable law (e.g. CAN-SPAM, TCPA).