Skip to main content

The full path

1

Register your origins

The service answers CORS with an explicit allowlist of origins and access-control-allow-credentials: true. Send VU the exact origins — scheme, host, and port — for every environment before you start.
2

Call the API from the client

The fingerprint describes the connection making the call. It has to come from the user’s device.
3

Forward the whole response to your backend

userData and signature, unmodified and unreordered.
4

Verify and score

Only after verifying should the signals reach your risk engine.

Calling from the browser

credentials: "include" is not optional. Without it the fp cookie is neither sent nor stored, and the service issues a brand-new identifier on every visit. Persistence — half the value of the product — disappears silently: the response is still 200 and every field is still there.
Never call this API from your server on the user’s behalf. The fingerprint is computed from the caller’s TLS handshake. A call made from your backend returns your backend’s fingerprint: identical for every one of your users, and therefore worthless.

Verifying the signature

The response travels through the client. Without verification, anyone can edit userData in their developer tools before it reaches your backend.
The value is a 4096-bit RSA public key in PEM format, base64-encoded. Decode it once and cache it; do not fetch it on every evaluation.
Confirm the hash algorithm and the exact canonicalization of userData with VU before writing the verification. The signature is produced over a specific serialization of that block: if your code re-serializes the object in another form — different spacing, different key order — verification fails even though the data is authentic. Carry the raw response body from the client all the way to the verifier; do not round-trip it through JSON.parse and JSON.stringify on the way.
While you settle that detail with VU, do not leave the integration open: treat the response as unverified and never let it alone authorize a sensitive operation.

Using the signals

No signal decides on its own. The value is in crossing them.
A tlsFingerprintHash is not unique per device: it identifies a combination of client, version, and platform. Millions of people running the same Chrome on the same Windows share a hash. Use it to spot inconsistencies and to group — never to authenticate.

Persistence: two mechanisms, two lifetimes

cookie and etag identify the same visitor through different paths, and that redundancy is deliberate:
  • cookie lasts a year and disappears when the user clears cookies or opens a private window.
  • etag rides on the HTTP cache and often survives that clearing.
  • etagFirstRequest tells you which case you are looking at: true is a freshly issued etag, false is one the client sent back — it had been here before.
Store both identifiers against the account. One rotating while the other persists is itself a signal.

/update

An administrative operation protected by the X-API-Key header. It plays no part in the integration flow. Without a valid key it returns 401:

Privacy

This API produces personal data: IP address, approximate location, and persistent device identifiers. Under GDPR, LGPD, or equivalent regimes, using it requires a lawful basis, notice to the data subject, and a defined retention period. Involve your legal team before going to production, and store only what your risk engine actually queries.

Before going to production

  1. Every origin — development, staging, production — is registered with VU.
  2. The call comes from the client, never from your backend.
  3. credentials: "include" is present on every call.
  4. The raw response body reaches the verifier intact.
  5. Signature verification is implemented and agreed with VU.
  6. The public key is cached, with a path to rotate it.
  7. Every key in geoData is read as optional; city can be null.
  8. accuracyRadius is taken into account whenever the coordinates are used.
  9. No decision rests on a single signal.
  10. No tlsFingerprintHash is used as a credential.
  11. Identifiers have a defined, documented retention period.
  12. There is a fallback for when the API does not answer: risk scoring degrades, it does not fall over.

Back to the introduction

Endpoints, response anatomy, and what every field means.
Last modified on September 9, 2026