Justia Lawyer Profiles, Reviews & Office Locations Scraper avatar

Justia Lawyer Profiles, Reviews & Office Locations Scraper

Pricing

from $1.25 / 1,000 attorney results

Go to Apify Store
Justia Lawyer Profiles, Reviews & Office Locations Scraper

Justia Lawyer Profiles, Reviews & Office Locations Scraper

Scrape attorney profiles from the Justia Lawyer Directory. Extract names, contacts, office locations, practice areas, education, experience, awards, bar admissions, peer endorsements and Justia Lawyer Ratings. Search by state, city, practice area or scrape profile URLs.

Pricing

from $1.25 / 1,000 attorney results

Rating

0.0

(0)

Developer

Abot API

Abot API

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

5 days ago

Last modified

Share

Justia Lawyer Directory Scraper

Scrape public US attorney profiles from the Justia Lawyer Directory - one of the largest free legal directories in the United States. The actor returns 55+ structured fields per attorney, including identity, contact details, multiple offices with weekly hours, practice areas with sub-specialties, full education and bar admissions, awards, professional associations, peer endorsements, the Justia Lawyer Rating breakdown, badges, and social profiles.

Why use this actor

  • Richest field set on the market - every section Justia exposes: badges, biography, practice areas (with sub-areas), additional practice areas, video conferencing, fees, jurisdictions (with bar ID + admission year), languages, professional experience, education (school + degree + year), awards, professional associations, speaking engagements, certifications, publications, websites, videos, social profiles, multiple offices (each with name, address, phone, hours), peer endorsements, rating breakdown, and the Justia Lawyer Rating.
  • Two modes - search by state(s) + practice area(s) + city, OR paste your own Justia directory / category / profile URLs.
  • Precise filters - narrow by Justia Lawyer Rating, free consultation, or top-rated status, so you only pay for the records you actually want.
  • Output that's ready for downstream tools - stable type:id key for idempotent upserts, clean JSON, typed arrays + objects.

Input parameters

FieldTypeDefaultDescription
modestringsearchsearch (build URL from filters) or url (paste Justia links).
statesarray["California"]One or more US states (full name or 2-letter code). Search mode only.
practiceAreasarray["Personal Injury"]One or more practice areas (e.g. "Personal Injury", "Criminal Law", "Family Law"). "All" / empty = no area filter. Search mode only.
citiesarray[]Optional city filter. Combines with each state.
startUrlsarray-One or more Justia URLs (directory listing, category, or attorney profile). URL mode only.
fetchDetailsbooleantrueOpen each profile to add 40+ fields (badges, bio, practice areas, offices, education, experience, awards, peer reviews, rating breakdown).
fetchVcardbooleanfalseAlso download the .vcf file to add a structured vCard block (fax, name parts, organization).
minRatingnumber-Only keep attorneys with at least this Justia Lawyer Rating (0-10 scale).
freeConsultationOnlybooleanfalseOnly keep attorneys who offer a free consultation.
topRatedOnlybooleanfalseOnly keep attorneys with the maximum Justia rating (10.0).
maxItemsinteger20THE cap for the run. Stop after this many records. 0 = unlimited.
maxPagesinteger0Max pages per directory URL. Does NOT cap the run (defers to maxItems). 0 = unlimited.
resumeFromRunIdstring-Paste a previous run ID (or dataset ID) from this actor. Attorneys already collected there are skipped, so this run returns only new ones.
incrementalModebooleanfalseTurn on for daily/recurring monitoring of the same search or URLs. See Incremental & dedup mode below.
stateKeystring-Optional. Name a monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to derive one automatically from the search/URL and filter/detail settings.
emitUnchangedbooleanfalseIncremental mode only. Also return (and bill) attorneys that have not changed since the last run, marked UNCHANGED.
emitExpiredbooleanfalseIncremental mode only. Also return (and bill) attorneys that were present before but are no longer found, marked EXPIRED. Only produced after a run that fully scanned the tracked search.
proxyobjectResidential (US)Network connection. Residential is the default and is recommended; it requires a paid Apify plan.

Incremental & dedup mode

Turn on incrementalMode to schedule this actor on a recurring basis against the same search/URLs and get only what changed each run, instead of the full result set every time. This is a different feature from resumeFromRunId (which continues one specific interrupted run) - incremental mode remembers its own baseline between runs, keyed on a hash of your search/filter/detail settings (or on stateKey if you set one).

Every attorney is classified and stamped with a changeType:

  • NEW - never seen before for this state key.
  • UPDATED - a real field changed since last time (changedFields lists which).
  • UNCHANGED - nothing changed. Suppressed (not returned, not billed) unless emitUnchanged is on.
  • REAPPEARED - was previously EXPIRED, now found again.
  • EXPIRED - was tracked before, no longer found after a run that fully scanned the search. Only produced when emitExpired is on, and only after a complete scan - a run capped by maxItems/maxPages, or one that used resumeFromRunId, skips expiry detection that run rather than risk marking an unscanned attorney as gone.

changedFields, firstSeenAt, and lastSeenAt are added to every output row alongside changeType once incremental mode is on.

Fields excluded from change detection (present in the output, but never counted as a "change"):

  • scrapedAt - a per-run timestamp, always different by definition.
  • metadata, sourceUrl - which search/page discovered the attorney this run; drifts with pagination and result-list rank, not with the attorney's own data.
  • vcard - only present when fetchVcard is on and that one extra request happened to land this run; a per-run toggle/flakiness artifact layered on top of the profile fetch, and a reformatting of fields already tracked elsewhere (phone, addresses, websites).

A field only ever populated by the profile page (badges, biography, education, experience, awards, jurisdictions, offices, and 30+ others) is excluded from the diff only when either the current or the previous scan of that attorney did not include a landed profile-page fetch, so a transient fetch failure is never reported as those fields being removed.

Example inputs

Search by state + practice area

{
"mode": "search",
"states": ["California", "New York"],
"practiceAreas": ["Personal Injury", "Family Law"],
"fetchDetails": true,
"maxItems": 200
}

Drill into a city

{
"mode": "search",
"states": ["California"],
"practiceAreas": ["Personal Injury"],
"cities": ["San Francisco"],
"fetchDetails": true,
"maxItems": 50
}

Direct profile URLs

{
"mode": "url",
"startUrls": [
"https://lawyers.justia.com/lawyer/christopher-adamson-10198",
"https://lawyers.justia.com/lawyer/alan-ahdoot-83686"
],
"fetchDetails": true,
"fetchVcard": true
}

Scrape a whole directory page (with pagination)

{
"mode": "url",
"startUrls": ["https://lawyers.justia.com/lawyers/personal-injury/california"],
"fetchDetails": true,
"maxItems": 500
}

Output

Each record is one attorney profile (type = "profile"). Every record includes stable identifiers - type, id (numeric), url, and profileUrl - so the recommended idempotency key for deduplication / upserts is type + ":" + id.

Top-level convenience fields

FieldTypeNotes
type, id, url, profileUrl, slugstring / number / stringStable identifiers. slug is the URL slug without the numeric id.
name, jobTitle, jobTitles[]string / string[]Identity + tagline.
primaryPhone, telephones[]string / string[]Aggregated across header + offices.
profileImagestringAvatar URL.
justiaRating, topRatednumber / booleanJustia Lawyer Rating (0-10 scale). topRated = rating โ‰ฅ 10.
clientReviewCount, clientReviewRatingnumberCounts shown on the profile.
ratingBreakdownobjectPer-criterion scores: Legal Knowledge, Legal Analysis, Communication Skills, Ethics and Professionalism (0-5 scale).
yearsOfExperiencenumberFrom the profile header facts.
city, state, breadcrumb[]string / arrayGeographic context from the breadcrumb.
badges[], claimedProfile, offersVideoConferencing, connectPro, liiPlatinum, hasSocialMediaarray / booleansFrom the Badges section.
biographystringMulti-paragraph biography.
practiceAreas[]array of {area, subAreas[]}Each area with its sub-specialty list.
additionalPracticeAreas[]array of stringsAdditional areas not in the main list.
videoConferencing[]array of stringsFaceTime, Zoom, Microsoft Teams, RingCentral, etc.
fees[], freeConsultation, contingentFeesarray / booleansFees + consultation model.
jurisdictions[]array of {name, organization, idNumber, since}Bar admissions with ID + admission year.
languages[]array of {language, modalities[]}Spoken / written modalities per language.
experience[]array of {role, organization, startDate, endDate}Professional experience entries.
education[]array of {school, degree, field, startDate, endDate, honors}Law school + undergraduate.
awards[]array of {title, organization, year}Honors and recognitions.
associations[]array of {organization, role}Professional associations.
speakingEngagements[]array of {title, date, description}CLEs + speaking engagements.
certifications[]array of {title, organization, year}Certifications.
publications[]array of {title, details[]}Publications.
websites[], websiteDetails[]array / array of {type, title, url, description}Firm websites + blogs.
videos[]array of stringsVideo URLs (YouTube, Vimeo).
socialProfiles[]array of stringsFacebook, X, LinkedIn, Instagram, Avvo, Martindale, Lawyers.com, etc.
offices[]array of {name, label, telephone, address, officeHours[]}Every office with full address + weekly hours.
addresses[], officeHours[]arrayTop-level convenience: every office address, plus the first office's hours.
peerReviews[]array of {reviewerName, reviewerProfileUrl, date, rating, text}Lawyer-to-lawyer endorsements.
emailContactUrl, vcardUrlstringContact-form URL and vCard download URL.
vcardobject(Optional, fetchVcard:true) Parsed vCard with fax, name parts, organization, structured address, URLs.
sourceUrl, scrapedAt, metadatastring / objectRun bookkeeping.

Example record (excerpt)

{
"type": "profile",
"id": 10198,
"url": "https://lawyers.justia.com/lawyer/christopher-adamson-10198",
"profileUrl": "https://lawyers.justia.com/lawyer/christopher-adamson-10198",
"slug": "christopher-adamson",
"name": "Christopher Adamson",
"jobTitle": "Award-Winning Personal Injury Lawyer",
"primaryPhone": "(866) 540-4527",
"justiaRating": 10.0,
"topRated": true,
"ratingBreakdown": {
"Legal Knowledge": 5.0,
"Legal Analysis": 5.0,
"Communication Skills": 5.0,
"Ethics and Professionalism": 5.0
},
"yearsOfExperience": 20,
"badges": ["Claimed Lawyer Profile", "Offers Video Conferencing", "LII Platinum", "Social Media"],
"claimedProfile": true,
"offersVideoConferencing": true,
"liiPlatinum": true,
"freeConsultation": true,
"contingentFees": true,
"practiceAreas": [
{ "area": "Personal Injury",
"subAreas": ["Animal & Dog Bites", "Brain Injury", "Car Accidents", "Construction Accidents", "Motorcycle Accidents", "Premises Liability", "Truck Accidents", "Wrongful Death"] }
],
"jurisdictions": [
{ "name": "California", "idNumber": "238500", "since": "2005" }
],
"languages": [{ "language": "English", "modalities": ["Spoken", "Written"] }],
"education": [
{ "school": "Loyola Law School, Loyola Marymount University", "degree": "J.D.", "endDate": "2005" },
{ "school": "University of California - Los Angeles", "degree": "B.A.", "endDate": "2002" }
],
"offices": [
{
"name": "Adamson Ahdoot LLP",
"label": "San Jose Office",
"telephone": "(866) 552-1841",
"address": { "street": "3165 Olin Ave #2", "city": "San Jose", "region": "CA", "postalCode": "95117", "country": "US" },
"officeHours": [ { "day": "Monday", "hours": "Open 24 hours" } ]
}
],
"peerReviews": [
{ "reviewerName": "Alan Ahdoot", "date": "March 12, 2024", "rating": 10.0,
"text": "caring and experienced advocate. Breadth of knowledge and experience coupled with compassion and empathy." }
],
"socialProfiles": [
"https://www.facebook.com/AdamsonAhdootLLP/",
"https://www.linkedin.com/in/christopher-adamson-4731526/"
],
"vcardUrl": "https://lawyers.justia.com/lawyer/christopher-adamson-10198/vcard",
"emailContactUrl": "https://lawyers.justia.com/lawyer/christopher-adamson-10198/contact"
}

Cost control

See the Store page for current rates. Two settings drive what a run costs:

  • Fetch full profile. When on, each attorney's profile page is retrieved to add the 40+ detail fields, and that retrieval is billed per attorney. When off, you get the listing fields only and nothing extra is billed.
  • Max items. The hard cap on records for the run. Set it deliberately.

For cheap discovery, run with Fetch full profile off, pick the attorneys you care about, then re-run those profile URLs in URL mode with it on. Runs that return no records are not billed for results.

Full-catalogue runs and resuming

maxPages is unlimited by default (0); the only cap on a run is maxItems, so a whole state or practice area can be walked in one run. Two features make a long run safe:

  • Resume a previous run. Set resumeFromRunId to a prior run ID (or dataset ID) from this actor and the new run skips every attorney already collected there, so you get only the delta. Useful for continuing a full-catalogue walk that stopped early, or for a recurring top-up run.
  • Automatic recovery. If the run is interrupted by a platform migration or restarted with the Resurrect button, it picks up from where it stopped: no duplicate records, no double charges.

Scheduling & automation

Each record has a stable type + ":" + id key so scheduled runs can power idempotent upserts into your CRM, warehouse, or lead database. For a recurring schedule that should only return what changed, turn on incrementalMode (see Incremental & dedup mode) instead of diffing full snapshots yourself.

Common recurring workflows:

  • Weekly state-level refresh - re-run the same states + practiceAreas combination to detect new attorneys or profile updates.
  • Monthly enrichment sync - re-scrape previously stored profile URLs (URL mode) to refresh phones, addresses, ratings, and offices.
  • Change monitoring - track competitive movements in a specific vertical (DUI in Texas, Immigration in New York, etc.).
  • Lead pipeline replenishment - automatically append newly discovered attorneys into outbound or enrichment workflows.

Notes on data coverage

  • The actor returns everything Justia exposes publicly on the profile page. Optional fields may be null for attorneys who haven't claimed / filled those sections.
  • Justia does not publish attorney email addresses on the profile page itself - only an emailContactUrl (a contact form) and a vcardUrl (a .vcf file with the address + phone). To enrich emails yourself, follow the firm websites[] and look for a public mailto: on the firm's own contact page.
  • The Justia Lawyer Rating is a peer-endorsement score (0-10 scale). ratingBreakdown is the per-criterion 0-5 breakdown.
  • The actor runs on a Residential (US) connection by default, which requires a paid Apify plan. Leave the Proxy field at its default unless you have a reason to change it.