Contextual CAPTCHA for ticketing

Tickets for fans.
Not for bots.

FanVerify replaces the traffic-light puzzle with something scalpers can't script: a timed, hands-on challenge about the artist. Real fans breeze through it. Bot farms and touts hit a wall.

Integration
2 snippets
API shape
reCAPTCHA-compatible
Questions
Set by the artist or promoter
Try it livePick an artist
Checkout · 2 × General Admission
Oasis · Wembley Stadium
Demo control
fanverify-response
— awaiting verification —

Image CAPTCHAs are solved for $0.001

Solver farms and vision models clear traffic lights faster than humans do. They're a speed bump, not a wall.

Queues reward whoever has the most browsers

Virtual waiting rooms measure patience and bandwidth. Neither correlates with being a fan.

Fans get the resale price

Every ticket a bot wins is a ticket a fan buys back at 3×. The artist gets the blame.

How it works

Same integration story as any CAPTCHA. The difference is what happens inside the box.

  1. 01

    Widget renders in checkout

    One script tag and a div. The badge sits where your CAPTCHA used to. You tell it which artist via data-context.

  2. 02

    Fan clears three rounds

    The server composes a fresh, randomized challenge from that artist's knowledge pack. Drag, match, recall. Timed.

  3. 03

    Your server calls siteverify

    Exchange the token for a signed result with a 0–1 score. Gate inventory, cap quantities, or route to a slower lane.

Your artist, your questions

Promoters and artists set the questions

Nothing here is fixed. Every question comes from a knowledge pack that the artist, their label or the promoter owns and edits. Add the things only real fans know, drop anything you'd rather not ask, write tour-specific questions for a single on-sale, and pick how hard each event should be.

  • Bring your own facts
    Setlist trivia, fan-club lore, the support act, the city that opened the tour. If it's a fact, it can be a question.
  • Tune it per event
    Easy for a stadium general sale, hardcore for a 300-cap fan-club presale. Round types, counts and timers are all settings.
  • Use your own artwork
    Hold the rights to your covers? Add them to the pack and the sort and match rounds show real sleeves instead of generated ones. Far more fun than zebra crossings.
  • Approve before on-sale
    Preview every round type with your pack, sign off the copy and the voice, then lock it for the event.
json
// One entry in your pack. That's the whole job.
{
  "id": "tour-opener",
  "prompt": "Which city opened the Live '25 tour?",
  "answers": ["Cardiff"],
  "difficulty": 1
}

Eight challenge types, infinite variations

Every round is generated from verifiable facts: titles, dates, running orders, personnel. No lyrics, no audio, and artwork only when you hold the rights.

Play them all in the demo →
Speed of SoundLylaFearlessMine
Single choice · easy

The genuine article

One real song among three from other artists. If you know a few songs, you're in.

WonderwallYellowCardiganLive ForeverBody Better
Multi-select · easy

Spot the real ones

Which of these songs or albums are actually theirs? Decoys are genuine titles from other artists.

  • 1Definitely Maybe
  • 2(What's the Story) Morning Glory?
  • 3Be Here Now
  • 4Heathen Chemistry
Drag to sort · hardcore

Release order

Put a random subset of albums in the order they came out. Hardcore mode only.

StyleCardigan
1989
Blank Space
Folklore
ExileAugust
Drag to match

Which album?

Six tracks, three albums. Every track has to land on the right record.

Live ForeverWonderwallSlide AwayLylaColumbiaSongbird
Multi-select

On the record

Select every track from one album among B-sides and lookalikes from others.

  • 1Welcome to New York
  • 2Style
  • 3Shake It Off
  • 4Bad Blood
  • 5Clean
Drag to sort · hardcore

Running order

Six tracks from one album, in tracklist order. Hardcore mode only.

1996
19912026
Slider

Pin the year

Slide to the exact year of a release, a tour, a lineup change.

Tony McCarrol|

Spelling is forgiven. Close counts.

Free text

Deep cut

Personnel, producers, venues. Fuzzy-matched, so typos don't punish real fans.

If you've shipped reCAPTCHA, you've shipped this

A client snippet that fills a hidden fanverify-response field and a server call that returns success and a score. Works with any stack. Drop it into a queue page, a checkout, or a presale registration.

  • Form-encoded or JSON, your choice
  • Per-site allowed hostnames and contexts
  • Score threshold set per site, tunable per event
  • Knowledge packs are plain JSON: add an artist in an afternoon
html
<script src="https://fanverify.dev/fanverify.js" async defer></script>

<form action="/checkout" method="POST">
  <!-- context = which knowledge pack to challenge with -->
  <div class="fanverify"
       data-sitekey="fv_pk_live_…"
       data-context="oasis"
       data-callback="onFanVerified"></div>

  <button type="submit">Buy tickets</button>
</form>

Built to be annoying to automate

No single layer is unbeatable. Stacked, they turn a $0.001 solve into a slow, flaky, expensive one, which is the economics that kills scalping.

Answers never leave the server

Solutions are AES-GCM sealed inside the challenge token. The browser only ever sees the question.

Randomized composition

Rounds are assembled from a fact graph: random subsets, random distractors, random ordering. No two sessions share an answer key.

Interaction telemetry

Sorting and matching rounds need a real drag gesture. Speed and pointer signals are reported to the vendor as flags, so scripts stand out without real fans being penalised.

Timed, one-shot rounds

Each round has a server-enforced time limit, and every answer is final. There's no oracle to brute-force.

Single-use, short-lived tokens

Verification tokens expire in two minutes and can be redeemed exactly once at siteverify.

Rate limiting per IP

Challenge creation and answer submission are throttled independently, so a farm can't grind through the pool.

Give the front row back to the fans.

Run the full checkout demo with a real siteverify round-trip, then read the integration docs.