> ## Documentation Index
> Fetch the complete documentation index at: https://docs.fingerprint.com/llms.txt
> Use this file to discover all available pages before exploring further.

# JavaScript agent

> This changelog lists all additions and updates to the Fingerprint documentation, in chronological order.

<Update label="June 2026">
  ## v4.1.0

  * Minor bug fixes, stability, and security improvements
  * Added new methods to [BinaryOutput](https://docs.fingerprint.com/reference/js-agent-v4-get-function#sealed_result): `toJSON`, `toString`, and `[Symbol.toPrimitive]`. These return a base64 representation of the binary data:
    ```javascript JavaScript theme={"theme":"github-dark-dimmed"}
    const result = await agent.get();
    console.log(result.sealed_result.toString()); // <<< will log the base64 string now, instead of `[object Object]`
    ```

  ## v3.12.10

  * Minor bug fixes, stability, and security improvements
</Update>

<Update label="March 2026">
  ## v4.0.3

  * Minor bug fixes, stability, and security improvements

  ## v4.0.2

  * Minor bug fixes, stability, and security improvements

  ## v3.12.9

  * Minor bug fixes, stability, and security improvements

  ## v3.12.8

  * Minor bug fixes, stability, and security improvements
</Update>

<Update label="February 2026">
  ## v4.0.1

  * Minor bug fixes, stability, and security improvements

  ## v3.12.7

  * Improve Identification accuracy
</Update>

<Update label="January 2026" tags={["Smart Signals"]}>
  ## v4.0.0

  * New major API version has been released. This version contains a major overhaul of the API surface, configuration options, and introduces breaking changes. See the [full migration guide](/reference/migrating-from-v3-to-v4) for all the details to start the transition to this new version.
  * The deprecation period for JavaScript agent version 3 begins once all server, client, and proxy integrations get released. The deprecation period is **12 months** from that date, following our [API deprecation policy](/reference/api-deprecation-policy).

  ## v3.12.6

  * Improve Identification and Smart Signal accuracy
</Update>

<Update label="December 2025">
  ## v3.12.5

  * Minor bug fixes, stability and security improvements
</Update>

<Update label="November 2025">
  ## v3.12.4

  * Improve Identification accuracy in Safari 26
  * Drop support for older browsers and updated our [list of supported browsers](/docs/browser-and-device-support)
</Update>

<Update label="October 2025" tags={["Smart Signals"]}>
  ## v3.12.3

  * Improve Smart Signals accuracy
</Update>

<Update label="September 2025" tags={["Smart Signals"]}>
  ## v3.12.2

  * Add a check for `SecurityError` in all affected signals

  ## v3.12.1

  * Improve Smart Signals accuracy
</Update>

<Update label="August 2025">
  ## v3.12.0

  * Move to ES2018 JavaScript language version target.
  * Decrease overall latency and bundle size

  ## v3.11.14

  * Improve identification accuracy
  * Improve performance (minor improvement)
</Update>

<Update label="July 2025" tags={["Smart Signals"]}>
  ## v3.11.13

  * Improve accuracy of [Developer Tools Detection](/docs/smart-signals-reference#developer-tools-detection) Smart Signal
  * Optimize latency
  * Introduce `FingerprintJS.ERROR_PROXY_INTEGRATION_SECRET_ENVIRONMENT_MISMATCH`, returned when the proxy secret belongs to a different environment than the Public API key (but same workspace)

  ## v3.11.12

  * Improve performance (signal collection latency)

  ## v3.11.11

  * Optimize agent size
  * Remove unused signals to decrease latency
</Update>

<Update label="May 2025" tags={["Smart Signals"]}>
  ## v3.11.10

  * Improve general performance by decreasing the total bundle size
  * Improve signal collection performance in Safari
  * Improve Smart Signals accuracy
  * ImproveIdentification accuracy in Firefox
</Update>

<Update label="April 2025">
  ## v3.11.9

  * Add specific behavior for [AI bot request filtering](/docs/ai-bot-filtering)
</Update>

<Update label="February 2025">
  ## v3.11.8

  * Signal accuracy improvements
</Update>

<Update label="January 2025" tags={["Smart Signals"]}>
  ## v3.11.7

  * Introduce [more granular errors](/docs/changelog-javascript-agent#more-granular-errors) for proxy integration failures and request filtering
  * Increase [Smart Signals accuracy](/docs/changelog-javascript-agent#smart-signals-accuracy)

  ### More granular errors

  Introduce more granular [error constants](/reference/v3/js-agent-error-handling#errors) for [network request filtering](/docs/network-request-filtering) and [proxy integration](/docs/protecting-the-javascript-agent-from-adblockers) failures:

  * `FingerprintJS.ERROR_NETWORK_RESTRICTED`, triggered when a request is filtered out based on an IP address or IP address range
  * `FingerprintJS.ERROR_INVALID_PROXY_INTEGRATION_SECRET`, occurs when the `Fpjs-Proxy-Secret` header contains an empty, invalid, or non-matching value
  * `FingerprintJS.ERROR_INVALID_PROXY_INTEGRATION_HEADERS`, triggered when the proxy integration headers are misconfigured or partially provided in those specific cases:
    * Missing required headers (`Fpjs-Proxy-Client-IP`, `Fpjs-Proxy-Forwarded-Host`).
    * Duplicate headers
    * Invalid patterns for `Client-IP` or `Forwarded-Host`

  ### Smart Signals accuracy

  Significantly improve the accuracy of the [Virtual Machine Detection](/docs/smart-signals-reference#virtual-machine-detection) Smart Signal.

  ## v3.11.6

  * Minor bug fixes and improvements
</Update>

<Update label="December 2024">
  ## v3.11.5

  * Minor bug fixes and improvements impacting signal collection
</Update>

<Update label="November 2024">
  ## v3.11.4

  * Minor bug fixes and stability improvements
</Update>

<Update label="October 2024">
  ## v3.11.3

  * Drop official support for older browsers (older versions should still work but it is not guaranteed). Updated list is available in the [browser and device support documentation](/docs/browser-and-device-support).
  * JavaScript agent now throws the error from the first attempt instead of the one from the last retry. This makes it more clear what the error was because our retry/fallback endpoints are prone to get blocked by ad blockers.

  ## v3.11.2

  * Minor bug fixes and stability improvements
</Update>

<Update label="September 2024" tags={["Smart Signals"]}>
  ## v3.11.1

  * Improve the identification accuracy in some Android browsers
  * Improve the accuracy of [Smart Signals](/docs/smart-signals-reference)
</Update>

<Update label="August 2024">
  ## v3.11.0

  * Minor bug fixes in signal collection
  * Improve back/forward cache support to prevent full page reloads
  * Add [`urlHashing option`](/reference/js-agent-load-function#urlhashing)
</Update>

<Update label="July 2024" tags={["Smart Signals"]}>
  ## v3.10.1

  * Improved accuracy of identification
  * Improved performance

  ## v3.10.0

  * A new JavaScript agent option: `remoteControlDetection` (has been deprecated since)
  * Fix incompatibility with some iOS versions
  * Remove the `Feature policy 'Payment' check failed...` console error in cross-origin iframes in Safari

  ## v3.9.10

  * Improved performance.
  * Improved accuracy of identification.
</Update>

<Update label="June 2024" tags={["Smart Signals"]}>
  ## v3.9.9

  * Improve the performance

  ## v3.9.8

  * fix: A message related to `AudioContext` is printed to the browser console
  * Improve the performance

  ## v3.9.7

  * Improve the identification and bot detection accuracy
  * Improve the performance
</Update>

<Update label="May 2024">
  ## v3.9.6

  * Improve the performance

  ## v3.9.5

  * Minor improvements
</Update>

<Update label="April 2024" tags={["Smart Signals"]}>
  ## v3.9.4

  * Improve the Smart Signals accuracy
  * The [ipLocation](/reference/js-agent-get-function#iplocation) response field is marked as deprecated. It will not return a result for **applications created after January 23rd, 2024**. See [IP Geolocation](/docs/smart-signals-reference#ip-geolocation) for a replacement available in our Smart Signals product.

  ## v3.9.3

  * Deprecate option [products](/reference/js-agent-get-function#products). The option to configure products became obsolete with the introduction of Smart Signals. Billed amount is determined by the billing plan and the products option does not influence it. Just remove it from your [JavaScript agent configuration](/reference/js-agent-get-function). It will likely be removed in the next major version.
  * Fix unexpected popup appearing in Android Chrome in rare cases.
</Update>

<Update label="March 2024">
  ## v3.9.2

  * Fixed an unhandled promise rejection happening in rare cases

  ## v3.9.1

  * Minor improvements
</Update>

<Update label="January 2024">
  ## v3.9.0

  * [Sealed Client Results](/docs/sealed-client-results) support. Namely, added a new `get()` response field: [`sealedResult`](/reference/js-agent-get-function#sealedresult).

  ## v3.8.7

  * Improve the [retry](/reference/js-agent-load-function#scripturlpattern) algorithm used in case JavaScript agent fails to load from the CDN.
</Update>

<Update label="October 2023">
  ## v3.8.6

  * Deprecate options [`tlsEndpoint`](/reference/js-agent-load-function#tlsendpoint-deprecated) and [`disableTls`](/reference/js-agent-load-function#disabletls-deprecated). They are not necessary because of recent improvements to the ad blocker protection. Just remove them from your [JavaScript agent configuration](/reference/js-agent-load-function). They will likely be removed in the next major version.
</Update>

<Update label="July 2023">
  ## v3.8.5

  * Minor improvements
</Update>

<Update label="June 2023">
  ## v3.8.4

  * Fix the [`subdivisions`](/reference/js-agent-get-function#iplocation) field type in the TypeScript declarations
</Update>

<Update label="April 2023">
  ## v3.8.3

  * Add an [error constant](/reference/v3/js-agent-error-handling) `ERROR_INVALID_ENDPOINT` which is used then the `endpoint` option value is not a valid URL
</Update>

<Update label="February 2023">
  ## v3.8.2

  * Add a license file to the NPM package
</Update>

<Update label="November 2022">
  ## v3.8.1

  * Add an [error constant](/reference/v3/js-agent-error-handling) `ERROR_INTEGRATION_FAILURE` which will be used for errors that happen on the [integration](/docs/protecting-the-javascript-agent-from-adblockers) side

  ## v3.8.0

  * Fallback endpoint. You can set multiple endpoints; JavaScript agent will try to send the request with the first endpoint, and if the request fails, retry the request with the second endpoint and so on. Supported by all options: [scriptUrlPattern](/reference/js-agent-load-function#scripturlpattern), [endpoint](/reference/js-agent-load-function#endpoint) and [tlsEndpoint](/reference/js-agent-load-function#tlsendpoint-deprecated).
  * Placeholder values for cases where you want to use the default endpoint as a fallback endpoint: - `FingerprintJS.defaultScriptUrlPattern` for [scriptUrlPattern](/reference/js-agent-load-function#scripturlpattern) - `FingerprintJS.defaultEndpoint` for [endpoint](/reference/js-agent-load-function#endpoint) - `FingerprintJS.defaultTlsEndpoint` for [tlsEndpoint](/reference/js-agent-load-function#tlsendpoint-deprecated)
</Update>

<Update label="August 2022">
  ## v3.7.1

  * A new [error is thrown](/reference/v3/js-agent-error-handling) when JavaScript agent is blocked by [Content Security Policy](https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP): `FingerprintJS.ERROR_CSP_BLOCK`. JavaScript agent doesn't retry network requests blocked by CSP. In previous versions a common error was thrown in this case: `FingerprintJS.ERROR_NETWORK_CONNECTION`.
</Update>

<Update label="July 2022" tags={["Smart Signals"]}>
  ## v3.7.0

  * [Bot Detection agent](https://fingerprint.com/products/bot-detection/) is embedded into FingerprintJS Pro agent
  * A new `fp.get()` option [products](/reference/js-agent-get-function#products) to enable or disable Fingerprint products (Browser Identification, BotDetection)

  ## v3.6.4

  * Security improvements
</Update>

<Update label="May 2022">
  ## v3.6.3

  * Add the [`zeroTrust`](/docs/zero-trust-mode) field to the TypeScript declaration of JavaScript agent result object

  ## v3.6.2

  * New error type: `ERROR_FORBIDDEN_ENDPOINT`. See the [error handling guide](/reference/v3/js-agent-error-handling) for more details.
</Update>

<Update label="April 2022">
  ## v3.6.1

  * fix: JavaScript agent installed from jsDelivr makes a network request to fpnpmcdn.io that can be blocked by your Content Security Policy. This is a temporary fix, it will be reverted. Please [switch to our CDN](/docs/migrating-from-fingerprintjs-to-fingerprint-pro#cdn-installation) to avoid this problem in future.
</Update>

<Update label="March 2022">
  ## v3.6.0

  * A new CDN for the CDN installation methods. Follow [this guide](/docs/migrating-from-fingerprintjs-to-fingerprint-pro#cdn-installation) to update. The old CDN URLs pointing to jsDelivr continue working, but we recommend switching to our CDN to avoid excess network requests.
  * JavaScript agent installed from NPM loads its code from our CDN in runtime. It guarantees that you always use the latest and the most accurate version of JavaScript agent.
    * If you use a Content Security Policy, add the CDN domain to the CSP as described in the [JavaScript agent CSP documentation](/docs/js-agent-csp) (see the "NPM installation" tab).
    * If you do an HTML preconnect, consider preconnecting to the CDN too as described in the [API preconnect documentation](/docs/optimize-javascript-agent#pre-connect-to-fingerprint-urls) (see the "NPM installation" tab).
  * Add `firstSeenAt` and `lastSeenAt` fields to JavaScript agent responses. See more details in [Visitor Footprint Timestamps](/docs/useful-timestamps).
  * New error types: ERROR\_SCRIPT\_LOAD\_FAIL and ERROR\_INSTALLATION\_METHOD\_RESTRICTED. See the [error handling guide](/reference/v3/js-agent-error-handling) for more details.
  * A new `load()` option in the NPM package of JavaScript agent: [`scriptUrlPattern`](/reference/js-agent-load-function#scripturlpattern). See more details in the [JavaScript agent guide](/reference/js-agent-load-function#scripturlpattern).

  ## v3.5.7

  * fix: If your project uses TypeScript and has the TypeScript's [isolatedModules](https://www.typescriptlang.org/tsconfig#isolatedModules) option is enabled, JavaScript agent causes an error: "TS2748: Cannot access ambient const enums"

  ## v3.5.6

  * Rename the token option of the `load` method of JavaScript agent to `apiKey`. The token option keeps working for backward compatibility. Also rename some error constants (the old names work too):
    * `ERROR_TOKEN_MISSING` → `ERROR_API_KEY_MISSING`
    * `ERROR_TOKEN_INVALID` → `ERROR_API_KEY_INVALID`
    * `ERROR_TOKEN_EXPIRED` → `ERROR_API_KEY_EXPIRED`
  * fix: JavaScript agent triggers a console error message unless the page's Content Security Policy allows `unsafe-inline` for `style-src`.
</Update>

<Update label="January 2022">
  ## v3.5.5

  * A new region: `ap` (Mumbai, India)
</Update>

<Update label="December 2021">
  ## v3.5.4

  * Improve incognito mode detection accuracy in Safari
  * Deprecate the `ipResolution` parameter because it affects nothing
  * The `get()` result's `ipLocation` field is marked is optional in the TypeScript declaration. The field could be undefined in fact, so this is a fix of the type declaration.
  * Actualize the [list of supported browsers](/docs/browser-and-device-support).
  * A new [error code](/reference/v3/js-agent-error-handling) for cases when the JavaScript agent version is not supported: `FingerprintJS.ERROR_UNSUPPORTED_VERSION`
  * Decrease the JavaScript agent code size by removing legacy parts
  * fix: An indefinite `setTimeout` loop in Firefox
</Update>

<Update label="September 2021">
  ## v3.5.3

  * Improve the tree-shaking capability
  * Confidence score calculations moved to server for increased accuracy (Pro version)

  ## v3.5.2

  * Improve the performance slightly
</Update>

<Update label="August 2021">
  ## v3.5.1

  * Improve identification time for visitors who use an ad blocker or an M1 Mac
  * Improve identification accuracy
</Update>

<Update label="July 2021">
  ## v3.5.0

  * Add a new result field: confidence score. The confidence score field tells how much the agent is sure about the visitor identifier. See [the API reference](/reference/js-agent-get-function#confidence) for more details.
  * Fix an error that occurs in Firefox Add-ons
</Update>

<Update label="June 2021">
  ## v3.4.0

  * Makes `get` run much faster when some time passes between calling `load()` and `get()`. See the [JavaScript agent preloading guide](/docs/optimize-javascript-agent#preload-the-javascript-agent) to learn how to leverage it.
  * Added an error constant for bad server response format: `FingerprintJS.ERROR_BAD_RESPONSE_FORMAT`. The error can be caused by wrong endpoint.
  * The `disableTls` option is moved from the get options to the load options. It still works when set within get options for compatibility, but doesn't actually disable the TLS request. So we recommend updating your code if you use `disableTls`.
  * fix: JavaScript agent may never complete getting the visitor identifier when the page is in background.

  ## v3.3.3

  * Fix client timeouts in WeChat built-in browser on iOS 13
  * Increase the accuracy of agent when the page runs in background
</Update>

<Update label="May 2021">
  ## v3.3.2

  * Fix "Client timeout" errors that happen in bots that run `setTimeout` too quickly
  * Fix console WebGL warnings in IE 11
</Update>

<Update label="April 2021">
  ## v3.3.1

  * Incognito detection accuracy improvement
  * TypeScript compatibility improvement
  * Fix an error in Android 5.1 Browser: Failed to parse the response
  * Fix client timeouts in iOS WeChat built-in browser

  ## v3.3.0

  * Many new identification methods under the hood
  * JavaScript agent retries visitor identification request in case of error
  * A new billing model. Identifications are billed per a unique visitor instead of a request.
  * New [expected JavaScript agent errors](/reference/v3/js-agent-error-handling): `FingerprintJS.ERROR_WRONG_REGION`, `FingerprintJS.ERROR_SUBSCRIPTION_NOT_FOUND`.

  ## v3.2.6

  * fix: Remote monitoring doesn't work in Android Browser 4.1
  * fix: JavaScript agent script encoding can change the canvas fingerprint, that can reduce accuracy in rare cases
  * Add internal request encryption
  * Improve the fingerprinting performance

  ## v2.8.5

  * Fix incognito detection in some browsers based on Blink
  * Decrease the chance of getting `send()` call timeout by decreasing the TLS request timeout
  * Improve the fingerprinting performance
</Update>

<Update label="February 2021">
  ## v3.2.5

  * Increase the TLS request stability by retrying
  * Decrease the chance of getting `get()` call timeout by decreasing the TLS request timeout
  * fix: Monitoring reports aren't sent sometimes

  ## v3.2.4

  * Improve the accuracy of Chrome incognito detection
  * Add the `requestId` field to errors emitted by the servers
  * Make JavaScript agent [easier to use](https://github.com/fingerprintjs/fingerprintjs/pull/610) in server side rendering environments like Next.js and Gatsby

  ## v2.8.4

  * Fix cookie `SameSite` attribute warnings in Firefox
  * Increase the accuracy of Chrome incognito detection
  * Add the `requestId` field to errors emitted by the servers
</Update>

<Update label="January 2021">
  ## v3.2.3

  * Add [JavaScript agent constants](/reference/v3/js-agent-error-handling) for the new [request filtering](/docs/request-filtering) errors
  * Fix cookie `SameSite` attribute warnings in Firefox
  * Improve the identification mechanism
</Update>

<Update label="December 2020">
  ## v3.2.2

  * fix: `load()` takes a huge time to run in some conditions
  * Handle cases where `navigator.deviceMemory` is a string

  ## v3.2.1

  * Add more information to JavaScript agent monitoring

  ## v3.2.0

  * Add an experimental API for JavaScript agent debugging. We can use it to analyze agent operation on your side and solve problems faster. [Contact support](mailto:support@fingerprintjs.com) for more details.
  * The minimal supported version of TypeScript is 4.0.0.
  * Amend Safari private mode detection. It always detected `incognito: true` in desktop Safari controlled by Karma or BrowserStack Automate.

  ## v2.8.3

  * fix: `FP.load()` takes a huge time to run in some conditions
  * Handle cases where `navigator.deviceMemory` is a string
</Update>

<Update label="November 2020">
  ## v3.1.0

  * Increased stability of the audio fingerprint component on iPhone
  * Made JavaScript agent use a TLS server located in Europe when the region is set to EU, for example:
    ```javascript JavaScript theme={"theme":"github-dark-dimmed"}
    FingerprintJS.load({
      token: "your-token",
      region: "eu",
    });
    ```
  * Added an option to set a custom TLS endpoint:
    ```javascript JavaScript theme={"theme":"github-dark-dimmed"}
    FingerprintJS.load({
        token: 'your-token',
        tlsEndpoint: 'https://mytls.example.com'
    })
    ```

  ## v3.0.3

  * fix: Incognito detection doesn't work in mobile Safari 13 and newer

  ## v3.0.2

  * fix: It's impossible to set an endpoint that is relative to the current domain in the `FingerprintJS.load()` function. For example, the following code didn't work:
    ```javascript JavaScript theme={"theme":"github-dark-dimmed"}
    const fp = await FingerprintJS.load({ token: 'your-token', endpoint: '/metrics' })
    const result = await fp.get()
    ```
    Warning. If you set the endpoint option to something like `metrics.example.com`, it will break because this is not an expected behavior. Change the endpoint to `https://metrics.example.com`.

  ## v2.8.2

  * Amend Safari private mode detection. It always detected `incognito: true` in desktop Safari controlled by Karma or BrowserStack Automate.

  ## v2.8.0

  * Increased stability of the audio fingerprint component on iPhone
  * Made JavaScript agent use a TLS server located in Europe when the region is set to EU, for example:

      <CodeGroup>
        ```javascript NPM installation theme={"theme":"github-dark-dimmed"}
        import { FP } from "@fp-pro/client";
        FP.load({
          client: "your-token",
          region: "eu",
        });
        ```

        ```html CDN installation theme={"theme":"github-dark-dimmed"}
        <head>
          <script>
            window.fpLayer = window.fpLayer || [];
            function fp() {
              fpLayer.push(arguments);
            }
            fp("config", "client", "your-token");
            fp("config", "region", "eu");
          </script>
          <script async src="https://cdn.fpjs.io/@2/fp.js"></script>
        </head>
        ```
      </CodeGroup>
  * Added an option to set a custom TLS endpoint:

      <CodeGroup>
        ```javascript NPM installation theme={"theme":"github-dark-dimmed"}
        import { FP } from '@fp-pro/client';
        FP.load({
            client: 'your-token',
            tlsEndpoint: 'https://mytls.example.com'
        })
        ```

        ```html CDN installation theme={"theme":"github-dark-dimmed"}
        <head>
            <script>
            window.fpLayer = window.fpLayer || [];
            function fp() { fpLayer.push(arguments); }
            fp('config', 'client', 'your-token');
            fp('config', 'tlsEndpoint', 'https://mytls.example.com');
            </script>
            <script async src="https://cdn.fpjs.io/@2/fp.js"></script>
        </head>
        ```
      </CodeGroup>
</Update>

<Update label="October 2020">
  ## v3.0.1

  * Unexpected entropy component errors are printed in the [debug mode](/reference/js-agent-v4-error-handling#handling-errors) of the JavaScript agent. Such errors should be reported to us.
  * Support elder browsers like IE 11, Chrome 42 and Firefox 48 (a [Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) polyfill is required)
  * Handle cases where `new Date().getTimezoneOffset()` returns a string
  * fix: Getting the visitor identifier takes a huge time in some conditions

  ## v3.0.0

  * The JavaScript agent API is changed to provide a simple transition from the [open-source version of the agent](https://github.com/fingerprintjs/fingerprintjs).
  * The installation methods have been unified so that they have same options and same usage methods. Also we've added a couple new ways to install.
  * Result and error handling has been simplified. A single value type is returned (resolved) and a single value type is thrown (rejected). The agent throws error only when a visitor identification fails due to incorrect agent setup or network issues; special kinds of visitors don't cause errors.

  Learn how to migrate:

  * [From FingerprintJS Pro version 2](/docs/migrating-from-fingerprintjs-to-fingerprint-pro)
  * [From FingerprintJS Open-Source version 3](/docs/migrating-from-fingerprintjs-to-fingerprint-pro#migrating-from-fingerprintjs-v3-open-source-to-fingerprint-identification)
  * [From FingerprintJS Open-Source version 2](/docs/migrating-from-open-source-v2)

  ## v2.7.7

  * fix: An error that occurs in a very rare case when `navigator.permissions` is present while `window.Notification` isn't.
  * Handle cases where `new Date().getTimezoneOffset()` returns a string
  * fix: Visitor identifier can change due to a daylight saving time shift
</Update>
