Martindale Scraper with Mails | US & Canada Lawyer Directory avatar

Martindale Scraper with Mails | US & Canada Lawyer Directory

Pricing

$3.99 / 1,000 results

Go to Apify Store
Martindale Scraper with Mails | US & Canada Lawyer Directory

Martindale Scraper with Mails | 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

3.0

(1)

Developer

Fatih Tahta

Fatih Tahta

Maintained by Community

Actor stats

3

Bookmarked

34

Total users

5

Monthly active users

a day ago

Last modified

Share

Martindale Lawyer Directory Scraper

Slug: fatihtahta/martindale-lawyer-directory-scraper

Overview

Martindale Lawyer Directory Scraper collects structured lawyer profile records from Martindale, including lawyer names, profile URLs, firm context, public contact details, location signals, ratings, awards, profile sections, peer-review information, and source context when available. Martindale is a public legal directory used to discover lawyers and legal-service providers across practice areas and regions, making its public listings useful for market research, territory planning, enrichment, and monitoring workflows. The actor can run from a structured practice-area and location search, from direct Martindale URLs, or from a combination of both when users need broad discovery plus known target pages. Optional email enrichment can add accepted email fields when the public source context supports it. Results are delivered as structured dataset records suitable for review, export, ETL pipelines, BI dashboards, CRM enrichment, AI-agent workflows, and downstream processing. The actor is designed for repeatable public-directory acquisition without claiming guaranteed completeness, fixed freshness windows, or private data access.

What Makes This Actor Different

  • Directory-specific search controls: Use Martindale practice-area and U.S./Canada location fields to create repeatable lawyer discovery runs without manually building URLs.
  • Direct URL refreshes: Provide known Martindale directory pages or individual lawyer profile URLs when you need to refresh saved targets, monitor selected profiles, or reproduce a specific review workflow.
  • Pipeline-ready records: Output uses documented JSON fields, stable identifiers, nested objects, and nullable optional groups so records can be upserted into warehouses, CRMs, search indexes, review queues, and AI workflows.
  • Profile detail preservation: The dataset schema groups listing snapshots, page metadata, social preview data, professional overview fields, ratings, awards, profile sections, peer reviews, and structured profile data instead of flattening everything into ambiguous columns.
  • Optional contact enrichment: Email-related fields are added only when enrichment is enabled and an accepted candidate is available, which lets users choose between faster directory-only exports and richer lead-preparation runs.
  • Run summary artifacts: Each run can include machine-readable and human-readable run receipts with saved-record totals, input mode counts, group outcomes, field coverage, email enrichment coverage, warnings, and representative top records.
  • Agentic usability: The documented input recipes, field reference, example records, idempotency key, and run artifacts make the actor easier to hand to internal agents or automated workflows without private context.

Who Should Use This Actor

  • Legal-market research teams: Map lawyer and firm presence by practice area, region, rating signals, and public profile coverage.
  • Sales and lead generation teams: Build targeted public lawyer lists for review, enrichment, CRM intake, and outreach preparation.
  • Data engineering teams: Ingest structured lawyer profiles into ETL jobs, warehouses, search indexes, deduplication systems, and monitoring pipelines.
  • CRM and enrichment operators: Refresh public profile, firm, location, phone, website, and optional email fields against internal account or lead records.
  • Competitive intelligence teams: Track visible profile attributes, ratings, awards, review counts, and firm positioning across recurring runs.
  • AI agents and workflow automations: Collect a bounded public dataset, inspect the run summary, and route selected records into analysis, alerts, enrichment, or human review.

Common Use Cases

  • Legal market intelligence: Monitor lawyer visibility, firm distribution, ratings, awards, and practice-area coverage across selected regions.
  • Lead list building: Collect public lawyer profiles for a specific practice area and location before qualification or enrichment.
  • CRM enrichment: Add Martindale profile URLs, firm names, office information, phones, websites, and optional email fields to existing records.
  • Directory and catalog building: Populate internal legal-service directories with structured public profile records.
  • Recurring territory monitoring: Schedule the same practice-area and location inputs to compare changes over time.
  • Target profile refreshes: Revisit known Martindale profile URLs to update public metadata and review signals.
  • Agentic research workflows: Let an internal agent collect a scoped lawyer dataset, compare it with previous records, and route follow-up tasks.

Real-World Questions This Data Can Answer

  • Which public lawyer profiles match a specific practice area and U.S. state or Canadian province?
  • Which profiles include phone numbers, websites, office locations, ratings, awards, or peer-review signals?
  • Which records include accepted email fields when email enrichment is enabled?
  • Which lawyers or firms appear repeatedly across related practice-area or direct URL runs?
  • Which records changed between a scheduled run and a previous export?
  • Which profiles are strong candidates for CRM review, enrichment, outreach preparation, or market analysis?
  • Which input segments produced the most saved records or the best optional-field coverage?

Quick Start

  1. Choose a practice area and location, paste direct Martindale URLs, or use both input modes together.
  2. Set a small limit such as 10 or 100 for your first validation run.
  3. Decide whether to enable getEmails based on whether contact enrichment matters more than the fastest directory-only export.
  4. Run the actor in Apify Console.
  5. Inspect the first dataset records and the run summary artifacts.
  6. Increase the limit, split the scope into repeatable segments, export the dataset, or schedule recurring runs after the output shape is verified.

Input Parameters

Configure the actor with a structured Martindale search, direct Martindale URLs, optional email enrichment, and a maximum number of profile records to save.

ParameterTypeDescriptionDefault
searchByCategorystringPractice-area directory to collect. 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.elder-law-lawyers
searchByLocationstringU.S. state, District of Columbia, or Canadian province/territory to pair with the practice area. Allowed values include all U.S. states plus district-of-columbia, alberta, british-columbia, manitoba, new-brunswick, newfoundland-and-labrador, northwest-territories, nova-scotia, nunavut, ontario, prince-edward-island, quebec, saskatchewan, and yukon-territory.alberta
startUrlsarray[string]Direct Martindale search result pages, practice-area pages, location pages, or individual lawyer profile URLs to collect. Use this for known targets, refresh runs, or combining exact URLs with structured search.-
getEmailsbooleanEnables optional email enrichment. When enabled and an accepted candidate is available, output can include email, emails, email_status, email_available, and has_email.false
includeRiskyEmailsbooleanControls whether broader lower-confidence email matches can be included when email enrichment is enabled. Turn off for stricter accepted email output.true
limitintegerMaximum number of lawyer profile records to save for each configured source group. Minimum value is 10.50000
proxyConfigurationobjectOptional Apify platform connection settings. Most users should keep the default unless their account requires a specific configuration.Default platform settings

Choosing Inputs

Use searchByCategory and searchByLocation when you want repeatable discovery for a defined legal market, such as Family Law in California or Trusts & Estates in Wyoming. This approach is best for market mapping, territory monitoring, and recurring analytics because the same practice-area and region pair can be rerun later.

Use startUrls when you already know the exact Martindale pages to collect. Direct URLs are useful for refreshing saved directory pages, monitoring known lawyer profiles, or collecting a narrow set of profiles from an internal list.

Use both modes together when you need a broad directory search plus a small set of known target pages in the same run. For cleaner downstream comparison, many teams segment recurring jobs by one practice area, one region, or one target-list workflow per run.

Start with a smaller limit to confirm output shape and field coverage. Increase the limit once the dataset records, optional fields, and run summary match the workflow you want to operationalize.

Enable getEmails only when email availability matters for your workflow. Email enrichment can add useful contact fields, but directory-only runs are usually simpler when profile, firm, location, rating, and review metadata are enough.

Input Recipes

  • Validation run: Choose one practice area, one location, leave email enrichment off, and set limit to 10 or 100 to inspect output structure quickly.
  • Targeted legal-market collection: Set searchByCategory and searchByLocation for a specific market segment, then use the saved records for review, BI, or CRM matching.
  • Known profile refresh: Paste individual Martindale profile URLs into startUrls when an internal system already stores profile links and you need updated public attributes.
  • Email enrichment run: Enable getEmails, set includeRiskyEmails according to your confidence needs, and use a controlled limit before scaling the run.
  • Scheduled monitoring run: Save one stable input configuration per practice-area and region segment, then rerun it on a schedule to compare record counts and selected field changes.
  • Segmented analysis: Run separate jobs by geography, practice area, or direct URL list so downstream reports can compare cleanly labeled segments.

Example Inputs

{
"searchByCategory": "trusts-and-estates-lawyers",
"searchByLocation": "wyoming",
"getEmails": false,
"includeRiskyEmails": true,
"limit": 100
}

Direct profile and directory URL refresh

{
"startUrls": [
"https://www.martindale.com/trusts-and-estates-lawyers/all/wyoming/",
"https://www.martindale.com/attorney/sample-lawyer-1808367/"
],
"getEmails": false,
"limit": 50
}

Contact enrichment run

{
"searchByCategory": "business-law-lawyers",
"searchByLocation": "new-york",
"getEmails": true,
"includeRiskyEmails": false,
"limit": 100
}

Output

Output Destination

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

The current public dataset shape is a lawyer profile record. Optional nested groups appear only when Martindale exposes the corresponding public information and the run configuration supports collecting it.

Record Envelope And Stable Identifiers

Every saved profile record includes the required envelope fields type, id, name, and profile_url.

Recommended idempotency key: type + ":" + id.

Use this composite key for deduplication and upserts when the same lawyer appears across repeated runs, related practice-area inputs, or direct URL refreshes. Keep profile_url, url, and record_id as audit and matching helpers when joining mixed input modes or reviewing records manually.

Examples

Example: profile record (type = "profile")

{
"type": "profile",
"id": 1808367,
"url": "https://www.martindale.com/attorney/sample-lawyer-1808367/",
"record_id": "1808367",
"name": "Sample Lawyer",
"profile_url": "https://www.martindale.com/attorney/sample-lawyer-1808367/",
"email": "sample.lawyer@example-law.test",
"emails": [
"sample.lawyer@example-law.test"
],
"email_status": "verified",
"email_available": true,
"has_email": true,
"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-555-0100",
"website": "https://example-law.test",
"image_url": "https://www.martindale.com/LBM_Images/Lawyers/lawyer-sample-photo.png",
"address": {
"streetAddress": "100 Example Avenue",
"addressLocality": "Cheyenne",
"addressRegion": "WY",
"postalCode": "82001",
"addressCountry": "US"
},
"position": "Member at Sample Legal Group"
},
"page_metadata": {
"title": "Sample Lawyer - Cheyenne, WY Attorney",
"canonical_url": "https://www.martindale.com/attorney/sample-lawyer-1808367/",
"description": "Sample public lawyer profile description."
},
"social_preview": {
"title": "Sample Lawyer",
"description": "Sample Legal Group profile preview.",
"image": "https://www.martindale.com/LBM_Images/Lawyers/lawyer-sample-photo.png",
"url": "https://www.martindale.com/attorney/sample-lawyer-1808367/",
"type": "profile"
},
"professional_overview": {
"name": "Sample Lawyer",
"headline": "Member at Sample Legal Group",
"availability": [
"Accepting new clients"
],
"organization": {
"name": "Sample Legal Group",
"url": "https://www.martindale.com/organization/sample-legal-group-300000000/"
},
"office_addresses": [
"100 Example Avenue, Cheyenne, WY 82001"
],
"phones": [
"307-555-0100"
],
"websites": [
"https://example-law.test"
]
},
"ratings": {
"overall": {
"score": "4.5",
"reviews": "26 Reviews"
},
"categories": [
{
"type": "Communication",
"score": "4.6",
"count": "12"
}
],
"profile_visibility": [
"Featured profile"
]
},
"awards": {
"labels": [
"Sample Peer Rated"
],
"images": [
"https://www.martindale.com/sample-award.png"
]
},
"sections": {
"biography": "Sample biography text for public profile review.",
"areas_of_practice": [
"Trusts and Estates",
"Estate Planning"
],
"education_credentials": {
"law_school": "Sample Law School",
"admissions": [
"Wyoming"
]
}
},
"peer_reviews": {
"summary": {
"score": "4.5",
"count": "8"
},
"dimensions": [
{
"metric": "Legal Knowledge",
"score": "4.7"
}
],
"reviews": [
{
"score": "5.0",
"meta": "Sample peer review metadata",
"text": "Sample review text."
}
]
},
"structured_data": {
"profile": {
"name": "Sample Lawyer",
"legalName": "Sample Legal Group",
"telephone": [
"307-555-0100"
],
"sameAs": [
"https://www.martindale.com/attorney/sample-lawyer-1808367/"
],
"knowsAbout": [
"Trusts and Estates",
"Estate Planning"
],
"award": [
"Sample Peer Rated"
],
"aggregateRating": {
"ratingValue": "4.5",
"reviewCount": 26
},
"address": {
"streetAddress": "100 Example Avenue",
"addressLocality": "Cheyenne",
"addressRegion": "WY",
"postalCode": "82001",
"addressCountry": "US"
},
"geo": {
"latitude": "41.1400",
"longitude": "-104.8202"
},
"hasMap": "https://www.example.com/maps/sample",
"image": "https://www.martindale.com/LBM_Images/Lawyers/lawyer-sample-photo.png",
"photo": {
"contentUrl": "https://www.martindale.com/LBM_Images/Lawyers/lawyer-sample-photo.png"
},
"url": "https://www.martindale.com/attorney/sample-lawyer-1808367/",
"description": "Sample structured profile description.",
"member": {
"name": "Sample Lawyer",
"jobTitle": "Attorney",
"worksFor": {
"name": "Sample Legal Group",
"url": "https://www.martindale.com/organization/sample-legal-group-300000000/"
},
"alumniOf": [
"Sample Law School"
],
"image": "https://www.martindale.com/LBM_Images/Lawyers/lawyer-sample-photo.png"
}
},
"webpage": {
"id": "https://www.martindale.com/attorney/sample-lawyer-1808367/",
"dateModified": "2026-01-15"
}
}
}

Run Summary And Artifacts

The actor also exposes run-level key-value-store artifacts for operational review:

  • RUN-SUMMARY: machine-readable JSON with start and finish times, duration, final status, requested limit, saved-record count, record-family counts, input mode counts, group outcomes, field coverage, email enrichment coverage, warnings, top records, and public artifact keys.
  • RUN-SUMMARY.html: human-readable report showing key values from the same summary, useful for quick review in Apify Console or stakeholder handoff.
  • RUN-SUMMARY-ERROR: best-effort diagnostic JSON written only if summary artifact generation fails.

Use the run summary as a run receipt. It can help data teams and AI agents verify completion, compare recurring runs, decide whether a retry or larger limit is needed, and route alerts or reports without opening every dataset row. Dataset records remain the authoritative output for lawyer profile data.

Field Reference

Profile Record

  • type (string, required): Public record family. Current value is profile.
  • id (integer, required): Numeric Martindale profile identifier when available.
  • name (string, required): Lawyer display name.
  • profile_url (string, required): Martindale profile URL captured for the lawyer.
  • url (string, optional): Canonical Martindale URL for the profile record when provided.
  • record_id (string, optional): Source-provided profile identifier or URL-level record key.
  • email (string, optional): Selected accepted email when email enrichment is enabled and a candidate is available.
  • emails (array[string], optional): Accepted email addresses associated with the profile.
  • email_status (string, optional): Public confidence label for the selected email.
  • email_available (boolean, optional): True when an accepted email candidate was saved.
  • has_email (boolean, optional): Convenience boolean for filtering rows with at least one accepted email.

Source Context

  • source.search_results_url (string, optional): Martindale search or directory page where the profile was discovered.
  • source.seed (object, optional): Public seed context for the record.
  • source.seed.type (string, optional): Seed origin, such as a query or direct URL.
  • source.seed.value (string, optional): Seed value used for discovery.

Listing Snapshot

  • listing_snapshot.entity_type (string, optional): Source-provided entity category label.
  • listing_snapshot.phone (string, optional): Phone number shown in listing context.
  • listing_snapshot.website (string, optional): Firm or lawyer website shown in listing context.
  • listing_snapshot.image_url (string, optional): Profile or listing image URL.
  • listing_snapshot.address (object, optional): Address fields shown in listing context.
  • listing_snapshot.address.streetAddress (string, optional): Street address.
  • listing_snapshot.address.addressLocality (string, optional): City or locality.
  • listing_snapshot.address.addressRegion (string, optional): State, province, or region.
  • listing_snapshot.address.postalCode (string, optional): Postal or ZIP code.
  • listing_snapshot.address.addressCountry (string, optional): Country label or code.
  • listing_snapshot.position (string, optional): Short role or firm-position text.

Page And Preview Metadata

  • page_metadata (object, optional): Profile-page title, canonical URL, and description metadata.
  • page_metadata.title (string, optional): Page title.
  • page_metadata.canonical_url (string, optional): Canonical profile URL from page metadata.
  • page_metadata.description (string, optional): Page meta description.
  • social_preview (object, optional): Open Graph or social-preview metadata.
  • 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

  • professional_overview (object, optional): Profile overview details from the public profile.
  • professional_overview.name (string, optional): Name as presented in the overview block.
  • professional_overview.headline (string, optional): Current role or headline.
  • professional_overview.availability (array[string], optional): Availability or status labels.
  • professional_overview.organization (object, optional): Affiliated organization or firm.
  • professional_overview.organization.name (string, optional): Organization 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): Phone numbers presented in profile context.
  • professional_overview.websites (array[string], optional): Website URLs presented in profile context.

Ratings, Awards, And Reviews

  • ratings (object, optional): Public rating and review-count summaries.
  • 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 notes.
  • awards (object, optional): Award labels and award image URLs.
  • awards.labels (array[string], optional): Award labels or badges.
  • awards.images (array[string], optional): Award image URLs.
  • peer_reviews (object, optional): Peer-review summary, dimensions, and review snippets.
  • 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.

Profile Sections

  • sections (object, optional): Profile detail sections.
  • sections.biography (string, optional): Biography text.
  • sections.areas_of_practice (array[string], optional): Practice area labels.
  • sections.education_credentials (object, optional): Education, admissions, or credential details when available.

Structured Data

  • structured_data (object, optional): Source-provided structured profile data normalized into public nested objects.
  • structured_data.profile.name (string, optional): Structured profile name.
  • structured_data.profile.legalName (string, optional): Structured legal or 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 or 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 (object, optional): Structured address object.
  • structured_data.profile.address.streetAddress (string, optional): Structured street address.
  • structured_data.profile.address.addressLocality (string, optional): Structured city or locality.
  • structured_data.profile.address.addressRegion (string, optional): Structured state, province, or 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 when provided.
  • 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 profile description.
  • structured_data.profile.member (object, optional): Structured member details.
  • structured_data.profile.member.name (string, optional): Member name.
  • structured_data.profile.member.jobTitle (string, optional): Member role.
  • structured_data.profile.member.worksFor.name (string, optional): Employer or firm name.
  • structured_data.profile.member.worksFor.url (string, optional): Employer or 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 when provided.

Data Model Notes

  • Identity fields: Use type + ":" + id for deduplication and upserts. Keep profile_url, url, and record_id for audit review and fallback matching.
  • Source context: source.search_results_url and source.seed help identify how a record entered the dataset, especially when a run combines search mode and direct URLs.
  • Business attributes: listing_snapshot, professional_overview, ratings, awards, sections, peer_reviews, and structured_data carry most downstream analysis value.
  • Contact fields: Email fields are optional and appear only when email enrichment is enabled and an accepted candidate is saved.
  • Nested objects: Related attributes remain grouped to preserve context for JSON-first systems; flatten them deliberately when exporting to spreadsheets.
  • Point-in-time values: Ratings, review counts, awards, and profile details reflect publicly visible information at run time.
  • Repeated runs: Store Apify run ID, input segment, run date, and dataset export metadata alongside records when building historical comparisons.

Data Quality, Guarantees, And Handling

  • Structured records: Results are normalized into predictable JSON objects for downstream use.
  • Field preservation: Meaningful schema-supported values are kept in stable public fields or grouped objects when available; optional source values may still be absent when a specific profile does not expose them.
  • Best-effort extraction: Fields may vary by region, public availability, account visibility, UI experiments, and source-side changes.
  • Optional fields: Null-check optional fields in downstream code, dashboards, and agent prompts.
  • Deduplication: Use type + ":" + id as the recommended stable key for repeated runs and mixed input modes.
  • Freshness: Results reflect the publicly available data at run time.
  • Repeated runs: Use the recommended idempotency key when syncing into warehouses, CRMs, search indexes, vector stores, or monitoring systems.
  • Schema awareness: Downstream systems should rely on documented fields and handle newly missing optional fields gracefully.
  • Run receipts: Use run summary artifacts to audit record counts, input modes, group outcomes, enrichment status, warnings, and representative records without treating them as replacement dataset rows.

Tips For Best Results

  • Start with limit set to 10 or 100 to validate record shape before scaling.
  • Use one practice area and one location per recurring run when you need clean comparisons.
  • Use direct startUrls for known profile refreshes or narrow monitoring lists.
  • Add email enrichment only when contact fields are important for the workflow.
  • Set includeRiskyEmails to false when stricter accepted email output matters more than broader contact coverage.
  • Keep a saved copy of each recurring input configuration so run-to-run comparisons are easier.
  • Review RUN-SUMMARY before importing records into production workflows.
  • Preserve the original JSON export when flattening nested fields for CSV or Excel.

How to Run on Apify

  1. Open the actor in Apify Console.
  2. Configure the available input fields for the target practice area, location, direct URLs, enrichment preference, and limit.
  3. Set the maximum number of outputs to collect.
  4. Click Start and wait for the run to finish.
  5. Open the dataset and inspect the first records.
  6. Download results in JSON, CSV, Excel, or another supported format.

Agentic And API-First Usage

This actor can serve as a structured public data acquisition step inside larger automated workflows. Agents, ETL jobs, and no-code automations can select a bounded input, wait for completion, read the dataset, review the run summary, and then route records into the next system.

Agent workflow pattern:

  1. Generate or select a scoped input from the supported schema.
  2. Run the actor manually, on a schedule, or through Apify platform automation.
  3. Wait for completion and read the dataset records.
  4. Validate records against the field reference.
  5. Read RUN-SUMMARY and RUN-SUMMARY.html to verify counts, enrichment coverage, group outcomes, warnings, and export readiness.
  6. Upsert records into the downstream system using type + ":" + id.
  7. Trigger analysis, enrichment, alerts, BI refreshes, search indexing, vector indexing, or human review.

Practical notes for agentic use:

  • Keep prompts and automations grounded in the documented input parameters.
  • Start with small validation runs before allowing broad automated collection.
  • Feed the field reference and one representative output record to downstream AI steps.
  • Feed run summary artifacts to downstream agents so they can reason about completion, record counts, enrichment coverage, and follow-up actions.
  • Treat optional fields as nullable instead of asking agents to infer missing values.
  • Store run ID, input configuration, and dataset export metadata outside the record when building audit trails.
  • When context is limited, pass the input schema, field reference, idempotency key, and one representative output example rather than the full README.

Scheduling & Automation

Scheduling

Automated data collection is useful when lawyer profiles, firm associations, contact fields, ratings, awards, or review counts need to be refreshed over time. Use Apify schedules to rerun the same scoped inputs on a predictable cadence.

  • Navigate to Schedules in Apify Console.
  • Create a new schedule, such as daily, weekly, or custom cron.
  • Configure input parameters for the practice area, location, direct URLs, enrichment preference, and limit.
  • Enable notifications for run completion.
  • Add webhooks for automated processing.

Integration Options

  • CRM enrichment: Sync profile URLs, names, firm context, phones, websites, locations, and optional email fields into account or lead records.
  • Google Sheets or Airtable review: Export a bounded dataset for analyst review, qualification, tagging, or manual QA.
  • Webhooks: Trigger ingestion, validation, notification, or ticketing workflows after each completed run.
  • Data warehouses: Store repeated runs by practice area and region for historical reporting and change detection.
  • BI dashboards: Track saved-record counts, field coverage, practice-area segments, regions, and profile-level public signals over time.
  • Search and vector indexes: Make lawyer profiles searchable for internal discovery, retrieval workflows, and agent context.
  • Zapier or Make: Connect completed runs to lightweight no-code workflows when a full ETL pipeline is not needed.

Export Formats And Downstream Use

  • JSON: Best for APIs, applications, AI agents, ETL pipelines, and preserving nested field groups.
  • CSV or Excel: Useful for spreadsheet workflows, stakeholder review, and lightweight analysis after flattening nested objects deliberately.
  • API access: Supports automated ingestion into internal systems through Apify dataset access.
  • BI and warehouses: Supports reporting, dashboards, historical analysis, and monitoring across scheduled runs.
  • Search or vector indexes: Supports discovery, semantic search, retrieval workflows, and AI-agent context when records are converted into the target index format.

Downstream Pipeline Guide

  • Idempotency: Use type + ":" + id for upserts and deduplication.
  • Null handling: Treat optional fields as nullable, especially enrichment, ratings, awards, sections, peer reviews, and structured data.
  • Type handling: Preserve numbers, booleans, arrays, and nested objects when ingesting JSON into downstream systems.
  • Flattening: When exporting to CSV or Excel, flatten nested fields intentionally and keep the original JSON export for full fidelity.
  • Partitioning: Store run date, Apify run ID, input segment, practice area, location, or workflow name outside or alongside records.
  • Change detection: Compare repeated runs by stable key and selected business fields such as profile URL, firm, phone, website, rating summary, awards, or email availability.
  • Quality checks: Monitor saved-record count, required identifiers, email coverage when enabled, profile URL coverage, and important optional field fill rates.
  • Human review: Route records with missing critical fields, unexpected values, or changed high-value attributes into a review queue when needed.
  • Retention: Decide how long to keep raw exports versus normalized tables based on audit, compliance, and reporting needs.

Performance And Coverage Expectations

Runtime depends on input scope, result volume, public page availability, response size, optional profile detail richness, and whether email enrichment is enabled. The estimates below are planning guidance, not guarantees.

Run typeExample scopeOutputsDurationCoverage notes
ValidationOne practice area and one location10-100Often a few minutesGood for checking schema shape and optional-field coverage
Small recurring segmentOne focused market segmentUnder 1,000Commonly several minutesSuitable for weekly monitoring and CRM refreshes
Larger discovery runBroad segment or higher limit1,000+Can take longerSplit by practice area or region for cleaner operations
Email enrichment runSearch or URL list with getEmails enabledVariesLonger than directory-only runsEmail fields appear only when accepted candidates are available

Highly filtered runs can finish faster, while broad discovery and detail-rich records may take longer. For production workflows, validate with a small run first, then scale the limit and schedule based on the observed record count and enrichment coverage for your target segment.

Limitations

  • Availability depends on what Martindale publicly exposes at run time.
  • Some optional fields may be missing on sparse profiles or in certain regions.
  • Very broad searches may take longer and should be split into smaller segments when operational consistency matters.
  • Email fields are optional and depend on enrichment settings plus accepted candidate availability.
  • Target-side changes can affect field availability, naming, or record counts.
  • Regional, account, visibility, or availability differences may change visible results.
  • The actor provides structured public data, not legal advice, business advice, outreach approval, or guaranteed full-market coverage.

Troubleshooting

  • No results returned: Check the selected practice area, location, direct URLs, and whether Martindale has matching public records.
  • Fewer results than expected: Raise limit, broaden the practice area or location, or verify that the target segment contains enough public profiles.
  • Some fields are empty: Optional fields depend on what each profile publicly provides and whether email enrichment is enabled.
  • No email fields returned: Confirm getEmails is enabled, then review whether records expose enough public contact context for accepted candidates.
  • Duplicate-looking records: Compare type + ":" + id first, then review profile_url, url, and record_id.
  • Run takes longer than expected: Reduce scope, lower the limit for validation, split broad collection into smaller segments, or disable email enrichment when contact fields are not needed.
  • Output changed: Compare the current dataset with the field reference and include a small output sample when reporting the issue.
  • Downstream import failed: Check JSON validity, nullable fields, nested objects, and whether your destination expects flattened columns.

FAQ

What data does this actor collect?

It collects structured public lawyer profile records from Martindale, including names, profile URLs, listing context, professional overview details, ratings, awards, profile sections, peer reviews, structured data, and optional email fields when enabled and available.

Can I filter by location and practice area?

Yes. Use searchByCategory for the practice area and searchByLocation for the U.S. state, District of Columbia, or Canadian province/territory.

Can I scrape specific Martindale URLs?

Yes. Add Martindale search result pages, directory pages, location pages, or individual lawyer profile URLs to startUrls.

Why did I receive fewer results than my limit?

The limit is a maximum, not a promise that the selected segment contains that many public profiles. Results can also vary based on public availability and source-side behavior at run time.

How should I choose a limit for my first run?

Start with 10 or 100, inspect the dataset and run summary, then increase the limit once the output shape and field coverage match your workflow.

Where can I find the run summary?

Open the actor output links for RUN-SUMMARY and RUN-SUMMARY.html. The JSON summary is machine-readable, while the HTML report is easier to review in Apify Console.

Can I schedule recurring runs?

Yes. Use Apify schedules with a saved input configuration to refresh a practice-area and location segment or a known URL list on a daily, weekly, or custom cadence.

How do I avoid duplicates across runs?

Use type + ":" + id as the primary idempotency key. Keep profile_url, url, and record_id for audit review and fallback matching.

Can I use the output with AI agents or automated workflows?

Yes. The dataset is structured JSON, and the run summary artifacts give agents a compact way to verify saved-record counts, input modes, enrichment coverage, warnings, and representative records.

Can I export the data to CSV, Excel, or JSON?

Yes. Apify datasets can be exported in common formats. JSON preserves nested objects best; CSV and Excel are useful after flattening the fields your workflow needs.

Does this actor collect private data?

No. It is intended for publicly available Martindale information. Users are responsible for using collected data lawfully and responsibly.

What should I include when reporting an issue?

Include the redacted input, run ID, expected behavior, actual behavior, a small output sample when helpful, and the export or downstream destination if the issue is pipeline-related.

Compliance & Ethics

Responsible Data Collection

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

  • Legal-industry research and market analysis
  • Public profile enrichment and CRM review
  • Directory monitoring and operational reporting

This section is informational and not legal advice. Users are responsible for ensuring their use of collected data complies with applicable laws, regulations, platform rules, and internal policies.

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, discrimination, or other harmful purposes.
  • Follow relevant data protection requirements where applicable, such as GDPR, CCPA, or sector-specific rules.
  • Review your own retention, access control, and data-sharing policies before operationalizing the dataset.

Support

For help, use the actor page or issue channel. Include the redacted input used, run ID, expected versus actual behavior, a small output sample when useful, and the downstream destination or export format if the issue is pipeline-related.