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
| PARAMETER | TYPE | REQ | DEFAULT | DESCRIPTION |
|---|---|---|---|---|
| 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
| FIELD | TYPE | DESCRIPTION | NULLABLE |
|---|---|---|---|
| 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
{
"mode": "search",
"keywords": ["immigration attorney Miami"],
"maxResultsPerKeyword": 25
}
{
"mode": "search",
"keywords": ["immigration attorney Miami"],
"maxResultsPerKeyword": 2
}
{
"mode": "search",
"keywords": [
"personal injury Houston",
"personal injury Dallas",
"personal injury San Antonio"
],
"maxResultsPerKeyword": 100
}
{
"mode": "url",
"profileUrls": [
"https://www.martindale.com/attorney/mr-mark-citrin-801882/",
"https://www.martindale.com/attorney/kenia-garcia-169014880/"
]
}
{
"mode": "search",
"keywords": ["Harvard Law School"],
"maxResultsPerKeyword": 50
}
{
"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.
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
- Attorney credential and bar admission checks
- Practice area directories by city
- Law firm rosters and lateral move tracking
- Legal market mapping by jurisdiction
- Finding multilingual counsel
- Enriching a legal dataset on a stable identifier
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