Skip to main content
Secured Accounts uses the same <botshield-verify> element as BotShield Gate. With the offer on and a platform-user-ref that is not yet secured, the element draws the Link with BotShield ID chip instead of the verify button. This page covers what is specific to that chip. For everything else, see Web component. The widget renders the chip only. Your page owns any heading, explanation or signed-in line around it.
The 3.3 widget (3.0.12) is the current /sdk.js. A page pinned to an earlier 3.0 version labels the chip Link BotShield ID and can’t show the Link surface without a gate. See Widget versions.

Attributes

state is set by the widget: idle, verifying, verified or failed. Read it, do not write it.

When the chip appears

In every row except the first two, the widget stays usable as a gate.

Chip states

Each state is the chip, a title over a short line, with at most one small link under it on a desktop. On a phone the chip opens BotShield directly. There is no QR code and no code.

The code

The code has 6 characters from the letters and digits ABCDEFGHJKLMNPQRSTUVWXYZ23456789. It lasts 5 minutes and works once. On a desktop the code is always shown beside the QR code, so a person whose camera cannot scan can type it at app.botshield.ai/link.

The two refusals

Both refusals keep one BotShield ID to one account on your platform. Neither changes any existing link. botshield:failure.reason carries whichever name BotShield sent. Handle both.

Events

All events bubble and cross the Shadow DOM boundary, so you can listen on the element, a parent, or document.

botshield:success

Fired when the person confirmed.
Verify the token on your server before you act on it.

botshield:presence

Fired when BotShield’s answer about the account changes: whether it is secured right now, with no tap. The detail is { state, fresh_until }, and state: "none" means not, or no longer, secured. See Staying in sync.

botshield:presence-error

Fired once, with { reason: "stream_unavailable" }, when the widget cannot hold its live connection. The widget then asks every 60 seconds instead. Fired when a code is created, for platforms that draw their own code and countdown.

botshield:failure

detail.reason is always present. These reasons are specific to Secured Accounts. For the reasons shared with BotShield Gate, such as origin_not_allowed and gate_not_active, see Web component. An Unavailable result is not an accusation. It means the account was not secured this time.

Methods

verify(), reset() and getToken() work as they do for a gate. A call to verify() from your code is not a user gesture, so on a desktop the widget cannot open a new tab. It goes straight to the QR code and the code.

Styling

The widget renders in a closed Shadow DOM. Style it through these parts: