HUD Section 8 Expiring Contracts Scraper - Multifamily & LIHTC avatar

HUD Section 8 Expiring Contracts Scraper - Multifamily & LIHTC

Pricing

from $2.10 / 1,000 properties

Go to Apify Store
HUD Section 8 Expiring Contracts Scraper - Multifamily & LIHTC

HUD Section 8 Expiring Contracts Scraper - Multifamily & LIHTC

Scrape HUD-assisted multifamily properties with expiring Section 8 and PRAC contracts, unit counts, rent-to-FMR ratios, REAC scores, and management agents, plus Year-15 and full LIHTC property lists.

Pricing

from $2.10 / 1,000 properties

Rating

0.0

(0)

Developer

Groundplane Labs

Groundplane Labs

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Categories

Security

Limited permissions

Share

Scrape HUD-assisted multifamily properties with upcoming Section 8 HAP / PRAC contract expiration dates, unit counts, rent-to-Fair Market Rent (FMR) ratios, REAC physical inspection scores, troubled status codes, and management agent organizations, plus Low-Income Housing Tax Credit (LIHTC_YEAR15 and LIHTC_ALL) properties, directly from the U.S. Department of Housing and Urban Development (HUD) ArcGIS Online FeatureServer services.

What it does

Affordable housing investors, lenders, housing authorities, and property management firms track HUD Section 8 Housing Assistance Payments (HAP) and Section 202/811 PRAC contract expirations as well as LIHTC Year-15 compliance milestones. Raw HUD ArcGIS layers store up to two assistance contracts per property (CONTRACT1 / CONTRACT2) with Oracle-style string dates (DD-MON-YY) and separate schemas for assisted multifamily properties vs. LIHTC tax-credit projects.

This Actor:

  • Queries HUD's official MULTIFAMILY_PROPERTIES_ASSISTED and LIHTC ArcGIS FeatureServer layers with automatic pagination (resultOffset / resultRecordCount=1000) and service-directory discovery fallback if layer paths change.
  • Expands CONTRACT1 and CONTRACT2 on each multifamily property into individual expiring-contract rows when contractExpirationDate falls within your expiringWithinMonths window, calculating monthsUntilExpiration.
  • Supports LIHTC_YEAR15 (filtering YR_PIS to your target Year-15 placed-in-service cohort, such as [2011, 2012]) and LIHTC_ALL modes.
  • Keeps individual person contact fields (MGMT_CONTACT_FULL_NAME and LIHTC CONTACT/CO_TEL) turned off by default (includeContacts: false), while always including business-level data (managementAgent organization name and onSitePhone).

Who it's for

  • Affordable housing acquisition & preservation teams identifying Section 8 properties with contracts expiring in the next 12–36 months or LIHTC properties entering their Year-15 disposition/recapitalization window.
  • Multifamily debt & FHA/agency lenders screening properties by unit count, REAC inspection score, and rent-to-FMR ratio.
  • Property management companies & housing compliance consultants benchmarking management portfolios across states.
  • Housing policy researchers & municipal planners monitoring expiring affordable housing stock by state and city.

Input

All filters have sensible defaults that return expiring Section 8 / PRAC contracts in Arizona (["AZ"]) within 24 months in a few seconds.

  • dataset (string enum): "SECTION8_CONTRACTS" (default), "LIHTC_YEAR15", or "LIHTC_ALL".
  • states (array of strings): Two-letter US state or territory postal codes (e.g. ["AZ"] or ["AZ", "NV", "CO"]). Default: ["AZ"].
  • expiringWithinMonths (integer): (SECTION8_CONTRACTS only) Keep contracts expiring between today and this many months into the future. Default: 24.
  • lihtcPlacedInServiceYears (array of integers): (LIHTC_YEAR15 only) 4-digit placed-in-service years (YR_PIS) to filter. Default: the current Year-15 cohort (current year minus 15 and minus 14), computed at run time when empty.
  • minUnits (integer): Minimum total housing units at the property. Default: 0.
  • includeContacts (boolean): Include named individual contact fields (contactName, contactPhone, contactEmail). Defaults to false for privacy compliance.
  • maxItems (integer): Maximum rows to return. Default: 200.

Example input JSON

{
"dataset": "SECTION8_CONTRACTS",
"states": ["AZ"],
"expiringWithinMonths": 24,
"lihtcPlacedInServiceYears": [2011, 2012],
"minUnits": 0,
"includeContacts": false,
"maxItems": 200
}

Example run options (default max charge $50)

When starting a run via the Apify API or Console, set a default maximum charge of $50 ("maxTotalChargeUsd": 50) in your run options:

{
"maxTotalChargeUsd": 50
}

Output

  • Sorting:
    • For SECTION8_CONTRACTS, results are sorted by contractExpirationDate ascending (soonest-expiring contracts first) so the most urgent contract renewals and preservation opportunities are never cut off by maxItems.
    • For LIHTC_YEAR15 and LIHTC_ALL, results are sorted by yearPlacedInService descending (newest placed-in-service projects first).
  • Deduplication: propertyId + contractNumber for SECTION8_CONTRACTS; hudId for LIHTC_YEAR15 and LIHTC_ALL.

Output fields (SECTION8_CONTRACTS)

FieldTypeDescription
propertyIdstringHUD Multifamily Property ID (PROPERTY_ID).
propertyNamestring | nullProperty name (PROPERTY_NAME_TEXT).
streetstring | nullStandardized street address.
citystring | nullProperty city.
statestring | nullTwo-letter state code.
zipstring | null5-digit ZIP code.
totalUnitsinteger | nullTotal units at the property.
assistedUnitsinteger | nullHUD-assisted units at the property.
contractNumberstringSection 8 / PRAC contract number (CONTRACT1 or CONTRACT2).
programTypestring | nullHUD assistance program type (e.g. "202/8 NC", "PRAC/202", "LMSA").
contractExpirationDatestringContract expiration date (YYYY-MM-DD).
monthsUntilExpirationnumberMonths remaining from today until contractExpirationDate.
rentToFmrRationumber | nullContract rent-to-Fair Market Rent (FMR) percentage.
reacScorestring | nullMost recent HUD REAC physical inspection score.
troubledCodestring | nullHUD troubled status indicator ("Y", "N", "P").
managementAgentstring | nullManagement agent organization name (MGMT_AGENT_ORG_NAME).
onSitePhonestring | nullOn-site property phone number (PROPERTY_ON_SITE_PHONE_NUMBER).
latitudenumber | nullProperty latitude.
longitudenumber | nullProperty longitude.
datasetstring"SECTION8_CONTRACTS".
contactNamestring | nullManagement contact person name (only when includeContacts: true).
contactPhonestring | nullManagement contact phone (only when includeContacts: true).
contactEmailstring | nullManagement contact email (only when includeContacts: true).

Output fields (LIHTC_YEAR15 / LIHTC_ALL)

FieldTypeDescription
hudIdstringHUD LIHTC Project ID (HUD_ID).
projectNamestring | nullLIHTC project name (PROJECT).
streetstring | nullStreet address.
citystring | nullCity.
statestring | nullState code.
zipstring | nullZIP code.
companystring | nullSponsor / contact company (COMPANY).
totalUnitsinteger | nullTotal project units (N_UNITS).
lowIncomeUnitsinteger | nullLow-income units (LI_UNITS).
yearPlacedInServiceinteger | null4-digit year placed in service (YR_PIS).
yearAllocatedinteger | null4-digit year tax credits were allocated (YR_ALLOC).
creditTypestring | nullTax credit type description (CREDIT).
nonProfitSponsorboolean | nullWhether the project has a non-profit sponsor (NON_PROF).
latitudenumber | nullLatitude.
longitudenumber | nullLongitude.
datasetstring"LIHTC_YEAR15" or "LIHTC_ALL".
contactNamestring | nullSponsor contact person name (only when includeContacts: true).
contactPhonestring | nullSponsor contact phone (only when includeContacts: true).

Sample output row (synthetic example)

{
"propertyId": "800999001",
"propertyName": "Example Desert Palms Senior Apartments",
"street": "450 E Camelback Rd",
"city": "Phoenix",
"state": "AZ",
"zip": "85012",
"totalUnits": 80,
"assistedUnits": 78,
"contractNumber": "AZ99T801001",
"programType": "202/8 NC",
"contractExpirationDate": "2027-04-30",
"monthsUntilExpiration": 5.9,
"rentToFmrRatio": 91.5,
"reacScore": "92",
"troubledCode": "N",
"managementAgent": "EXAMPLE SOUTHWEST HOUSING MANAGEMENT LLC",
"onSitePhone": "602-000-0100",
"latitude": 33.5092,
"longitude": -112.0685,
"dataset": "SECTION8_CONTRACTS"
}

How pricing works

Pay per result: $3 per 1,000 results ($0.003 per row). You only pay for rows returned. The Actor checks your run's maximum spending limit before every dataset push (recommended default: "maxTotalChargeUsd": 50) and stops cleanly if that limit is reached.

Compliance

When includeContacts is set to true, the Actor includes named management or sponsor contacts published in HUD's public datasets. By default, includeContacts is false.

  • All data is published by the U.S. Department of Housing and Urban Development (HUD) Open Data portal.
  • Buyers and users are responsible for complying with the Telephone Consumer Protection Act (TCPA), the National Do-Not-Call (DNC) Registry, the CAN-SPAM Act, and all applicable state privacy laws before any outreach.
  • Do not use this data for consumer or individual targeting.

Data source and terms

  • Official source: HUD Geospatial Storefront / ArcGIS Online Services (MULTIFAMILY_PROPERTIES_ASSISTED and LIHTC FeatureServer layers).
  • Update frequency: MULTIFAMILY_PROPERTIES_ASSISTED is updated regularly by HUD Office of Multifamily Housing; the LIHTC layer is an annual national database release (last data edition December 2024). The actor measures each layer's last source edit on every run: if the multifamily layer goes more than 120 days without an edit, or the LIHTC layer more than 800 days, the run ends PARTIAL and says the source data is stale, with the last edit date.
  • Disclaimer: This Actor is an independent tool and is not affiliated with or endorsed by the U.S. Department of Housing and Urban Development (HUD).

Troubleshooting

  • Run status messages: every run ends with Complete: or PARTIAL:. Complete: means all matched rows were emitted and the counts in the message (rows matched, records scanned) are exact. PARTIAL: names the concrete reason, for example rows skipped after failing validation, or the max charge limit being reached.
  • Zero matches: if the HUD source is healthy but nothing matches your filters, the run succeeds with Complete: 0 rows matched your filters and suggests which filters to widen. A failed run instead means the source itself errored or its fields changed.
  • Canary input: the smallest input that returns rows in under 30 seconds. Use it to check the Actor is healthy: {"dataset": "SECTION8_CONTRACTS", "states": ["AZ"], "expiringWithinMonths": 24, "maxItems": 5}.
  • Found a problem or need a field? Open an issue on the Issues tab; we respond quickly.

Limits and FAQ

  • Does HUD publish owner entity names or management emails in the LIHTC layer? No. The MULTIFAMILY_PROPERTIES_ASSISTED layer provides the management agent organization (MGMT_AGENT_ORG_NAME) and optional management contact details, while the LIHTC layer provides COMPANY and optional CONTACT/CO_TEL. Owner LLC names are not present in these layers and are never invented.
  • Why can the same propertyId appear twice in SECTION8_CONTRACTS? A single multifamily property can have two separate HUD assistance contracts (CONTRACT1 and CONTRACT2). If both contracts expire within your expiringWithinMonths window, one row is emitted per contract (propertyId + contractNumber).

Changelog

  • v0.1.3 (2026-11-01): Fix round: unparseable expiration dates are now counted, feed the 20 percent fail rule, appear in the PARTIAL reason with a sample, and trigger a first-page value sentinel that fails loudly when no expiration date parses; LIHTC Year-15 default is computed from the current year; retries are 6 tries with jittered backoff 2 to 32 s capped at 120 s; 2-digit years are interpreted as 20YY; service-directory fallback requires an exact name match; title gains Scraper; pricing states the per-1K figure.
  • v0.1.2 (2026-10-31): Red Team fix round: per-layer freshness measurement (a stale HUD layer now ends the run PARTIAL with the last source edit date instead of reporting Complete forever); zero-scanned runs reconciled against the layer's total record count so an empty or broken source cannot masquerade as a zero match; server-side paging order with unique tiebreaks plus count reconciliation during the scan; core-column sentinel extended to headline fields (assisted units, rent-to-FMR ratios, management agent, LIHTC units and credit type); expiration windows use the US Eastern date so same-day expirations are not dropped early; includeContacts parsed strictly (a string "false" can never enable contacts); retries honor Retry-After; matched counts distinguish pre-dedupe matches from unique emitted rows; default memory set to 512 MB based on observed runs.
  • v0.1.1 (2026-10-31): Honest status contract (Complete: / PARTIAL: with matched and scanned counts), zero matches now succeed as Complete: 0, core-column sentinel and per-row validation added, store category corrected to Business only, default run options (maxTotalChargeUsd: 50) declared.
  • v0.1 (2026-10-31): Initial release supporting SECTION8_CONTRACTS, LIHTC_YEAR15, and LIHTC_ALL modes across HUD ArcGIS FeatureServer layers.