diff --git a/config/install/hcaptcha.settings.yml b/config/install/hcaptcha.settings.yml
index 0cce2c0..baf8032 100644
--- a/config/install/hcaptcha.settings.yml
+++ b/config/install/hcaptcha.settings.yml
@@ -5,3 +5,4 @@ widget:
   theme: ''
   size: ''
   tabindex: 0
+cacheable: false
diff --git a/config/schema/hcaptcha.schema.yml b/config/schema/hcaptcha.schema.yml
index 192c383..2de6531 100644
--- a/config/schema/hcaptcha.schema.yml
+++ b/config/schema/hcaptcha.schema.yml
@@ -13,6 +13,9 @@ hcaptcha.settings:
     hcaptcha_src:
       type: string
       label: 'hCaptcha javascript resource URL'
+    cacheable:
+      type: boolean
+      label: 'Make captcha cacheable'
     widget:
       type: mapping
       label: 'Widget settings'
diff --git a/hcaptcha.module b/hcaptcha.module
index 4f764bc..a9919a3 100644
--- a/hcaptcha.module
+++ b/hcaptcha.module
@@ -26,6 +26,7 @@ function hcaptcha_captcha($op, $captcha_type = '') {
         $renderer = \Drupal::service('renderer');
         $hcaptcha_site_key = $config->get('site_key');
         $hcaptcha_secret_key = $config->get('secret_key');
+        $hcaptcha_cacheable = $config->get('cacheable');
 
         if (!empty($hcaptcha_site_key) && !empty($hcaptcha_secret_key)) {
           $attributes = [
@@ -35,7 +36,7 @@ function hcaptcha_captcha($op, $captcha_type = '') {
             'data-size' => $config->get('widget.size'),
             'data-tabindex' => $config->get('widget.tabindex'),
           ];
-          $hcaptcha = new HCaptcha($hcaptcha_site_key, $hcaptcha_secret_key, $attributes);
+          $hcaptcha = new HCaptcha($hcaptcha_site_key, $hcaptcha_secret_key, $hcaptcha_cacheable, $attributes);
           $captcha = $hcaptcha->getWidget('hcaptcha_captcha_validation');
 
           $hcaptcha_src = $config->get('hcaptcha_src');
@@ -74,12 +75,13 @@ function hcaptcha_captcha_validation($solution, $response, $element, $form_state
 
   $hcaptcha_site_key = $config->get('site_key');
   $hcaptcha_secret_key = $config->get('secret_key');
+  $hcaptcha_cacheable = $config->get('cacheable');
 
   if (!isset($_POST['h-captcha-response']) || empty($_POST['h-captcha-response']) || empty($hcaptcha_secret_key)) {
     return false;
   }
 
-  $captcha = new HCaptcha($hcaptcha_site_key, $hcaptcha_secret_key, array(), new Drupal8Post());
+  $captcha = new HCaptcha($hcaptcha_site_key, $hcaptcha_secret_key, $hcaptcha_cacheable, array(), new Drupal8Post());
   $captcha->validate($_POST['h-captcha-response'], \Drupal::request()->getClientIp());
 
   if ($captcha->isSuccess()) {
diff --git a/src/Form/HCaptchaAdminSettingsForm.php b/src/Form/HCaptchaAdminSettingsForm.php
index 74b4ad2..2823570 100644
--- a/src/Form/HCaptchaAdminSettingsForm.php
+++ b/src/Form/HCaptchaAdminSettingsForm.php
@@ -64,6 +64,13 @@ class HCaptchaAdminSettingsForm extends ConfigFormBase {
       '#type' => 'textfield',
     ];
 
+    $form['general']['hcaptcha_cacheable'] = [
+      '#default_value' => $config->get('cacheable'),
+      '#description' => $this->t('Make the captcha cacheable, this might generate unknown CAPTCHA session ID issues.'),
+      '#title' => $this->t('Cacheable'),
+      '#type' => 'checkbox',
+    ];
+
     // Widget configurations.
     $form['widget'] = [
       '#type' => 'details',
@@ -110,6 +117,7 @@ class HCaptchaAdminSettingsForm extends ConfigFormBase {
     $config
       ->set('site_key', $form_state->getValue('hcaptcha_site_key'))
       ->set('secret_key', $form_state->getValue('hcaptcha_secret_key'))
+      ->set('cacheable', $form_state->getValue('hcaptcha_cacheable'))
       ->set('widget.theme', $form_state->getValue('hcaptcha_theme'))
       ->set('widget.size', $form_state->getValue('hcaptcha_size'))
       ->set('widget.tabindex', $form_state->getValue('hcaptcha_tabindex'))
diff --git a/src/HCaptcha/HCaptcha.php b/src/HCaptcha/HCaptcha.php
index 3595da8..c18421e 100644
--- a/src/HCaptcha/HCaptcha.php
+++ b/src/HCaptcha/HCaptcha.php
@@ -18,14 +18,16 @@ class HCaptcha
 
   protected $siteKey = '';
   protected $secretKey = '';
+  protected $cacheable = false;
   protected $errors = array();
   private $success = false;
   private $validated;
   private $requestMethod;
 
-  public function __construct($site_key, $secret_key, $attributes = array(), RequestMethod $requestMethod = null) {
+  public function __construct($site_key, $secret_key, $cacheable, $attributes = array(), RequestMethod $requestMethod = null) {
     $this->siteKey = $site_key;
     $this->secretKey = $secret_key;
+    $this->cacheable = $cacheable;
     $this->requestMethod = $requestMethod;
 
     if (!empty($attributes) && is_array($attributes)) {
@@ -46,11 +48,16 @@ class HCaptcha
     $widget['form']['captcha_response'] = array(
       '#type' => 'hidden',
       '#value' => 'hCaptcha no captcha',
+      '#cache' => ['max-age' => 0],
     );
 
     // As the validate callback does not depend on sid or solution, this
     // captcha type can be displayed on cached pages.
-    $widget['cacheable'] = true;
+    $widget['cacheable'] = $this->cacheable;
+
+    if (!$this->cacheable) {
+      \Drupal::service('page_cache_kill_switch')->trigger();
+    }
 
     $widget['form']['hcaptcha_widget'] = array(
       '#markup' => '<div' . $this->getAttributesString() . '></div>',
