Dashboard

Security Best Practices for Integrators

A verification protects you only if your integration cannot be tricked into accepting a result that is not real, not yours or not for this transaction. These practices apply to every product.

1. Publishable keys and secrets

Credential Where it may live
Client key vhk_live_… Browser widgets, mobile apps, request headers
Client secret vhsk_live_… Your server's secret store only
Webhook signing secret whsec_… Your server's secret store only

2. Confirm every result on your server

The browser is under the visitor's control. Never grant access because of:

Instead confirm on your server with one of:

Method Proves
Signed webhook Event from VerifyHuman for your account, with environment, product and status
Evidence Receipt Signed result of a verification made with your key
POST /api/validate (client secret) A VerifyHuman widget token issued for your account
POST /api/v1/verify-age/validate (client secret) A VerifyAge pass of your account meeting your minimum age

3. Check product, environment and policy

For every result you accept, check:

Store VerifyAge minimum ages on the server (Wizard, hosted page or VerifyFlow), never in browser code. See VerifyAge.

4. Prevent replay and substitution

5. Signed webhooks

See Webhooks.

6. Evidence Receipts

7. Safe redirects

8. Rotating API keys

Create a new key, deploy it, confirm it works, then deactivate the old key. Rotate immediately if a secret may have been exposed. See API Keys.

9. Browser integration limits

10. Test and Live separation

Keep Test and Live credentials, pages and webhook endpoints separate, and make your production configuration fail closed if a Test key is deployed. See Test and Live Environments.