Hapi
TrustCaptcha – Bot protection

Hapi CAPTCHA Integration

Wire TrustCaptcha into a Hapi route or pre-handler in just a few lines of TypeScript. Stop bot-driven spam on logins, signups and contact forms — without breaking your Joi schemas or payload parsing. EU-hosted, GDPR-ready, no image puzzles.

Quickstart

How the integration works

1. Create a CAPTCHA

Create a user account or log in with an existing one. Then create a new CAPTCHA or select an existing one. If you’re unsure whether TrustCaptcha is right for you, try our CAPTCHA service risk-free for 14 days at no cost.

On the CAPTCHA overview page, you will find all the important information, such as the site key and licence key, and you can also create your API key. Allow your websites to access your CAPTCHA by simply adding them to the access authorised domain list in the CAPTCHA security rules.

Start of the CAPTCHA creation form.
CAPTCHA security rules of a demo CAPTCHA.

2. Add the CAPTCHA widget to your form

Drop the TrustCaptcha widget into the HTML form your Hapi route serves. The widget runs the CAPTCHA in the background and adds a hidden tc-verification-token field on submit, which arrives on request.payload like any other input.

contact.html
HTML
<script type="module" src="https://cdn.trustcomponent.com/trustcaptcha/3.0.x/trustcaptcha.esm.min.js"></script>

<form method="post" action="/contact">
    <input type="email" name="email" required>
    <trustcaptcha-component sitekey="<your_site_key>"></trustcaptcha-component>
    <button type="submit">Send</button>
</form>

The CAPTCHA widget will then be displayed inside your form:

CAPTCHA done

Need detailed information about the CAPTCHA widget integration?
For the full widget reference — including themes, languages, custom design and more — please read our documentation.

Read the documentation

3. Validate the token in your Hapi route

In your Hapi route handler, take the verification token from request.payload, look up the result via our Node.js library, and decide whether to accept the request.

First, install our TrustCaptcha Node.js library:

Install
bash
npm i @hapi/hapi @trustcomponent/trustcaptcha-nodejs

Then validate the token inside your Hapi route and act on the result:

server.ts
TypeScript
import Hapi from "@hapi/hapi";
import { TrustCaptcha } from "@trustcomponent/trustcaptcha-nodejs";

const server = Hapi.server({ port: 8080 });

server.route({
  method: "POST",
  path: "/contact",
  handler: async (request, h) => {
    const payload = request.payload as Record<string, string>;
    const token = payload["tc-verification-token"] ?? "";

    try {
      const result = await TrustCaptcha.getVerificationResult("<your_api_key>", token);
      if (!result.verificationPassed || result.score > 0.5) {
        return h.response("CAPTCHA verification failed.").code(400);
      }
    } catch {
      return h.response("CAPTCHA verification failed.").code(400);
    }

    // CAPTCHA passed — process the request
    return "Thanks!";
  },
});

await server.start();

Need detailed information about the Hapi CAPTCHA integration?
For full step-by-step instructions — including a reusable pre-extension for projects with several protected routes — please read our documentation.

Read the documentation

Other backend framework instead of Hapi?
If you use a different framework, pick the matching recipe here. If your framework isn’t listed, your software developers can integrate the verification themselves using our documentation or ask our support team for a pre-built integration.

Actix Web
ASP.NET Core
Axum
Django
Echo
Express
FastAPI
Fastify
Fiber
Flask
Gin
Hapi
Laravel
Micronaut
NestJS
Next.js
Quarkus
Ruby on Rails
Sinatra
Spring Boot
Symfony

4. Congratulations 🎉

You are now protected by TrustCaptcha - congratulations!

CAPTCHA done

FAQs

Where in a Hapi app does the CAPTCHA verification go?
Inside the route handler that receives the form submission, or — for several protected routes — inside a route-level pre-extension. Both have access to request.payload, where the CAPTCHA token (default name: "tc-verification-token") arrives like any other field.
Do I need a payload-parser plugin?
No. Hapi parses application/x-www-form-urlencoded and application/json automatically — request.payload is already the parsed object, so no extra plugin is required to read the CAPTCHA token.
How do I run the verification before the route handler?
Use Hapi's pre extension. Define a small async function that reads the token, calls our Node.js library and returns either h.continue (proceed) or h.response(...).takeover() (short-circuit with a 400). Add it to the route's options under pre.
Will Joi validation strip the CAPTCHA token from the payload?
It can. If you validate the payload with @hapi/joi (or joi), declare tc-verification-token in the schema or call .unknown(true) so the token is preserved before your pre-extension or handler reads it.
How do I share the SDK across many routes?
Build a single TrustCaptcha instance once at startup and store it on the server's app object: server.app.trustCaptcha = new TrustCaptcha({ apiKey }). Inside any pre-extension or handler, read it via request.server.app.trustCaptcha — no rebuild per request.
Losing leads to CAPTCHAs?

TrustCaptcha blocks spam and bots, not customers. No puzzles, GDPR-ready, EU-hosted.

CAPTCHA start
CAPTCHA done
Puzzle-free UX
Runs in the background while visitors type — so more people finish your forms and fewer drop off.
GDPR-ready
EU-hosted and privacy-first: no cookies, encrypted transmission, automatic cleanup — with ready-to-use legal resources.
Multi-layer Security
Adaptive protection plus intelligent risk scoring stops abuse early — even when attack traffic spikes.
Full Control
Fine-tune sensitivity, set allow/block lists, and use geoblocking — you decide how strict verification should be.

Protect your Hapi application with TrustCaptcha in just a few steps!

  • EU-hosted & GDPR-ready
  • No puzzles
  • Try free for 14 days