{"record":{"id":"93d789f48cb78150","repo":"bitwarden/server","slug":"resource-not-found-93d789","errorCode":null,"errorMessage":"Resource not found.","messagePattern":"Resource not found\\.","errorType":"http","errorClass":"NotFoundException","httpStatus":404,"severity":"error","filePath":"src/Api/Auth/Controllers/EmergencyAccessController.cs","lineNumber":87,"sourceCode":"        return new EmergencyAccessGranteeDetailsResponseModel(result);\n    }\n\n    [HttpGet(\"{id}/policies\")]\n    public async Task<ListResponseModel<PolicyResponseModel>> Policies(Guid id)\n    {\n        var user = await _userService.GetUserByPrincipalAsync(User);\n        var policies = await _emergencyAccessService.GetPoliciesAsync(id, user);\n        var responses = policies?.Select(policy => new PolicyResponseModel(policy));\n        return new ListResponseModel<PolicyResponseModel>(responses);\n    }\n\n    [HttpPut(\"{id}\")]\n    public async Task Put(Guid id, [FromBody] EmergencyAccessUpdateRequestModel model)\n    {\n        var emergencyAccess = await _emergencyAccessRepository.GetByIdAsync(id);\n        if (emergencyAccess == null)\n        {\n            throw new NotFoundException();\n        }\n\n        var user = await _userService.GetUserByPrincipalAsync(User);\n        await _emergencyAccessService.SaveAsync(model.ToEmergencyAccess(emergencyAccess), user);\n    }\n\n    [HttpPost(\"{id}\")]\n    [Obsolete(\"This endpoint is deprecated. Use PUT /{id} instead.\")]\n    public async Task Post(Guid id, [FromBody] EmergencyAccessUpdateRequestModel model)\n    {\n        await Put(id, model);\n    }\n\n    [HttpDelete(\"{id}\")]\n    public async Task Delete(Guid id)\n    {\n        var userId = _userService.GetProperUserId(User);\n        await _emergencyAccessService.DeleteAsync(id, userId.Value);","sourceCodeStart":69,"sourceCodeEnd":105,"githubUrl":"https://github.com/bitwarden/server/blob/e93b962371d80964556f5590c6615f5160a437a1/src/Api/Auth/Controllers/EmergencyAccessController.cs#L69-L105","documentation":"Thrown as NotFoundException (HTTP 404) from PUT /emergency-access/{id}. _emergencyAccessRepository.GetByIdAsync(id) returns null — no emergency access record exists with the given GUID. The controller checks existence before allowing the grantor to update the access configuration (e.g., key type, wait time).","triggerScenarios":"PUT /emergency-access/{id} is called with a GUID that does not correspond to any emergency access invite/grant. The record may have been deleted, the id was never valid, or was transcribed incorrectly.","commonSituations":"The emergency access invitation was revoked or declined before the update. The grantee or grantor deleted the emergency access relationship. Client uses a cached id from a previous session after the record was removed. GUID was mistyped or truncated in the request URL.","solutions":["Call GET /emergency-access to list the user's current emergency access records and use a valid id.","If the record was deleted, create a new emergency access invite via POST /emergency-access.","Verify the GUID in the URL is complete and correctly formatted."],"exampleFix":"// before: updating a deleted/nonexistent emergency access record\nvar resp = await client.PutAsJsonAsync($\"/emergency-access/{oldId}\", model); // 404\n\n// after: list current records first\nvar list = await client.GetAsync(\"/emergency-access\");\nvar currentId = SelectEmergencyAccessId(list);\nvar resp = await client.PutAsJsonAsync($\"/emergency-access/{currentId}\", model);","handlingStrategy":"validation","validationCode":"// Verify the emergency access record exists before updating\nvar list = await client.GetAsync(\"/emergency-access\");\nvar validIds = ParseEmergencyAccessIds(list);\nif (!validIds.Contains(id)) {\n    return Error(\"Emergency access record not found. It may have been revoked or deleted.\");\n}","typeGuard":null,"tryCatchPattern":"try {\n    var resp = await client.PutAsJsonAsync($\"/emergency-access/{id}\", model);\n    resp.EnsureSuccessStatusCode();\n} catch (HttpRequestException ex) when (ex.StatusCode == HttpStatusCode.NotFound) {\n    // Record doesn't exist — refresh the list\n    await RefreshEmergencyAccessListAsync();\n    ShowUserError(\"This emergency access record no longer exists.\");\n}","preventionTips":["Always reference emergency access IDs from a freshly fetched list.","Handle 404 by refreshing the list and notifying the user that the record was removed.","Avoid persisting emergency access IDs in local storage across app restarts without validation."],"tags":["emergency-access","not-found","validation","stale-id"],"backgroundTag":null,"analyzedSha":"e93b962371d80964556f5590c6615f5160a437a1","analyzedAt":"2026-08-13T14:22:19.382Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}