Guides

Quick start

Create keys, identify a visitor in the browser, read the result with a secret key on your server, and act on it. The whole integration in five steps.

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 $3 of credit, and development keys are free.

  1. Step 1: Create an account and choose a region

    Sign up for the Fingerly dashboard. The owner of a new organization chooses where its visitor data will live, and the choice is permanent. See regions.

  2. 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.

    Allowed origin
    http://localhost:3000
    
  3. Step 3: Identify a visitor in the browser

    npm install @fingerly/web-js
    
    login.ts
    import { load } from '@fingerly/web-js'
    
    const fingerly = await load({ apiKey: 'fly_pk_us_development_…' })
    
    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 }),
      })
    })
    
  4. 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 requestId names.

    import { load } from '@fingerly/node'
    
    const fingerly = load({ secretKey: process.env.FINGERLY_SECRET_KEY! })
    const event = await fingerly.events.get('01a0a84b-e6a2-7c09-9f51-0b3d7a26c8e4')
    
  5. 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 { load, FingerlyAPIError } from '@fingerly/node'
    
    const fingerly = load({ 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.003 each. 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.