Justia Lawyer Profiles, Reviews & Office Locations Scraper at a glance
Justia Lawyer Profiles, Reviews & Office Locations Scraper is a ready-to-run Apify actor from abotapi for collecting lead generation data. Its documented output includes id, attorney, change, tagline and phone, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $2.00 per 1,000 results on the Apify Free plan and from $1.25 on paid plans, with smaller per-run or optional feature charges listed on Apify.
- Runs on
- Apify cloud: console, API, schedules and integrations
- Data type
- Lead Generation, Developer Tools, Other
- Pricing
- $2.00 per 1,000 results (Free plan), from $1.25 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 21 options
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.
What Justia Lawyer Profiles, Reviews & Office Locations Scraper can do
- Richest field set on the market. Every section Justia publishes: badges, biography, practice areas with sub-specialties, multiple offices with weekly hours, jurisdictions with bar ID and admission year, languages, education, professional experience, awards, associations, speaking engagements, certifications, publications, peer endorsements and the Justia Lawyer Rating breakdown.
- Two ways to find attorneys. Search by state, practice area and city, or paste your own Justia directory, category or attorney profile URLs.
- Filter before you pay for a profile fetch. Free consultation and top rated are checked on the listing card itself, before any profile page is opened, so a narrow filter never wastes a profile fetch.
- Built for schedules. Incremental mode tracks one search or URL set over time and classifies every attorney NEW, UPDATED or UNCHANGED by default (EXPIRED and REAPPEARED need Emit expired too), so a recurring run returns and bills only what changed.
- Resume without re-paying. Continue an interrupted run from its run or dataset ID, or let the actor recover on its own after a platform migration, with no duplicate records and no double charges.
- Optional vCard enrichment. Turn on Fetch vCard to add a structured contact block (name parts, fax, organization, structured address) pulled from the attorney's own .vcf file.
Choose what to collect
These inputs let you configure Justia Lawyer Profiles, Reviews & Office Locations Scraper. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
modestring · required | How to start the scrape. 'search' builds a directory URL from the state(s), practice area(s), and city below. 'url' takes the exact Justia directory or profile URLs you paste. |
statesarray | One or more US states (full name like 'California' or 2-letter code like 'CA'). Leave empty for all states. Applied as a search filter in search mode only. |
practiceAreasarray | One or more practice areas (e.g. 'Personal Injury', 'Criminal Law', 'Family Law'). 'All' or empty means no area filter. Applied as a search filter in search mode only. |
citiesarray | Optional city filter (e.g. 'San Francisco'). Combines with each state in search mode. Leave empty to scrape the entire state. |
startUrlsarray | Paste one or more Justia URLs (directory listing like https://lawyers.justia.com/lawyers/personal-injury/california, category, or attorney profile like https://lawyers.justia.com/lawyer/christopher-adamson-10198). Supported shapes: directory listing (state, state plus city, practice area plus state, practice area plus state plus city), listing with ?page=N, and attorney profile. A practice-area-only link (no state) returns no lawyers and is skipped with a warning, so add a state. Other links are skipped with a warning. Multi-URL supported. Filter fields above are ignored in URL mode. If a URL already includes a page number, results continue from that page. |
fetchDetailsboolean | Open each attorney profile page to add badges, biography, practice areas with sub-specialties, multiple offices with weekly hours, education, experience, awards, professional associations, jurisdictions, languages, certifications, speaking engagements, social profiles, peer endorsements, and the Justia Lawyer Rating breakdown. Adds one HTTP request per attorney. |
fetchVcardboolean | In search mode this only applies when Fetch full profile details is on (otherwise it has no effect); pasted profile URLs always load the profile. Downloads the .vcf file each profile exposes to add a structured vCard block: name parts, fax, organization, structured address, URLs. Adds one small HTTP request per attorney. Off by default (the HTML page already covers most fields). |
Show 14 more inputs
| Input | What it controls |
|---|---|
minRatingnumber | Only keep attorneys with at least this Justia Lawyer Rating (0 to 10 scale). |
freeConsultationOnlyboolean | Only keep attorneys who advertise a free consultation. |
topRatedOnlyboolean | Only keep attorneys with the maximum Justia Lawyer Rating (10.0). |
maxPagesinteger | How many result pages to read per directory URL. Does NOT cap the run. Leave empty (or 0) for unlimited pages. The run is bounded by Max results, which is the cap. |
maxItemsinteger | THE cap for the run: stop after this many attorney records (default 20). Set to 0 for unlimited. Values above 1,000,000 are not accepted. |
resumeFromRunIdstring | Optional: paste a previous run ID (or dataset ID) from this actor. Attorneys already collected there are skipped, so this run only returns new ones. Leave empty for a normal run. |
incrementalModeboolean | Turn this on for daily or recurring monitoring of the same search or URLs. The first run returns every attorney as NEW. Later runs normally return only NEW, UPDATED, and REAPPEARED attorneys. Turn on "Emit unchanged" or "Emit expired" only when you also want those returned (and billed). State is kept separately per search/URL and filter/detail setup; use State key to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from run ID above. Change detection compares every returned field except scrapedAt, sourceUrl, metadata and vcard (run bookkeeping); the order of plain lists such as phone numbers is ignored. Add more with Ignore fields when detecting changes. |
stateKeystring | Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from the search/URL and filter/detail settings, so different searches never mix state with each other. |
emitUnchangedboolean | Off by default. Turn on to also return attorneys that have not changed since the last run, marked UNCHANGED. This returns, and bills, extra rows you already have, so leave it off unless you specifically want the full snapshot every run. |
emitExpiredboolean | Off by default. Turn on to also return attorneys that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search, not when Max results/Max pages capped it, or when Resume from run ID was used. This returns, and bills, extra synthetic rows, so leave it off unless you need expiry tracking. |
ignoreFieldsForChangesarray | Optional. Field names to leave out when deciding whether an attorney changed, for example biography or awards. Use a dotted path such as peerReviews.date for a field inside a list or object. Ignored fields are still returned in the output; they just never turn an attorney into UPDATED or appear in changedFields. Already ignored by default: scrapedAt, sourceUrl, metadata and vcard, and the order of plain lists such as phone numbers or languages. |
mcpConnectorsarray | Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify, Settings, Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON; the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com). |
notionParentPageUrlstring | URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors. |
maxNotifyListingsinteger | Cap on items written to each connector per run. Does not affect the dataset. |
Fields in the output
The documented dataset includes the fields below. Availability can depend on the source page and selected mode.
idID (text)nameAttorney (text)changeTypeChange (text)jobTitleTagline (text)primaryPhonePhone (text)justiaRatingJustia rating (number)topRatedTop rated (boolean)freeConsultationFree consult (boolean)cityCity (text)stateState (text)practiceAreasPractice areas (array)profileUrlProfile (link)Show 24 more fields
telephonesAll phones (array)emailContactUrlContact form (link)vcardUrlvCard (link)websitesWebsites (array)socialProfilesSocials (array)addressesAddresses (array)officesOffices (array)jurisdictionsBar admissions (array)languagesLanguages (array)yearsOfExperienceYears exp (number)educationEducation (array)clientReviewCountReviews (number)ratingBreakdownRating breakdown (object)peerReviewsPeer endorsements (array)awardsAwards (array)badgesBadges (array)firmNameFirm (text)phonePhone (text)addressAddress (text)zipZIP (text)websiteWebsite (link)changedFieldsChanged fields (array)firstSeenAtFirst seen (date)lastSeenAtLast seen (date)Example output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"type": "profile",
"id": 284001,
"url": "https://lawyers.justia.com/lawyer/morgan-ellery-284001",
"profileUrl": "https://lawyers.justia.com/lawyer/morgan-ellery-284001",
"slug": "morgan-ellery",
"name": "Morgan Ellery",
"jobTitle": "Personal Injury and Car Accident Lawyer",
"primaryPhone": "(415) 555-0142",
"telephones": [
"(415) 555-0142",
"(415) 555-0177"
],
"justiaRating": 9.5,
"topRated": false,
"ratingBreakdown": {
"Legal Knowledge": 5,
"Legal Analysis": 4.5,
"Communication Skills": 5,
"Ethics and Professionalism": 5
},
"yearsOfExperience": 15,
"badges": [
"Claimed Lawyer Profile",
"Offers Video Conferencing"
],
"claimedProfile": true,
"offersVideoConferencing": true,
"freeConsultation": true,
"contingentFees": true,
"practiceAreas": [
{
"area": "Personal Injury",
"subAreas": [
"Car Accidents",
"Premises Liability",
"Wrongful Death"
]
}
],
"jurisdictions": [
{
"name": "California",
"organization": "State Bar of California",
"idNumber": "778899",
"since": "2010"
}
],
"education": [
{
"school": "Example State University College of Law",
"degree": "J.D.",
"endDate": "2009"
}
],
"offices": [
{
"name": "Example Legal Group LLP",
"label": "Oakland Office",
"telephone": "(415) 555-0142",
"address": {
"street": "200 Sample Plaza Suite 4",
"city": "Oakland",
"region": "CA",
"postalCode": "94612",
"country": "US"
},
"officeHours": [
{
"day": "Monday",
"hours": "9:00 AM - 5:00 PM"
}
]
}
],
"peerReviews": [
{
"reviewerName": "Reviewer Name",
"date": "June 4, 2024",
"rating": 9,
"text": "Thorough and responsive counsel throughout the case."
}
],
"socialProfiles": [
"https://www.linkedin.com/in/example-attorney/"
],
"websites": [
"https://www.example-law-group.com"
],
"emailContactUrl": "https://lawyers.justia.com/lawyer/morgan-ellery-284001/contact",
"vcardUrl": "https://lawyers.justia.com/lawyer/morgan-ellery-284001/vcard",
"city": "Oakland",
"state": "CA",
"scrapedAt": "2026-09-29T12:00:00.000Z",
"sourceUrl": "https://lawyers.justia.com/lawyers/personal-injury/california"
}Ways to use this data
- Legal lead generation: pull every attorney in a practice area and state to build outreach lists with phone numbers, offices and websites.
- Legal marketing and SEO agencies: benchmark competitor firms' badges, ratings, biography copy and awards in a market.
- Legal tech and directories: enrich or backfill your own attorney directory with structured practice areas, jurisdictions and education.
- Referral networks: find top rated or free-consultation attorneys in a specific city for client referrals.
- Market and compliance research: track new attorney entrants and rating changes in a practice area over time with Incremental mode.
Before you run
Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.
Questions about this actor
What data does Justia Lawyer Profiles, Reviews & Office Locations Scraper return?
The documented output for Justia Lawyer Profiles, Reviews & Office Locations Scraper includes id, attorney, change, tagline, phone, justia rating, top rated and free consult. Availability of each field depends on the source page and the selected mode.
How much does Justia Lawyer Profiles, Reviews & Office Locations Scraper cost?
It costs $2.00 per 1,000 results on the Apify Free plan and from $1.25 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.
What output views are available?
The dataset has five views: Overview, Credentials, Reviews, Contact and Changes (incremental status and changedFields).
Can I get only new or changed attorneys on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only new and updated records by default; unchanged ones are suppressed and not billed unless you turn on Emit unchanged, and reappeared records only show up once you also use Emit expired on an earlier complete scan.
Why does a pasted profile URL always come back fully enriched?
A directly pasted attorney profile link is the record you asked for by name, so the actor always opens and returns its full profile, and Free consultation only, Top rated only and Min rating are never applied to it. The Fetch full profile details toggle only changes behavior for directory or search listing results, where it decides whether each listed attorney's own profile page gets opened.
Why did my run fail instead of returning an empty dataset?
If a working connection cannot be established at all, or a resume ID cannot be resolved, the run stops with a clear failed status so a real problem is never mistaken for "no attorneys matched." If the connection works but a later page in the walk cannot be loaded, or your filters simply matched nobody, the run completes normally and the log (and run status message) says so.
