PEOPLECOMPANYAI API MCP READY

Martindale Lawyer Directory API

US attorney profiles as structured JSON, searchable by practice area and city with no URL needed. Type "immigration attorney Miami" and get back typed rows: every bar admission with its year and jurisdiction, first admission year as an integer, law school with degree and year, practice areas, firm and role, office address, phones, languages and peer review. The credentials layer is the part most directory scrapers drop, and it is what lets you tell a 2013 admittee from a 1987 veteran at a glance.

RECORDS2
MEDIAN LAGon demand
FIELDS31

Input parameters

PARAMETERTYPEREQDEFAULTDESCRIPTION
mode enum yes search 'search' finds profiles from free-text keywords and needs no URL. 'url' collects specific profile pages you already hold.
keywords string[] no Free-text searches used in search mode: a practice area with a city ("personal injury Houston"), a location ("Austin, TX"), a firm, a law school or an attorney name. Up to 20 per run. Prefilled with "personal injury Houston".
maxResultsPerKeyword integer no 25 Profiles returned per keyword, from 1 to 2000. You are billed once per profile delivered, so keywords multiplied by this cap is the ceiling on what a run can cost. — drives your bill
profileUrls string[] no Specific attorney profile URLs of the form martindale.com/attorney/name-id/, used in URL mode. Up to 500 per run. This is the watchlist path: the same list re-run on a schedule.

Output schema

FIELDTYPEDESCRIPTIONNULLABLE
result_type string 'lawyer' for a profile row, 'error' for an input that returned nothing. no
searchKeyword string The keyword this profile matched. Search mode only, and the field you filter on when one run carries several queries. yes
isln string International Standard Lawyer Number. The stable per-attorney identifier, and the right join key because it survives firm moves. no
name string Attorney's name as listed, honorifics included ("Mr. Mark Citrin"). no
profileUrl string Direct link to the profile. In search mode it can carry a trailing practice-area query parameter. no
areasOfPractice string[] Practice areas the attorney lists, from a single entry to a dozen. no
practiceCount integer How many practice areas are listed. no
state string US state the attorney is listed in. The reliable geography filter, since the keyword match is not. yes
address string Office address as published, single line. yes
mailingAddress string Mailing address. Present on most profiles but usually identical to address; treat a difference as the signal, not the presence. yes
phones string[] Every listed phone number, in mixed source formatting ("305-786-4364", "(562) 452-9522"). Normalise before dialling or matching. yes
website string Attorney or firm website. Commonly present, but absent on a fair share of profiles. yes
firm string Role and firm together, normalised from the source page ("Member at Mark Citrin, PA"). Diff this field across runs to catch lateral moves. yes
lawSchool string Law school with degree and year, and sometimes honours and class rank appended as free text. yes
university string Undergraduate education, degree and year where listed. yes
firstAdmissionYear integer Year of first bar admission, as a clean integer. Subtract from the current year for years in practice. yes
admissions string Every listed admission with year and jurisdiction, semicolon separated, federal district and circuit courts included. The source sometimes repeats an entry. yes
languages string Languages spoken, phrased as the source phrases them ("French and Creole and Russian"). Free text, not a code list, so match loosely. yes
memberships string Professional memberships as a single semicolon-separated string. yes
awards object[] Award and rating badges, each an object with two keys: title and img. Not a list of plain strings. yes
peerReview object Peer review as { stars, reviewCount }. Zeros are kept on purpose: they mean no reviews yet, which is distinguishable from missing data. no
biography string The attorney's biography text, often several hundred words. yes
about string Additional profile text. In practice it repeats biography verbatim on most profiles, so do not budget for it as a second field. yes
photoUrl string Profile photo URL. yes
videoCallPlatforms string[] Platforms offered for video consultations ("Zoom", "Skype", "FaceTime"). Sparsely populated. yes
firmYearEstablished integer Year the firm was established. Rarely populated; it comes back as 0 on most profiles, so read 0 as unknown rather than as a year. yes
summary string One-line plain-language summary of the profile, useful as a label in an agent or a spreadsheet. no
fetched_at string UTC timestamp when the row was collected. no
sourceUrl string Error rows only. The keyword or URL the error relates to. yes
error_message string Error rows only. Plain-language reason the input produced no profiles. yes
error_type string Error rows only. Machine-readable error category, for example CollectionError. yes

Worked examples

Practice area plus city — no URL needed, this is the headline path
{
  "mode": "search",
  "keywords": ["immigration attorney Miami"],
  "maxResultsPerKeyword": 25
}
Cheap smoke test — two profiles, the exact input used to verify this page
{
  "mode": "search",
  "keywords": ["immigration attorney Miami"],
  "maxResultsPerKeyword": 2
}
State roster — one keyword per city beats one keyword per state, then dedupe on isln
{
  "mode": "search",
  "keywords": [
    "personal injury Houston",
    "personal injury Dallas",
    "personal injury San Antonio"
  ],
  "maxResultsPerKeyword": 100
}
Profile watchlist — URL mode, re-run on a schedule and diff the firm field
{
  "mode": "url",
  "profileUrls": [
    "https://www.martindale.com/attorney/mr-mark-citrin-801882/",
    "https://www.martindale.com/attorney/kenia-garcia-169014880/"
  ]
}
Alumni search — the keyword matches school names, then filter on lawSchool
{
  "mode": "search",
  "keywords": ["Harvard Law School"],
  "maxResultsPerKeyword": 50
}
Firm roster — a firm name as the keyword, grouped afterwards on firm
{
  "mode": "search",
  "keywords": ["Garcia & Qayum Law Group"],
  "maxResultsPerKeyword": 25
}
POWER-USER TIP
The keyword match is fuzzy, and deliberately so — The directory searches names, schools and locations together. A live run of "personal injury Houston" returned Troy Gabriel Houston, an aviation and malpractice attorney in Irvine, California. That is the source behaving normally, not a bug the Actor can fix. Every row carries the searchKeyword that produced it, and state, address and areasOfPractice are the reliable filters after collection.
POWER-USER TIP
maxResultsPerKeyword is the entire bill — Cost is keywords multiplied by the cap, charged once per profile actually delivered. Twenty keywords at 100 profiles each is at most 2,000 billable rows. A keyword that matches nothing costs nothing; it returns an error row instead of silence.
POWER-USER TIP
Join on isln, never on name — Names arrive with honorifics and middle names, and change. The ISLN is stable across firm moves, which is what makes month-over-month diffing on firm or address actually work. Two runs joined on isln give you a lateral-move feed; two runs joined on name give you noise.
POWER-USER TIP
Peer review stars and review count move independently — A profile can carry five stars with a reviewCount of 0, because the star rating is the directory's own peer rating rather than a count of written reviews. Neither is a legal credential, and client-review text is not returned at all: those fields were empty on every profile tested, so they were left out rather than shipped permanently blank.
POWER-USER TIP
Volume tiers cut the per-profile rate — The listed 0.00665 is the BRONZE rate. FREE pays 0.007, SILVER 0.006318 and GOLD 0.006002, so a large roster build lands roughly 14 percent under the free-tier price.

Coverage

2
input modes — keyword search · profile URL list
28
fields per profile — credentials contact firm practice reputation
20
keywords per run — up to 2,000 profiles each
500
profile URLs per run — url mode, no search needed
2
saved dataset views — attorneys overview · credentials

Tasks

Saved runs with the inputs already filled in — each one a standalone page and a working configuration example.

Request a task →

Code

curl

curl -X POST "https://api.apify.com/v2/acts/johnvc~lawyer-directory-api/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"mode":"search","keywords":["immigration attorney Miami"],"maxResultsPerKeyword":25}'

Python

from apify_client import ApifyClient

client = ApifyClient("APIFY_TOKEN")
run = client.actor("johnvc/lawyer-directory-api").call(
    run_input={
        "mode": "search",
        "keywords": ["immigration attorney Miami"],
        "maxResultsPerKeyword": 25,
    }
)
for row in client.dataset(run.default_dataset_id).iterate_items():
    if row.get("result_type") != "lawyer":
        continue
    print(row["isln"], row["name"], row.get("firstAdmissionYear"), row.get("firm"))

MCP

claude mcp add --transport http lawyers \
  "https://mcp.apify.com/?tools=actors,docs,johnvc/lawyer-directory-api"

What people use it for

Alternatives

Investment Finance Professionals — the same licensed-professional lookup on the finance sideours LinkedIn Profile API — self-reported career history rather than directory-published credentialsours LinkedIn Company API — firmographics on the law firm itself, not the individual attorneyours Google Scholar Case Law API — the opinions behind a practice area, not the practitionersours
A state bar's own attorney lookup — genuinely better if your question is licence status or discipline, which nothing here answers; free and authoritative, but one state at a time and no bulk exportcompeting
Third-party Martindale scrapers on the same marketplace — at least six exist and the busiest is genuinely competitive: 0.00399 per record, a 96 percent run rate over 300 runs, and Canada as well as the US, which this one does not cover. Its published field list stops at names, firms, ratings, contacts and practice areas, so pick this one when you need the admissions history and the ISLN join key, not when you need the cheapest rowcompeting