NYC Landlord Registry Lead List — HPD Portfolio Contacts avatar

NYC Landlord Registry Lead List — HPD Portfolio Contacts

Pricing

from $8.25 / 1,000 results

Go to Apify Store
NYC Landlord Registry Lead List — HPD Portfolio Contacts

NYC Landlord Registry Lead List — HPD Portfolio Contacts

Bulk NYC landlord & managing-agent contact lead lists from HPD building registrations. Killer filter: portfolio size — target owners of 5-50 Bronx buildings. Rolls up buildings per contact with business address, boroughs, ZIPs & samples. For prop-mgmt, insurance, lender & proptech sales.

Pricing

from $8.25 / 1,000 results

Rating

0.0

(0)

Developer

Kyle Maloney

Kyle Maloney

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Share

Build bulk landlord and managing-agent contact lead lists from New York City's legally mandated HPD (Housing Preservation & Development) registration data — with the one filter no flat data dump gives you: portfolio size per landlord. Ask for "owners of 5–50 Bronx buildings" and get one clean lead record per unique contact, with their filed business address and a rollup of every building they're registered on.

Every residential building with 3+ units (and many 1–2 unit non-owner-occupied buildings) in NYC must register annually with HPD and name an owner, head officer, and managing agent. That makes this the most complete, legally mandated landlord contact registry in the United States — refreshed continuously on NYC Open Data.

Who it's for

  • Property-management companies prospecting owners in a target borough / portfolio band
  • Insurance brokers (landlord policies, umbrella, builders risk) building call lists
  • Lenders & mortgage brokers targeting multi-building owners for refi outreach
  • Contractors, roofers, boiler/elevator service companies selling to building operators
  • Proptech sales teams who need decision-maker (HeadOfficer / Agent) leads, not LLC shells
  • Real-estate investors & brokers mapping who actually controls a neighborhood

What it does (the transform)

  1. Pulls HPD Multiple Dwelling Registrations for your borough/ZIP (dataset tesw-yqqr).
  2. Filters to current registrations only — registration end date on/after the dataset's own latest filing date (anchored to the data, not the wall clock; NYC registrations run in annual cycles ending September 1). Set includeExpired: true to keep lapsed registrations too.
  3. Pulls the matching HPD Registration Contacts (dataset feu5-w2e2) in batched SoQL IN (...) queries, joined on registrationid.
  4. Groups by normalized contact identity — corporation name (case/punctuation normalized) or person first+last name, plus filed business address — so the same management company across 40 buildings becomes ONE lead with buildings_count: 40.
  5. Applies your lead filters: contact types, min/max portfolio size, entities only.
  6. Outputs leads sorted by portfolio size (largest first), capped at maxResults.

Example input

{
"borough": "BRONX",
"contactTypes": ["HeadOfficer", "Agent"],
"minPortfolioBuildings": 5,
"maxPortfolioBuildings": 50,
"entityOnly": false,
"maxResults": 500
}

How complete is the contact data? (measured, not claimed)

Measured on the actor's own prefill (Bronx, HeadOfficer + Agent, 200 results) against the live datasets on 2026-08-01, n = 200 leads:

Contact / identity fieldPopulated
contact_name100.0%
business_address / business_city / business_state / business_zip100.0%
contact_type / contact_types100.0%
corporation (the identity is itself an LLC)38.5%
affiliated_corporations (the LLC behind a person-named lead)41.5%
entity identifiable, either way80.0%
contact_title43.5%
contact_middle_initial14.0%
contact_descriptions100.0%
building_bbls / building_bins / buildings100.0%

Mean portfolio: 35.3 buildings per lead. Mean HPD contact rows per lead: see contact_records_count.

There are no phone numbers or email addresses in this data. HPD publishes name, role, title and a filed business mailing address only, and this actor republishes exactly that - nothing is inferred or appended. If you need a phone, this is the list you feed to a skip-trace, not a replacement for one.

corporation is null on 61.5% of leads because a HeadOfficer row is a natural person and carries no corporation name. The owning entity is on a different contact row of the same registration, which v1.0 fetched and discarded. v1.1 publishes it as affiliated_corporations, which is how entity coverage goes from 38.5% to 80.0%. corporation and is_entity keep their exact v1.0 meaning.

Output fields

Lead identity

FieldMeaning
contact_namePerson name; falls back to the corporation for pure entity records
contact_full_nameFirst, middle initial and last name
contact_first_nameFirst name as filed
contact_middle_initialMiddle initial as filed
contact_last_nameLast name as filed
corporationCorporation/LLC name as filed on THIS identity, or null for an individual
affiliated_corporationsCorporation names filed on other contact rows of the same registrations - this is how the owning LLC is recovered for a person-named lead
has_corporate_affiliateTrue when at least one affiliated corporation was found
is_entityTrue when the identity itself is a corporation/LLC
contact_typeMost frequent role: HeadOfficer, Agent, CorporateOwner, IndividualOwner, Officer, SiteManager, JointOwner, Shareholder, Lessee
contact_typesEvery role this identity appears under
contact_titleMost frequent filed title (MEMBER, PRINCIPAL, TREASURER, PRESIDENT)
contact_titlesEvery distinct filed title
contact_descriptionsHPD contactdescription values (CORP, GEN.PART, INDIVIDUAL)
contact_records_countHow many HPD contact rows rolled up into this lead
business_addressFiled business street address
business_cityFiled business city
business_stateFiled business state
business_zipFiled business ZIP

Portfolio

FieldMeaning
buildings_countPortfolio size - distinct registered buildings linked to this contact in the scanned area
registration_rows_countHPD registration rows (one per building) behind the portfolio
registration_ids_countDistinct HPD registrations this contact appears on. One registration can cover hundreds of buildings
buildingsUp to 25 buildings, each with address, zip, bbl, bin, building_id, registration_id and registration_end_date
building_bblsUp to 25 10-digit Borough-Block-Lot ids, so this joins directly to the rest of the NYC shelf
building_binsUp to 25 NYC Building Identification Numbers
sample_buildingsUp to 5 buildings as "housenumber streetname, borough"
boroughsBoroughs the portfolio touches
borough_countHow many boroughs
zipsZIP codes the portfolio touches
zip_countHow many ZIPs
community_boardsCommunity boards the portfolio touches
newest_registration_dateMost recent lastregistrationdate across the portfolio
earliest_registration_end_dateEarliest registrationenddate across the portfolio
latest_registration_end_dateLatest registrationenddate; beyond the next September 1 means an early renewal

Run provenance and source health

FieldMeaning
registrations_statusok / unavailable for the HPD registration read
contacts_statusok / unavailable for the HPD contact join
anchor_statusok / not_applicable for the current-registration anchor
sources_failedDataset URLs that did not answer. Empty on a healthy run
partial_runTrue when a contributing source did not fully answer
current_registrations_onlyTrue when portfolios count only currently registered buildings; false under includeExpired
anchor_dateThe max(lastregistrationdate) the currency filter was anchored to
registration_rows_scannedTotal HPD registration rows read this run
contact_rows_scannedTotal HPD contact rows read this run
data_as_ofUTC date the run executed
source_urlNYC Open Data page for the contacts dataset
registrations_source_urlNYC Open Data page for the registrations dataset

What v1.1 fixed (2026-08-01)

Both sources were re-probed live and the actor was rebuilt around what they actually return. Nothing was removed or renamed.

  • buildings_count - the entire product - was wrong for the largest portfolios. tesw-yqqr is one row per building, not per registration; a single registration id can cover hundreds of buildings. v1.0 indexed by registration id and kept only the first row. Live on 2026-08-01 there are 151,523 current registration rows across only 142,280 distinct ids, so 9,243 rows were being discarded city-wide - 8,999 of Queens' 41,808 rows, 21.5%. Concretely: registration 911741 (a Queens co-op) covers 1,448 buildings; v1.0 published its head officer and its agent as landlords of 1 building each. minPortfolioBuildings / maxPortfolioBuildings were therefore filtering on a number that could be off by 1,447.
  • Contact batches truncated silently. v1.0 sent 50 registration ids with a flat $limit=5000, no $order and no paging. Registration 911741 alone carries 8,688 contact rows and 912547 carries 5,352, so a batch containing either lost rows - and with no $order, which rows survived was arbitrary, so the other 49 registrations in that batch could contribute nothing.
  • Registration paging used a non-total sort key. $order=registrationid over 9,243 duplicate ids lets Socrata skip or repeat rows across page boundaries. It is now registrationid,buildingid and reconciled against the count(*) the service itself reports.
  • A failed anchor query silently changed the answer. v1.0 warned and carried on without the currency filter, turning buildings_count from a current portfolio into a lifetime one. That now fails the run unless you asked for includeExpired.
  • A misspelled borough produced a green, zero-row run that reads exactly like "no landlords here". Borough, contact type and ZIP are now validated against the live vocabularies before anything runs.
  • The owning LLC, the title and the middle initial were fetched and discarded. See affiliated_corporations, contact_title, contact_middle_initial.
  • Block, lot and BIN were never requested, so the leads could not be joined to the rest of the NYC shelf. See building_bbls / building_bins.

Use as an MCP tool

This actor is callable by AI agents (Claude, Cursor, custom agents) via mcp.apify.com — the described input schema and field-level output docs make it a clean chainable tool for "find me NYC landlord leads" workflows.

FAQ

How do I get a list of NYC landlords by portfolio size? Set minPortfolioBuildings / maxPortfolioBuildings (e.g. 5–50) and a borough. Portfolio size is computed within the scanned area, so a Bronx run counts Bronx buildings.

Is this data legal to use for outreach? The addresses are business addresses filed under NYC Housing Maintenance Code §27-2097, published as public open data by the City of New York precisely so the public can identify who is responsible for a building. No phone numbers or emails are in the source; this actor republishes only what the city publishes.

Which contact type should I target? HeadOfficer (the decision-maker behind the owning entity) and Agent (the managing agent who buys services day-to-day) are the highest-value roles. CorporateOwner rows give you the owning LLC itself.

Does it include expired registrations? No — by default only current-cycle registrations (end date on/after the dataset's latest filing date). Set includeExpired: true to include lapsed ones, e.g. to prospect owners who fell out of compliance.

Can I run it city-wide? Yes — leave borough empty. Expect a much longer run (~165k current registrations across all five boroughs); borough-by-borough runs are faster and cheaper.

What about new-landlord alerts? A delta mode (only contacts on registrations filed since your last run) is planned for v1.1.

Pricing

Pay-per-result: you're charged only for the lead records actually pushed to the dataset. Runs that match nothing cost only the minimal actor start.

Data sources

Both are keyless, public NYC Open Data (Socrata) endpoints maintained by the NYC Department of Housing Preservation & Development.

ActorWhat it adds
NYC Distressed Property LeadsWhich of those buildings are actually under pressure (violations, liens, evictions)
NYC ACRIS Deed Transfer IntelWhether the owner has been buying or selling, with price and cash/LLC flags
Parcel Owner LookupAddress → owner of record for one-off checks

Typical play: build a portfolio-banded contact list here → screen those BBLs for distress → time the outreach against recent ACRIS activity.