91³Ô¹ÏÍø

Watch CBS News

NYC faces largest budget gap since Great Recession, comptroller says. City facing "some tough decisions."

New York City is facing a massive budget gap in the immediate future, Comptroller Mark Levine said Friday. 

Levine said the city faces a budget shortfall of $2.2 billion this fiscal year, and $10.4 billion in the 2027 fiscal year. 

The comptroller said the city hasn't faced such a large budget shortfall since the Great Recession in 2008. 

Levine said the city faces "some tough decisions about revenue and expenses." 

"We are not going to sugarcoat this" 

"We're not going to sugarcoat this. This is a challenging budget outlook," Levine said. "This does not mean we still cannot act boldly. And it might mean that our biggest plans need to be phased in over multiple years." 

The comptroller claimed the Adams administration's spending led to the high budget projections for the next two years, and failed to account for recurring expenses. 

"We're also calling out the cause of this gap which was the budget practices of the previous administration, over-reliance on one-shot financial measures, such as drawing down on prepaid expenses, and especially by underaccounting for expenses that we know the city will occur, such as overtime pay, such as shelter costs," Levine said. 

The comptroller said, however, that there's a way to close the gap. 

"If we can grow our economy, then we avoid the difficult trade-offs," he said. 

"We are raising the alarm now"

All of this means Mayor Zohran Mamdani will be facing a grim reality of a budget gap as he prepares his first budget. 

"We are raising the alarm now about the scale of these gaps - $12 billion in the current year and next year combined," Levine said. 

Mamdani blamed it on his predecessor, too. 

"We have long said that what we are inheriting not just an administration, in the prior one, that exhibited incredible fiscal mismanagement, but also a decades-long effort from Gov. Cuomo to pilfer from city coffers at each and every turn," Mamdani said. 

But a spokesman for former Mayor Eric Adams denied the charges that he was fiscally irresponsible. 

"Blaming Mayor Adams for long-standing structural budget gaps and fiscal pressures ignores the reality of what this administration took on and what it has delivered. As has been widely acknowledged, New York City contributes more than 54 percent of the State's tax revenue while receiving just over 40 percent in return - a challenge that predates this administration and requires partnership, not political blame," spokesperson Todd Shapiro said. 

For more information on Levine's projections, , or .   

View CBS News In
CBS News App Open
Chrome Safari Continue
const link = doc.createElement('link'); link.rel = 'stylesheet'; link.href = '/fly/fly/bundles/cbsnewscontent/css/cmp-banner.min.css?v=296763317a51cab90faa73f1bb146d5c'; doc.head.appendChild(link); doc.body.innerHTML = CONSENT_MESSAGE; } else { el.insertAdjacentHTML('afterend', CONSENT_MESSAGE); } }); } function hidePrivacyMessage() { // Remove from the main document document.querySelectorAll(`.${CONSENT_MESSAGE_CLASS}`).forEach(el => el.remove()); // Remove from inside any iframes document.querySelectorAll('iframe').forEach(iframe => { const doc = iframe.contentDocument || iframe.contentWindow.document; doc.querySelectorAll(`.${CONSENT_MESSAGE_CLASS}`).forEach(el => el.remove()); }); } function activateGatedScripts() { // Handle both new format (cmp-gated-script) and old OneTrust/Ketch format (optanon-category-4) const gatedScripts = Array.from(document.querySelectorAll('script.cmp-gated-script, script.optanon-category-4')); // Activate scripts sequentially with a small delay to avoid timing issues let delay = 0; gatedScripts.forEach(function(placeholder, index) { setTimeout(function() { // Skip if already processed if (placeholder.hasAttribute('data-cmp-processed')) { return; } placeholder.setAttribute('data-cmp-processed', 'true'); const newScript = document.createElement('script'); newScript.type = 'text/javascript'; // Try new format first (data-cmp-src), then fall back to old format (data-src) const src = placeholder.getAttribute('data-cmp-src') || placeholder.getAttribute('data-src'); if (src) { newScript.src = src; } else if (placeholder.textContent) { // Inline script - just copy the content newScript.textContent = placeholder.textContent; } // Handle new format attributes (data-cmp-attrs) - for both inline and external scripts const attrs = placeholder.getAttribute('data-cmp-attrs'); if (attrs) { const tempDiv = document.createElement('div'); tempDiv.innerHTML = '
<\/div>'; const tempAttrs = tempDiv.firstChild.attributes; for (let i = 0; i < tempAttrs.length; i++) { // For external scripts, allow defer/async. For inline scripts, skip them (not valid) if (src || (tempAttrs[i].name !== 'async' && tempAttrs[i].name !== 'defer')) { newScript.setAttribute(tempAttrs[i].name, tempAttrs[i].value); } } } // Copy other attributes from old OneTrust format for (let i = 0; i < placeholder.attributes.length; i++) { const attr = placeholder.attributes[i]; // Skip attributes we've already handled or don't want to copy if (!['class', 'data-src', 'data-type', 'data-cmp-src', 'data-cmp-attrs', 'data-cmp-processed', 'type', 'async', 'defer', 'src'].includes(attr.name)) { newScript.setAttribute(attr.name, attr.value); } } placeholder.parentNode.replaceChild(newScript, placeholder); // If external script, manually trigger window.onload handlers after it loads // This handles widgets that use window.onload for initialization if (src) { newScript.addEventListener('load', function() { // If page already loaded and script set a new onload handler, trigger it if (document.readyState === 'complete' && window.onload) { const originalOnload = window.onload; window.onload = null; // Clear temporarily to prevent loops originalOnload(); // Execute the handler } }); } }, delay); delay += 500; // 500ms delay between each script to allow full loading }); } cbsoptanon.onScriptsReady(function(cmp) { cmp.ot.targetingAllowed(function(allowed) { if (!allowed) { showPrivacyMessage(); } else { activateGatedScripts(); } }); cmp.ot.awaitInitialConsent(function(consent_model) { cmp.ot.addOnConsentChangedHandler(function() { cmp.ot.targetingAllowed(function(allowed) { if (allowed) { hidePrivacyMessage(); activateGatedScripts(); } else { showPrivacyMessage(); } }); }); }); });