{"record":{"id":"51b5041c1b67753a","repo":"home-assistant/core","slug":"todo-save-item-failed","errorCode":null,"errorMessage":"todo_save_item_failed","messagePattern":"todo_save_item_failed","errorType":"exception","errorClass":"HomeAssistantError","httpStatus":null,"severity":"error","filePath":"homeassistant/components/bring/todo.py","lineNumber":121,"sourceCode":"        ]\n\n    @property\n    def bring_list(self) -> BringData:\n        \"\"\"Return the bring list.\"\"\"\n        return self.coordinator.data[self._list_uuid]\n\n    @override\n    async def async_create_todo_item(self, item: TodoItem) -> None:\n        \"\"\"Add an item to the To-do list.\"\"\"\n        try:\n            await self.coordinator.bring.save_item(\n                self._list_uuid,\n                item.summary or \"\",\n                item.description or \"\",\n                str(uuid.uuid4()),\n            )\n        except BringRequestException as e:\n            raise HomeAssistantError(\n                translation_domain=DOMAIN,\n                translation_key=\"todo_save_item_failed\",\n                translation_placeholders={\"name\": item.summary or \"\"},\n            ) from e\n\n        await self.coordinator.async_refresh()\n\n    @override\n    async def async_update_todo_item(self, item: TodoItem) -> None:\n        \"\"\"Update an item in the To-do list.\n\n        Bring has an internal 'recent' list which we want to use instead of a todo list\n        status, therefore completed todo list items are matched to the recent list and\n        pending items to the purchase list.\n\n        This results in following behaviour:\n\n        - Completed items will move to the \"completed\" section in home assistant todo","sourceCodeStart":103,"sourceCodeEnd":139,"githubUrl":"https://github.com/home-assistant/core/blob/58a3fdb3ea0538617f0a07efcfba6294de64fd59/homeassistant/components/bring/todo.py#L103-L139","documentation":"Raised by the Bring To-do entity's async_create_todo_item when bring-api's save_item() raises BringRequestException, meaning the HTTP request to create the list item failed. The item is a newly generated UUID-backed entry with summary/description. HA surfaces it as a HomeAssistantError with translation key todo_save_item_failed and the item's summary as placeholder.","triggerScenarios":"Adding a To-do item (via UI or todo.add_item service) while the Bring API returns a non-2xx response or the request layer raises: invalid session cookie, list UUID stale, payload rejected, network timeout.","commonSituations":"Expired Bring session after HA restart, list deleted or recreated on the phone app so the stored list_uuid no longer exists, intermittent cloud errors, item summary containing characters the API rejects.","solutions":["Retry the add after reloading the integration so the coordinator refreshes lists and the session.","Re-authenticate the Bring integration if failures persist (Config > Integrations > Bring > Re-authenticate).","Confirm the list still exists in the Bring app and re-create the config entry if the list was deleted/recreated.","Check logs for the underlying BringRequestException message to see the HTTP status."],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"try:\n    await todo_entity.async_create_todo_item(item)\nexcept HomeAssistantError as err:\n    if err.translation_key == \"todo_save_item_failed\":\n        await coordinator.async_refresh()\n        await todo_entity.async_create_todo_item(item)  # one retry after refresh\n    else:\n        raise","preventionTips":["Trigger a coordinator refresh before batch To-do edits.","Keep the Bring session healthy: reload the integration on repeated write failures.","Avoid editing the same list from the phone app and HA simultaneously."],"tags":["home-assistant","bring","todo","network"],"backgroundTag":null,"analyzedSha":"58a3fdb3ea0538617f0a07efcfba6294de64fd59","analyzedAt":"2026-08-14T20:54:38.818Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}