HAR.com Texas Real Estate Agent Scraper — Realtor Leads
Pricing
$3.00 / 1,000 per agent returneds
HAR.com Texas Real Estate Agent Scraper — Realtor Leads
76,042 Texas real-estate agents from HAR.com: name, brokerage, office address, phone (100% fill), city/ZIP, star rating, recent listing activity, languages, Platinum status, bio and photo. Filter by city, ZIP, brokerage, rating or Platinum. No email/license — read the honest limits.
Pricing
$3.00 / 1,000 per agent returneds
Rating
0.0
(0)
Developer
Scrapers Delight
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
2
Monthly active users
17 days ago
Last modified
Categories
Share
One row per agent from HAR.com, the Houston Association of REALTORS® board site — the deepest public agent directory in Texas. Each row carries fullName, phone, brokerageName with its stable brokerageKey and officeAddress, city / state / zip, the HAR rating and ratingSurveyCount, recent listing activity (listingsForSale, listingsForRent, listingsSold, listingsRented), languages spoken, isPlatinum membership, designations where shown, the agent bio and photoUrl. Filter by city, ZIP, brokerage, rating or Platinum status — or paste agent profile URLs and scrape those directly. No login. No CAPTCHA solving from you.
HAR is the board-level file, not a Google-Maps skim. It gives you the brokerage's HAR office key, the survey-backed rating, the agent's recent sold/rented counts and the languages they work in — fields a maps scraper cannot see. It is Texas-only by nature. There is no email and no license number in this dataset — read Honest limits before you buy.
Scope
Measured on HAR's live sitemap on 2026-08-15: 76,042 distinct agent profile URLs across the
profiles_1, profiles_2 and profiles_4 chunks (39,200 + 13,655 + 23,187; profiles_3 is served
empty by HAR right now), plus 1,405 affiliate members. Those are counts read off the files, not
quoted from a marketing page.
Filters: which ones are free, and which ones cost you
HAR's agent sitemap gives 76,042 profile URLs that carry no city, ZIP, brokerage or rating — but har.com also publishes its own agent index by ZIP and by city, and this Actor enumerates from those. That is what decides the cost of every filter here.
| Filter | How it works | Cost |
|---|---|---|
| Cities | Enumerated from har.com's own per-city agent listing (/{City}/real_estate_agents). The Actor ships har.com's index of 1,752 Texas city names, so the name resolves offline — no lookup request | Pre-filter — ~4.2 KB per candidate found |
| ZIP codes | Enumerated from har.com's own per-ZIP agent listing (/zipcode_<zip>/real_estate_agents) | Pre-filter — ~4.2 KB per candidate found |
| Profile URLs | You supply the exact profiles | Free to apply |
| Brokerage keys, phone / Platinum / rated, min rating, min listings sold | Applied after the profile is fetched, because neither the URL nor the listing reveals them | Costs one profile fetch per candidate examined, match or not |
Measured on the live Actor through Apify RESIDENTIAL-US, cities: ["Katy"] with maxItems 25 — the
identical input, before and after this became a pre-filter:
| Before (build 0.1.15) | After (build 0.1.16) | |
|---|---|---|
| Rows delivered | 2 of 25 | 25 of 25 |
| Profiles downloaded | 304 | 29 |
| Residential proxy billed | 28.5 MiB, $0.2121 | 2.59 MiB, $0.0202 |
| Wall clock | 292 s | 58 s |
| Cost per delivered row | $0.119 | $0.0010 |
zipCodes: ["77450"], maxItems 15, same comparison: 8 of 15 rows (the run tripped its own cost
breaker) reading 47 listing pages → 15 of 15 rows reading 1 listing page, 1.76 MiB billed.
Listing pages are now read lazily — one page at a time, only when the crawler has actually run out of candidates — so asking for 25 agents in a 3,208-agent city reads 2 listing pages, not 161.
If a city name is not in har.com's index (a typo, or somewhere outside Texas) the Actor says so in the run log and status, and falls back to the old scan-and-discard behaviour for that name, bounded by the "Max profiles examined" budget. You are only ever charged for rows you actually receive — examined-and-discarded profiles are free to you.
Setting both
citiesandzipCodesmeans the intersection: the ZIP list sources the crawl and the city name is then checked on each profile, which makes the city half a post-fetch filter again. Use one or the other for the cheapest run.
🚀 Quick start
The Actor ships prefilled with a working demo. Click Try for free, press Start, change nothing.
{"maxItems": 50,"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "US" }}
That pulls 50 Texas agents. Measured on the platform, that exact input: 50 agents, 50 distinct agentKeys, 0 duplicates, phone 92%, brokerage 100%, and it charged exactly 50 rows. Every field in the sample row below came out of a run like that one.
The wedge: board-level Texas depth a maps scraper can't give you
HAR is the MLS board's own site, so each profile carries things a phone-book or Google-Maps agent scraper never has:
- The brokerage as a stable key.
brokerageKey(e.g.RMXD01for RE/MAX Space Center) is HAR's own office id — join every agent at a brokerage without fuzzy-matching brokerage name strings. - A survey-backed rating.
rating+ratingSurveyCountcome from HAR's completed-client-survey system, not a scraped star average. - Recent production.
listingsSold/listingsRented/listingsForSaleare the agent's current activity counters — a live proxy for who is actually working, not just licensed. - Languages.
languagesis HAR's declared multi-lingual list (Spanish, Mandarin, Vietnamese …), the field relocation and immigrant-market services sort on. - Platinum status.
isPlatinumflags HAR's paid membership tier — the agents who invest in their business and answer their phone.
Read this before you buy rows
- This directory is Texas. HAR is the Houston-area MLS board; its agent file is Texas agents. There is no state picker. Use the city / ZIP / brokerage filters to narrow inside Texas.
- Filters run AFTER the page is fetched. The profile URL carries no city, ZIP or brokerage, so
cities,zipCodes,brokerageKeys,platinumOnly,ratedOnly,minRatingandminListingsSoldare all applied once a profile has loaded. An unfiltered pull is 1.0 fetches per row; a narrow city or a Platinum-only cut costs several fetches per row. You are billed only for agents returned, never for a page a filter discarded — so a narrow ask costs time and proxy budget, not your money. - There is no email address in this dataset. HAR keeps the agent's email behind a "Send email"
lead form; it is not on the page, so there is no
emailfield and nothing here invents one. - There is no TREC license number in this dataset. HAR does not print it on the agent overview
page (it lives in a separate TREC directory), so there is no
licenseNumberfield rather than an always-null one. - A missing rating is a fact about HAR, not a scraping failure. Most Texas agents have no
completed surveys, so
ratingisnullfor them.listingsSold: nulllikewise means HAR showed no counter, not zero sales.
What you get — one row per agent
| Group | Fields |
|---|---|
| Identity | profileUrl, agentKey, memberNumber, fullName, photoUrl, scrapedAt |
| Contact & location | phone, city, state, zip |
| Brokerage | brokerageName, brokerageKey, brokerageUrl, officeAddress |
| Status & rating | isPlatinum, rating, ratingSurveyCount |
| Recent activity | listingsForSale, listingsForRent, listingsSold, listingsRented |
| Profile | languages[], designations[], bio |
Conventions, stated once: scrapedAt is ISO-8601 UTC. rating is on a 0–5 scale and is only
set when ratingSurveyCount > 0. agentKey (from the profile URL) is present on 100% of rows and is
the right de-duplication key; memberNumber is HAR's numeric agent id. The dataset ships a Texas
agents table view so you can eyeball the slice you bought without writing a transformation.
Field fill — re-measured 2026-08-19 on 291 live records
Fill is quoted on two real slices, because one number would either flatter or slander this
dataset. Directory = 231 distinct agents pulled unfiltered from three places in the sitemap
(offsets 0, 30 000 and 60 000). Platinum = 60 agents from a platinumOnly: true run — the slice
most lead buyers actually want. Every run also prints its own measured fill in the log.
| Field | Directory (n=231) | Platinum (n=60) | |
|---|---|---|---|
fullName, agentKey, state, zip, profileUrl | 100% | 100% | every row |
brokerageName, brokerageKey, brokerageUrl, officeAddress | 100% | 100% | HAR office id + address |
photoUrl | 100% | 100% | |
city | 99.7% | 100% | null on the rare row where HAR's own meta tag is malformed — see the limits |
phone | 97.8% | 100% | HAR's contact-widget phone |
memberNumber | 72.3% | 100% | 167/171 on HAR-native agents, 0/60 on ABoR — see the limits |
bio | 26.4% | 78.3% | the agent's own write-up. HAR's canned placeholder is never shipped — see the limits |
listingsSold | 39.0% | 80.0% | recent sold counter |
listingsForSale | 38.1% | 65.0% | agents with active listings |
listingsRented | 30.3% | 71.7% | recent rented counter |
isPlatinum | 22.5% true | 100% true | a boolean on every row; % true swings 0–42% by slice |
listingsForRent | 16.0% | 33.3% | |
designations | 9.1% | 61.7% | ABR, CRS, GRI, CLHMS, SIOR, CIPS, SRES … 25 distinct codes seen |
languages | 7.4% | 36.7% | multi-lingual agents |
ratingSurveyCount | 4.3% | 25.0% | most agents have no completed surveys |
rating | 4.3% | 25.0% | exactly tracks ratingSurveyCount — a rated agent always gets a number |
Re-measured independently on build 0.1.8 over 271 fresh distinct agents (sitemap offsets 0 and
30 000, no filters — 90 of them Platinum, 181 not). The numbers move by slice, so treat the table as
a range, not a promise: bio 23.2% non-Platinum / 78.9% Platinum · phone 96.7% / 100% ·
memberNumber 97.8% / 100% · listingsSold 45.9% / 91.1% · designations 7.2% / 27.8% ·
languages 7.2% / 24.4% · rating 0% / 20.0%. Zero duplicate agentKeys in 271 rows, all 24
columns present on all 271, and zero rows carrying HAR's canned placeholder bio.
The headline that could mislead you: this is a brokerage-and-contact product, not a ratings product. HAR ratings are survey-gated and sparse; buy this for the brokerage key, the phone and the recent-production counters, not for star ratings.
How to run it
A. A plain Texas pull (the cheapest mode) — 1.0 fetches per row
{ "maxItems": 2000 }
B. One city — a pre-filter, so cost scales with matches
The name is resolved against har.com's own city index (1,752 Texas cities, shipped with the Actor)
and the crawl is enumerated from /{City}/real_estate_agents. Spelling is forgiving: Katy, katy,
Katy, TX and Sugar Land all resolve.
{ "cities": ["Katy", "Sugar Land"], "maxItems": 500 }
har.com files an agent under every city they work, so an agent's own office address may be in a
neighbouring town. Measured on a 30-row ["Katy", "Sugar Land"] pull: 28 rows self-report Katy,
2 report Houston — agents who work Katy from a Houston office. That is the source's own
definition of "agents in Katy", and the Actor does not second-guess it (re-testing the profile's
address would throw away profiles you already paid to fetch).
Cities are consumed in the order you list them, so if maxItems is filled by the first city the
later ones are never reached — that 30-row pull above returned Katy agents only. Give a larger
maxItems, or run one city per run, if you want each city represented.
C. One brokerage
Run once unfiltered, read the brokerageKey off the rows you want, then re-run with them.
{ "brokerageKeys": ["RMXD01", "EXPD12"], "maxItems": 1000 }
D. Active, contactable agents
{ "withPhoneOnly": true, "minListingsSold": 3, "maxItems": 1000 }
E. Known profiles — paste the URLs
Sitemap enumeration is skipped entirely. Only /{name}/agent_{key} URLs are accepted.
{ "profileUrls": ["https://www.har.com/james-chen/agent_ypchen"] }
F. Resuming a big pull across runs
Enumeration order is stable, so a maxItems=1000 run followed by skip=1000 continues where the
first stopped. All 76,042 agent URLs are unique.
{ "skip": 1000, "maxItems": 1000 }
Sample row
One real row, from a real run:
{"profileUrl": "https://www.har.com/james-chen/agent_ypchen","agentKey": "ypchen","memberNumber": "685420","fullName": "James Chen","phone": "(281) 849-6888","city": "Missouri City","state": "TX","zip": "77459","brokerageName": "NX Realty","brokerageKey": "NXRA01","brokerageUrl": "https://www.har.com/nx-realty/broker_nxra01","officeAddress": "6110 Sienna Ranch Rd #201, Missouri City, TX 77459","isPlatinum": true,"rating": 4.97,"ratingSurveyCount": 252,"listingsForSale": 5,"listingsForRent": 3,"listingsSold": null,"listingsRented": 79,"languages": ["Mandarin", "Min Nan/Taiwanese", "English"],"designations": ["ABR", "CRS", "GRI", "ALHS"],"bio": "James Chen is a licensed broker in the Greater Houston Area with over 10 years of real estate experience …","photoUrl": "https://www.har.com/ogimage/v3/agent-profile-overview--ypchen--61ef46073bb7640a3ef4281c7b3e86a7.jpg","scrapedAt": "2026-08-15T04:38:39.177Z"}
Two fields people misread, so they are named to prevent it:
ratingis set only whenratingSurveyCount > 0. HAR renders an empty "0 / 5" placeholder on unrated agents; this Actor never turns that into a false 0.0 — an unrated agent israting: null.listingsSold: nullmeans "HAR showed no sold counter", not "0 sales". The counters reflect what HAR chose to display on the overview.
Input
Grouped in the Console as What to scrape · Lead-quality filters · Depth, limits & cost · Advanced. Nothing is required; everything that matters is prefilled.
| Field | Type | Default | What it does |
|---|---|---|---|
maxItems | int | 50 | Agents to return, and your hard cost cap. |
cities | list | — | Pull agents har.com lists in these cities. Pre-filter, forgiving spelling. |
zipCodes | list | — | Pull agents har.com lists in these ZIPs. Pre-filter. |
brokerageKeys | list | — | Keep only these HAR office keys. Post-fetch. |
profileUrls | list | — | Paste /{name}/agent_{key} URLs to skip enumeration. |
withPhoneOnly | bool | false | Keep only agents with a phone. Cheap (~93% fill). |
platinumOnly | bool | false | Keep only Platinum agents. ~8 fetches per row. |
ratedOnly | bool | false | Keep only agents with a completed survey. Expensive — sparse. |
minRating | select | 0 | Keep agents rated at least this. Implies a rating exists. |
minListingsSold | int | 0 | Keep agents with at least this many recent sold listings. |
includeBio | bool | true | Include the profile bio. |
includeLanguages | bool | true | Include languages spoken. |
includeDesignations | bool | true | Include designations where shown. |
skip | int | 0 | Resume where a previous run stopped. |
maxConcurrency | int | 5 | Warmed residential sessions in flight (1–10). |
proxyConfiguration | proxy | Apify RESIDENTIAL-US | Leave it. See the transport ladder. |
Pricing
$0.003 per agent returned — $3 per 1,000 — charged on the agent-scraped event. No monthly
platform fee from this Actor.
| Run | Agents | Cost |
|---|---|---|
| The prefilled demo, no edits | 50 | $0.15 |
| A city sample | 500 | $1.50 |
| A brokerage list | 1,000 | $3.00 |
| A serious pass | 5,000 | $15.00 |
| Every agent HAR publishes | 76,042 | $228.13 |
You are charged for rows delivered, never for a profile that was fetched and then filtered out,
and never twice for the same agent — duplicate agentKeys are dropped at enumeration, before
anything is fetched. Rows are charged as they are pushed, so if you hit a budget cap you get
whole rows and stop, not a half-billed dataset. maxItems is your hard cost cap.
Honest limits
- No email addresses. HAR keeps the agent email behind a "Send email" lead form. Anyone selling
you "HAR emails" generated them somewhere else. Pair this Actor with an email-enrichment step on
brokerageName+fullNameif you need them. - No TREC license number. HAR does not print it on the agent overview page. If you need the license, cross-reference the free TREC public license search.
- Texas only. HAR is the Houston-area board; the directory is Texas agents.
- Ratings are sparse, and that is a fact about HAR, not about this Actor. Only agents with at
least one completed client survey get a score: measured 4.3% of the open directory and
25.0% of Platinum agents. When a rating exists you get the exact two-decimal CER value HAR
prints (4.97, 4.94, 4.85 …) —
ratingandratingSurveyCounthave identical fill (10/231 and 10/231), so a rated agent never comes back with a blank score. - Designations are a Platinum-weighted field. HAR renders them as badge images on the overview: 61.7% of Platinum agents carry at least one, versus 9.1% of the open directory. Empty means HAR showed no Designations section for that agent.
memberNumberis blank on ABoR-syndicated agents. One sitemap chunk is Austin Board of REALTORS® profiles (agentKeystartsABORTX-); HAR ships those with an emptymember_numberinput, so the field is honestlynullthere (0/60 measured) and 167/171 on HAR-native agents. UseagentKeyas the join key — it is 100% on every row.biocounts only the agent's OWN words. When an agent leaves the bio blank, HAR fills the block with its own canned CTA ("Contact {name} if you are in the process of buying, selling or renting a property…"). That is a fact about HAR's template, not a biography, so it is dropped rather than shipped as content: it was 112 of the 173 non-null bios in the audited directory slice and 1 of 48 in the Platinum slice. The percentages above are agent-written bios only, which is why the directory figure (26.4%) is far below the Platinum one (78.3%) — Platinum agents write bios. HAR also lets agents paste from Word and from markdown editors, and those variants are read too (they were previously being dropped).- HAR's own
og:keywordsis occasionally malformed, andcityis read from it. On 1 of 291 audited rows HAR printed the ZIP where the city belongs.cityisnullon that row rather than wrong — a bare ZIP or an echo of the agent's name is refused, becausecitiesis a filter input and a wrong city is worse than a blank one. The same HAR defect is visible in its rendered office address. 290/291 rows had acitythat appears verbatim insideofficeAddress. - Brokerage, rating, Platinum and phone filtering happens after the fetch, because neither the profile URL nor the listing reveals them. Narrow asks on those are slower. City and ZIP are not in this group — they are enumerated from har.com's own indexes before anything is downloaded.
- The PerimeterX wall is real. This Actor beats it with a warmed residential session (see below), and across every validation run 100% of profiles came through — but if the wall is unusually hot, a run may leave a few profiles blocked and log it. The rows you get are always real.
How it works (technical)
-
Work out where candidates come from:
cities→ resolve each name against the bundled city index (built fromsitemap.har.com/cities_sitemap.xml.gz) and page/{City}/real_estate_agents?sort=name.zipCodes→ page/zipcode_<zip>/real_estate_agents?sort=name.- neither → read
https://sitemap.har.com/sitemap.xml(an open host — no PerimeterX, no proxy needed), pull the gzippedprofiles_N.xml.gzchunks, decompress in-process and stream the/{name}/agent_{key}<loc>values, deduplicating onagentKey.
?sort=nameis what makes listing paging safe: HAR's own pagination links usesort=rnd, and pages of a randomised list overlap. Withsort=name, page 1 and page 2 share 0 of 20 agents on/Katy/,/Sugar_Land/and/zipcode_77450/. Listing pages are pulled lazily — one at a time, only when the crawlers have run out of work — so a 25-row pull reads 2 pages, not 161. Candidates are deduplicated before anything is fetched, thenskipis applied. -
Fetch each profile page through Apify RESIDENTIAL, country US, on a warmed session: each worker mints a PerimeterX cookie by requesting
har.com/on a fresh pinned session and hanging up as soon as the response headers arrive (the cookie is inSet-Cookie; the ~310 KB body is not needed). It then fetches profiles on that session, re-warming on any block. -
Parse each page — the record is merged from HAR's hidden lead-form inputs (member number, phone), the
<meta og:*>tags (photo, andkeywords= "{Name},…,{City},{ST},{ZIP}"), the/{slug}/broker_{key}link (brokerage name from the anchor/title, key + URL from the href) and the rendered body (rating + survey count, activity counters, languages, Platinum badge, bio). -
Apply your filters, push in batches, charge on push.
Which HAR pages are reachable. Measured through Apify proxy:
| Page | Result |
|---|---|
www.har.com/findapro/agentsearch (agent search) | HTTP 403, PerimeterX px-captcha |
www.har.com/{City}/real_estate_agents (city listing, warmed residential) | HTTP 200, 20 agents per page, 84.8 KB on the wire |
www.har.com/zipcode_<zip>/real_estate_agents (warmed residential) | HTTP 200, 20 agents per page, 84.5 KB on the wire |
www.har.com/{name}/agent_{key} (profile, warmed residential) | HTTP 200, full profile |
sitemap.har.com/* | HTTP 200, open |
An earlier version of this README recorded the city listing as
HTTP 403, PerimeterXand built the whole design around that. That reading was taken on an unwarmed session: the listing pages sit behind exactly the same PX rule as the profile pages, and clear it the same way. Re-measured 2026-09-08, and correcting it is what turnedcitiesfrom a scan-and-discard filter into a pre-filter.?page_size=is not honoured — the server pins 20 per page regardless.
The transport ladder. Everything below was measured through Apify Proxy, not from a laptop. A home broadband line reaches har.com without a proxy; an Apify container does not, so the home result is reported and then ignored.
| Rung | Result |
|---|---|
| Direct / Apify datacenter, fresh or pinned | 0/5 — HTTP 403 px-captcha |
| Apify RESIDENTIAL-US, fresh session per request | 0/5 — HTTP 403 px-captcha |
| Apify RESIDENTIAL-US, pinned session, no warmup | 1/5 — roulette |
| Apify RESIDENTIAL-US, pinned session + homepage warmup + Chrome client-hints + retry-on-new-session | 24/24, then 40/40 = 100% (3 warmups for 40 profiles), 0 failures |
Findings worth keeping:
-
The homepage warmup is the whole trick. PerimeterX serves
har.com/through and sets a valid cookie for that residential exit IP; the profile page then passes. Without the warmup, a residential session cleared roughly 1 in 5. -
The warmup only needs the response headers. The PX cookie arrives in
Set-Cookie, so the Actor hangs up the moment the headers land. A/B over 12 fresh sessions each, two profiles attempted per session, through Apify RESIDENTIAL-US:Warm-up Wire bytes per warm-up Profiles passed Wire per good profile Full body 34.6 KB 9/17 (53%) 111.7 KB Headers only 9.4 KB 8/16 (50%) 78.4 KB Same pass rate inside the noise of n≈16, a quarter of the bytes. (
robots.txtdoes not mint a PX cookie, and there is no lighter PX-guarded HTML page on the host.) -
Session longevity is set by PX heat, not by a counter. Three warmed sessions walked 20, 2 and 3 profiles before their first block. A block costs only ~4.8 KB, so the Actor re-warms reactively on a block instead of throwing a good session away on a fixed profile count.
-
HAR gzips ~6x, and that is what you are billed on. Apify bills residential proxy on the bytes that actually cross the wire: a profile is 63.5 KB compressed against 390 KB decompressed, the homepage 49.6 KB against 310 KB. The Actor therefore requests gzip, meters the raw buffer and inflates in-process, so its cost log is comparable to the invoice. Response bodies are not the whole bill either — headers, TLS handshakes and a proxy CONNECT per session cross the same metered link — so the log applies a 1.30x overhead factor, measured by dividing Apify's own billed
PROXY_RESIDENTIAL_TRANSFER_GBYTESby the body bytes counted on four runs (1.27, 1.36, 1.33, 1.24). The "KB per delivered row" the run prints is therefore what you are actually charged for.
Uniqueness — measured, not asserted
- The three live profile chunks hold 76,042 agent URLs with 0 duplicate
agentKeys across them. - A 30-agent contiguous slice returned 29 active agents, 1 inactive, 0 duplicates.
- Two slices joined with
skipshare 0 rows.agentKeys are deduplicated at enumeration, before anything is fetched, so a duplicate can reach neither your dataset nor your bill.
When a run stops early
This Actor never hands you a silently empty dataset: every early stop is spelled out in the run status message, and nothing you did not receive is ever billed.
- 0 rows ends the run with a status message, naming the fetch count, how many were PX-blocked, inactive, unparseable and how many your filters removed — plus the likely cause. Nothing is billed.
- A sitemap that HAR serves empty or partial (no
profiles_Nchunks, or chunks with no agent URLs) stops the run with that message rather than pretending it collected something. HAR serves those chunks unevenly — re-run, or paste URLs intoprofileUrls. - More than 20% of HTTP-200 pages failing to parse warns loudly in the log and the run status — the rows you did get are real, but check them: HAR may have changed the template. If nothing parsed at all, the run fails — a broken parser is the one thing worth failing on.
- A high residual PX-block rate warns — the rows you got are real; re-run to pick up the misses.
- A proxy-cost breaker stops a run that is spending far more bandwidth than its rows are worth
(over 1.6x the ~315 KB/row break-even, judged on delivered rows once there are at least 8 of
them). The status names it, with the KB per delivered row and the warm-up count, and every row you
received was charged — nothing else was. It can only ever cut a run short of your
maxItems: a run that delivered everything you asked for is never labelled a cost stop, however hot PX was. Measured 2026-09-09, one input run at two sizes:maxItems 8delivered 8 of 8 at 969 KB/row with no stop message (runXDSabJgSFMK5Ed9O1); the same filters atmaxItems 25delivered 8 of 25 at 1,033 KB/row and said so (runs90CoQCoRiBpDfzBJ). - A run whose "Max total charge" runs out stops on a whole row, never a half-billed one, and the
charge cap is the message you get — it outranks every other early-stop reason, because it is the
one you can act on. Measured:
cities:["Katy"], maxItems 25, cap $0.03 → 10 rows delivered, 10 charged, status "Stopped at this run's maximum total charge, not at maxItems." - A non-HAR-agent URL in
profileUrlsis skipped with a warning naming the first bad one; if none of them are usable the Actor falls back to sitemap enumeration instead of failing. - The run-time limit is respected. The Actor reads its own remaining wall-clock time, stops
starting new fetches before the platform would kill it, and still emits everything already
collected, with a status message telling you to raise the timeout or use
skipto continue. - Running out of candidates before
maxItemsis a warning, not a failure. - No input at all is fine. Press Start with an empty input and you get the documented 50-agent sample ($0.15) — it is never an error, and never a surprise bill.
Who buys this
| You are… | You use it to… |
|---|---|
| Title companies & escrow | Build a Texas agent call list with phone + brokerageName + recent listingsSold, prioritising active closers. |
| Mortgage lenders & LOs | Source referral-partner agents by city and production, filtered to withPhoneOnly + minListingsSold. |
| Real-estate coaching & CRM SaaS | Target Platinum agents (isPlatinum) and high-production teams as buyers who invest in their business. |
| Relocation & language-market services | Segment by languages and city to find agents who serve a specific community. |
| Recruiting / brokerage growth desks | Rank agents at a competitor brokerage (brokerageKey) by recent activity for lateral recruiting. |
How this differs from the sibling agent Actors
| Actor | What it is | Why you would use it instead |
|---|---|---|
| This Actor | HAR.com, the Texas MLS board directory | You want Texas board-level depth — brokerage key, survey-backed rating, recent sold/rented counts and languages — at the deepest coverage in the state. |
zillow-agent-leads-scraper | Zillow's national agent directory | You want national coverage and Zillow's review counts. |
realtor-agent-leads-scraper | Realtor.com's national directory | You want national coverage and Realtor.com's recent-sales history. |
fastexpert-agent-scraper | FastExpert's curated national list | You want FastExpert's email and sold-transaction history nationwide. |
homelight-scraper | HomeLight's agent matches | You want HomeLight's performance-ranked matches. |
The honest summary: the national portals are wider; HAR is deeper in Texas and carries the board's own brokerage key and activity counters. The usual play is to pull HAR for a Texas market and enrich contact details elsewhere.
FAQ
Can I get agent emails?
No — and nobody honestly can, from this source. HAR keeps the email behind a "Send email" lead form,
so there is no email field. You do get phone (~93%), brokerageName and brokerageUrl. If email
is the point, enrich on fullName + brokerageName elsewhere.
Can I get the TREC license number?
No — HAR does not print it on the agent overview. Cross-reference the free TREC public license search
using fullName + city.
Does this cover the whole US? No. HAR is the Houston Association of REALTORS® board; its agent directory is Texas.
Does it need a proxy? Yes — Apify Proxy, RESIDENTIAL, country US, which is the default and cannot be turned off for the crawl. HAR's profile pages are behind PerimeterX; datacenter and non-US residential measured 0/5.
How do I filter to one city?
Set cities. The name is resolved against har.com's own index of 1,752 Texas cities and the crawl is
enumerated from that city's agent listing, so only agents har.com already files under that city are
ever downloaded — cost scales with matches, not with the 76,042-agent register. Spelling is forgiving
(Katy, katy, Katy, TX). If a name is not in the index the run says so and falls back to scanning
profiles, bounded by "Max profiles examined".
Do I get charged for rows a filter removed? No. You are charged per agent returned, on push. A narrow filter costs time and proxy budget, not money.
Two runs, will I get duplicates?
Not if you use skip with the number the previous run logged. agentKeys are unique across the
directory.
Will a run ever succeed with zero rows? No. A run that emits nothing throws, and the error says how many pages were fetched, blocked, inactive or filtered out.
Can I schedule it?
Yes — Apify Schedules. Pair it with skip to walk the directory a slice at a time.
⚠️ Legal & fair use
This Actor reads public agent directory pages that HAR.com publishes and enumerates from HAR's
own sitemap (sitemap.har.com). HAR's robots.txt disallows /social/, /track, /tx/*,
/dlreceipt/ and a handful of API endpoints; this Actor touches none of them — it reads the
sitemap.har.com chunks and the public /{name}/agent_{key} profile pages. It does not log in and
collects no data behind authentication.
Rows describe named individuals, so they are personal data. You are responsible for complying with HAR's terms and with how you use the data. Real-estate solicitation and anti-spam rules may apply to your outreach — including TCPA, CAN-SPAM, Texas DNC and TREC advertising rules.
HAR.com®, HAR® and REALTOR® are trademarks of their owners; this Actor is not affiliated with, endorsed by or sponsored by the Houston Association of REALTORS®.
Feedback
Found a missing field or want a new filter? Open an issue on the Issues tab.
SEO keywords
har.com scraper, har agent scraper, houston association of realtors scraper, texas real estate agent scraper, houston realtor leads, texas realtor list, real estate agent leads texas, har.com data export, houston real estate agents database, texas agent directory scraper, realtor phone list texas, brokerage agent list, platinum agent list har, texas real estate agent csv, houston agent leads, real estate agent lead generation texas, har realtor scraper, texas mls agent scraper, agent brokerage data, real estate recruiting list texas