apache/superset · error · UpdateFailedError
Slack v1 file uploads are no longer supported because Slack
Error message
Slack v1 file uploads are no longer supported because Slack retired `files.upload`. Enable `ALERT_REPORT_SLACK_V2` and grant the Slack bot both the `channels:read` and `groups:read` scopes so the recipient can be upgraded to Slack v2. Slack v2 upgrade failed: {update_error} What it means
Raised by SlackUpgradeCommand when a report/alert with attachments could not be delivered because Slack retired the files.upload API (v1) and the automatic upgrade to Slack v2 also failed (update_error). It re-raises NotificationParamException or UpdateFailedError with a message explaining that ALERT_REPORT_SLACK_V2 must be enabled and the bot must hold channels:read and groups:read scopes.
Source
Thrown at superset/commands/report/slack_upgrade.py:169
for recipient, recipient_config_json in resolved:
recipient.type = ReportRecipientType.SLACKV2
recipient.recipient_config_json = recipient_config_json
def send_fallback(
self,
notification: SlackNotification,
content: NotificationContent,
update_error: NotificationParamException | UpdateFailedError,
) -> None:
"""Deliver text through Slack v1 and record the first successful fallback."""
if content.has_attachments:
record_statsd_gauge_failure("reports.slack.send", update_error)
message = (
f"{SLACK_V1_FILE_UPLOAD_MESSAGE} "
f"Slack v2 upgrade failed: {update_error}"
)
if isinstance(update_error, UpdateFailedError):
raise UpdateFailedError(message) from update_error
raise NotificationParamException(message) from update_error
notification.send_legacy_text()
if self._fallback_recorded:
return
self._execution_warnings.append(
"Slack v2 upgrade unavailable; delivered the text-only report "
f"through deprecated Slack v1: {update_error}"
)
app.config["STATS_LOGGER"].incr("reports.slack.v1_fallback")
if isinstance(update_error, UpdateFailedError):
app.config["STATS_LOGGER"].incr("reports.slack.v1_fallback.system_error")
logger.error(
"Slack v2 upgrade failed with a system error; delivered the "
"text-only report through Slack v1 for this execution: %s",
update_error,
extra={View on GitHub (pinned to f4587218dd)
Solutions
- Enable the ALERT_REPORT_SLACK_V2 feature flag in superset_config.py: FEATURE_FLAGS = {'ALERT_REPORT_SLACK_V2': True}
- Re-authorize the Slack app and grant the bot both channels:read and groups:read scopes, then reinstall it in the workspace
- Invite the Slack bot to the target channel/group so the upgraded lookup (conversations.list) can resolve the recipient
- Re-run the report/alert and verify the recipient was persisted with a v2 channel ID; text-only reports still deliver via v1 and only log a warning
Example fix
# before
FEATURE_FLAGS = {'ALERT_REPORT_SLACK_V2': False}
# after
FEATURE_FLAGS = {'ALERT_REPORT_SLACK_V2': True}
# and in the Slack app config, add bot scopes: channels:read, groups:read Defensive patterns
Strategy: fallback
Validate before calling
from superset.utils.core import feature_flag_manager # or app.config
v2_ok = app.config['FEATURE_FLAGS'].get('ALERT_REPORT_SLACK_V2')
scopes_ok = {'channels:read', 'groups:read'} <= set(bot_token_scopes)
assert v2_ok and scopes_ok or not report_has_attachments Type guard
def can_deliver_attachments_v2(ff: dict, scopes: set[str]) -> bool:
return ff.get('ALERT_REPORT_SLACK_V2', False) and {'channels:read', 'groups:read'} <= scopes Try / catch
from superset.commands.exceptions import UpdateFailedError
from superset.reports.notifications.exceptions import NotificationParamException
try:
execute_report_delivery(report)
except (NotificationParamException, UpdateFailedError) as e:
if 'Slack v1 file uploads' in str(e):
downgrade_to_text_only(report); alert_ops(e)
else:
raise Prevention
- Keep ALERT_REPORT_SLACK_V2 enabled in every environment that sends attachment reports
- Track the bot's granted scopes in config review; alert when channels:read/groups:read go missing
- Smoke-test Slack delivery after any Slack app re-install or token rotation
When it happens
Trigger: A report or alert delivery that produces attachments (content.has_attachments) targets Slack while the ALERT_REPORT_SLACK_V2 feature flag is off, or the flag is on but the bot token lacks channels:read/groups:read so the recipient upgrade to a v2 channel ID fails; the send path then falls back to v1, which can no longer upload files.
Common situations: Upgrading Superset past the Slack files.upload retirement without re-authorizing the Slack app; creating a new Slack bot token without the v2 scopes; feature flag ALERT_REPORT_SLACK_V2 left disabled in superset_config.py; delivering chart screenshots/PDF reports to private channels the bot cannot list.
Related errors
- validation_error
- security_error
- parse_error
- Please choose at least one groupby
- There are associated alerts or reports: %(report_names)s
AI-assisted analysis of apache/superset@f4587218dd (2026-08-14).
Data as JSON: /api/errors/1b4c9780202e44b1.
Report an issue: GitHub.