Overview
This tutorial walks through implementing Fingerprint to prevent new account fraud, where bad actors create multiple fake accounts to exploit sign-up bonuses, free trials, or other incentives. You’ll begin with a starter app that includes a mock sign-up page and a basic registration flow. From there, you’ll add the Fingerprint JavaScript agent to identify each visitor and use server-side logic with Fingerprint data to detect and block multiple account creations from the same device. For simplicity, the sample will block new account sign-ups from devices that have already registered one account, but in practice, you might choose to add friction, require additional verification, or set higher thresholds instead. By the end, you’ll have a sample app that limits each visitor to one legitimate account and can be adapted to fit your own fraud prevention and business logic. This tutorial uses just plain JavaScript and a Node server with SQLite on the back end. For language- or framework-specific setups, see our quickstarts.Estimated time: < 15 minutes
Prerequisites
Before you begin, make sure you have the following:- A copy of the starter repository (clone with Git or download as a ZIP)
- Node.js (v20 or later) and npm installed
- Your favorite code editor
- Basic knowledge of JavaScript
1. Create a Fingerprint account and get your API keys
- Sign up for a free Fingerprint trial, or log in if you already have an account.
- After signing in, go to the API keys page in the dashboard.
- Save your public API key, which you’ll use to initialize the Fingerprint JavaScript agent.
- Create and securely store a secret API key for your server. Never expose it on the client side. You’ll use this key on the backend to retrieve full visitor information through the Fingerprint Server API.
2. Set up your project
- Clone or download the starter repository and open it in your editor.
Terminal
- This tutorial will be using the
new-account-fraudfolder. The project is organized as follows:
Project structure
- Install dependencies:
Terminal
- Copy or rename
.env.exampleto.env, then add your Fingerprint API keys:
Terminal
- Start the server:
Terminal
- Visit
http://localhost:3000to view the mock sign-up page from the starter app. Create a few test accounts using different usernames and clicking Sign up. Then open the page in a different browser or incognito window and try creating another account from the same device. By default, the app allows unlimited account creations per device.
3. Add Fingerprint to the front end
In this step, you’ll load the Fingerprint client when the page loads and trigger identification when the user clicks Sign up. The client returns both avisitorId and a requestId. Instead of relying on the visitorId from the browser, you’ll send the requestId to your server along with the signup payload. The server will then call the Fingerprint Events API to securely retrieve the full identification details, including the verified visitorId and risk signals such as browser tampering or bot activity.
- At the top of
public/index.js, load the Fingerprint JavaScript agent:
public/index.js
- Make sure to change
regionto match your workspace region (e.g.,eufor Europe,apfor Asia,usfor Global (default)). - Near the bottom of
public/index.js, the Sign up button already has an event handler for submitting the credentials. Inside this handler, request visitor identification from Fingerprint using theget()method and include the returnedrequestIdwhen sending the signup request to the server:
public/index.js
get() method sends signals collected from the browser to Fingerprint servers, where they are analyzed to identify the visitor. The returned requestId acts as a reference to this specific identification event, which your server can later use to fetch the full visitor details.
For lower latency in production, check out our documentation on using Sealed Client Results to return full identification details as an encrypted payload from the get() method.
4. Receive and use the request ID to get visitor insights
Next, pass therequestId through to your signup logic, initialize the Fingerprint Server API client, and fetch the full visitor identification event so you can access the trusted visitorId and Smart Signals.
- In the back end, the
server/server.jsfile defines the API routes for the app. Update the/api/signuproute there to also extractrequestIdfrom the request body and pass it into theattemptSignupfunction.
server/server.js
- The
server/accounts.jsfile contains the logic for handling signups. Start by importing and initializing the Fingerprint Server API client there, and load your environment variables withdotenv.
server/accounts.js
- Make sure to change
regionto match your workspace region (e.g.,EUfor Europe,APfor Asia,Globalfor Global (default)). - Update the
attemptSignupfunction to acceptrequestIdand use it to fetch the full identification event details from Fingerprint:
server/accounts.js
requestId, the Fingerprint server client will retrieve the full data for the visitor identification request. The returned object will contain the visitor ID, IP address, device, and browser details, and Smart Signals like bot detection, browser tampering detection, VPN detection, and more.
You can see a full example of the event structure and test it with your own device in our demo playground.
For additional checks to ensure the validity of the data coming from your front end, view how to protect from client-side tampering and replay attacks in our documentation.
5. Block bots and suspicious devices
This optional step uses the Bot Detection and Suspect Score Smart Signals,
which are only available on paid plans.
event object includes the Bot Detection Smart Signal that flags automated activity, making it easy to reject bot traffic.
This signal returns good for known bots like search engines, bad for automation tools, headless browsers, or other signs of automation, and notDetected when no bot activity is found.
- Continuing in the
attemptSignupfunction inserver/accounts.js, check the bot signal returned in theeventobject:
server/accounts.js
- Below the bot detection check, add a condition that reads the Suspect Score from the
eventobject and blocks the login if it exceeds a chosen threshold (for example, 20):
server/accounts.js
6. Prevent multiple account sign-ups per device
Next, use the trustedvisitorId from the event object to enforce a one-account-per-device rule. If the same device (visitorId) tries to create another account, reject the sign-up. In production, you may choose to allow a limited number of accounts per device, require additional verification, or flag the new account for review. (This example simplifies account creation logic for demonstration purposes.)
Note: The starter app includes a SQLite database with a table already created for you:
SQLite database tables
- Add a helper function to the bottom of the
server/accounts.jsfile to check if the device has already been used to create an account:
server/accounts.js
- Update
attemptSignupto retrieve thevisitorIdand use it to enforce the one device per account rule and record successful logins:
server/accounts.js
- Update the SQL statement to store the
visitorIdalong with the account details so it can be used later for device verification checks:
Terminal
This is a minimal example to show how to implement Fingerprint. In a real
application, make sure to use proper security practices, input validation,
password handling, and account management logic that align with your
production standards.
7. Test your implementation
Now that everything is wired up, you can test the full protected signup flow.- Start your server if it isn’t already running and open http://localhost:3000:
Terminal
- Reset the database by clicking on Reset demo DB at the bottom of the page.
- Create a new account in your browser, you should see a success response. Then try to create another account and you’ll see that the attempt fails.
- Open an incognito/private window and try creating another account. The attempt will still be rejected because the device has already registered one account.
- Bonus: Test the flow using a headless browser or automation tool to see bot detection in action. A sample script is available in
test-bot.js. While your app is running, run the script withnode test-bot.jsin your terminal and observe that the automated signups are blocked.