Martindale Scraper | $4 / 1k | US & Canada Lawyer Directory avatar

Martindale Scraper | $4 / 1k | US & Canada Lawyer Directory

Pricing

$3.99 / 1,000 results

Go to Apify Store
Martindale Scraper | $4 / 1k | US & Canada Lawyer Directory

Martindale Scraper | $4 / 1k | US & Canada Lawyer Directory

Scrape verified lawyer profiles from Martindale.com across the U.S. and Canada including names, firms, ratings, contacts, and practice areas. Ideal for legal market insights, research, or lead generation. $4 per 1000 listings.

Pricing

$3.99 / 1,000 results

Rating

5.0

(1)

Developer

Fatih Tahta

Fatih Tahta

Maintained by Community

Actor stats

1

Bookmarked

14

Total users

4

Monthly active users

5.9 hours

Issues response

5 days ago

Last modified

Share

Martindale Scraper | US & Canada Lawyer Directory

Slug: fatihtahta/martindale-scraper

Overview

Martindale Scraper collects structured lawyer directory data from Martindale, including profile identity details, profile URLs, firm and office information, practice areas, ratings, reviews, and related metadata. It is designed to support broad directory coverage by practice area and location, as well as targeted collection from specific directory or profile pages.

Martindale is a widely used legal directory, making this data valuable for market mapping, legal-industry research, and contact enrichment workflows. The actor automates repetitive collection steps and returns consistent JSON records that are ready for downstream use. This helps teams reduce manual effort and move faster from raw listings to analysis.

Why Use This Actor

  • Market research and analytics teams: Analyze attorney and firm presence by practice area and region, then benchmark visibility, ratings, and positioning trends over time.
  • Product and content teams: Identify legal service coverage gaps, discover high-signal profiles, and inform directory, content, or partnership strategies.
  • Developers and data engineering teams: Feed structured lawyer records into ETL jobs, analytics warehouses, search indexes, or internal data products.
  • Lead generation and enrichment teams: Build and enrich prospect lists with profile, firm, location, and optional contact signals.
  • Monitoring and competitive intelligence teams: Track changes in profile attributes, reputation signals, and market representation across selected geographies.

Input Parameters

Provide any combination of URLs, queries, and filters to control coverage and precision.

ParameterTypeDescriptionDefault
searchByCategorystringPractice area filter for directory discovery. Allowed values: all-lawyers, bankruptcy-lawyers, business-law-lawyers, civil-litigation-lawyers, criminal-law-lawyers, divorce-lawyers, elder-law-lawyers, estate-planning-lawyers, family-law-lawyers, general-practice-lawyers, labor-and-employment-lawyers, landlord-and-tenant-law-lawyers, libel-slander-and-defamation-lawyers, lottery-law-lawyers, medical-malpractice-lawyers, personal-injury-lawyers, real-estate-lawyers, social-security-disability-lawyers, traffic-violations-lawyers, trusts-and-estates-lawyers, wills-and-probate-lawyers.family-law-lawyers
searchByLocationstringState/province/territory filter. Allowed values: U.S. states and District of Columbia (alabama ... wyoming) plus Canadian regions: alberta, british-columbia, manitoba, new-brunswick, newfoundland-and-labrador, northwest-territories, nova-scotia, nunavut, ontario, prince-edward-island, quebec, saskatchewan, yukon-territory.california
startUrlsstring[]One or more Martindale URLs to begin collection from (search result pages, practice-area pages, location pages, or lawyer profile pages).
getEmailsbooleanInclude available lawyer email addresses in output records. Useful for enrichment and contact workflows.false
includeRiskyEmailsbooleanInclude less-certain email matches for broader coverage. Disable for stricter confidence.true
limitintegerMaximum listings to save per query. Minimum: 10.50000
proxyConfigurationobjectConnection settings. Default is Apify proxy with RESIDENTIAL group and U.S. country routing.{"useApifyProxy":true,"apifyProxyGroups":["RESIDENTIAL"],"apifyProxyCountry":"US"}

Example Input

{
"searchByCategory": "trusts-and-estates-lawyers",
"searchByLocation": "wyoming",
"startUrls": [
"https://www.martindale.com/trusts-and-estates-lawyers/all/wyoming/"
],
"getEmails": true,
"includeRiskyEmails": false,
"limit": 500
}

Output

6.1 Output destination

The actor writes results to an Apify dataset as JSON records. And the dataset is designed for direct consumption by analytics tools, ETL pipelines, and downstream APIs without post-processing.

6.2 Record envelope (all items)

Every record includes the following stable envelope fields:

  • type (string, required)
  • id (number, required)
  • url (string, required)

Recommended idempotency key: type + ":" + id. Use this key for deduplication and upserts when the same entity appears across multiple inputs or runs.

6.3 Examples

Example: profile (type = "profile")

{
"type": "profile",
"id": 1808367,
"url": "https://www.martindale.com/attorney/bruce-s-asay-1808367/",
"record_id": "https://www.martindale.com/attorney/bruce-s-asay-1808367/?pa=331",
"name": "Bruce S. Asay",
"profile_url": "https://www.martindale.com/attorney/bruce-s-asay-1808367/?pa=331",
"source": {
"search_results_url": "https://www.martindale.com/trusts-and-estates-lawyers/all/wyoming/?sort=crRecommendedPct&sortType=DESC",
"seed": {
"type": "query",
"value": "trusts-and-estates-lawyers::wyoming"
}
},
"listing_snapshot": {
"entity_type": "LegalService",
"phone": "307-400-3593",
"website": "http://alglaw.us",
"image_url": "https://www.martindale.com/LBM_Images/Lawyers/lawyer-bruce-s-asay-mr-photo-5087400.png"
},
"professional_overview": {
"headline": "Member at Associated Legal Group, LLC",
"office_addresses": [
"1812 Pebrican Avenue, Cheyenne, WY 82001"
]
},
"ratings": {
"overall": {
"score": "4.5",
"reviews": "26 Reviews"
}
}
}

Field reference

Profile fields (type = "profile")

  • record_id (string, optional): Record-level unique source identifier.
  • name (string, optional): Lawyer display name.
  • profile_url (string, optional): Source profile URL captured in the record.
  • source.search_results_url (string, optional): Search/list page where the record was discovered.
  • source.seed.type (string, optional): Seed origin category (for example, query or URL seed).
  • source.seed.value (string, optional): Seed value used for discovery.
  • listing_snapshot.entity_type (string, optional): Entity category label.
  • listing_snapshot.phone (string, optional): Primary phone shown for the listing.
  • listing_snapshot.website (string, optional): Website URL shown in listing context.
  • listing_snapshot.image_url (string, optional): Listing/profile image URL.
  • listing_snapshot.address.streetAddress (string, optional): Street address.
  • listing_snapshot.address.addressLocality (string, optional): City/locality.
  • listing_snapshot.address.addressRegion (string, optional): State/province/region.
  • listing_snapshot.address.addressCountry (string, optional): Country label.
  • listing_snapshot.address.postalCode (string, optional): Postal or ZIP code.
  • page_metadata.title (string, optional): Page title.
  • page_metadata.canonical_url (string, optional): Canonical page URL.
  • page_metadata.description (string, optional): Page meta description.
  • social_preview.title (string, optional): Social preview title.
  • social_preview.description (string, optional): Social preview description.
  • social_preview.image (string, optional): Social preview image URL.
  • social_preview.url (string, optional): Social preview URL.
  • social_preview.type (string, optional): Social preview type label.
  • professional_overview.name (string, optional): Name as presented in overview block.
  • professional_overview.headline (string, optional): Current role/headline.
  • professional_overview.availability (array[string], optional): Availability/status labels.
  • professional_overview.organization.name (string, optional): Affiliated organization/firm name.
  • professional_overview.organization.url (string, optional): Organization profile URL.
  • professional_overview.office_addresses (array[string], optional): Office address lines.
  • professional_overview.phones (array[string], optional): Known phone numbers.
  • professional_overview.websites (array[string], optional): Known website URLs.
  • ratings.overall.score (string, optional): Overall rating value.
  • ratings.overall.reviews (string, optional): Review count summary text.
  • ratings.categories (array[object], optional): Category-level rating summaries.
  • ratings.categories.type (string, optional): Category name.
  • ratings.categories.score (string, optional): Category score.
  • ratings.categories.count (string, optional): Category review count.
  • ratings.profile_visibility (array[string], optional): Profile visibility ranking notes.
  • awards.labels (array[string], optional): Award labels/badges.
  • awards.images (array[string], optional): Award image URLs.
  • sections.biography (string, optional): Biography text.
  • sections.areas_of_practice (array[string], optional): Practice area labels.
  • sections.education_credentials (object, optional): Education/admission details map.
  • peer_reviews.summary.score (string, optional): Peer review summary score.
  • peer_reviews.summary.count (string, optional): Peer review count summary.
  • peer_reviews.dimensions (array[object], optional): Review dimensions and scores.
  • peer_reviews.dimensions.metric (string, optional): Dimension name.
  • peer_reviews.dimensions.score (string, optional): Dimension score.
  • peer_reviews.reviews (array[object], optional): Individual peer review entries.
  • peer_reviews.reviews.score (string, optional): Review score.
  • peer_reviews.reviews.meta (string, optional): Review metadata text.
  • peer_reviews.reviews.text (string, optional): Review body text.
  • structured_data.profile.name (string, optional): Structured profile name.
  • structured_data.profile.legalName (string, optional): Structured legal/organization name.
  • structured_data.profile.telephone (array[string], optional): Structured phone values.
  • structured_data.profile.sameAs (array[string], optional): Related profile URLs.
  • structured_data.profile.knowsAbout (array[string], optional): Structured practice/knowledge topics.
  • structured_data.profile.award (array[string], optional): Structured award labels.
  • structured_data.profile.aggregateRating.ratingValue (string, optional): Aggregate rating value.
  • structured_data.profile.aggregateRating.reviewCount (number, optional): Aggregate review count.
  • structured_data.profile.address.streetAddress (string, optional): Structured street address.
  • structured_data.profile.address.addressLocality (string, optional): Structured city/locality.
  • structured_data.profile.address.addressRegion (string, optional): Structured region.
  • structured_data.profile.address.postalCode (string, optional): Structured postal code.
  • structured_data.profile.address.addressCountry (string, optional): Structured country code.
  • structured_data.profile.geo.latitude (string, optional): Latitude.
  • structured_data.profile.geo.longitude (string, optional): Longitude.
  • structured_data.profile.hasMap (string, optional): Map URL.
  • structured_data.profile.image (string, optional): Structured primary image.
  • structured_data.profile.photo.contentUrl (string, optional): Structured photo URL.
  • structured_data.profile.url (string, optional): Structured canonical URL.
  • structured_data.profile.description (string, optional): Structured description.
  • structured_data.profile.member.name (string, optional): Structured member name.
  • structured_data.profile.member.jobTitle (string, optional): Structured member role.
  • structured_data.profile.member.worksFor.name (string, optional): Employer/firm name.
  • structured_data.profile.member.worksFor.url (string, optional): Employer/firm URL.
  • structured_data.profile.member.alumniOf (array[string], optional): Alumni institutions.
  • structured_data.profile.member.image (string, optional): Member image URL.
  • structured_data.webpage.id (string, optional): Structured webpage identifier.
  • structured_data.webpage.dateModified (string, optional): Last-modified timestamp.

Data guarantees & handling

  • Best-effort extraction: Fields may vary by region, session conditions, availability, and UI experiments.
  • Optional fields: Null-check fields in downstream code because many attributes are conditionally present.
  • Deduplication: Recommend type + ":" + id as the canonical key for upserts and deduplication.

How to Run on Apify

  1. Open the actor in Apify Console.
  2. Configure your search parameters (for example, practice area, state/province, and optional direct URLs).
  3. Set the maximum number of outputs to collect.
  4. Click Start and wait for the run to finish.
  5. Download results in JSON, CSV, Excel, or other supported formats.

You’re right — that section reads like a generic Apify template. It doesn’t speak to this actor or how a serious team would actually use it.

Here’s a more tailored, actionable version you can paste directly into your README to replace the current Scheduling & Automation section:


Scheduling & Automation

Keep Your Lawyer Dataset Continuously Updated

Martindale profiles change over time — firms merge, ratings update, contact info changes, and attorneys move between offices. If you're using this actor for analytics, enrichment, or monitoring, manual runs aren’t enough.

Use Apify scheduling to turn this into a continuously updating legal intelligence feed.

Common Automation Patterns

1. Market Monitoring (Weekly Refresh) Track visibility and rating changes in a specific practice area and region.

  • Schedule: Weekly (e.g., Sunday 02:00 UTC)
  • Input: Fixed searchByCategory + searchByLocation
  • Limit: High enough to cover full market
  • Downstream: Upsert into warehouse using type + ":" + id

2. Lead Enrichment Pipeline (Daily Incremental Runs) Continuously discover new profiles and enrich outbound lists.

  • Schedule: Daily
  • Input: Practice area + multiple locations
  • getEmails: true (if enabled in your workflow)
  • Downstream: Webhook → CRM sync or enrichment job

3. Competitive Tracking (Targeted URLs) Monitor specific firms or high-value profiles.

  • Schedule: Daily or weekly
  • Input: startUrls with direct profile URLs
  • Limit: Not required (direct targets)
  • Compare changes between runs (ratings, reviews, awards, etc.)

How to Create a Production-Ready Schedule

  1. Open the actor in Apify Console

  2. Go to the Schedules tab

  3. Click Create schedule

  4. Choose:

    • Cron expression (recommended for production control)
    • or Daily/Weekly preset
  5. Paste your finalized input JSON

  6. Enable:

    • Run immediately after creation (optional)
    • Notifications
    • Webhooks (if chaining downstream systems)

For large coverage jobs, run during off-peak hours (e.g., 01:00–04:00 UTC) to reduce contention and stabilize performance.


Downstream Integration (Make It Actually Useful)

This actor is designed to plug directly into data pipelines.

Trigger processing immediately after each run:

  • Upsert into Postgres / BigQuery / Snowflake
  • Sync to CRM
  • Push to internal API
  • Trigger change-detection workflows

Use type + ":" + id as your idempotency key.


Data Warehousing

Typical flow:

  1. Actor run completes
  2. Dataset exported via API
  3. ETL job transforms records
  4. Upsert using canonical key
  5. Historical snapshot stored for trend analysis

Because profile attributes can change over time, storing historical versions enables:

  • Rating trend analysis
  • Market share tracking
  • Visibility shifts by practice area

No-Code Automation

If you’re not running a custom backend:

  • Zapier: Push new records into Airtable, HubSpot, or Sheets
  • Make (Integromat): Multi-step enrichment flows
  • Google Sheets: Lightweight reporting layer
  • Slack/Discord: Notify when new profiles appear in a monitored region
  • Email: Send automated summary reports to stakeholders

Change Detection Strategy (Advanced)

For monitoring use cases:

  1. Store previous run snapshot

  2. Compare:

    • ratings.overall.score
    • ratings.overall.reviews
    • awards.labels
    • professional_overview.organization.name
  3. Trigger alerts only on meaningful changes

This avoids noise and makes the dataset actionable rather than just large.

Performance

Estimated run times:

  • Small runs (< 1,000 outputs): ~9–11 minutes
  • Medium runs (1,000–5,000 outputs): ~15–35 minutes
  • Large runs (5,000+ outputs): ~35+ minutes

Execution time varies based on selected filters, result volume, and how much information is returned per record.

Compliance & Ethics

Responsible Data Collection

This actor collects publicly available lawyer directory and professional profile information from Martindale for legitimate business purposes, including:

  • legal services research and market analysis
  • lead enrichment and prospect qualification
  • competitive visibility tracking

Users are responsible for ensuring their collection and use of data complies with applicable laws, regulations, and contractual obligations. This section is informational and not legal advice.

Best Practices

  • Use collected data in accordance with applicable laws, regulations, and the target site’s terms.
  • Respect individual privacy and personal information.
  • Use data responsibly and avoid disruptive or excessive collection.
  • Do not use this actor for spamming, harassment, or other harmful purposes.
  • Follow relevant data protection requirements where applicable (e.g., GDPR, CCPA).

Support

If you need help, open an issue on the actor page in Apify Console (Issues tab). Include the input you used (redacted), the run ID, expected vs. actual behavior, and an optional small output sample so troubleshooting can start quickly.