NAV Navbar
iOS (Swift) Android Web Pixel Privacy

Introduction

Download The iOS SDK Here.

Download The Android SDK Here.

Configure The Javascript Tag Here.

Configure The Privacy Policy Tag Here.

Configure The Web Pixel Here.

Welcome to the VeriPath SDK! You can use our SDK to obtain GDPR compliant user opt-ins for all your app and web data, and manage your privacy policy.

You’ll need an account to fully utilize our SDKs. If you don’t have one, you can get one here.

Each app SDK package includes sample apps so you can see how it can be done right in your IDE.

You can view code examples in the dark area to the right, and always feel free to reach out to developer support if you need a hand.

Installation

Here’s how to get it installed:

// You need to add the Veripath.framework package to your project.
//  This should be an embedded binary and a linked framework
// You have to import the AAR file in the project:
// Click on app module and right click -> new -> module
// Select the VeriPath SDK AAR.

// Then, in your app's gradle file, you'll need this:
compile 'com.google.android.gms:play-services:11.4.0'
compile 'com.google.code.gson:gson:2.8.0
// This is the required stylesheet.
// It should be placed in the <head> of your HTML code.
<link rel='stylesheet' id="veripath-css" href="//cdn.veripath.net/javascript-sdk/veripath.0.4.min.css" type="text/css" media="all" />

// This is the required javascript.
// It should be placed right after the <body> tag of your HTML code.
<script type="text/javascript" src="//cdn.veripath.net/javascript-sdk/veripath.0.4.min.js"></script>
/*
If you're mandating disclosures and consent on your own,
you can use a simple pixel to pass everything to us.

There is no installation needed, other than puting
the pixel code in the one place where consent is confirmed.
*/

<img src="https://api.veripath.net/pixel/v1/set-consent.png?param1=x&param2=y" />

/*
If you want to use our pixel as an inline HTML link, you can use it like this:
*/
<a href="https://api.veripath.net/pixel/v1/set-consent?param1=x&param2=y&redirect=https://www.mysite.com/confirmation_url" />
// This is the required javascript.
// It should be placed right after the <body> tag of your HTML code.
// It will search inline for the following HTML, and put your privacy policy in it:  <div id="VERIPATH_PRIVACY_POLICY"></div>
<script type="text/javascript" src="//cdn.veripath.net/javascript-sdk/veripath-privacy.0.3.1.min.js"></script>

To install, you have to add the relevant files to your project.

Permissions

// For Android versions earlier than 21:
<uses-permission android:name="android.permission.INTERNET"/>

If your app needs to prompt for specific permissions, make sure you do that :)

At a minimum, you must be able to connect to the internet.

Authentication

To authorize, use this code:

import UIKit
import Veripath

class ViewController: UIViewController, VeripathViewDelegate {
    @IBOutlet var vView: VeripathView!

    override func viewDidLoad() {
        super.viewDidLoad()
        vView.delegate = self

        // And now, we auth.
        vView.veripathSetup(sdkKey: "bosskey", publicKey: "lookatme", secretKey: "shhhh")
    }
}

// You'll have to create a view in your Main.storyboard for us.
// The class is VeripathView
// The module is Veripath
// And in our sample, we've named the view "VView"
// Initialize
public class VeripathApplication extends AppCompatActivity implements MainFragment.OnFragmentInteractionListener
{
    MainFragment m;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        FragmentManager fm = getSupportFragmentManager();

        // And now, we auth.
        m.veripathSetup("bosskey", "shhhh", "lookatme");
    }
}

// In your AndroidManifest.xml file, you need to name this class.
android:name=.VeripathApplication
// This javascript tag should be placed BEFORE you include the core javascript library, ideally after the opening of your <body> tag.
<script type="text/javascript">
    const VERIPATH_KEY = "bosskey";
    const VERIPATH_SECRET = "shhhh";
    const VERIPATH_PUBLIC = "lookatme";
</script>
<script type="text/javascript" src="//cdn.veripath.net/javascript-sdk/veripath.0.4.min.js"></script>
/*
The pixel needs to know your key so it can assign consent with your app.
This is done with a simple URL parameter:
key=bosskey
*/
// This javascript tag should be placed BEFORE you include the core javascript library, ideally after the opening of your <body> tag.
<script type="text/javascript">
    const VERIPATH_KEY = "bosskey";
</script>
<script type="text/javascript" src="//cdn.veripath.net/javascript-sdk/veripath-privacy.0.3.1.min.js"></script>

Make sure to replace bosskey with your SDK key.

Make sure to replace lookatme with your Public key.

Make sure to replace shhhh with your Secret key.

We use a whole bunch of keys in our SDK.

Ok, 3. We use 3 keys.

They are your SDK key, Public Key and Secret Key.

If you don’t have any Keys yet, you can get them in the Connect portal.

Launching The Overlay

To launch the overlay, use this code:

import UIKit
import Veripath

class ViewController: UIViewController, VeripathViewDelegate {
    // This is how to tell if we've gotten their permisisons already.
    func getPermissions(json: String) {
        print("Done!  Here are the permissions: ")
        print(json)
        vView.isHidden = true
    }

    @IBOutlet var vView: VeripathView!

    // We put in an "update permissions" button, right here.
    @IBAction func update(_ sender: Any) {
        // This will show the VeriPath screen, even if they've already went through it successfully.
        vView.isHidden = false
        vView.update(b: true)
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        vView.delegate = self

        // Set the flags here on what to show & hide.
        vView.showDeviceData(show: true);
        vView.showLocation(show: true);
        vView.showMatchingData(show: true);
        vView.showMeasurement(show: true);
        vView.showStorage(show: true);
        vView.showPersonalization(show: true);
        vView.showAds(show: true);
        vView.showContent(show: true);

        // Set the 3rd party users of this data, if any.
        // These are the users of your data that are NOT part of the standard IAB vendor list or custom vendor list managed in your VeriPath Connect Dashboard.
        vView.setDataUsers(vendors: ["Google", "Facebook", "VenPath"]);

        // Showing the PayForPrivacy dialog
        vView.showPayForPrivacy(show: true);

        // How much are you going to charge if you can't use their data?
        vView.setPrivacyPrice(privacy: "$2.99 / month");

        // Set your colors
        vView.setPrimary(r: 211, g: 211, b: 211)
        vView.setDarkPrimary(r: 128, g: 128, b: 128)
        vView.setAccent(r: 135, g:206 , b: 250)

        /*
         This is how to launch the VeriPath Permission Screen
         on the launch of the app.  It will always show, until they
         select some type of permission opt-in.
         */
        vView.veripathSetup(sdkKey: "bosskey", publicKey: "lookatme", secretKey: "shhhh")

        /*
         If you want to force the VeriPath Permission Screen
         to show on the next launch, even if it has been filled out,
         set showTime to a timestamp string for now.

         WARNING: DO NOT SET IT TO System.currentTimeMillis() !!!

         That will force the VeriPath Permission Screen to show on
         every-single-launch of the app.  Not good...
         */
        //vView.resetLaunch(developerValue: 2538052033)
    }
}
package demo.veripath.com.veripathsample;

import android.content.Intent;
import android.net.Uri;
import android.support.v4.app.FragmentManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import com.veripath.sdk.VeriPath.MainFragment;
import com.veripath.sdk.VeriPath.showVeripath;

public class MainActivity extends AppCompatActivity implements MainFragment.OnFragmentInteractionListener{

    MainFragment m;
    Button updateButton;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        try {
            /*
             This is how to launch the VeriPath Permission Screen
             on the launch of the app.  It will always show, until they
             select some type of permission opt-in.
            */
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            FragmentManager fm = getSupportFragmentManager();

            // We put in an "update permissions" button, right here.
            updateButton = findViewById(R.id.buttonUpdate);
            updateButton.setVisibility(View.GONE);
            m = (MainFragment) fm.findFragmentById(R.id.fragment);

            // Set the flags here on what to show & hide.
            m.showDeviceData(true);
            m.showLocation(true);
            m.showMatchingData(true);
            m.showMeasurement(true);
            m.showStorage(true);
            m.showPersonalization(true);
            m.showAds(true);
            m.showContent(true);

            // Set the 3rd party users of this data, if any.
            // These are the users of your data that are NOT part of the standard IAB vendor list or custom vendor list managed in your VeriPath Connect Dashboard.
            m.setDataUsers(vendors: ["Google", "Facebook", "VenPath"]);

            // Showing the PayForPrivacy dialog
            m.showPayForPrivacy(true);

            // How much are you going to charge if you can't use their data?
            m.setPrivacyPrice("$1.99 / month");

            // NOTE:  If you are displaying payForPrivacy, and you get a "false" value in your callback...
            // That means they confirmed that they want to pay.

            /*
            If you want to force the VeriPath Permission Screen
            to show on the next launch, even if it has been filled out,
            set showTime to a timestamp string for now.

            WARNING: DO NOT SET IT TO System.currentTimeMillis() !!!

            That will force the VeriPath Permission Screen to show on
            every-single-launch of the app.  Not good...
             */
            //Long showTime = Long.parseLong("1526918285");
            //m.resetLaunch(showTime);

            // This initializes the SDK.
            m.veripathSetup("bosskey", "shhhh", "lookatme");

            // Now let's show it all :)
            m.setOnShowVeripath(new showVeripath() {
                @Override
                public void success(String s) {
                    Log.d("Granted Permission", s);
                    updateButton.setVisibility(View.VISIBLE);
                    updateButton.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            startActivity(new Intent(getApplicationContext(),UpdateActivity.class));
                        }
                    });
                }
            });

            // This is how to tell if we've gotten their permisisons already.
            if (m.permissionsDone()) {
                // The user picked his preferences already.  Let's let them update if they choose.
                updateButton.setVisibility(View.VISIBLE);
                updateButton.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        startActivity(new Intent(getApplicationContext(),UpdateActivity.class));
                    }
                });
            }
        } catch (Exception e) {
            // Oh no!  Handle this...
        }
    }

    @Override
    public void onFragmentInteraction(Uri uri) {

    }
}
// This is the CSS styling, and should be placed in the <head> of your HTML code.
<style type="text/css">
/* Set your colors */
:root {
  --VERIPATH_MAIN_COLOR: gainsboro;
  --VERIPATH_ACCENT_COLOR: silver;
  --VERIPATH_ALT_COLOR: steelblue;
  --VERIPATH_BUTTON_COLOR: white;
}
</style>
<link rel='stylesheet' id="veripath-css" href="//cdn.veripath.net/javascript-sdk/veripath.0.4.min.css" type="text/css" media="all" />

// This is the Javascript configuration, and should be placed right after the opening <body> tag of your HTML code.
<script type="text/javascript">
    // VeriPath Config Data.
    const VERIPATH_KEY = "bosskey";
    const VERIPATH_SECRET = "shhhh";
    const VERIPATH_PUBLIC = "lookatme";
    const VERIPATH_SHOW_STORAGE = true;
    const VERIAPTH_SHOW_PERSONALISATION = true;
    const VERIPATH_SHOW_DEVICE = true;
    const VERIPATH_SHOW_MATCH = true;
    const VERIPATH_SHOW_LOCATION = true;
    const VERIPATH_SHOW_MEASUREMENT = true;
    const VERIPATH_SHOW_CONTENT = true;
    const VERIPATH_SHOW_ADS = true;

    // If you need to handle the user's consent decision in real time, this callback function will be called with the users consent choices as the first parameter.
    //const VERIPATH_CALLBACK = "handlePerms";

    // Optional Pay For Privacy Config Data
    //const VERIPATH_SHOW_PAY_FOR_PRIVACY = true;
    //const VERIPATH_PRIVACY_COST = 1.99;
    //const VERIPATH_STRIPE_KEY = 'pk_test_aaaaaaaaaaaaaaaaaaaaaaaa';
    //const VERIPATH_STRIPE_ACTION = "actionFunctionForStripe()";

    // If the user is authenticated at this point, you should set their email address here.  This will remove the email address ask from the consent form, making it a smoother process.
    //const VERIPATH_USER = "[email protected]";

    // These are the users of your data that are NOT part of the standard IAB vendor list or custom vendor list managed in your VeriPath Connect Dashboard.
    const VERIPATH_DATA_USERS = ["Google", "Facebook", "VenPath"];
</script>
<script type="text/javascript" src="//cdn.veripath.net/javascript-sdk/veripath.0.4.min.js"></script>
/*
When you collect consent for your disclosures, you need to build it as a JSON array to pass it to the VeriPath pixel.

We will also need to send a "vpid" which is the MD5 hash of the lowercased email address for this consenting user, and the lowercase ISO-2 country code for the user.

Other parameters are optional.
*/

/* For custom vendors, not in your VeriPath custom vendor list, use their name. */
/* For custom vendors in the VeriPath custom vendor list, use "VERIPATH1" where "1" is their ID. */
/* For iab vendors, use their iab vendor ID. */

/* This maps to the IAB permission: Precise Geographic Location Data */
location={"internal_use":true,"google_analytics,mixpanel,VERIPATH1,1,2,3,4":true}

/* This maps to the IAB permission: Linking Devices */
device_data={"internal_use":true,"google_analytics,mixpanel,VERIPATH1,1,2,3,4":true}

/* This maps to the IAB permission: Matching Data To Offline Sources */
match_data={"internal_use":true,"google_analytics,mixpanel,VERIPATH1,1,2,3,4":true}

/* This maps to the IAB permission: Measurement */
measurement={"internal_use":true,"google_analytics,mixpanel,VERIPATH1,1,2,3,4":true}

/* This maps to the IAB permission: Storage And Access Of Information */
storage={"internal_use":true,"google_analytics,mixpanel,VERIPATH1,1,2,3,4":true}

/* Maps to the IAB permission: Personalisation */
personalization={"internal_use":true,"google_analytics,mixpanel,VERIPATH1,1,2,3,4":true}

/* This maps to the IAB permission: Ad Selection Reporting And Delivery */
ads={"internal_use":true,"google_analytics,mixpanel,VERIPATH1,1,2,3,4":true}

/* This maps to the IAB permission: Content Delivery Selection And Reporting */
content={"internal_use":true,"google_analytics,mixpanel,VERIPATH1,1,2,3,4":true}

/* This is the user identifier:  A MD5 hash of the lowercased email address. */
vpid=md5(lowercase([email protected]))

/* This is the lowercase ISO-2 country code */
country=us

/*
If you want us to redirect to a URL, rather than display a pixel, use the redirect parameter.

Note:  If we redirect, any success or error codes & messages will be sent as session
variables:  'code' and 'message'.
*/
redirect=https://www.yoursite.com

// These fields are optional, but helpful.
timestamp // The unix timestamp when this happened.
device_os_version // The os version of the users device
device_os // The OS of the users device
device_make // The make of the users device
device_model // The model name / number of the users device
app_version // The version number for your app
app_release // The release number for your app
distinct_id // A distinct identifier for this uer, such as an internal USER id
ip_address // The IP address of the user when they gave consent
// This is the Javascript configuration, and should be placed right after the opening <body> tag of your HTML code.
<script type="text/javascript">
    // VeriPath Config Data.
    const VERIPATH_KEY = "bosskey";
    const VERIPATH_ADDRESS = "Your Company, Inc. <br />123 Fake St.<br />New York, NY 10030<br />USA";
</script>
<script type="text/javascript" src="//cdn.veripath.net/javascript-sdk/veripath-privacy.0.3.1.min.js"></script>

// This is the div that will get populated with your privacy policy.
<div id="VERIPATH_PRIVACY_POLICY"></div>

Make sure to replace bosskey with your SDK key.

Make sure to replace lookatme with your Public key.

Make sure to replace shhhh with your Secret key.

If you are collecting Demograph data, call showDemographics(true). Else, call showDemographics(false). Do this for all of the available data types.

The VeriPath SDK should show when the app launches. It will show up every launch until the user completes it. After that, it won’t show when the app launches ever again.

When VeriPath is completed, you’ll have access to the user’s granted permissions in a JSON array. From there, your app can handle the specific user permissions however you’d like.

This all comes in to the Success callback function in the example.

VeriPath Overlay

Updating Permissions

To create an update button, use this code:

// We put in an "update permissions" button in our ViewController that's extending our VeripathViewDelegate.
@IBAction func update(_ sender: Any) {
    // This will show the VeriPath screen, even if they've already went through it successfully.
    vView.isHidden = false
    vView.update(b: true)
}
package demo.veripath.com.veripathsample;

import android.net.Uri;
import android.support.v4.app.FragmentManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

import com.veripath.sdk.VeriPath.MainFragment;
import com.veripath.sdk.VeriPath.showVeripath;

public class UpdateActivity extends AppCompatActivity implements MainFragment.OnFragmentInteractionListener {

    MainFragment m;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        try {
            /*
            This is how to launch the VeriPath Permission Screen
            whenever the "update permissions" buttin is pressed.
             */
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_update);
            FragmentManager fm = getSupportFragmentManager();
            m = (MainFragment) fm.findFragmentById(R.id.fragment2);

            // Set the flags here on what to show & hide.
            m.showDeviceData(true);
            m.showLocation(true);
            m.showMatchingData(true);
            m.showMeasurement(true);
            m.showStorage(true);
            m.showPersonalization(true);
            m.showAds(true);
            m.showContent(true);

            // Set the 3rd party users of this data, if any.
            // If you comment this line out, it will just say "Internal" to the user, denoting you need this data internally.
            m.setDataUsers(vendors: ["Google", "Facebook", "VenPath"]);

            // Showing the PayForPrivacy dialog
            m.showPayForPrivacy(true);

            // How much are you going to charge if you can't use their data?
            m.setPrivacyPrice("$1.99 / month");

            // This initializes the SDK.
            m.veripathSetup("SDK_KEY", "SECRET_KEY", "PUBLIC_KEY");

            // NOTE:  If you are displaying payForPrivacy, and you get a "false" value in your callback...
            // That means they confirmed that they want to pay.

            /*
                This line forces the launcher to show, even if they've submitted
                it already.
            */
            m.forceLauncher(true);

            // Now let's show it all :)
            m.setOnShowVeripath(new showVeripath() {
                @Override
                public void success(String s) {
                        /*
                        When the user is done, you'll get a permission JSON object here.
                        Do with it what you will.
                         */
                    Log.d("Updated Permissions: ", s);
                    m.forceLauncher(false);
                }
            });
        } catch (Exception e) {
            // Oh no!  Handle this...
        }
    }

    @Override
    public void onFragmentInteraction(Uri uri) {

    }
}
<script type="text/javascript">
    // Place this somewhere after your javascript configuration and veripath require code.
    showVeripath();
</script>
// Since you own disclosures, this is on you to show any consent updates.

Make sure to replace bosskey with your SDK key.

Make sure to replace lookatme with your Public key.

Make sure to replace shhhh with your Secret key.

The user should be able to change their approved VeriPath permissions at any time. To do this, create a button or link somewhere in your app that invokes the VeriPath UI.

Pay For Privacy

// Showing the PayForPrivacy dialog
vView.showPayForPrivacy(show: true);

// Set the price that you want to charge
vView.setPrivacyPrice(privacy: "$1.99 / month");
// Showing the PayForPrivacy dialog
m.showPayForPrivacy(true);

// Set the price that you want to charge
m.setPrivacyPrice("$1.99 / month");
// This is not included with the pixel.
// Showing the PayForPrivacy dialog
const VERIPATH_SHOW_PAY_FOR_PRIVACY = true;

// Set the cost as it will be sent to Stripe
const VERIPATH_PRIVACY_COST = 1.99;

// Set the display cost
const VERIPATH_PRIVACY_COST_DISPLAY = "$1.99 / month";

// Set your stripe information.  Your key, the page stripe will post the charge to, and your friendly display name.
const VERIPATH_STRIPE_KEY = "your_stripe_key";
const VERIPATH_STRIPE_ACTION = 'hello';
const VERIPATH_STRIPE_NAME = 'VeriPath';

If you want to give your users the choice to send you data, or pay for their privacy – This is how to do it.

You can set it to be $0.99 / mo, $1.99 / month, $24.99 / year, etc. It’s what you’re going to show to the user, so be sure to match it with your IAP or Stripe product / billing plan.

Some users don’t want to send you their data, but they still want to use your service.

This function enables that transaction to take place.

If they choose to keep the data you’re requesting private, you get to charge them for it.

In the VeriPath Success callback function for the app SDKs, you’ll get an array of what they are allowing you to do (and not do) with their data.

If you have Pay For Privacy enabled, you can use this to trigger an In App Purchase (IAP.)

On the web, Pay For Privacy payments are handled through your Stripe account.

VeriPath Pay For Privacy

Working With Callbacks

This is how to handle the consent decision with a callback:

func getPermissions(json: String) {
    print("Granted Permission: ")
    print(json)
}
m.setOnShowVeripath(new showVeripath() {
    @Override
    public void success(String s) {
        Log.d("Granted Permission: ", s);
    }
});
<script type="text/javascript">
    const VERIPATH_CALLBACK = "handlePerms";

    function handlePerms(perms) {
        console.log("Granted Permissions: ");
        console.log(perms);
      }
</script>
<script type="text/javascript" src="//cdn.veripath.net/javascript-sdk/veripath.0.4.min.js"></script>
// Since you've handled consent on your own, and passed us the resulting decision through our pixel, you can do whatever you want with the decision.

When the user completes the consent process, you may need to run some code based on their choices. There are a number of ways to handle this, but the most customizable is with a callback function.

Reading Cookies

/* Besides the standardized iab SharedPreferences, we set some SharedPreferences for custom vendors. */

/*
Key: Veripath_Custom_Vendors
Value: (below)
*/

{
    "features": [{
        "id": 1,
        "vendors": [{
            "id": "VERIPATH1",
            "name": "VeriPath, Inc."
        }, {
            "id": "VERIPATH2",
            "name": "VenPath, Inc."
        }, {
            "id": "custom_1",
            "name": "Google Analytics"
        }]
    }, {
        "id": 2,
        "vendors": [{
            "id": "VERIPATH1",
            "name": "VeriPath, Inc."
        }, {
            "id": "VERIPATH2",
            "name": "VenPath, Inc."
        }, {
            "id": "custom_1",
            "name": "Google Analytics"
        }]
    }, {
        "id": 3,
        "vendors": [{
            "id": "VERIPATH1",
            "name": "VeriPath, Inc."
        }, {
            "id": "VERIPATH2",
            "name": "VenPath, Inc."
        }, {
            "id": "custom_1",
            "name": "Google Analytics"
        }]
    }],
    "purposes": [{
        "id": 1,
        "vendors": [{
            "id": "VERIPATH1",
            "name": "VeriPath, Inc."
        }, {
            "id": "VERIPATH2",
            "name": "VenPath, Inc."
        }, {
            "id": "custom_1",
            "name": "Google Analytics"
        }]
    }, {
        "id": 2,
        "vendors": [{
            "id": "VERIPATH1",
            "name": "VeriPath, Inc."
        }, {
            "id": "VERIPATH2",
            "name": "VenPath, Inc."
        }, {
            "id": "custom_1",
            "name": "Google Analytics"
        }]
    }, {
        "id": 3,
        "vendors": [{
            "id": "VERIPATH1",
            "name": "VeriPath, Inc."
        }, {
            "id": "VERIPATH2",
            "name": "VenPath, Inc."
        }, {
            "id": "custom_1",
            "name": "Google Analytics"
        }]
    }, {
        "id": 4,
        "vendors": [{
            "id": "VERIPATH1",
            "name": "VeriPath, Inc."
        }, {
            "id": "VERIPATH2",
            "name": "VenPath, Inc."
        }, {
            "id": "custom_1",
            "name": "Google Analytics"
        }]
    }, {
        "id": 5,
        "vendors": [{
            "id": "VERIPATH1",
            "name": "VeriPath, Inc."
        }, {
            "id": "VERIPATH2",
            "name": "VenPath, Inc."
        }, {
            "id": "custom_1",
            "name": "Google Analytics"
        }]
    }],
    "legIntPurposes": [{
        "id": 1,
        "vendors": []
    }, {
        "id": 2,
        "vendors": []
    }, {
        "id": 3,
        "vendors": []
    }, {
        "id": 4,
        "vendors": []
    }, {
        "id": 5,
        "vendors": []
    }]
}
/* Besides the standardized iab NSUserDefaults, we set some NSUserDefaults for custom vendors. */

/*
Key: Veripath_Custom_Vendors
Value: (below)
*/

{
    "features": [{
        "id": 1,
        "vendors": [{
            "id": "VERIPATH1",
            "name": "VeriPath, Inc."
        }, {
            "id": "VERIPATH2",
            "name": "VenPath, Inc."
        }, {
            "id": "custom_1",
            "name": "Google Analytics"
        }]
    }, {
        "id": 2,
        "vendors": [{
            "id": "VERIPATH1",
            "name": "VeriPath, Inc."
        }, {
            "id": "VERIPATH2",
            "name": "VenPath, Inc."
        }, {
            "id": "custom_1",
            "name": "Google Analytics"
        }]
    }, {
        "id": 3,
        "vendors": [{
            "id": "VERIPATH1",
            "name": "VeriPath, Inc."
        }, {
            "id": "VERIPATH2",
            "name": "VenPath, Inc."
        }, {
            "id": "custom_1",
            "name": "Google Analytics"
        }]
    }],
    "purposes": [{
        "id": 1,
        "vendors": [{
            "id": "VERIPATH1",
            "name": "VeriPath, Inc."
        }, {
            "id": "VERIPATH2",
            "name": "VenPath, Inc."
        }, {
            "id": "custom_1",
            "name": "Google Analytics"
        }]
    }, {
        "id": 2,
        "vendors": [{
            "id": "VERIPATH1",
            "name": "VeriPath, Inc."
        }, {
            "id": "VERIPATH2",
            "name": "VenPath, Inc."
        }, {
            "id": "custom_1",
            "name": "Google Analytics"
        }]
    }, {
        "id": 3,
        "vendors": [{
            "id": "VERIPATH1",
            "name": "VeriPath, Inc."
        }, {
            "id": "VERIPATH2",
            "name": "VenPath, Inc."
        }, {
            "id": "custom_1",
            "name": "Google Analytics"
        }]
    }, {
        "id": 4,
        "vendors": [{
            "id": "VERIPATH1",
            "name": "VeriPath, Inc."
        }, {
            "id": "VERIPATH2",
            "name": "VenPath, Inc."
        }, {
            "id": "custom_1",
            "name": "Google Analytics"
        }]
    }, {
        "id": 5,
        "vendors": [{
            "id": "VERIPATH1",
            "name": "VeriPath, Inc."
        }, {
            "id": "VERIPATH2",
            "name": "VenPath, Inc."
        }, {
            "id": "custom_1",
            "name": "Google Analytics"
        }]
    }],
    "legIntPurposes": [{
        "id": 1,
        "vendors": []
    }, {
        "id": 2,
        "vendors": []
    }, {
        "id": 3,
        "vendors": []
    }, {
        "id": 4,
        "vendors": []
    }, {
        "id": 5,
        "vendors": []
    }]
}
/* Besides the standardized iab cookie (named euconsent), we drop a cookie for custom vendors. */

/*
Cookie name:  euconsent_custom_vendors
Cookie Expiration:  390 days
Cookie Domain:  .veripath.net
Cookie Value:  (below)
*/

{
    "features": [{
        "id": 1,
        "vendors": [{
            "id": "VERIPATH1",
            "name": "VeriPath, Inc."
        }, {
            "id": "VERIPATH2",
            "name": "VenPath, Inc."
        }, {
            "id": "custom_1",
            "name": "Google Analytics"
        }]
    }, {
        "id": 2,
        "vendors": [{
            "id": "VERIPATH1",
            "name": "VeriPath, Inc."
        }, {
            "id": "VERIPATH2",
            "name": "VenPath, Inc."
        }, {
            "id": "custom_1",
            "name": "Google Analytics"
        }]
    }, {
        "id": 3,
        "vendors": [{
            "id": "VERIPATH1",
            "name": "VeriPath, Inc."
        }, {
            "id": "VERIPATH2",
            "name": "VenPath, Inc."
        }, {
            "id": "custom_1",
            "name": "Google Analytics"
        }]
    }],
    "purposes": [{
        "id": 1,
        "vendors": [{
            "id": "VERIPATH1",
            "name": "VeriPath, Inc."
        }, {
            "id": "VERIPATH2",
            "name": "VenPath, Inc."
        }, {
            "id": "custom_1",
            "name": "Google Analytics"
        }]
    }, {
        "id": 2,
        "vendors": [{
            "id": "VERIPATH1",
            "name": "VeriPath, Inc."
        }, {
            "id": "VERIPATH2",
            "name": "VenPath, Inc."
        }, {
            "id": "custom_1",
            "name": "Google Analytics"
        }]
    }, {
        "id": 3,
        "vendors": [{
            "id": "VERIPATH1",
            "name": "VeriPath, Inc."
        }, {
            "id": "VERIPATH2",
            "name": "VenPath, Inc."
        }, {
            "id": "custom_1",
            "name": "Google Analytics"
        }]
    }, {
        "id": 4,
        "vendors": [{
            "id": "VERIPATH1",
            "name": "VeriPath, Inc."
        }, {
            "id": "VERIPATH2",
            "name": "VenPath, Inc."
        }, {
            "id": "custom_1",
            "name": "Google Analytics"
        }]
    }, {
        "id": 5,
        "vendors": [{
            "id": "VERIPATH1",
            "name": "VeriPath, Inc."
        }, {
            "id": "VERIPATH2",
            "name": "VenPath, Inc."
        }, {
            "id": "custom_1",
            "name": "Google Analytics"
        }]
    }],
    "legIntPurposes": [{
        "id": 1,
        "vendors": []
    }, {
        "id": 2,
        "vendors": []
    }, {
        "id": 3,
        "vendors": []
    }, {
        "id": 4,
        "vendors": []
    }, {
        "id": 5,
        "vendors": []
    }]
}
This is your responsibility, so please read the full iab spec and implement it.

When the consent process is completed by the user, we set a few cookies (or shared / user preferences on in-app mobile.)

The iab consent cookie for web and in-app mobile is described here.

Errors

The VeriPath SDK uses the following errors:

Error Meaning
Unable to authenticate. Please check your keys. (400) Your Public and / or Secret key are wrong
Empty IDFA / AAID The Advertising ID is missing.
connectionError If sending the packet failed
SDK Key missing You forgot to put in your SDK key
Public Key missing You forgot to put in your public key
Secret Key missing You forgot to put in your secret key
Failed to grab IP from Veripath Service Pretty self explanatory… we tried to get the public IP of the device and it failed
Rate Limited We appreciate the enthusiasm, but you’re sending data too frequently
No data to send You tried to send data, but there wasn’t any set
400 / Key is required. Your key is missing
401 / Bad key. Your key was invalid
402 / Missing or invalid consent data. Required data for this consent pixel was invalid or missing
403 / Error sending consent data. Please fire this pixel again, as the consent data was not saved on our side