91³Ô¹ÏÍø

Watch CBS News

San Francisco Mission District community leader Jonathan Jacobo arrested on suspicion of rape

Police in San Francisco on Monday afternoon arrested a well-known Mission District community leader who faces multiple sexual assault charges after being accused in a rape case that happened several years ago.

According to a press release issued by the San Francisco Police Department, officers arrested 35-year-old sexual assault suspect Jonathan Jacobo at around 2 p.m. He surrendered to SFPD's Special Victims Unit (SVU) and was booked into San Francisco County Jail on a San Francisco District Attorney's arrest warrant.

Jacobo was charged with rape by force, oral copulation by force, sexual battery by restraint and domestic violence, according to the San Francisco District Attorney's Office. 

Court documents indicate the victim in the case met Jacobo in 2019 when they were both working in the field of affordable housing. A friendship developed that later turned into a more intimate relationship. According to court documents, the victim ended the intimate relationship in February of 2021 and made it clear to Jacobo that she was only interested in a platonic friendship. 

Prosecutors allege that Jacobo sexually assaulted the victim two months later on April 3 and 4 after she had explicitly communicated to him that she did not want any sexual contact, which he stated he understood. Jacobo allegedly assaulted the victim in his home.

According to , Jacobo worked as the director for the housing nonprofit Tenants and Owners Development Corporation (TODCO). Jacobo resigned his executive position at the nonprofit affordable housing developer TODCO in April.

CBS News Bay Area also interviewed Jacobo more than once regarding his work with Mission District Vendors Association. 

, Jacobo has been accused of rape by multiple women.  

"I would like to thank the survivor for her courage to come forward and cooperation with law enforcement's investigation," said SF District Attorney Brooke Jenkins in a statement.

"The SFPD will do everything in our power to bring justice in this case," said Police Chief Bill Scott. "Our Special Victims Unit has been working tirelessly on this investigation. We urge anyone who is a victim of sexual assault to come forward and report your case to the SFPD."

Although charges have been filed, police said the case remains under active investigation, police said. Anyone with information is asked to call the San Francisco Police Department Tip Line at 1-415-575-4444 or Text a Tip to TIP411 and begin the text message with SFPD. Tipsters may remain anonymous   

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