91³Ô¹ÏÍø

Watch CBS News

NYC Council holds hearing on NYPD, other agencies' compliance with sanctuary laws

The New York City Council held a hearing Thursday on sanctuary city laws, and how well agencies are complying.

It prompted a rally in the rain outside City Hall.

The goal of the hearing

The hearing followed a Department of Investigation review that found gaps and insufficient guidance in city agencies' compliance with sanctuary laws. The City Council Committee on Oversight and Investigations is specifically looking at the NYPD, the Department of Correction, and the Department of Probation.

"Today's oversight hearing will get to the heart of two critical questions. One, is New York City prepared on paper and in practice prepared to defend our laws against a lawless federal administration and, two, are our agencies [prepared] to protect, not just on paper but in practice, immigrant New Yorkers across our city?" said Councilmember Shekar Krishnan, the committee's chairperson.

Compliance with NYC's sanctuary laws

The city's sanctuary laws prohibit local agencies from using city resources to cooperate with federal immigration authorities, which includes prohibiting local law enforcement from holding detainees at the request of U.S. Immigration and Customs Enforcement, except when there are public safety concerns.

That compliance has come into question amid the Trump administration's immigration crackdown.

In one example, advocates allege the NYPD transferred the sealed arrest record of a woman who was detained at a protest to the Department of Homeland Security, claiming the information is being used to seek her deportation.

"DOI also found [the Department of Correction] was not training personnel how to engage immigration enforcement or officials," Department of Investigations Acting Commissioner Christopher Ryan said.

The DOI review was requested by the City Council last year under then-Mayor Eric Adams. Earlier this year, Mayor Zohran Mamdani issued an executive order requiring certain city agencies to conduct an internal audit around their sanctuary policies and practices.   

ICE protests in New York City

There have been several ICE protests in New York City over the last six months, including some involving complaints about the NYPD's actions.

In late November of last year, protesters took issue with police following a clash outside a parking garage in Lower Manhattan. They claimed they were attempting to block ICE agents from conducting a raid at nearby Canal Street, but said the NYPD eventually arrested multiple people at the scene.

"So while it is illegal, largely illegal, for city agencies to aid ICE, we are seeing week-after-week incidents that show that our city is violating its own laws and that is wrong," City Councilmember Shahana Hanif said at the time.

All that happened one day after police took several people into custody at the same site after what police sources called an unscheduled anti-ICE demonstration.

Protesters clashed with NYPD officers and what appeared to be DHS officers. Groups of people could be seen throwing debris at police and standing in front of their vehicles.

"There were protesters that had been pepper-sprayed, sprayed with something else that looked kind of like it was orange, and then there were protesters that had bloody faces," protester Amanda Holden said.

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(); } }); }); }); });