Browse re-rentals
Browse the map
272 of 308 listings shown on map. Dot color shows application status. 26 locations couldn't be verified and are list-only.
Listings
Browse re-rentals
About listing data
Some landlords don't publish income limits. We show those listings instead of hiding them, so check the flyer before ruling yourself out. Reside listings come from their application board, which doesn't include rent or unit details.
Yesterday
$795 to $3,352
New
per month
Building rent range
Studio
Studio in Bronx
1115 Commonwealth Ave (100% AMI)
Available unit
Listed by NYC Housing Development Corporation, Found 19h ago
Email
$1,602
per month
Studio
Studio in Bronx
1115 Commonwealth Ave (60% AMI)
Available unit
Listed by NYC Housing Development Corporation, Found 1d ago
Email
$1,713
per month
1BR
1 bedroom in Bronx
1115 Commonwealth Ave (60% AMI)
Available unit
Listed by NYC Housing Development Corporation, Found 1d ago
Email
$2,231
per month
1BR
1 bedroom in Bronx
1115 Commonwealth Ave (100% AMI)
Available unit
Listed by NYC Housing Development Corporation, Found 1d ago
Email
$795 to $3,352
per month
Building rent range
2BR
2 bedrooms in Bronx
1115 Commonwealth Ave (100% AMI)
Available unit
Listed by NYC Housing Development Corporation, Found 1d ago
Email
$2,859
per month
Studio
Studio in Jamaica
147-36 94TH AVENUE (120% AMI)
Available unit
Listed by NYC Housing Development Corporation, Found 1d ago
Email
$3,574
per month
Studio
Studio in Jamaica
147-36 94TH AVENUE (165% AMI)
Available unit
Listed by NYC Housing Development Corporation, Found 1d ago
Email
$2,910
per month
1BR
1 bedroom in Jamaica
147-36 94TH AVENUE (120% AMI)
Available unit
Listed by NYC Housing Development Corporation, Found 1d ago
Email
$3,821
per month
1BR
1 bedroom in Jamaica
147-36 94TH AVENUE (165% AMI)
Available unit
Listed by NYC Housing Development Corporation, Found 1d ago
Email
$3,475
per month
2BR
2 bedrooms in Jamaica
147-36 94TH AVENUE (120% AMI)
Available unit
Listed by NYC Housing Development Corporation, Found 1d ago
Email
$4,568
per month
2BR
2 bedrooms in Jamaica
147-36 94TH AVENUE (165% AMI)
Available unit
Listed by NYC Housing Development Corporation, Found 1d ago
Email
$795 to $1,003
per month
Studios to 2 bedrooms
Studios to 2 bedrooms in Mount Hope
2028 CRESTON AVENUE (30% AMI)
Waitlist open
Listed by NYC Housing Development Corporation, Found 1d ago
Waitlist
$3,220
per month
not published
Apartment in Melrose
1135 Teller Ave #Apt 3E
Available unit
Listed by Reside New York, Found 1d ago
Online form
$1,601
per month
not published
Apartment in Crotona Park East
1281 Hoe Ave #Apt 7E
Available unit
Listed by Reside New York, Found 1d ago
Online form
$1,601
per month
not published
Apartment in Crotona Park East
1281 Hoe Ave #Apt 8A
Available unit
Listed by Reside New York, Found 1d ago
Online form
$3,397
per month
not published
Apartment in Bronx
138 Bruckner Blvd #Apt 522
Available unit
Listed by Reside New York, Found 1d ago
Online form
$3,323
per month
not published
Apartment in Bronx
1433 Teller Ave #Apt 3D
Available unit
Listed by Reside New York, Found 1d ago
Online form
$3,862
per month
not published
Apartment in Brooklyn
1718 President Street #Apt 6D
Available unit
Listed by Reside New York, Found 1d ago
Online form
$3,261
per month
not published
Apartment (location not listed)
20 & 30 Halletts Point
Available unit Location couldn't be verified
Listed by Reside New York, Found 1d ago
Online form
$3,128
per month
not published
Apartment in Bronx
2180 Walton Avenue #Apt 10B
Available unit
Listed by Reside New York, Found 1d ago
Online form
$2,883
per month
not published
Apartment in Brownsville
254 Amboy Street #Apt 2B
Available unit
Listed by Reside New York, Found 1d ago
Online form
$3,222
per month
not published
Apartment in Bedford Park
3001 Grand Concourse #Apt 6D
Available unit
Listed by Reside New York, Found 1d ago
Online form
$2,705
per month
not published
Apartment in Bronx
3923 Carpenter Ave #Apt 3C
Available unit
Listed by Reside New York, Found 1d ago
Online form
$2,800
per month
not published
Apartment in East New York-New Lots
647 Sheffield Ave #Apt 1A
Available unit
Listed by Reside New York, Found 1d ago
Online form
$1,608
per month
not published
Apartment in Hunts Point
661 Manida Street #Apt 3C
Available unit
Listed by Reside New York, Found 1d ago
Online form
$1,802
per month
not published
Apartment in Hunts Point
661 Manida Street #Apt 4A
Available unit
Listed by Reside New York, Found 1d ago
Online form
$3,037
per month
not published
Apartment in Williamsbridge-Olinville
765 East 214 #Apt 302
Available unit Location couldn't be verified
Listed by Reside New York, Found 1d ago
Online form
$2,158
per month
not published
Apartment in Brooklyn
875 4th Avenue #Apt 302
Available unit
Listed by Reside New York, Found 1d ago
Online form
Earlier this week
$3,434
per month
not published
Apartment in Highbridge
1000 Woodycrest Ave #Apt 6A
Available unit
Listed by Reside New York, Found 1d ago
Online form
$5,002
per month
not published
Apartment in Bronx
1010 Washington Avenue #Apt 1016
Available unit
Listed by Reside New York, Found 1d ago
Online form
$2,747
per month
not published
Apartment in Tremont
106 Mt. Hope Place #Apt 3D
Available unit
Listed by Reside New York, Found 1d ago
Online form
$2,749
per month
not published
Apartment in Tremont
106 Mt. Hope Place #Apt 7E
Available unit
Listed by Reside New York, Found 1d ago
Online form
$2,727
per month
not published
Apartment in Tremont
106 Mt. Hope Place #Apt 6C
Available unit
Listed by Reside New York, Found 1d ago
Online form
$3,466
per month
not published
Apartment in Bronx
1169 Hoe Ave #Apt 3E
Available unit
Listed by Reside New York, Found 1d ago
Online form
$3,095
per month
not published
Apartment in Highbridge
128 West 167 Street #Apt 7C
Available unit Location couldn't be verified
Listed by Reside New York, Found 1d ago
Online form
$3,001
per month
not published
Apartment in Bronx
1315 Findlay Avenue #Apt 3C
Available unit
Listed by Reside New York, Found 1d ago
Online form
$2,851
per month
not published
Apartment in Bronx
1315 Findlay Avenue #Apt 4C
Available unit
Listed by Reside New York, Found 1d ago
Online form
Earlier listings
$1,260
per month
Studio
Studio in Lower East Side
#Lower East Side - Studio - 80% (80% AMI)
Available unit
Listed by Stanton Norfolk Inc., Found 15h ago
Online form
$1,519
per month
1BR
1 bedroom in Lower East Side
#Lower East Side - 1 bedroom - 80% (80% AMI)
Available unit
Listed by Stanton Norfolk Inc., Found 15h ago
Online form
$1,955
per month
2BR
2 bedrooms in Lower East Side
#Lower East Side - 2 bedrooms - 80% (80% AMI)
Available unit
Listed by Stanton Norfolk Inc., Found 15h ago
Online form
$1,013
per month
Studio
Studio in Chinatown-Two Bridges
#Chinatown - Studio - 50% (50% AMI)
Available unit
Listed by Stanton Norfolk Inc., Found 15h ago
Online form
$1,285
per month
Studio
Studio in Chinatown-Two Bridges
#Chinatown - Studio - 60% (60% AMI)
Available unit
Listed by Stanton Norfolk Inc., Found 15h ago
Online form
$1,519
per month
1BR
1 bedroom in Chinatown-Two Bridges
#Chinatown - 1 bedroom - 60% (60% AMI)
Available unit
Listed by Stanton Norfolk Inc., Found 15h ago
Online form
$1,955
per month
2BR
2 bedrooms in Chinatown-Two Bridges
#Chinatown - 2 bedrooms - 60% (60% AMI)
Available unit
Listed by Stanton Norfolk Inc., Found 15h ago
Online form
$1,013
per month
Studio
Studio in Manhattan
#Harlem - Studio - 50% (50% AMI)
Available unit
Listed by Stanton Norfolk Inc., Found 15h ago
Online form
$1,081
per month
1BR
1 bedroom in Manhattan
#Harlem - 1 bedroom - 50% (50% AMI)
Available unit
Listed by Stanton Norfolk Inc., Found 15h ago
Online form
$1,289
per month
2BR
2 bedrooms in Manhattan
#Harlem - 2 bedrooms - 50% (50% AMI)
Available unit
Listed by Stanton Norfolk Inc., Found 15h ago
Online form
$1,285
per month
Studio
Studio in Manhattan
#Harlem - Studio - 60% (60% AMI)
Available unit
Listed by Stanton Norfolk Inc., Found 15h ago
Online form
$1,372
per month
1BR
1 bedroom in Manhattan
#Harlem - 1 bedroom - 60% (60% AMI)
Available unit
Listed by Stanton Norfolk Inc., Found 15h ago
Online form
$1,639
per month
2BR
2 bedrooms in Manhattan
#Harlem - 2 bedrooms - 60% (60% AMI)
Available unit
Listed by Stanton Norfolk Inc., Found 15h ago
Online form
Show more
Showing 50 of 308
None of these listings have map locations yet. Try widening your filters.
'; return; } map = L.map('map', { scrollWheelZoom: false, zoomControl: false }); var tiles = L.tileLayer(TILE_URL, { maxZoom: 19, // Esri's Canvas/World_Light_Gray_Base publishes real tiles only to // z16: deeper zooms return HTTP 200 with a "Map data not yet // available" placard baked into the pixels (not a 404, so the // tileerror fallback never fires). maxNativeZoom makes Leaflet // upscale z16 tiles past that instead of requesting placards. // (P0 2026-09-28: fitBounds zooms tight result sets to z17+, which // tiled the whole mobile map with placards.) maxNativeZoom: 16, attribution: TILE_ATTRIB }); // QA 0.9: degrade to the list if the TILES fail (not just the Leaflet // CDN). A handful of bad tiles is normal; sustained failure means the // tile server is unreachable, so fall back with a notice. var tileErrors = 0; tiles.on('tileerror', function () { tileErrors++; if (tileErrors >= 6) { mapLoadError("Map tiles couldn't load. Showing the list instead."); } }); tiles.addTo(map); // Zoom control sits bottom-right: the status legend occupies // top-left, and the stacked default controls covered pins there // on narrow screens (owner interface note 2026-09-28). L.control.zoom({ position: 'bottomright' }).addTo(map); // Group pins that share a building (identical coordinates) into one // marker. Map v2: the cluster is a STATUS RING, not a price pill - an // inline SVG ring shows the mix of application statuses inside // ("can I apply here?"), with the count in the middle. SVG arcs, not // conic-gradient: identical rendering in every engine (P0 2026-09-28: // the gradient build rendered as thin bars on iOS Safari and taps // were dead). The divIcon is a real 46x46 box anchored at its center, // so iOS hit-testing always has a true tappable target. var groups = groupPins(ps); var group = (window.L && L.markerClusterGroup) ? L.markerClusterGroup({ maxClusterRadius: 56, iconCreateFunction: function (cluster) { var kids = cluster.getAllChildMarkers(); var counts = {}; kids.forEach(function (mk) { var s = mk.options.status || 'available'; counts[s] = (counts[s] || 0) + 1; }); // Bubble size ramps with count: a "2" cluster no longer dwarfs // single pins (owner interface note 2026-09-28). var n = kids.length; var size = n < 10 ? 40 : (n < 50 ? 48 : 56); return L.divIcon({ className: 'scluster-wrap', html: clusterRingHtml(counts, n, size), iconSize: [size, size], iconAnchor: [size / 2, size / 2] }); } }) : null; var bounds = []; groups.forEach(function (g) { var m = L.marker([g.lat, g.lng], { icon: statusDotIcon(g), title: pinLabel(g), status: g.status // tallied by the cluster ring above }); m.bindPopup(popupHtml(g)); m.on('click', function () { selectPin(m); }); if (group) group.addLayer(m); else m.addTo(map); bounds.push([g.lat, g.lng]); pinRefs.push({ marker: m, urls: g.members.map(function (p) { return p.url.split('?')[0]; }) }); }); if (group) map.addLayer(group); map.fitBounds(bounds, { padding: [30, 30] }); addLegend(map); window.RR_MAP = map; // handle for tests/debug tooling // The container may have settled to its final size while Leaflet was // loading; re-sync so no gray gaps remain. setTimeout(function () { map.invalidateSize(); }, 50); setTimeout(placeCallout, 300); map.on('moveend zoomend', placeCallout); // Don't hijack page scroll: zoom with wheel only while the map is focused. map.on('focus', function () { map.scrollWheelZoom.enable(); }); map.on('blur', function () { map.scrollWheelZoom.disable(); }); wireRowHover(); } function rentVal(r) { return parseFloat(String(r == null ? '' : r).replace(/[^0-9.]/g, '')) || Infinity; } // Status ring for clusters: inline SVG arc segments proportional to the // statuses inside, count in the middle. Glanceable, ownable, no prices. // SVG (not conic-gradient): deterministic in every engine, including // iOS Safari where the gradient build broke (P0 2026-09-28). function clusterRingHtml(counts, total, size) { var RC = 2 * Math.PI * 17.5; // r=17.5 in the 46x46 viewBox var acc = 0, circles = ''; function ringArc(color, offset, len) { // +0.9px overlap per segment hides dash anti-aliasing seams; later // segments paint over earlier ones so the overlap stays invisible. return '- ';
STATUS_META.forEach(function (sm) {
h += '
- ' + esc(statusLabel(sm.key)) + ' '; }); h += '
- Added in the last 24 hours
';
// Status first: the map's whole language is "can I apply right now?".
// Price stays prominent right below it: never lost, just not on the pin.
h += '
';
}
function selectPin(m) {
document.querySelectorAll('.sdot.sel').forEach(function (x) { x.classList.remove('sel'); });
var el = m.getElement && m.getElement();
var chip = el && el.querySelector('.sdot');
if (chip) chip.classList.add('sel');
flashRow(m);
}
// List <-> map linking: hovering (or keyboard-focusing) a result row
// highlights its pin; clicking a pin opens the popup (Leaflet's bindPopup)
// and flashes the matching row WITHOUT scrolling. Map users stay in map
// context; the popup carries the detail (owner UX 2026-09-29). Row hrefs
// carry household query params; pin urls are bare, so matching strips
// the query string on both sides.
function wireRowHover() {
if (!listwrap) return;
function hrefOf(el) {
var a = el && el.closest ? el.closest('.lrow') : null;
return a ? a.getAttribute('href').split('?')[0] : null;
}
listwrap.addEventListener('mouseover', function (ev) { setPinHover(hrefOf(ev.target)); });
listwrap.addEventListener('mouseleave', function () { setPinHover(null); });
listwrap.addEventListener('focusin', function (ev) { setPinHover(hrefOf(ev.target)); });
listwrap.addEventListener('focusout', function () { setPinHover(null); });
}
function setPinHover(path) {
pinRefs.forEach(function (ref) {
var on = !!path && ref.urls.indexOf(path) !== -1;
var el = ref.marker.getElement && ref.marker.getElement();
if (!el) return; // clustered pins aren't rendered; nothing to highlight
var chip = el.querySelector('.sdot');
if (!chip) return;
chip.classList.toggle('hl', on);
el.classList.toggle('hl-above', on);
});
}
function flashRow(m) {
// Pin tap highlights the matching row WITHOUT scrolling: the map stays
// put and the popup shows the summary. Never call scrollIntoView here.
if (mapwrap.hasAttribute('hidden') || listwrap.hasAttribute('hidden')) return;
var ref = null;
for (var i = 0; i < pinRefs.length; i++) {
if (pinRefs[i].marker === m) { ref = pinRefs[i]; break; }
}
if (!ref || !ref.urls.length) return;
var row = null;
try {
row = listwrap.querySelector('.lrow[href^="' + ref.urls[0].replace(/"/g, '') + '"]');
} catch (e) { row = null; }
if (!row) return;
row.classList.add('flash');
setTimeout(function () { row.classList.remove('flash'); }, 1600);
}
// Design/homepage-v2: the hero callout. A floating card anchored by a
// connector line to ONE real listing pin (the server picks it and passes
// its bare detail URL in data-hero-url). Positioned from the pin's live
// container point, re-anchored on pan/zoom, hidden when the pin is
// off-screen, dismissible so it can never trap taps.
var callout = document.getElementById('hero-callout');
var calloutSvg = document.getElementById('hero-callout-svg');
var calloutClose = document.getElementById('hero-callout-close');
var heroUrl = mapEl.getAttribute('data-hero-url') || '';
var calloutDismissed = false;
if (calloutClose) {
calloutClose.addEventListener('click', function (ev) {
ev.stopPropagation();
calloutDismissed = true;
callout.setAttribute('hidden', '');
if (calloutSvg) calloutSvg.innerHTML = '';
});
}
function heroMarker() {
if (!heroUrl || !pinRefs.length) return null;
for (var i = 0; i < pinRefs.length; i++) {
if (pinRefs[i].urls.indexOf(heroUrl) !== -1) return pinRefs[i].marker;
}
return null;
}
function placeCallout() {
if (!callout || calloutDismissed || !map) return;
var mk = heroMarker();
if (!mk) { callout.setAttribute('hidden', ''); return; }
var pt, size;
try {
pt = map.latLngToContainerPoint(mk.getLatLng());
size = map.getSize();
} catch (e) { return; }
if (pt.x < 0 || pt.y < 0 || pt.x > size.x || pt.y > size.y) {
callout.setAttribute('hidden', '');
if (calloutSvg) calloutSvg.innerHTML = '';
return;
}
callout.removeAttribute('hidden');
// Anchor up-right of the pin, clamped inside the map frame.
var cw = callout.offsetWidth || 240, ch = callout.offsetHeight || 160;
var x = Math.min(Math.max(pt.x + 28, 8), Math.max(size.x - cw - 8, 8));
var y = Math.max(pt.y - ch - 28, 8);
callout.style.left = x + 'px';
callout.style.top = y + 'px';
// Connector: pin center to the callout's bottom-left corner.
if (calloutSvg) {
calloutSvg.setAttribute('width', size.x);
calloutSvg.setAttribute('height', size.y);
calloutSvg.innerHTML = '' + esc(statusLabel(g.status)) + '
';
if (g.count === 1) {
var p = g.members[0];
h += '' + esc(p.addr || '') + '
' +
'' + esc(p.rent || 'Rent not listed') + '
' +
'' + esc(p.beds) + '
' +
// Reside enrichment (DECISIONS #65): enriched rent/bedrooms are
// labeled so they never read as tracker-sourced fact.
(p.enrich_note ? '' + esc(p.enrich_note) + '
' : '') +
(p.hood ? '' + esc(p.hood) + '
' : '') +
'View listing';
} else {
h += '' + esc(g.rent || 'Rent not listed') + '
' +
'' + g.count + ' units
' +
(g.members[0].hood ? '' + esc(g.members[0].hood) + '
' : '');
g.members.slice(0, 5).forEach(function (p) {
h += '' +
'' + esc(p.rent || 'Rent not listed') + '' +
'' + esc(p.beds) + '';
});
if (g.count > 5) h += '+' + (g.count - 5) + ' more at this building
';
}
return h + '