The token
The attestation token is the same signed JWT that BotShield Gate issues. See Verify on your server for the format, the issuer, the 120-second lifetime and the published keys. Secured Accounts adds three claims.
A token without
trusted_since is never trusted. Do not read a missing date as “secured since the beginning”.
Verify with the API
POST /sdk/verify-token needs no API key. Pass your organization ID as audience and a token issued for any other organization is rejected.
data.data. An error arrives with HTTP 200 as data.error. An invalid or expired token is a normal result with valid: false and a reason.
replayed: true means this token was checked before. A token is meant to be checked once. From November 15, 2026, a second check returns valid: false.
Verify locally
This example usesjose.
What to check
- The token is valid and not expired.
organization_idis your organization.request_idis the one your page sent with the token.trustedistrue.
When there is no token
GET /verification/status reports the same result by request_id. After the request completes, the response carries trusted and first_time. For a refused or failed request, reason is already_trusted, rebind_requires_prior_id or unavailable.
Webhook events
Set up delivery and signature verification first. See the Webhooks overview.account.secured and account.unlinked have no environment field, and the handle is the same in Development and Production. One endpoint receives both environments. If you test with Development keys against the endpoint your production system reads, account events from your tests arrive there too.account.secured
Sent once when a person secures an account: a new link, not a later pass on the same link.
The event does not carry your
platform-user-ref. To connect it to your user, match it to the gate.human_verified event for the same confirmation, which carries the same handle and the request_id your page received, or search the Console registry by your user reference.
account.unlinked
Sent when a link ends. The next confirmation on that account is a first-time confirmation again.
gate.human_verified
Secured Accounts adds three fields to this event.
The other fields are described in Webhook events. (
census is the API’s name for BotShield Gate.)
gate.unavailable
A request to secure an account that does not complete ends with this event.
A request produces one terminal event. Use
request_id as your idempotency key.
Keep your records current
Do not rely on webhooks alone. A later gate pass on the account reports the current
trusted value in its token. See Staying in sync for the whole pattern.