Yandex Cloud
Search
Contact UsGet started
  • Blog
  • Pricing
  • Documentation
  • All Services
  • System Status
    • Featured
    • Infrastructure & Network
    • Data Platform
    • Containers
    • Developer tools
    • Serverless
    • Security
    • Monitoring & Resources
    • ML & AI
    • Business tools
  • All Solutions
    • By industry
    • By use case
    • Economics and Pricing
    • Security
    • Technical Support
    • Customer Stories
    • Gateway to Russia
    • Cloud for Startups
    • Education and Science
  • Blog
  • Pricing
  • Documentation
Yandex project
© 2025 Yandex.Cloud LLC
Security in Yandex Cloud
  • Key security principles
  • Division of responsibility
  • Compliance
  • Security measures on the Yandex Cloud side
  • Security tools available to cloud service users
    • All tutorials
      • Installing an NGINX Ingress controller with a Certificate Manager certificate
      • Building a CI/CD pipeline in GitLab with serverless products
      • Creating an interactive serverless application using WebSocket
      • Creating an L7 load balancer in Application Load Balancer with a Smart Web Security profile
      • API Gateway protection with Smart Web Security
      • Adding an HTML page to work with SmartCaptcha
      • SmartCaptcha in Android apps
      • Invisible SmartCaptcha in Android apps
      • SmartCaptcha in an Android app on Flutter
      • SmartCaptcha in iOS apps
  • User support policy during vulnerability scanning
  • Security bulletins
  • Public IP address ranges
  1. Tutorials
  2. Application security
  3. Adding an HTML page to work with SmartCaptcha

Adding an HTML page to work with Yandex SmartCaptcha

Written by
Yandex Cloud
Updated at April 28, 2025

You can embed SmartCaptcha in your Android and iOS apps via WebView, a component that allows you to display web pages inside an application.

To do this, you need to host an HTML page with CAPTCHA code on your server and then embed the link to this page in the app.

HTML page with a CAPTCHA code
<!DOCTYPE html>
<html>
  <head>
    <title>SmartCaptcha Mobile</title>
    <meta charset="UTF-8" />
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1, shrink-to-fit=no"
    />
    <script>
      function onSmartCaptchaReady() {
        if (!window.smartCaptcha) {
          throw new Error("SmartCaptcha is not present");
        }

        const params = getParameters();

        const widgetId = window.smartCaptcha.render(
          "captcha-container",
          params
        );

        window.smartCaptcha.subscribe(
          widgetId,
          "challenge-visible",
          handleChallengeVisible
        );

        window.smartCaptcha.subscribe(
          widgetId,
          "challenge-hidden",
          handleChallengeHidden
        );

        window.smartCaptcha.subscribe(widgetId, "success", handleSuccess);

        if (params.invisible) {
          window.smartCaptcha.execute(widgetId);
        }
      }

      function handleSuccess(token) {
        if (window.NativeClient) {
          window.NativeClient.onGetToken(token);
        } else {
          sendIos("captchaDidFinish", token);
        }
      }

      function handleChallengeVisible() {
        if (window.NativeClient) {
          window.NativeClient.onChallengeVisible();
        } else {
          sendIos("challengeDidAppear");
        }
      }

      function handleChallengeHidden() {
        if (window.NativeClient) {
          window.NativeClient.onChallengeHidden();
        } else {
          sendIos("challengeDidDisappear");
        }
      }

      function sendIos(...args) {
        if (args.length == 0) {
          return;
        }

        const message = {
          method: args[0],
          data: args[1] !== undefined ? args[1] : ""
        };

        if (window.webkit) {
          window.webkit.messageHandlers.NativeClient.postMessage(message);
        }
      }

      function getParameters() {
        const result = {};

        if (!window.location.search) {
          return result;
        }

        const queryParams = new URLSearchParams(window.location.search);

        queryParams.forEach((value, key) => {
          result[key] = value;
        });

        result.test = result.test === "true";
        result.invisible = result.invisible === "true";
        result.hideShield = result.hideShield === "true";
        result.webview = true;

        return result;
      }
    </script>

    <script
      src="https://smartcaptcha.yandexcloud.net/captcha.js?render=onload&onload=onSmartCaptchaReady"
      defer
    ></script>
  </head>

  <body>
    <noscript>
      You need to enable JavaScript to run this app.
    </noscript>
    <div id="captcha-container" class="smart-captcha" />
  </body>
</html>

You can also add a link to an HTML page on the Yandex Cloud server to your app.

https://smartcaptcha.yandexcloud.net/webview

After that, you will be able to embed SmartCaptcha in your mobile applications:

  • SmartCaptcha in Android apps.
  • Invisible SmartCaptcha in Android apps.
  • SmartCaptcha in an Android app on Flutter.
  • SmartCaptcha in iOS apps.

Was the article helpful?

Previous
API Gateway protection with Smart Web Security
Next
SmartCaptcha in Android apps
Yandex project
© 2025 Yandex.Cloud LLC