This guide takes you from an empty account to a verified identification. It uses the browser SDK and Node.js; every step has the same shape in other languages. New accounts start with $1 of credit, and development keys are free.
Step 1: Create an account
Sign in to the Fingerly dashboard with your email address, and open the link we send you, or with Google, Microsoft or GitHub. Your first sign-in creates the account. Then name your organization and its first project.
Step 2: Create a public key
In Integration > SDK keys, create a public key in the development environment and add the origin your app runs on. A public key with no allowed origins refuses every request.
http://localhost:3000Step 3: Identify a visitor in the browser
npm install @fingerly/web-jsimport { load } from '@fingerly/web-js' // consent: 'granted' only once you have consent (or another lawful basis) const fingerly = await load({ apiKey: 'fly_pk_development_…', consent: 'granted' }) form.addEventListener('submit', async (event) => { event.preventDefault() const { requestId } = await fingerly.identify({ tag: 'login' }) await fetch('/api/login', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ email: form.email.value, password: form.password.value, requestId }), }) })The SDK collects nothing until consent is
granted, andpendingis the default. Here it is granted at load; to wait for your consent banner instead, see privacy and consent.Step 4: Create a secret key and read the result on your server
Create a secret key in the same environment and store it in your server's environment. The secret is shown once.
When the login request reaches your backend, read the event its
requestIdnames.import { Fingerly } from '@fingerly/node' const fingerly = new Fingerly({ secretKey: process.env.FINGERLY_SECRET_KEY! }) const event = await fingerly.events.get('01a0a84b-e6a2-7c09-9f51-0b3d7a26c8e4')Step 5: Decide
Check the event belongs to this action and is recent, then use the level to choose what happens. Start by recording what you would have done before enforcing it.
import { Fingerly, FingerlyAPIError } from '@fingerly/node' const fingerly = new Fingerly({ secretKey: process.env.FINGERLY_SECRET_KEY! }) const MAX_AGE_MS = 2 * 60 * 1000 export async function decide(orderId: string, requestId: string) { let event try { event = await fingerly.events.get(requestId) } catch (error) { if (error instanceof FingerlyAPIError && error.status === 404) return 'refuse' throw error } if (event.tag !== 'checkout:' + orderId) return 'refuse' if (Date.now() - Date.parse(event.occurred_at) > MAX_AGE_MS) return 'refuse' if (event.suspect_level === 'high') return 'review' if (event.suspect_level === 'medium') return 'challenge' return 'allow' }
Try it
Open your page, log in, then open Identification > Events in the dashboard. Your identification is there with its visitor, score and signals. Now try a private window, a VPN or an automated browser, and watch the score change.
Go live
- Create production public and secret keys with your real origins, and deploy them.
- Production identifications cost $0.0025 each, less once a month passes 250,000. Add funds or turn on auto top-up in Settings > Billing.
- Review your risk weights and threshold against staging traffic before you enforce decisions.
- Add webhooks if you want results pushed to you.