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
- Upgrade to a license that includes reCAPTCHA support
- Verify the license key is correctly installed and not expired, then re-fetch entitlements
- Remove the reCAPTCHA config from the save payload and use an alternative captcha/bot protection
- 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
- Gate reCAPTCHA UI behind the entitlement check
- Confirm license key is installed and valid before configuring premium features
- Handle 403 ForbiddenError as an upgrade signal, not a bug
- Avoid copying recaptcha config payloads between tenants with different licenses
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
- License does not allow translations
- License does not allow OIDC PKCE method support
- Audit logs not available - license required.
- User does not have access to environment variables feature.
- FEATURE_DISABLED
AI-assisted analysis of Budibase/budibase@a81a902e9a (2026-08-29).
Data as JSON: /api/errors/9d5772402489ecb6.
Report an issue: GitHub.