XF Bot Guard

XF Bot Guard 1.4.1

No permission to download
Coming soon in XF Bot Guard 1.2.8

XF Bot Guard 1.2.8 is now in production testing on my own forum, and this update is shaping up to be a pretty solid one.

This release is focused on more control, smarter detection, better compatibility, and lower overhead.

Coming in 1.2.8:

  • Alternative CAPTCHA provider support
    Use a tougher CAPTCHA for Bot Guard challenges while keeping the rest of XenForo more user-friendly, or the other way around.

  • Verified AI crawler controls
    Optionally allow selected verified AI search crawlers and user-triggered AI fetchers to access safe public content, only after IP range and user-agent verification. This does not open the door to AI training crawlers.

  • Contextual link canaries
    A new optional SEO-safe detection layer that places context-aware canary links within normal content flows to help identify suspicious automated fetching and reconnaissance activity. Designed to blend naturally into legitimate page structures, making reliable detection and avoidance significantly more difficult for bots.

  • Optimised dashboard reads
    Reduced memory usage when rendering dashboard snapshot data, especially helpful for larger forums with bigger Bot Guard datasets.

  • Remote CIDR JSON sources
    Add trusted or untrusted remote CIDR JSON sources for more flexible Bot Guard network handling. Lists are refreshed automatically and used to either allow known-good networks or send matching traffic directly to a Bot Guard challenge.

  • Improved XenForo unfurl handling
    Better support for XenForo’s own URL unfurling requests through the light valid response system.

More details will come with the full release notes, but 1.2.8 is all about giving admins sharper tools without making life harder for genuine visitors.
 
Last edited:
I've been trying out Bot Guard on our forum for the past week or so with pretty standard settings and things seemed to be working fine, but then everything went to hell last night. For the past week we had been running Bot Guard 1.1.5 and it was only displaying about 50-100 guests online. I'm sure there were more than that as at minimum we're used to seeing at least 1000 guests online, and the past few days page loads started to get noticeably slower at certain times throughout the day. Last night it was so bad that I shut the board down and upgraded to Bot Guard 1.2.7, then about 20 minutes later we were seeing this:

Screenshot 2026-06-13 at 00-29-02 Jedi Council Forums.webp

This number of bots isn't new for us. We've been getting slammed with numbers this high every so often ever since the new Star Wars movie premiered about a month ago. However, with Bot Guard and Surge Guard running, the server was completely overwhelmed. Page loads were taking 30+ seconds with constant timeouts and 500 errors. When I tried disabling these two add-ons, pages started loading closer to normal again despite the bot traffic. This leads me to believe that the massive amount of logging is what slowed everything down. Am I correct? How would we go about fixing this? The amount of settings and data this add-on provides is pretty overwhelming so I'm not sure where to start.
 
Last edited:
Not using Cloudflare or IP Thread Manager. We're on a VPS running PHP8.3 / MySQL8.0 / NGINX 1.28. We're using the NGINX bot blocker and Fail2ban jails as the first line of defense.

EDIT: I don't mean to sound like I'm blaming this add-on for my problems. This is great software and I'm thankful to zee for creating it. I'm just hoping there's something we can do to make it work for us. :)
 
Last edited:
Are you planning on converting all text to Xenforo phrases? Or is there another way to translate the plugin into another language without ending up with a mixture of text in different languages?
 
More of an observation than a concern. I noticed that the Turnstile page doesn't show any mod statistics. Is it using the standard Xenforo system with CAPTCHA validation on Cloudflare servers, or a regular widget?
 
Are you planning on converting all text to Xenforo phrases? Or is there another way to translate the plugin into another language without ending up with a mixture of text in different languages?

Yep, I am aware of the mix of phrases and hard-coded messaging. It's on my backlog to move all hard-coded messaging to phrases.
 
I've been trying out Bot Guard on our forum for the past week or so with pretty standard settings and things seemed to be working fine, but then everything went to hell last night. For the past week we had been running Bot Guard 1.1.5 and it was only displaying about 50-100 guests online. I'm sure there were more than that as at minimum we're used to seeing at least 1000 guests online, and the past few days page loads started to get noticeably slower at certain times throughout the day. Last night it was so bad that I shut the board down and upgraded to Bot Guard 1.2.7, then about 20 minutes later we were seeing this:

View attachment 339829

This number of bots isn't new for us. We've been getting slammed with numbers this high every so often ever since the new Star Wars movie premiered about a month ago. However, with Bot Guard and Surge Guard running, the server was completely overwhelmed. Page loads were taking 30+ seconds with constant timeouts and 500 errors. When I tried disabling these two add-ons, pages started loading closer to normal again despite the bot traffic. This leads me to believe that the massive amount of logging is what slowed everything down. Am I correct? How would we go about fixing this? The amount of settings and data this add-on provides is pretty overwhelming so I'm not sure where to start.

Oh No Reaction Gif GIF


Not using Cloudflare or IP Thread Manager. We're on a VPS running PHP8.3 / MySQL8.0 / NGINX 1.28. We're using the NGINX bot blocker and Fail2ban jails as the first line of defense.

EDIT: I don't mean to sound like I'm blaming this add-on for my problems. This is great software and I'm thankful to zee for creating it. I'm just hoping there's something we can do to make it work for us. :)

No worries at all. I don’t read this as blaming the add-on. This is exactly the kind of real-world pressure case where the limits between server-level blocking and application-level handling become very obvious.

At that volume, the first line of defence really does need to be NGINX, Fail2ban, or another edge/server-level blocker. If tens of thousands of bot sessions are suddenly reaching PHP/XenForo, Bot Guard can help classify, challenge, and reduce some bad traffic, but it cannot make that amount of application-layer traffic cheap.

So yes, the extra logging/detail writes may have contributed to the slowdown, especially during a storm like that. But the bigger issue is that the huge volume of bot traffic was suddenly reaching the application layer at all. Disabling Bot Guard and Surge Guard reduced the amount of work being done per request, which is why the site felt better, but it doesn’t mean the traffic became safe or cheap.

The immediate blunt Bot Guard settings I’d try are:

Log low-value allow/skip audit events
Code:
zeeBotGuardLogLowValueEvents = Off

Low-value allow audit sample rate
Code:
zeeBotGuardLogAllowSampleRate = 0

Log browser validation allow events
Code:
zeeBotGuardLogBrowserValidationAllows = Off

Tracked browser validation bootstraps per 10 minutes
Code:
zeeBotGuardBootstrapRequestsPer10Min = 0

Event detail write handling
Code:
zeeBotGuardEventDetailWriteMode = Buffered

That keeps the lower-value/supplementary logging down without fully removing the minimum level of audit/context that Bot Guard relies on to track suspicious behaviour across page loads.

The last option only buffers supplementary event detail, not every Bot Guard database write, but it can reduce some synchronous DB work during heavy traffic. After enabling it, keep an eye on the event detail buffer health/status so failed or stale files do not start building up.

For longer-term recurring waves, I’d also review the raw retention settings. The goal is to keep enough recent evidence for Bot Guard to make useful decisions, without retaining storm-volume data for weeks when the site is repeatedly under pressure.

The broad recommendation would be: keep raw event, counter, and session data shorter during recurring waves; keep compact dashboard snapshots longer; and avoid verbose logging unless you are actively diagnosing something.

Settings I’d review:

Event retention hours
Code:
zeeBotGuardEventRetentionHours
I’d suggest somewhere around 72 to 168 hours during recurring waves.

Visitor retention hours
Code:
zeeBotGuardVisitorRetentionHours
If possible, I’d keep this longer than event logs, for example 168 to 336 hours, because it affects longer-term visitor reputation/state.

Session retention hours
Code:
zeeBotGuardSessionRetentionHours
I’d suggest around 72 to 168 hours.

Counter retention hours
Code:
zeeBotGuardCounterRetentionHours
I’d suggest around 72 to 168 hours. Counters are used for operational reporting and recent scoring/rate signals, so I would not set this extremely low unless database pressure is severe.

Dashboard snapshot retention hours
Code:
zeeBotGuardDashboardSnapshotRetentionHours
This can usually stay longer, because snapshots are compact compared with raw rows.

Zero-signal IP retention hours
Code:
zeeBotGuardIpZeroSignalRetentionHours
This only applies to stale IP rows with no useful signal. Lowering it can help prune low-value state, but the minimum is higher than the raw log settings.

Beyond that, if the server still cannot weather that kind of traffic without Cloudflare or another edge layer, the realistic option inside Bot Guard would be something intentionally blunt: when guest/bot pressure crosses a configured threshold, start returning early 429 or 503 responses to guests before doing the heavier XenForo/Bot Guard work.

That could be based on guest count, Bot Guard counters, server load, response timing, or DB pressure.

The trade-off is that it would hurt real human guests too. But, to be fair, if the alternative is the site being down or unusable for everyone, then “temporarily and intelligently unavailable for visitors we do not know yet” may be a reasonable compromise. In that scenario, the priority is protecting the people the site already trusts - members, known-good visitors, and established sessions - so the forum can keep running for them instead of PHP/MySQL falling over completely.

So I do think there is probably a useful feature in there, as long as it is framed honestly. It would be an origin survival mode, not a clean bot-detection feature.

I’m actually interested in what you and other users think of that as a possible fallback feature.

Something like:

  • disabled by default
  • guest-only / excludes known and accepted bots / unknown-visitor focused
  • configurable thresholds
  • returns early 429 or 503 once the site is under extreme pressure
  • protects members and already-trusted visitors and bots first
  • intended purely as a “keep the origin alive” mode, not as normal bot detection

It would not replace proper edge/server-level mitigation, but it could give smaller VPS-hosted forums a last-resort survival option during bot floods.
 
I noticed that the Turnstile page doesn't show any mod statistics. Is it using the standard Xenforo system with CAPTCHA validation on Cloudflare servers, or a regular widget?

Good observation. I dug into this, and you were right to question it.

XF Bot Guard was already using XenForo’s normal CAPTCHA / Turnstile rendering and validation path, rather than a completely custom Turnstile implementation. So yes, the challenge was still being validated through the usual XenForo CAPTCHA provider and Cloudflare server-side validation flow.

However, up to 1.2.7, the Bot Guard challenge did not pass a dedicated Turnstile action/context when rendering the widget. That meant Cloudflare could validate the Turnstile challenge correctly, but Turnstile Analytics had no Bot Guard-specific action label to group/report against.

In the upcoming 1.2.8 build, I’ve changed the CAPTCHA handling so Bot Guard resolves and renders the configured XenForo CAPTCHA provider itself, while still using XenForo’s provider classes and configured credentials.

As part of that change, Bot Guard now sets the Turnstile action/context to:

Code:
bot_guard

So the short version is:

  • Yes, it is still using XenForo’s standard Turnstile provider.
  • Yes, validation is still handled through the normal Cloudflare Turnstile server-side validation path.
  • No, Bot Guard is not using a separate/custom Turnstile account or secret.
  • But 1.2.8 adds the missing Bot Guard-specific action label so Turnstile Analytics can report it properly.

This was an incidental fix from the CAPTCHA provider work rather than something I specifically set out to change, but the result is correct and will be included in 1.2.8.
 
@zeeb0t thank you for the feedback. I will try your suggested settings and let you know how it goes.

This is exactly the kind of real-world pressure case where the limits between server-level blocking and application-level handling become very obvious.

At that volume, the first line of defence really does need to be NGINX, Fail2ban, or another edge/server-level blocker. If tens of thousands of bot sessions are suddenly reaching PHP/XenForo, Bot Guard can help classify, challenge, and reduce some bad traffic, but it cannot make that amount of application-layer traffic cheap.
Agreed. We started using a combination of the Nginx Ultimate Bad Bot Blocker and Fail2ban jails a year or two ago after we regularly started seeing the amount of guests hit 10k. It was very effective at keeping that number down around 1k or less until a few months ago when we upgraded from XF1 to 2.3 and moved to a new server. Since then it seems like the number of bots that hit the forum during peak hours keeps creeping up, as if the bots are getting more intelligent and/or the bot blocker is becoming less effective at recognizing them. The week the Mandalorian movie came out the bot numbers were peaking between 80 and 100k. I decided to try Bot Guard just to see how well it would work before looking into a paid solution like IP Thread Manager (or Cloudflare if we have to, although I don't think we want to go that route).

So I do think there is probably a useful feature in there, as long as it is framed honestly. It would be an origin survival mode, not a clean bot-detection feature.

I’m actually interested in what you and other users think of that as a possible fallback feature.

Something like:

  • disabled by default
  • guest-only / excludes known and accepted bots / unknown-visitor focused
  • configurable thresholds
  • returns early 429 or 503 once the site is under extreme pressure
  • protects members and already-trusted visitors and bots first
  • intended purely as a “keep the origin alive” mode, not as normal bot detection

It would not replace proper edge/server-level mitigation, but it could give smaller VPS-hosted forums a last-resort survival option during bot floods.
That sounds like it might be worth trying the next time we see the bot horde return. I'm also curious what others think of that. I believe we've already got a Fail2ban jail for banning IPs that rack up too many 429 errors as well.
 
That sounds like it might be worth trying the next time we see the bot horde return. I'm also curious what others think of that. I believe we've already got a Fail2ban jail for banning IPs that rack up too many 429 errors as well.

I like the idea either way, and I’ve just implemented it. It is off by default, but when enabled, it should help protect the overall uptime of the forum if things get bad. It’s a compromise that prioritises availability for known users, while still leaving clear options if it happens too often: turn the feature off, upgrade server resources, or add additional edge-layer protection as discussed.

Ultimately, I want XF Bot Guard to be a weapon in every sense. The main limitation is that it currently runs inside XenForo, which makes the checks much more expensive than they would be if they were handled outside XenForo before the request reached the application.

That said, I am working on a standalone version of XF Bot Guard. It won’t be as simple as installing an add-on and pressing enable inside XenForo, but the trade-off will be more complexity in exchange for higher availability, even during heavy bot storms.
 
zeeb0t updated XF Bot Guard with a new update entry:

Minor Release: v1.2.8

XF Bot Guard 1.2.8

Release type:
minor

XF Bot Guard 1.2.8 is a protection, crawler-control, and operations release. It adds stronger bot-detection signals, safer AI crawler handling, configurable CAPTCHA and Edge behaviour, emergency origin protection, better investigation tools, and a broad documentation, performance, and hardening pass.

Contextual link canaries

XF Bot Guard can now place temporary canary aliases on a very small number of eligible public...

Read the rest of this update entry...
 
With previous version of this addon altcha captcha was working.

Code:
ErrorException: XF Bot Guard CAPTCHA fallback provider used during render: effective provider hCaptcha (XF\Captcha\HCaptcha). src/XF/Error.php:81
Generated by: Unknown account Jun 14, 2026 at 2:01 

Stack trace
#0 src/XF.php(270): XF\Error->logError('XF Bot Guard CA...', false)
#1 src/addons/Zee/BotGuard/Service/CaptchaProviderResolver.php(830): XF::logError('XF Bot Guard CA...')
#2 src/addons/Zee/BotGuard/Service/CaptchaProviderResolver.php(334): Zee\BotGuard\Service\CaptchaProviderResolver->logError('XF Bot Guard CA...')
#3 src/addons/Zee/BotGuard/Pub/Controller/Challenge.php(515): Zee\BotGuard\Service\CaptchaProviderResolver->logResolutionIssue(Array, 'render')
#4 src/addons/Zee/BotGuard/Pub/Controller/Challenge.php(160): Zee\BotGuard\Pub\Controller\Challenge->renderBotGuardCaptchaHtml()
#5 src/XF/Mvc/Dispatcher.php(362): Zee\BotGuard\Pub\Controller\Challenge->actionIndex(Object(XF\Mvc\ParameterBag))
#6 src/XF/Mvc/Dispatcher.php(264): XF\Mvc\Dispatcher->dispatchClass('Zee\\BotGuard:Ch...', 'Index', Object(XF\Mvc\RouteMatch), Object(Zee\BotGuard\Pub\Controller\Challenge), NULL)
#7 src/XF/Mvc/Dispatcher.php(121): XF\Mvc\Dispatcher->dispatchFromMatch(Object(XF\Mvc\RouteMatch), Object(Zee\BotGuard\Pub\Controller\Challenge), NULL)
#8 src/XF/Mvc/Dispatcher.php(63): XF\Mvc\Dispatcher->dispatchLoop(Object(XF\Mvc\RouteMatch))
#9 src/XF/App.php(2824): XF\Mvc\Dispatcher->run()
#10 src/XF.php(814): XF\App->run()
#11 index.php(23): XF::runApp('XF\\Pub\\App')
#12 {main}

Request state
array(4) {
  ["url"] => string(11) "/bot-guard/"
  ["referrer"] => string(44) "/threads/162291/"
  ["_GET"] => array(0) {
  }
  ["_POST"] => array(0) {
  }
}

Code:
ErrorException: XF Bot Guard CAPTCHA provider issue during render: selected provider Roi\ALTCHACAPTCHA:ALTCHACAPTCHA (Roi\ALTCHACAPTCHA\Captcha\ALTCHACAPTCHA) is not usable. Reason: custom_configuration_unverified. The custom CAPTCHA provider is class-compatible, but Bot Guard cannot independently verify its credential configuration. src/XF/Error.php:81
Generated by: Unknown account Jun 14, 2026 at 2:01 PM

Stack trace
#0 src/XF.php(270): XF\Error->logError('XF Bot Guard CA...', false)
#1 src/addons/Zee/BotGuard/Service/CaptchaProviderResolver.php(830): XF::logError('XF Bot Guard CA...')
#2 src/addons/Zee/BotGuard/Service/CaptchaProviderResolver.php(323): Zee\BotGuard\Service\CaptchaProviderResolver->logError('XF Bot Guard CA...')
#3 src/addons/Zee/BotGuard/Pub/Controller/Challenge.php(515): Zee\BotGuard\Service\CaptchaProviderResolver->logResolutionIssue(Array, 'render')
#4 src/addons/Zee/BotGuard/Pub/Controller/Challenge.php(160): Zee\BotGuard\Pub\Controller\Challenge->renderBotGuardCaptchaHtml()
#5 src/XF/Mvc/Dispatcher.php(362): Zee\BotGuard\Pub\Controller\Challenge->actionIndex(Object(XF\Mvc\ParameterBag))
#6 src/XF/Mvc/Dispatcher.php(264): XF\Mvc\Dispatcher->dispatchClass('Zee\\BotGuard:Ch...', 'Index', Object(XF\Mvc\RouteMatch), Object(Zee\BotGuard\Pub\Controller\Challenge), NULL)
#7 src/XF/Mvc/Dispatcher.php(121): XF\Mvc\Dispatcher->dispatchFromMatch(Object(XF\Mvc\RouteMatch), Object(Zee\BotGuard\Pub\Controller\Challenge), NULL)
#8 src/XF/Mvc/Dispatcher.php(63): XF\Mvc\Dispatcher->dispatchLoop(Object(XF\Mvc\RouteMatch))
#9 src/XF/App.php(2824): XF\Mvc\Dispatcher->run()
#10 src/XF.php(814): XF\App->run()
#11 index.php(23): XF::runApp('XF\\Pub\\App')
#12 {main}

Request state
array(4) {
  ["url"] => string(11) "/bot-guard/"
  ["referrer"] => string(44) "/threads/162291/"
  ["_GET"] => array(0) {
  }
  ["_POST"] => array(0) {
  }
}
 
With previous version of this addon altcha captcha was working.

Code:
ErrorException: XF Bot Guard CAPTCHA fallback provider used during render: effective provider hCaptcha (XF\Captcha\HCaptcha). src/XF/Error.php:81
Generated by: Unknown account Jun 14, 2026 at 2:01 

Stack trace
#0 src/XF.php(270): XF\Error->logError('XF Bot Guard CA...', false)
#1 src/addons/Zee/BotGuard/Service/CaptchaProviderResolver.php(830): XF::logError('XF Bot Guard CA...')
#2 src/addons/Zee/BotGuard/Service/CaptchaProviderResolver.php(334): Zee\BotGuard\Service\CaptchaProviderResolver->logError('XF Bot Guard CA...')
#3 src/addons/Zee/BotGuard/Pub/Controller/Challenge.php(515): Zee\BotGuard\Service\CaptchaProviderResolver->logResolutionIssue(Array, 'render')
#4 src/addons/Zee/BotGuard/Pub/Controller/Challenge.php(160): Zee\BotGuard\Pub\Controller\Challenge->renderBotGuardCaptchaHtml()
#5 src/XF/Mvc/Dispatcher.php(362): Zee\BotGuard\Pub\Controller\Challenge->actionIndex(Object(XF\Mvc\ParameterBag))
#6 src/XF/Mvc/Dispatcher.php(264): XF\Mvc\Dispatcher->dispatchClass('Zee\\BotGuard:Ch...', 'Index', Object(XF\Mvc\RouteMatch), Object(Zee\BotGuard\Pub\Controller\Challenge), NULL)
#7 src/XF/Mvc/Dispatcher.php(121): XF\Mvc\Dispatcher->dispatchFromMatch(Object(XF\Mvc\RouteMatch), Object(Zee\BotGuard\Pub\Controller\Challenge), NULL)
#8 src/XF/Mvc/Dispatcher.php(63): XF\Mvc\Dispatcher->dispatchLoop(Object(XF\Mvc\RouteMatch))
#9 src/XF/App.php(2824): XF\Mvc\Dispatcher->run()
#10 src/XF.php(814): XF\App->run()
#11 index.php(23): XF::runApp('XF\\Pub\\App')
#12 {main}

Request state
array(4) {
  ["url"] => string(11) "/bot-guard/"
  ["referrer"] => string(44) "/threads/162291/"
  ["_GET"] => array(0) {
  }
  ["_POST"] => array(0) {
  }
}

Code:
ErrorException: XF Bot Guard CAPTCHA provider issue during render: selected provider Roi\ALTCHACAPTCHA:ALTCHACAPTCHA (Roi\ALTCHACAPTCHA\Captcha\ALTCHACAPTCHA) is not usable. Reason: custom_configuration_unverified. The custom CAPTCHA provider is class-compatible, but Bot Guard cannot independently verify its credential configuration. src/XF/Error.php:81
Generated by: Unknown account Jun 14, 2026 at 2:01 PM

Stack trace
#0 src/XF.php(270): XF\Error->logError('XF Bot Guard CA...', false)
#1 src/addons/Zee/BotGuard/Service/CaptchaProviderResolver.php(830): XF::logError('XF Bot Guard CA...')
#2 src/addons/Zee/BotGuard/Service/CaptchaProviderResolver.php(323): Zee\BotGuard\Service\CaptchaProviderResolver->logError('XF Bot Guard CA...')
#3 src/addons/Zee/BotGuard/Pub/Controller/Challenge.php(515): Zee\BotGuard\Service\CaptchaProviderResolver->logResolutionIssue(Array, 'render')
#4 src/addons/Zee/BotGuard/Pub/Controller/Challenge.php(160): Zee\BotGuard\Pub\Controller\Challenge->renderBotGuardCaptchaHtml()
#5 src/XF/Mvc/Dispatcher.php(362): Zee\BotGuard\Pub\Controller\Challenge->actionIndex(Object(XF\Mvc\ParameterBag))
#6 src/XF/Mvc/Dispatcher.php(264): XF\Mvc\Dispatcher->dispatchClass('Zee\\BotGuard:Ch...', 'Index', Object(XF\Mvc\RouteMatch), Object(Zee\BotGuard\Pub\Controller\Challenge), NULL)
#7 src/XF/Mvc/Dispatcher.php(121): XF\Mvc\Dispatcher->dispatchFromMatch(Object(XF\Mvc\RouteMatch), Object(Zee\BotGuard\Pub\Controller\Challenge), NULL)
#8 src/XF/Mvc/Dispatcher.php(63): XF\Mvc\Dispatcher->dispatchLoop(Object(XF\Mvc\RouteMatch))
#9 src/XF/App.php(2824): XF\Mvc\Dispatcher->run()
#10 src/XF.php(814): XF\App->run()
#11 index.php(23): XF::runApp('XF\\Pub\\App')
#12 {main}

Request state
array(4) {
  ["url"] => string(11) "/bot-guard/"
  ["referrer"] => string(44) "/threads/162291/"
  ["_GET"] => array(0) {
  }
  ["_POST"] => array(0) {
  }
}

Thanks, will look into this now. As you are probably aware from the messages, Bot Guard is still working - but with default XenForo CAPTCHA as a fallback, since there seems to be some issue there.

I will provide an update on this.
 
With previous version of this addon altcha captcha was working.

Code:
ErrorException: XF Bot Guard CAPTCHA fallback provider used during render: effective provider hCaptcha (XF\Captcha\HCaptcha). src/XF/Error.php:81
Generated by: Unknown account Jun 14, 2026 at 2:01

Stack trace
#0 src/XF.php(270): XF\Error->logError('XF Bot Guard CA...', false)
#1 src/addons/Zee/BotGuard/Service/CaptchaProviderResolver.php(830): XF::logError('XF Bot Guard CA...')
#2 src/addons/Zee/BotGuard/Service/CaptchaProviderResolver.php(334): Zee\BotGuard\Service\CaptchaProviderResolver->logError('XF Bot Guard CA...')
#3 src/addons/Zee/BotGuard/Pub/Controller/Challenge.php(515): Zee\BotGuard\Service\CaptchaProviderResolver->logResolutionIssue(Array, 'render')
#4 src/addons/Zee/BotGuard/Pub/Controller/Challenge.php(160): Zee\BotGuard\Pub\Controller\Challenge->renderBotGuardCaptchaHtml()
#5 src/XF/Mvc/Dispatcher.php(362): Zee\BotGuard\Pub\Controller\Challenge->actionIndex(Object(XF\Mvc\ParameterBag))
#6 src/XF/Mvc/Dispatcher.php(264): XF\Mvc\Dispatcher->dispatchClass('Zee\\BotGuard:Ch...', 'Index', Object(XF\Mvc\RouteMatch), Object(Zee\BotGuard\Pub\Controller\Challenge), NULL)
#7 src/XF/Mvc/Dispatcher.php(121): XF\Mvc\Dispatcher->dispatchFromMatch(Object(XF\Mvc\RouteMatch), Object(Zee\BotGuard\Pub\Controller\Challenge), NULL)
#8 src/XF/Mvc/Dispatcher.php(63): XF\Mvc\Dispatcher->dispatchLoop(Object(XF\Mvc\RouteMatch))
#9 src/XF/App.php(2824): XF\Mvc\Dispatcher->run()
#10 src/XF.php(814): XF\App->run()
#11 index.php(23): XF::runApp('XF\\Pub\\App')
#12 {main}

Request state
array(4) {
  ["url"] => string(11) "/bot-guard/"
  ["referrer"] => string(44) "/threads/162291/"
  ["_GET"] => array(0) {
  }
  ["_POST"] => array(0) {
  }
}

Code:
ErrorException: XF Bot Guard CAPTCHA provider issue during render: selected provider Roi\ALTCHACAPTCHA:ALTCHACAPTCHA (Roi\ALTCHACAPTCHA\Captcha\ALTCHACAPTCHA) is not usable. Reason: custom_configuration_unverified. The custom CAPTCHA provider is class-compatible, but Bot Guard cannot independently verify its credential configuration. src/XF/Error.php:81
Generated by: Unknown account Jun 14, 2026 at 2:01 PM

Stack trace
#0 src/XF.php(270): XF\Error->logError('XF Bot Guard CA...', false)
#1 src/addons/Zee/BotGuard/Service/CaptchaProviderResolver.php(830): XF::logError('XF Bot Guard CA...')
#2 src/addons/Zee/BotGuard/Service/CaptchaProviderResolver.php(323): Zee\BotGuard\Service\CaptchaProviderResolver->logError('XF Bot Guard CA...')
#3 src/addons/Zee/BotGuard/Pub/Controller/Challenge.php(515): Zee\BotGuard\Service\CaptchaProviderResolver->logResolutionIssue(Array, 'render')
#4 src/addons/Zee/BotGuard/Pub/Controller/Challenge.php(160): Zee\BotGuard\Pub\Controller\Challenge->renderBotGuardCaptchaHtml()
#5 src/XF/Mvc/Dispatcher.php(362): Zee\BotGuard\Pub\Controller\Challenge->actionIndex(Object(XF\Mvc\ParameterBag))
#6 src/XF/Mvc/Dispatcher.php(264): XF\Mvc\Dispatcher->dispatchClass('Zee\\BotGuard:Ch...', 'Index', Object(XF\Mvc\RouteMatch), Object(Zee\BotGuard\Pub\Controller\Challenge), NULL)
#7 src/XF/Mvc/Dispatcher.php(121): XF\Mvc\Dispatcher->dispatchFromMatch(Object(XF\Mvc\RouteMatch), Object(Zee\BotGuard\Pub\Controller\Challenge), NULL)
#8 src/XF/Mvc/Dispatcher.php(63): XF\Mvc\Dispatcher->dispatchLoop(Object(XF\Mvc\RouteMatch))
#9 src/XF/App.php(2824): XF\Mvc\Dispatcher->run()
#10 src/XF.php(814): XF\App->run()
#11 index.php(23): XF::runApp('XF\\Pub\\App')
#12 {main}

Request state
array(4) {
  ["url"] => string(11) "/bot-guard/"
  ["referrer"] => string(44) "/threads/162291/"
  ["_GET"] => array(0) {
  }
  ["_POST"] => array(0) {
  }
}

The issue is identified, and I am patching it now. I will release a new 1.2.9 that patches custom CAPTCHA providers. Give me about half hour, or so.
 
With previous version of this addon altcha captcha was working.

Code:
ErrorException: XF Bot Guard CAPTCHA fallback provider used during render: effective provider hCaptcha (XF\Captcha\HCaptcha). src/XF/Error.php:81
Generated by: Unknown account Jun 14, 2026 at 2:01 

Stack trace
#0 src/XF.php(270): XF\Error->logError('XF Bot Guard CA...', false)
#1 src/addons/Zee/BotGuard/Service/CaptchaProviderResolver.php(830): XF::logError('XF Bot Guard CA...')
#2 src/addons/Zee/BotGuard/Service/CaptchaProviderResolver.php(334): Zee\BotGuard\Service\CaptchaProviderResolver->logError('XF Bot Guard CA...')
#3 src/addons/Zee/BotGuard/Pub/Controller/Challenge.php(515): Zee\BotGuard\Service\CaptchaProviderResolver->logResolutionIssue(Array, 'render')
#4 src/addons/Zee/BotGuard/Pub/Controller/Challenge.php(160): Zee\BotGuard\Pub\Controller\Challenge->renderBotGuardCaptchaHtml()
#5 src/XF/Mvc/Dispatcher.php(362): Zee\BotGuard\Pub\Controller\Challenge->actionIndex(Object(XF\Mvc\ParameterBag))
#6 src/XF/Mvc/Dispatcher.php(264): XF\Mvc\Dispatcher->dispatchClass('Zee\\BotGuard:Ch...', 'Index', Object(XF\Mvc\RouteMatch), Object(Zee\BotGuard\Pub\Controller\Challenge), NULL)
#7 src/XF/Mvc/Dispatcher.php(121): XF\Mvc\Dispatcher->dispatchFromMatch(Object(XF\Mvc\RouteMatch), Object(Zee\BotGuard\Pub\Controller\Challenge), NULL)
#8 src/XF/Mvc/Dispatcher.php(63): XF\Mvc\Dispatcher->dispatchLoop(Object(XF\Mvc\RouteMatch))
#9 src/XF/App.php(2824): XF\Mvc\Dispatcher->run()
#10 src/XF.php(814): XF\App->run()
#11 index.php(23): XF::runApp('XF\\Pub\\App')
#12 {main}

Request state
array(4) {
  ["url"] => string(11) "/bot-guard/"
  ["referrer"] => string(44) "/threads/162291/"
  ["_GET"] => array(0) {
  }
  ["_POST"] => array(0) {
  }
}

Code:
ErrorException: XF Bot Guard CAPTCHA provider issue during render: selected provider Roi\ALTCHACAPTCHA:ALTCHACAPTCHA (Roi\ALTCHACAPTCHA\Captcha\ALTCHACAPTCHA) is not usable. Reason: custom_configuration_unverified. The custom CAPTCHA provider is class-compatible, but Bot Guard cannot independently verify its credential configuration. src/XF/Error.php:81
Generated by: Unknown account Jun 14, 2026 at 2:01 PM

Stack trace
#0 src/XF.php(270): XF\Error->logError('XF Bot Guard CA...', false)
#1 src/addons/Zee/BotGuard/Service/CaptchaProviderResolver.php(830): XF::logError('XF Bot Guard CA...')
#2 src/addons/Zee/BotGuard/Service/CaptchaProviderResolver.php(323): Zee\BotGuard\Service\CaptchaProviderResolver->logError('XF Bot Guard CA...')
#3 src/addons/Zee/BotGuard/Pub/Controller/Challenge.php(515): Zee\BotGuard\Service\CaptchaProviderResolver->logResolutionIssue(Array, 'render')
#4 src/addons/Zee/BotGuard/Pub/Controller/Challenge.php(160): Zee\BotGuard\Pub\Controller\Challenge->renderBotGuardCaptchaHtml()
#5 src/XF/Mvc/Dispatcher.php(362): Zee\BotGuard\Pub\Controller\Challenge->actionIndex(Object(XF\Mvc\ParameterBag))
#6 src/XF/Mvc/Dispatcher.php(264): XF\Mvc\Dispatcher->dispatchClass('Zee\\BotGuard:Ch...', 'Index', Object(XF\Mvc\RouteMatch), Object(Zee\BotGuard\Pub\Controller\Challenge), NULL)
#7 src/XF/Mvc/Dispatcher.php(121): XF\Mvc\Dispatcher->dispatchFromMatch(Object(XF\Mvc\RouteMatch), Object(Zee\BotGuard\Pub\Controller\Challenge), NULL)
#8 src/XF/Mvc/Dispatcher.php(63): XF\Mvc\Dispatcher->dispatchLoop(Object(XF\Mvc\RouteMatch))
#9 src/XF/App.php(2824): XF\Mvc\Dispatcher->run()
#10 src/XF.php(814): XF\App->run()
#11 index.php(23): XF::runApp('XF\\Pub\\App')
#12 {main}

Request state
array(4) {
  ["url"] => string(11) "/bot-guard/"
  ["referrer"] => string(44) "/threads/162291/"
  ["_GET"] => array(0) {
  }
  ["_POST"] => array(0) {
  }
}

Hey there, I just released v1.2.9 which should resolve this issue. Can you please upgrade, and let me know if your custom CAPTCHA provider now works as expected? Thank you!
 
A false 404 error with the path /bot-guard/collect has appeared in Google's console. Any recommendations on how to best resolve this? So far, the only thing I can think of is editing the template and adding a robots directive to prevent indexing the page with the error.
 
Back
Top Bottom