91³Ô¹ÏÍø

Watch CBS News

FTC warns Apple's Tim Cook over alleged political bias in its Apple News app

The Federal Trade Commission on Thursday sent a  to Apple CEO Tim Cook about Apple News, pointing to reports claiming the news aggregator "systematically boosts left-wing sources and suppresses right-wing sources."

FTC Chairman Andrew Ferguson alerted the tech giant's chief executive that, if the allegations are true, the company could be violating the FTC Act, a law that prohibits unfair or deceptive acts or practices. The Apple News app aggregates news stories from a range of digital publications to curate content tailored to consumers' preferences.  

Ferguson, who cited research from the Media Research Center, a right-leaning watchdog group, said that tech companies that feature news articles based on a publication's "perceived ideological or political viewpoint" may violate the law. The FTC chief asked Apple to review its article curation and "take corrective action swiftly" if it is excluding conservative news sources.

Policies that exclude some news sources "stifle the free exchange of ideas, manipulate the public discourse and are inconsistent with American values," Ferguson wrote.

Apple did not immediately respond to CBS News' request for comment.

The FTC cited a report from the Media Research Center that analyzed more than 600 stories featured by Apple News in users' feeds from Jan. 1 to Jan. 31. The analysis found that more than 400 of the stories Apple News featured came from outlets perceived to be left-leaning, and that news sources perceived to be right-leaning did not appear in users' digital news feeds.

The Media Research Center says it relies on , a company that rates the perceived political bias of online publications, for determining a news source's perspective.

Ferguson also argued that Apple may be violating its own terms and conditions of service if it doesn't disclose to consumers practices that could "cause substantial injury that is neither reasonably avoidable nor outweighed by countervailing benefits to consumers or competition."

Nevertheless, the FTC chief noted that the agency "is not the speech police."

"[W]e do not have authority to require Apple or any other firm to take affirmative positions on any political issue, nor to curate news offerings consistent with one ideology or another," Ferguson added.

But, he noted, the agency has a mandate from Congress to ensure that consumers are protected from "material misrepresentations and omissions, including when the product or service offered to consumers is a speech-related product."

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