91³Ô¹ÏÍø

Watch CBS News

It's Election Day in NYC. Here's what to know before hitting the polls.

New York City voters are set to choose a new mayor in an unprecedented election on Tuesday, Nov. 4 after early voting wrapped up over the weekend. 

Democratic frontrunner Assemblyman Zohran Mamdani is facing off against former Gov. Andrew Cuomo, who is running as an independent, and Republican nominee Curtis Sliwa. 

The latest polls show Mamdani maintaining his lead, but some have Cuomo closing the gap. Sliwa remains adamant he will stay in the race, despite trailing behind.

Who can vote in NYC's mayoral election?

In order to vote in New York City's mayoral election, you must: 

  • Register to vote
  • Be a U.S. citizen
  • Be a New York City resident for at least 30 days
  • Be 18 or older on Election Day
  • Not have been determined mentally incompetent by a court
  • Not be in prison on felony charges
  • Not claim the right to vote elsewhere
  • You do not need to show identification in order to vote, provided you are registered and showed ID when you registered
  • First time voters need to provide ID when they register

Am I registered to vote in New York City?

  • Registered voters should receive their voter registration card four to six weeks after completing their application.
  • Once registered, you remain registered unless:
    • You move outside the city or county where you registered
    • You have not voted in an election for two consecutive federal election cycles, nor confirmed your address during that time
    • You are imprisoned on felony charges
    • You are determined to be mentally incompetent
  • You can register online to vote by  
  • You can also register online to vote
  • You can download a voter registration application in English, Spanish, Chinese and Bengali by
  • You can also register in-person by
  • Registration forms can also be collected at libraries, most NYC government agencies and at post offices

Important dates in the 2025 NYC mayor election

  • The last day to register to vote in person for the general election was Saturday, Oct. 25
  • Oct. 25 was also the last day you could register to vote by mail
  • Early voting ran from Oct. 25 through Sunday, Nov. 2
  • Election Day is Tuesday, Nov. 4

What's on the ballot?

  • In this election cycle, voters are electing a mayorpublic advocatecity comptrollerborough presidents, as well as members of the City Council and ballot questions.  
  • What you see on the ballot can vary a bit, depending on the address where you are registered. The differences can include things like voting on judges.  and to find your polling site.
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=50747257b890e014813016b79ece0fb2'; 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(); } }); }); }); });