{"record":{"id":"09667c945be3ab9c","repo":"bitwarden/server","slug":"a-secret-can-only-be-in-one-project-at-a-time","errorCode":null,"errorMessage":"A secret can only be in one project at a time.","messagePattern":"A secret can only be in one project at a time\\.","errorType":"http","errorClass":"BadRequestException","httpStatus":400,"severity":"error","filePath":"src/Api/SecretsManager/Controllers/SecretsManagerPortingController.cs","lineNumber":75,"sourceCode":"        return new SMExportResponseModel(projects.Select(p => p.Project), secrets.Select(s => s.Secret));\n    }\n\n    [HttpPost(\"sm/{organizationId}/import\")]\n    public async Task Import([FromRoute] Guid organizationId, [FromBody] SMImportRequestModel importRequest)\n    {\n        if (!await _currentContext.OrganizationAdmin(organizationId) || !_currentContext.AccessSecretsManager(organizationId))\n        {\n            throw new NotFoundException();\n        }\n\n        if (importRequest.Projects?.Count() > 1000 || importRequest.Secrets?.Count() > 6000)\n        {\n            throw new BadRequestException(\"You cannot import this much data at once, the limit is 1000 projects and 6000 secrets.\");\n        }\n\n        if (importRequest.Secrets.Any(s => s.ProjectIds.Count() > 1))\n        {\n            throw new BadRequestException(\"A secret can only be in one project at a time.\");\n        }\n\n        var projectsToAdd = importRequest.Projects?.Count();\n        if (projectsToAdd is > 0)\n        {\n            var (max, overMax) = await _maxProjectsQuery.GetByOrgIdAsync(organizationId, projectsToAdd.Value);\n            if (overMax != null && overMax.Value)\n            {\n                throw new BadRequestException($\"The maximum number of projects for this plan is ({max}).\");\n            }\n        }\n\n        await _importCommand.ImportAsync(organizationId, importRequest.ToSMImport());\n    }\n}\n","sourceCodeStart":57,"sourceCodeEnd":91,"githubUrl":"https://github.com/bitwarden/server/blob/e93b962371d80964556f5590c6615f5160a437a1/src/Api/SecretsManager/Controllers/SecretsManagerPortingController.cs#L57-L91","documentation":"Thrown at SecretsManagerPortingController.cs:75 inside Import. The payload contains at least one secret whose ProjectIds collection has more than one entry (importRequest.Secrets.Any(s => s.ProjectIds.Count() > 1)). Bitwarden Secrets Manager enforces a single-project-per-secret model, so the controller throws BadRequestException(\"A secret can only be in one project at a time.\") -> HTTP 400.","triggerScenarios":"POST /sm/{org}/import where any imported secret references multiple project ids, e.g. data exported from a system that allowed many-to-many secret/project relationships.","commonSituations":"Migrating from a tool where a secret could belong to several folders/projects; mapping error during payload conversion; duplicated project id on a single secret.","solutions":["Reduce each secret to exactly one project id (pick the primary project) before importing.","If a secret truly must appear in multiple projects, import duplicates under each project separately.","Validate the payload with a pre-pass that asserts every secret has at most one project id."],"exampleFix":"// before: secret mapped to many projects\nvar payload = new SMImportRequestModel {\n    Secrets = srcSecrets.Select(s => new SMImportSecret { Key = s.Key, Value = s.Value, ProjectIds = s.Folders }) // >1\n};\n\n// after: one project per secret\nvar payload = new SMImportRequestModel {\n    Secrets = srcSecrets.Select(s => new SMImportSecret { Key = s.Key, Value = s.Value, ProjectIds = new[] { s.PrimaryFolder } })\n};","handlingStrategy":"validation","validationCode":"var bad = import.Secrets.Where(s => s.ProjectIds.Count() > 1).ToList();\nif (bad.Any()) throw new ArgumentException($\"{bad.Count} secret(s) reference multiple projects\");","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Enforce one project per secret during payload conversion.","Pick a primary project for multi-folder source secrets.","Add a pre-flight validation pass over the import set."],"tags":["csharp","aspnet","bitwarden","secrets-manager","import","validation","data-model","api"],"backgroundTag":null,"analyzedSha":"e93b962371d80964556f5590c6615f5160a437a1","analyzedAt":"2026-08-13T14:22:19.382Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}