Dashboard

Manage your TapHuman integration and view quick stats.

Integration Status
Active
Usage
0 / 1,000
Configuration
API Keys
Plan
Free Tier

Configure Your Keys

Your Client ID and Secret Key authenticate your requests and secure your integration. Use this section to regenerate keys if they are compromised, and define the specific domains (CORS) where your widgets are allowed to render.

Public Key (Client ID)
loading...
Secret Key
loading...
Allowed Domains (CORS)

Comma-separated list of domains allowed to use your widget (e.g. mygame.com, example.com). Localhost and your Sandbox are implicitly allowed. By default, you are capped at 50 domains. Please contact support if you require an expanded limit.

Saved!

Test in the Sandbox

Before writing any code, try out the different gamified experiences here. Note: If you select multiple games, our system will randomly deliver them to your users on every load, further complicating targeted attacks by machine-learning bots. This sandbox is connected to your live keys and simulates exactly what your users will see. It also outputs the raw payload data in real-time so you can understand the cryptographic handshake.

Active

Payload Explorer

Frontend Payload Received
[System] Waiting for interaction...
Expected Backend Signature
[System] Waiting for interaction...

Age Verification

Protect age-restricted content and purchases with a privacy-minimal age gate. Choose a self-declared minimum-age check (L1) or a server-calculated age check from a birthdate (L2) that never stores the birthdate. Try it in the preview, then copy the embed snippet.

Policy

Verification mode
Minimum age (13–25)
Grant TTL (seconds, 300–86400)
Embed purpose
Market experience

Presentation only. This choice changes the embed URL and preview, not the saved age policy or server threshold.

Saved!

Allowed Domains

Comma-separated list of domains allowed to embed your widgets. This list is shared between the CAPTCHA widgets and the age gate. Localhost and the sandbox are implicitly allowed.

Saved!

Keys

Public Key (Client ID)
loading...
The age gate uses your existing workspace secret to sign grants. Manage (unlock / regenerate) your secret key from your API Keys tab.

Sandbox Preview

This preview embeds the age gate against your live keys and simulates exactly what your users will see. It shows only the threshold result — no birthdate is displayed or stored.

Embed Snippet

Copy the frontend widget into your HTML, and verify the signed grant on your backend using your secret key.

Frontend (HTML/JS)

Backend Verification (Node.js)

Add to Your App

We've generated custom code snippets for you below. These snippets automatically update based on the game you select in the sandbox. Simply copy the frontend widget into your HTML, and use the backend snippet to cryptographically verify the payloads.

Frontend Integration (HTML/JS)

Backend Verification

<?php
$payload   = $_POST['payload'];   // raw string
$signature = $_POST['signature']; // hex digest

$parsed = json_decode($payload, true);

// 1. Prevent Replay Attacks (5-minute expiration)
$age_ms = abs(time() * 1000 - $parsed['timestamp']);
if ($age_ms > 5 * 60 * 1000) {
    http_response_code(403);
    die('Expired Token');
}

// 2. Verify HMAC-SHA256 Signature
$expected = hash_hmac('sha256', $payload, $_ENV['TAPHUMAN_SECRET_KEY']);

if (!hash_equals($expected, $signature)) {
    http_response_code(403);
    die('Invalid Signature');
}

// 3. Verified — proceed with form submission
echo json_encode(['success' => true]);
import hmac, hashlib, json, time, os
from flask import request, jsonify

@app.route('/api/verify-captcha', methods=['POST'])
def verify_captcha():
    payload   = request.form['payload']   # raw string
    signature = request.form['signature'] # hex digest
    parsed    = json.loads(payload)

    # 1. Prevent Replay Attacks (5-minute expiration)
    age_ms = abs(time.time() * 1000 - parsed['timestamp'])
    if age_ms > 5 * 60 * 1000:
        return 'Expired Token', 403

    # 2. Verify HMAC-SHA256 Signature
    expected = hmac.new(
        os.environ['TAPHUMAN_SECRET_KEY'].encode(),
        payload.encode(),
        hashlib.sha256
    ).hexdigest()

    if not hmac.compare_digest(expected, signature):
        return 'Invalid Signature', 403

    # 3. Verified — proceed with form submission
    return jsonify(success=True)

Monitor & Scale

You're ready for production! Your first 1,000 successful human solves every calendar month are completely free. Monitor your usage here, configure alert notifications, and add a payment method when you're ready to scale beyond the free tier.

Usage: 0 / 1,000 (Free Quota)

TapHuman Plans

Free
For personal sites and small launches. Available to everyone.
$0 · 1,000 solves per month
  • ✓ 1,000 verified solves per month
  • ✓ Full playable challenge library
  • ✓ Server-side HMAC verification
  • ✓ Accessibility path included
Install the plugin
EARLY ADOPTER PROGRAM
God Tier
For the first 100 sites brave enough to ditch surveillance-based CAPTCHAs.
$0 · free, forever
  • ✓ 100,000 CAPTCHA solves per month — free, forever
  • ✓ 100x the standard free tier
  • ✓ Locked in for life — never expires, never downgrades
  • ✓ Priority support from the founding team
  • ✓ Claim with an early-adopter invitation
Claim God Tier
Pro
For sites with serious traffic. Available to everyone.
$0.009 · per verified solve (~$9 per 1,000)
  • ✓ Unlimited monthly solves
  • ✓ Pay only for verified human solves — bots are free
  • ✓ No flat fees, no contracts
  • ✓ Everything in Free, at any scale

Plans and pricing as shown on taphuman.io/pricing.

Notifications

Sent!
Saved!
TapHuman Pulse

Feedback that feels playable.

Build a branded NPS campaign, tune the post-score experience, and preview the customer journey without leaving your TapHuman dashboard.

Development preview
Pulse persistence is currently available only in the reviewed local emulator environment. Production sending remains disabled.
Launchpad Start from a proven moment

Apply a complete campaign direction, then tune every detail in the builder.

Draft builder Unsaved preview
Preview only
Sending stays locked until sender, domain, retention, and provider setup are complete.