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

  1. Enable the ALERT_REPORT_SLACK_V2 feature flag in superset_config.py: FEATURE_FLAGS = {'ALERT_REPORT_SLACK_V2': True}
  2. Re-authorize the Slack app and grant the bot both channels:read and groups:read scopes, then reinstall it in the workspace
  3. Invite the Slack bot to the target channel/group so the upgraded lookup (conversations.list) can resolve the recipient
  4. 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

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


AI-assisted analysis of apache/superset@f4587218dd (2026-08-14). Data as JSON: /api/errors/1b4c9780202e44b1. Report an issue: GitHub.