Integrating Verisoul Fraud Prevention with Qualtrics

Last updated: December 30, 2025

This guide explains how to integrate Verisoul into your Qualtrics surveys to identify fake users, bots, and multi-accounting in real-time. This integration uses a combination of client-side JavaScript to collect device signals and a server-side Web Service call to receive a risk decision.


Prerequisites

  • A Verisoul Project ID and API Key (from the Verisoul Dashboard).

  • Access to the Survey Flow and JavaScript editor in Qualtrics.


Step 1: Install the Verisoul SDK

To collect device signals, you must add the Verisoul JavaScript snippet to your survey.

  1. In your Qualtrics survey, go to the Look & Feel menu.

  2. Click on the General tab.

  3. Find the Header section and click edit.

  4. Switch to the source view (<>) and paste the following script:

HTML

<script async src="https://js.verisoul.ai/prod/bundle.js" verisoul-project-id="YOUR_PROJECT_ID"></script><script>// Helper to ensure Verisoul is available before call
  !function(e){if(e.Verisoul)return;const r=[],t={},o=new Proxy(t,{get:(e,o)=>o in t?t[o]:(...e)=>new Promise(((t,n)=>r.push([o,e,t,n]))),set:(e,r,o)=>(t[r]=o,!0)});e.Verisoul=o;const n=()=>{Object.keys(t).length&&r.splice(0).forEach((([e,r,o,n])=>{try{Promise.resolve(t[e](...r)).then(o,n)}catch(e){n(e)}}))},c=document.querySelector("script[verisoul-project-id]"),s=()=>r.splice(0).forEach((([,,,e])=>e(new Error("Failed to load Verisoul SDK"))));if(!c)return void s();c.addEventListener("load",n,{once:!0}),c.addEventListener("error",(()=>{clearInterval(i),s()}),{once:!0});const i=setInterval((()=>{Object.keys(t).length&&(clearInterval(i),n())}),40)}(window);
</script>

[!IMPORTANT]

Replace YOUR_PROJECT_ID with your actual Verisoul Project ID.


Step 2: Capture the Session ID

You need to grab the unique session_id generated by Verisoul and save it as an Embedded Data field in Qualtrics.

  1. Go to Survey Flow.

  2. Add an Embedded Data element at the very top of your flow. Create a field named session_id.

  3. In your first survey question (e.g., the Consent or Intro screen), click on the JavaScript icon (js).

  4. Add the following code to the addOnReady function:

JavaScript

Qualtrics.SurveyEngine.addOnReady(function() {
    var self = this;
    window.Verisoul.session().then(function(result) {
        // Save the Verisoul session_id to Qualtrics Embedded Data
        Qualtrics.SurveyEngine.setEmbeddedData('session_id', result.session_id);
    }).catch(function(e) {
        console.error("Verisoul failed", e);
    });
});

Step 3: Configure the Web Service (Risk Decision)

Once the session_id is captured, you use a Web Service block to ask Verisoul if the user is "Real," "Suspicious," or "Fake."

  1. In Survey Flow, add a Web Service block after the block where the session_id is captured.

  2. URL: https://api.prod.verisoul.ai/session/authenticate

  3. Method: POST

  4. Custom Headers:

    • x-api-key: YOUR_VERISOUL_API_KEY

    • Content-Type: application/json

  5. Body Parameters (JSON): Map the following structure to your Embedded Data:

    • session_id = ${e://Field/session_id}

    • account.id = ${e://Field/ResponseID} (or your own internal User ID)

Setting Response Data

Under the "Set Embedded Data" section of the Web Service block, map the Verisoul response to new Qualtrics fields:

  • decision = decision

  • account_score = account_score

  • reason = reasons


Step 4: Take Action in Survey Flow

Now that you have the decision field (Real, Suspicious, or Fake), you can branch your survey logic.

  1. Add a Branch element below the Web Service.

  2. Condition: If Embedded Data decision is equal to Fake.

  3. Action: Add an End of Survey element within the branch to immediately disqualify the user.


Summary of Data Flow

Component

Purpose

Header Script

Loads the Verisoul tracking environment.

JavaScript Task

Requests a unique session_id from the browser.

Web Service

Sends the session_id to Verisoul's API to get a risk score.

Branch Logic

Filters out bots and fraudsters based on the API response.