Budibase/budibase · error · ForbiddenError

License does not allow use of recaptcha

Error message

License does not allow use of recaptcha

What it means

processRecaptchaConfig gates reCAPTCHA behind a license feature. If pro.features.isRecaptchaEnabled() returns false, saving a reCAPTCHA config throws ForbiddenError regardless of the payload contents.

Source

Thrown at packages/worker/src/api/controllers/global/configs.ts:270

  if (existing) {
    for (const c of config.configs) {
      const existingConfig = existing.configs.find(e => e.uuid === c.uuid)
      if (!existingConfig) {
        continue
      }
      if (c.clientSecret === PASSWORD_REPLACEMENT) {
        c.clientSecret = existingConfig.clientSecret
      }
    }
  }
}

export async function processRecaptchaConfig(
  config: RecaptchaInnerConfig,
  existingConfig?: RecaptchaInnerConfig
) {
  if (!(await pro.features.isRecaptchaEnabled())) {
    throw new ForbiddenError("License does not allow use of recaptcha")
  }
  if (config.secretKey === PASSWORD_REPLACEMENT && !existingConfig) {
    throw new BadRequestError("No secret key provided")
  }
  if (config.secretKey === PASSWORD_REPLACEMENT && existingConfig) {
    config.secretKey = existingConfig.secretKey
  }
}

function prepareTranslationsConfig(
  ctx: UserCtx,
  config?: TranslationsConfigInner
): TranslationsConfigInner {
  const defaultLocale = config?.defaultLocale || "en"
  const locales: TranslationsConfigInner["locales"] = {}
  const now = new Date().toISOString()
  const updatedBy = ctx.user?._id

View on GitHub (pinned to a81a902e9a)

Solutions

  1. Upgrade to a license that includes reCAPTCHA support
  2. Verify the license key is correctly installed and not expired, then re-fetch entitlements
  3. Remove the reCAPTCHA config from the save payload and use an alternative captcha/bot protection
  4. After upgrading, retry the save with the same payload
Defensive patterns

Strategy: validation

Validate before calling

const recaptchaAllowed = await pro.features.isRecaptchaEnabled()
if (!recaptchaAllowed) {
  // hide recaptcha config section; don't build the save payload
  return
}

Try / catch

try {
  await configApi.save(recaptchaConfig)
} catch (err) {
  if (err.status === 403 && err.message.includes("recaptcha")) {
    // show upgrade prompt instead of retrying
  } else { throw err }
}

Prevention

When it happens

Trigger: Any attempt to save a reCAPTCHA config (type recaptcha) on a tenant whose license does not include the reCAPTCHA feature.

Common situations: Free-tier or expired license attempting to configure reCAPTCHA on the auth/self-host settings; license key not applied in the environment so features resolve to disabled.

Related errors


AI-assisted analysis of Budibase/budibase@a81a902e9a (2026-08-29). Data as JSON: /api/errors/9d5772402489ecb6. Report an issue: GitHub.