Verify

Prove there is a person, without asking them to prove it.

Put a container in your form and confirm the token on your server. Most visitors see a tick and nothing else.

01

In the page

A token, and the one check that makes it worth somethingThe widget checks the visitor in the page and puts a token in a hidden form field. Your server receives the submission and confirms that token once, server to server.Visitorthe widget runs its checksA tokenin a hidden form fieldYour serverhas the submissionConfirmed onceserver to serverCheck the hostname and the action, not only success.A second confirmation of the same token fails.
The widget checks the visitor in the page and leaves a token in the form. That token is worth nothing until your server confirms it once, which is the second half of this page.
<script src="https://verify.yunzheng.space/v1.js?v=1.4.0" async defer></script>

<form method="post" action="/login">
  <div class="orbit-verify" data-sitekey="ovk_…" data-action="login"></div>
  <button type="submit">Sign in</button>
</form>

The script renders every .orbit-verify container on the page and injects a hidden field named orbit-verify-response into the surrounding form. Create the site key on the Verify page in the console.

Each site key carries a security level. Every level applies the same checks: User-Agent against the platform the page reports, the request headers a browser sets and page script cannot, browser APIs against the claimed version, interaction and timing, and network and device history. The level sets the risk score at which the visitor is asked to confirm, the score at which the request is refused, and the cost of the proof of work.

LevelAsks to confirm atRefuses atProof of work
standard0.350.7016 bits
strict0.250.5517 bits
maximum0.150.4018 bits

Recommended: maximum for sign-up, sign-in, password reset and payment; strict for comment and contact forms; standard for low-value submissions. The live widget on this site runs at maximum. Set the level per key in the console.

If your pages send a Content-Security-Policy, list both verification hosts in connect-src: https://verify.yunzheng.space https://verify.edge.yunzheng.space. The widget asks the nearest edge first and falls back to the first host on its own, so naming only the first still works — it just gives up the nearer answer.

AttributeWhat it does
data-sitekeyRequired. The key from the console.
data-actionA label, returned as-is by siteverify. Use it to tell a login apart from a signup.
data-themeauto, light or dark.
data-sizenormal or compact.
data-langen or zh-CN. Follows the page language when unset.
02

On your server

The token in the form field is worth nothing until you confirm it. Confirm it once, server-side, before you act on the submission.

const r = await fetch("https://verify.yunzheng.space/v1/siteverify", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    secret: process.env.ORBIT_VERIFY_SECRET,
    response: req.body["orbit-verify-response"],
    remoteip: req.ip,
  }),
});
const v = await r.json();
// { success, challenge_ts, hostname, action, score, "error-codes": [] }
if (!v.success) return res.status(400).send("verification failed");
Check hostname and action as well as success. A token is only evidence that somebody passed a check — checking those two is what ties it to this form on your site.

A token can be confirmed once. A second confirmation of the same token fails, which is what stops a captured submission from being replayed.

03

What it does not do

  • No cookies, no iframe, and nothing loaded from a third party.
  • No keystrokes and no pointer coordinates are collected.
  • Visitor addresses are never stored in the clear.
  • Nothing that would let one site's visitors be recognised on another.
04

Questions

Will visitors have to click something?

Usually not. The check runs by itself and shows a tick. Where the signals are poor the widget turns into a single checkbox — one click, no image puzzles, ever.

Does it work without JavaScript?

No. The check runs in the browser, so a visitor with scripting disabled cannot complete it. If you must serve those visitors, keep a non-form path for them.

Next

Related

Getting started

How an Orbit account is organised, what lives where in the console, and the shortest path from signing in to serving a name from our network.

DNS hosting

Add a zone, point your registrar at our name servers, manage records: weighted answers, health-checked records, ALIAS at the apex, zone-file import.

Connect a hostname

Delegate the whole domain, delegate one hostname, or add a CNAME and leave your DNS where it is. What each one costs you and when to pick it.

← All documentation