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.
Put a container in your form and confirm the token on your server. Most visitors see a tick and nothing else.
<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.
| Level | Asks to confirm at | Refuses at | Proof of work |
|---|---|---|---|
standard | 0.35 | 0.70 | 16 bits |
strict | 0.25 | 0.55 | 17 bits |
maximum | 0.15 | 0.40 | 18 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.
| Attribute | What it does |
|---|---|
data-sitekey | Required. The key from the console. |
data-action | A label, returned as-is by siteverify. Use it to tell a login apart from a signup. |
data-theme | auto, light or dark. |
data-size | normal or compact. |
data-lang | en or zh-CN. Follows the page language when unset. |
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");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.
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.
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.
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.
Add a zone, point your registrar at our name servers, manage records: weighted answers, health-checked records, ALIAS at the apex, zone-file import.
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.