{"record":{"id":"022aeba0cb1933f8","repo":"home-assistant/core","slug":"backup-backup-id-not-found-022aeb","errorCode":null,"errorMessage":"Backup {backup_id} not found","messagePattern":"Backup (.+?) not found","errorType":"exception","errorClass":"BackupNotFound","httpStatus":null,"severity":"warning","filePath":"homeassistant/components/backblaze_b2/backup.py","lineNumber":209,"sourceCode":"\n        try:\n            await self._hass.async_add_executor_job(_delete_uploaded_file)\n        except B2Error:\n            _LOGGER.warning(\n                \"Failed to clean up partially uploaded backup file %s;\"\n                \" manual deletion from Backblaze B2 may be required\",\n                filename,\n            )\n        else:\n            _LOGGER.debug(\n                \"Successfully deleted partially uploaded main backup file %s\", filename\n            )\n\n    async def _get_file_for_download(self, backup_id: str) -> FileVersion:\n        \"\"\"Get backup file for download, raising if not found.\"\"\"\n        file, _ = await self._find_file_and_metadata_version_by_id(backup_id)\n        if not file:\n            raise BackupNotFound(f\"Backup {backup_id} not found\")\n        return file\n\n    @handle_b2_errors\n    @override\n    async def async_download_backup(\n        self, backup_id: str, **kwargs: Any\n    ) -> AsyncIterator[bytes]:\n        \"\"\"Download a backup from Backblaze B2.\"\"\"\n        file = await self._get_file_for_download(backup_id)\n        _LOGGER.debug(\"Downloading %s\", file.file_name)\n\n        downloaded_file = await self._hass.async_add_executor_job(file.download)\n        response = downloaded_file.response\n\n        async def stream_response() -> AsyncIterator[bytes]:\n            \"\"\"Stream the response into an AsyncIterator.\"\"\"\n            try:\n                iterator = response.iter_content(chunk_size=1024 * 1024)","sourceCodeStart":191,"sourceCodeEnd":227,"githubUrl":"https://github.com/home-assistant/core/blob/58a3fdb3ea0538617f0a07efcfba6294de64fd59/homeassistant/components/backblaze_b2/backup.py#L191-L227","documentation":"BackupNotFound raised in _get_file_for_download when _find_file_and_metadata_version_by_id returns no file for the backup_id. The B2 backup agent cannot start a download because the corresponding file version no longer exists (or its metadata file no longer identifies it).","triggerScenarios":"async_download_backup(backup_id) where the B2 bucket has no file whose companion metadata maps to that id — deleted externally, hidden by lifecycle rules, or recorded under an older metadata format.","commonSituations":"Backup deleted in the Backblaze console or by B2 lifecycle rules, stale backup list after restoring HA from a backup, metadata file out of sync with main file.","solutions":["Refresh the backup list and download using a current id","If the file exists in B2, verify its sidecar metadata file maps backup_id correctly","Manage retention inside HA rather than deleting files directly in B2"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"backups = await agent.async_list_backups()\nif backup_id not in {b.backup_id for b in backups}:\n    # don't attempt download; refresh UI","typeGuard":"from homeassistant.components.backup.exceptions import BackupNotFound\n\ndef is_backup_not_found(err: BaseException) -> bool:\n    return isinstance(err, BackupNotFound)","tryCatchPattern":"try:\n    file = await self._get_file_for_download(backup_id)\nexcept BackupNotFound:\n    # refresh list, pick a valid id\n    ...","preventionTips":["Resolve download targets from a fresh backup list","Do not delete B2 files manually or via lifecycle rules that bypass HA","Keep main file and metadata sidecar paired when managing B2 externally"],"tags":["backblaze","b2","backup","not-found","download"],"backgroundTag":null,"analyzedSha":"58a3fdb3ea0538617f0a07efcfba6294de64fd59","analyzedAt":"2026-08-14T20:54:38.818Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}