bitwarden/server · error · BadRequestException

Free Bitwarden Families sponsorship has been disabled by you

Error message

Free Bitwarden Families sponsorship has been disabled by your organization administrator.

What it means

Thrown (HTTP 400) when creating a Families-for-Enterprise sponsorship because the sponsoring organization has the FreeFamiliesSponsorshipPolicy enabled. Despite the optimistic policy name, an ENABLED FreeFamiliesSponsorshipPolicy DISABLES sponsorships — an org owner turned the policy on to block the feature org-wide.

Source

Thrown at src/Api/Billing/Controllers/OrganizationSponsorshipsController.cs:94

        _userService = userService;
        _currentContext = currentContext;
        _policyQuery = policyQuery;
        _featureService = featureService;
        _logger = logger;
    }

    [Authorize("Application")]
    [HttpPost("{sponsoringOrgId}/families-for-enterprise")]
    [SelfHosted(NotSelfHostedOnly = true)]
    public async Task CreateSponsorship(Guid sponsoringOrgId, [FromBody] OrganizationSponsorshipCreateRequestModel model)
    {
        var sponsoringOrg = await _organizationRepository.GetByIdAsync(sponsoringOrgId);
        var freeFamiliesSponsorshipPolicy = await _policyQuery.RunAsync(sponsoringOrgId,
            PolicyType.FreeFamiliesSponsorshipPolicy);

        if (freeFamiliesSponsorshipPolicy.Enabled)
        {
            throw new BadRequestException("Free Bitwarden Families sponsorship has been disabled by your organization administrator.");
        }

        var sponsorship = await _createSponsorshipCommand.CreateSponsorshipAsync(
            sponsoringOrg,
            await _organizationUserRepository.GetByOrganizationAsync(sponsoringOrgId, _currentContext.UserId ?? default),
            model.PlanSponsorshipType,
            model.SponsoredEmail,
            model.FriendlyName,
            model.IsAdminInitiated.GetValueOrDefault(),
            model.Notes);
        if (sponsorship.OfferedToEmail != null)
        {
            await _sendSponsorshipOfferCommand.SendSponsorshipOfferAsync(sponsorship, sponsoringOrg.Name);
        }
    }

    [Authorize("Application")]
    [Authorize<ManageUsersRequirement>]

View on GitHub (pinned to e93b962371)

Solutions

  1. Have an organization owner disable the FreeFamiliesSponsorshipPolicy for the sponsoring org (or the governing enterprise).
  2. Confirm you are targeting the intended sponsoring organization.
  3. If the policy is intentional, stop attempting to create sponsorships and communicate the restriction to users.
Defensive patterns

Strategy: validation

Validate before calling

// Before offering to create a sponsorship, fetch and check the policy state.
const policy = await getPolicy(sponsoringOrgId, 'FreeFamiliesSponsorshipPolicy');
if (policy.enabled) { disableCreateSponsorshipUI(); }

Try / catch

try {
  await createSponsorship(sponsoringOrgId, model);
} catch (e) {
  if (e.isBadRequest && /sponsorship has been disabled/i.test(e.message)) {
    showPolicyNotice('Your organization administrator has disabled sponsorships.');
  } else { throw e; }
}

Prevention

When it happens

Trigger: An org admin enabled the 'disable free families sponsorship' policy and a user then calls POST /{sponsoringOrgId}/families-for-enterprise; the sponsoring org is governed by an enterprise policy that cascades this restriction.

Common situations: Enterprise policy rollout that disables sponsorships across member organizations; admin toggled the policy after sponsorships were already being offered.

Related errors


AI-assisted analysis of bitwarden/server@e93b962371 (2026-08-13). Data as JSON: /api/errors/007bfc26661f2a55. Report an issue: GitHub.