NAR Directory Member Scraper extracts detailed realtor profile information from the National Association of Realtors directory. It helps professionals collect verified agent contact and office details efficiently without manual lookup, saving time and improving data accuracy.
Created by Bitbash, built to showcase our approach to Scraping and Automation!
If you are looking for nar-directory-member-scraper you've just found your team — Let’s Chat. 👆👆
This project collects structured profile data of individual real estate agents listed in the NAR member directory. It solves the challenge of manually gathering reliable agent contact information by automating profile-level data extraction. It is designed for real estate professionals, data analysts, marketers, and research teams who need accurate agent intelligence.
- Works on individual member profile URLs
- Retrieves both personal and office-level information
- Captures contact details without authentication
- Outputs clean, structured, analysis-ready data
- Suitable for lead generation and directory research
| Feature | Description |
|---|---|
| Profile-Level Scraping | Extracts detailed information from individual member profiles. |
| Contact Data Access | Collects business emails and phone numbers when available. |
| Office Information Mapping | Retrieves office name, address, and contact details. |
| Structured Output | Returns normalized, machine-readable data for easy reuse. |
| URL-Based Targeting | Scrapes only specified member profiles for precision. |
| Field Name | Field Description |
|---|---|
| personId | Unique identifier of the member profile. |
| firstName | Realtor’s first name. |
| lastName | Realtor’s last name. |
| memberTypeCode | Membership classification code. |
| memberTypeDescription | Human-readable membership type. |
| businessEmailAddress | Business email associated with the agent. |
| preferredPhone | Primary contact phone number. |
| localAssociationName | Name of the local realtor association. |
| stateAssociationName | Name of the state-level association. |
| primaryFieldOfBusinessName | Main business specialization. |
| officeBusinessName | Office or brokerage name. |
| officeEmailAddress | Office contact email. |
| officePhoneNumber | Office phone number. |
| streetAddressLine1 | Office street address. |
| streetCity | Office city. |
| streetState | Office state. |
| streetZip | Office ZIP code. |
[
{
"PersonId": 4575908,
"FirstName": "Aaliyah",
"LastName": "Aguero",
"MiddleName": null,
"MemberTypeCode": "R",
"MemberTypeCodeDescription": "REALTOR®",
"WebPageAddress": null,
"BusinessEmailAddress": "aaliyaha.xxxxxx@gmail.com",
"PreferredPhoneType": "O",
"PreferredPhone": "832646xxxx",
"PrimaryLocalAssociationId": 8055,
"LocalAssociationName": "HOUSTON ASSOCIATION OF REALTORS® INC",
"PrimaryStateAssociationId": 886,
"StateAssociationName": "TEXAS ASSOCIATION OF REALTORS®",
"PrimaryFieldOfBusinessId": 100,
"PrimaryFieldOfBusinessName": "General Residential Sales",
"OfficeId": 805513590,
"OfficeBusinessName": "C.R.Realty",
"OfficeEmailAddress": "cr@crrealtyco.com",
"OfficePhoneNumber": "8326460512",
"StreetAddressLine1": "5604 1st St. suite 101",
"StreetCity": "Katy",
"StreetState": "TX",
"StreetZip": "77493"
}
]
NAR Directory Member Scraper/
├── src/
│ ├── main.py
│ ├── scraper/
│ │ ├── member_parser.py
│ │ └── profile_fetcher.py
│ ├── utils/
│ │ ├── validators.py
│ │ └── normalizers.py
│ └── config/
│ └── settings.example.json
├── data/
│ ├── input_urls.txt
│ └── sample_output.json
├── requirements.txt
└── README.md
- Real estate marketers use it to collect agent emails, so they can run targeted outreach campaigns.
- Brokerage analysts use it to map agent-office relationships, so they can evaluate market coverage.
- Lead generation teams use it to build verified contact lists, so they can improve conversion rates.
- Researchers use it to analyze membership distribution, so they can identify regional trends.
Do I need an account to use this scraper? No, it works directly with publicly accessible member profile URLs.
Can I scrape multiple profiles at once? Yes, you can provide multiple profile URLs to process them in a single run.
Is sensitive data included in the output? Only publicly available profile information is collected, and outputs can be filtered further if needed.
What happens if a profile field is missing? Missing fields are returned as null to maintain a consistent data structure.
Primary Metric: Processes an average member profile in under 2 seconds.
Reliability Metric: Maintains a success rate above 98% on valid profile URLs.
Efficiency Metric: Capable of handling hundreds of profiles per hour with minimal resource usage.
Quality Metric: Delivers highly complete records with consistent field normalization across profiles.
