{"record":{"id":"7259f02fdf1402c4","repo":"Significant-Gravitas/AutoGPT","slug":"autogpt-managed-credentials-cannot-be-deleted","errorCode":null,"errorMessage":"AutoGPT-managed credentials cannot be deleted","messagePattern":"AutoGPT-managed credentials cannot be deleted","errorType":"http","errorClass":"HTTPException","httpStatus":403,"severity":"info","filePath":"autogpt_platform/backend/backend/api/features/integrations/router.py","lineNumber":652,"sourceCode":"            status_code=status.HTTP_404_NOT_FOUND, detail=\"Credentials not found\"\n        )\n    if is_system_credential(cred_id):\n        raise HTTPException(\n            status_code=status.HTTP_403_FORBIDDEN,\n            detail=\"System-managed credentials cannot be deleted\",\n        )\n    creds = await creds_manager.store.get_creds_by_id(user_id, cred_id)\n    if not creds:\n        raise HTTPException(\n            status_code=status.HTTP_404_NOT_FOUND, detail=\"Credentials not found\"\n        )\n    if not provider_matches(creds.provider, provider):\n        raise HTTPException(\n            status_code=status.HTTP_404_NOT_FOUND,\n            detail=\"Credentials not found\",\n        )\n    if creds.is_managed:\n        raise HTTPException(\n            status_code=status.HTTP_403_FORBIDDEN,\n            detail=\"AutoGPT-managed credentials cannot be deleted\",\n        )\n\n    try:\n        await remove_all_webhooks_for_credentials(user_id, creds, force)\n    except NeedConfirmation as e:\n        return CredentialsDeletionNeedsConfirmationResponse(message=str(e))\n\n    tokens_revoked = None\n    if provider == ProviderName.CODEX:\n        tokens_revoked = await revoke_codex_credentials(creds_manager, user_id, cred_id)\n    else:\n        await creds_manager.delete(user_id, cred_id)\n\n    if isinstance(creds, OAuth2Credentials) and provider != ProviderName.CODEX:\n        if provider_matches(provider.value, ProviderName.MCP.value):\n            # MCP uses dynamic per-server OAuth — create handler from metadata","sourceCodeStart":634,"sourceCodeEnd":670,"githubUrl":"https://github.com/Significant-Gravitas/AutoGPT/blob/9c8bb5550f446ba5d3046b78896578742495b3cf/autogpt_platform/backend/backend/api/features/integrations/router.py#L634-L670","documentation":"DELETE /integrations/{provider}/credentials/{cred_id} returns 403 'AutoGPT-managed credentials cannot be deleted' when the stored credential has is_managed == True. Managed credentials (e.g. Ayrshare provisioned by AyrshareManagedProvider) are created and lifecycle-managed by the platform itself; direct user deletion is blocked.","triggerScenarios":"DELETE against a credential whose row has is_managed=true (e.g. an auto-provisioned Ayrshare social credential).","commonSituations":"User tries to tidy up the automatically-created provider entry in the credentials UI; script deletes every credential it can list.","solutions":["Do not delete managed credentials; the platform controls their lifecycle","If removal is truly required, disable the managed provider feature / revoke the platform-side integration so the manager retracts it","UI: hide or disable delete on credentials flagged is_managed"],"exampleFix":null,"handlingStrategy":"type-guard","validationCode":"meta = next(c for c in all_credentials if c['id'] == cred_id)\nif meta.get('is_managed'):\n    return  # platform-managed; not user-deletable","typeGuard":"const isUserDeletable = (c: { is_managed?: boolean }): boolean =>\n  c.is_managed !== true;","tryCatchPattern":null,"preventionTips":["Check the is_managed flag on listed credentials before exposing delete actions"],"tags":["credentials","managed-credentials","http-403"],"backgroundTag":null,"analyzedSha":"9c8bb5550f446ba5d3046b78896578742495b3cf","analyzedAt":"2026-08-14T17:17:21.957Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}