diff --git a/.changeset/device-rarity-smart-signal.md b/.changeset/device-rarity-smart-signal.md new file mode 100644 index 00000000..876b608f --- /dev/null +++ b/.changeset/device-rarity-smart-signal.md @@ -0,0 +1,5 @@ +--- +'java-sdk': minor +--- + +**events**: Add Device Rarity Smart Signal diff --git a/.changeset/proxy-ml-score.md b/.changeset/proxy-ml-score.md new file mode 100644 index 00000000..ae3aa3eb --- /dev/null +++ b/.changeset/proxy-ml-score.md @@ -0,0 +1,5 @@ +--- +'java-sdk': minor +--- + +**events**: Add `proxy_ml_score` to `Event` diff --git a/.changeset/raw-device-attributes-font-hash-timezone-offset.md b/.changeset/raw-device-attributes-font-hash-timezone-offset.md new file mode 100644 index 00000000..19b8e919 --- /dev/null +++ b/.changeset/raw-device-attributes-font-hash-timezone-offset.md @@ -0,0 +1,5 @@ +--- +'java-sdk': minor +--- + +**events**: Add `font_hash` and `timezone_offset` fields for the `RawDeviceAttributes` diff --git a/.changeset/raw-device-attributes-mobile-android.md b/.changeset/raw-device-attributes-mobile-android.md new file mode 100644 index 00000000..f5fb2ae3 --- /dev/null +++ b/.changeset/raw-device-attributes-mobile-android.md @@ -0,0 +1,5 @@ +--- +'java-sdk': minor +--- + +**events**: Enable `raw_device_attributes` for Android devices. Only `device_manufacturer` and `device_model` are currently supported for Android devices. diff --git a/.changeset/raw-device-attributes-mobile-ios.md b/.changeset/raw-device-attributes-mobile-ios.md new file mode 100644 index 00000000..da5f0b6d --- /dev/null +++ b/.changeset/raw-device-attributes-mobile-ios.md @@ -0,0 +1,5 @@ +--- +'java-sdk': minor +--- + +**events**: Enable `raw_device_attributes` for iOS devices. Only `device_manufacturer`, `device_model`, `hardware_concurrency`, `languages`, and `screen_resolution` are currently supported for iOS devices. diff --git a/.changeset/request-read-timeout-error-code.md b/.changeset/request-read-timeout-error-code.md new file mode 100644 index 00000000..7857a2aa --- /dev/null +++ b/.changeset/request-read-timeout-error-code.md @@ -0,0 +1,5 @@ +--- +'java-sdk': minor +--- + +**events**: Add `request_read_timeout` error code diff --git a/.schema-version b/.schema-version index 3a285c2b..aa6c8967 100644 --- a/.schema-version +++ b/.schema-version @@ -1 +1 @@ -v3.1.0 \ No newline at end of file +v3.2.0 \ No newline at end of file diff --git a/README.md b/README.md index ca4ec333..70ba6712 100644 --- a/README.md +++ b/README.md @@ -328,6 +328,7 @@ Class | Method | HTTP request | Description - [Proximity](docs/Proximity.md) - [ProxyConfidence](docs/ProxyConfidence.md) - [ProxyDetails](docs/ProxyDetails.md) + - [RareDevicePercentileBucket](docs/RareDevicePercentileBucket.md) - [RawDeviceAttributes](docs/RawDeviceAttributes.md) - [RequestHeaderModifications](docs/RequestHeaderModifications.md) - [RuleActionHeaderField](docs/RuleActionHeaderField.md) @@ -335,6 +336,7 @@ Class | Method | HTTP request | Description - [SDK](docs/SDK.md) - [SearchEventsBot](docs/SearchEventsBot.md) - [SearchEventsIncrementalIdentificationStatus](docs/SearchEventsIncrementalIdentificationStatus.md) + - [SearchEventsRareDevicePercentileBucket](docs/SearchEventsRareDevicePercentileBucket.md) - [SearchEventsSdkPlatform](docs/SearchEventsSdkPlatform.md) - [SearchEventsVpnConfidence](docs/SearchEventsVpnConfidence.md) - [SupplementaryIDHighRecall](docs/SupplementaryIDHighRecall.md) diff --git a/docs/ErrorCode.md b/docs/ErrorCode.md index 6dc29caa..64084807 100644 --- a/docs/ErrorCode.md +++ b/docs/ErrorCode.md @@ -4,6 +4,7 @@ Error code: * `request_cannot_be_parsed` - The query parameters or JSON payload contains some errors that prevented us from parsing it (wrong type/surpassed limits). +* `request_read_timeout` - The request body could not be read before the connection timed out. * `secret_api_key_required` - secret API key in header is missing or empty. * `secret_api_key_not_found` - No Fingerprint workspace found for specified secret API key. * `public_api_key_required` - public API key in header is missing or empty. @@ -31,6 +32,8 @@ Error code: * `REQUEST_CANNOT_BE_PARSED` (value: `"request_cannot_be_parsed"`) +* `REQUEST_READ_TIMEOUT` (value: `"request_read_timeout"`) + * `SECRET_API_KEY_REQUIRED` (value: `"secret_api_key_required"`) * `SECRET_API_KEY_NOT_FOUND` (value: `"secret_api_key_not_found"`) diff --git a/docs/Event.md b/docs/Event.md index 40647e9b..afb2a712 100644 --- a/docs/Event.md +++ b/docs/Event.md @@ -40,6 +40,7 @@ Contains results from Fingerprint Identification and all active Smart Signals. |**proxy** | **Boolean** | IP address was used by a public proxy provider or belonged to a known recent residential proxy | [optional] | |**proxyConfidence** | [**ProxyConfidence**](ProxyConfidence.md) | | [optional] | |**proxyDetails** | [**ProxyDetails**](ProxyDetails.md) | | [optional] | +|**proxyMlScore** | **Double** | Machine learning–based proxy score, represented as a floating-point value between 0 and 1 (inclusive), with up to three decimal places of precision. A higher score means a higher confidence in the positive `proxy` detection result | [optional] | |**incognito** | **Boolean** | `true` if we detected incognito mode used in the browser, `false` otherwise. | [optional] | |**jailbroken** | **Boolean** | iOS specific jailbreak detection. There are 2 values: * `true` - Jailbreak detected. * `false` - No signs of jailbreak or the client is not iOS. | [optional] | |**locationSpoofing** | **Boolean** | Flag indicating whether the request came from a mobile device with location spoofing enabled. | [optional] | @@ -49,9 +50,9 @@ Contains results from Fingerprint Identification and all active Smart Signals. |**ruleAction** | [**EventRuleAction**](EventRuleAction.md) | | [optional] | |**simulator** | **Boolean** | iOS specific simulator detection. There are 2 values: * `true` - Simulator environment detected. * `false` - No signs of simulator or the client is not iOS. | [optional] | |**suspectScore** | **Integer** | Suspect Score is an easy way to integrate Smart Signals into your fraud protection work flow. It is a weighted representation of all Smart Signals present in the payload that helps identify suspicious activity. The value range is [0; S] where S is sum of all Smart Signals weights. See more details here: https://docs.fingerprint.com/docs/suspect-score | [optional] | -|**tampering** | **Boolean** | Flag indicating browser tampering was detected. This happens when either: * There are inconsistencies in the browser configuration that cross internal tampering thresholds (see `tampering_details.anomaly_score`). * The browser signature resembles an \"anti-detect\" browser specifically designed to evade fingerprinting (see `tampering_details.anti_detect_browser`). | [optional] | +|**tampering** | **Boolean** | The field can be used as a standalone flag for tampering detection. Alternatively, the more granular fields documented below can be used for workflows that require more context. * `true` if tampering is detected through an anomalous browser signature, anti-detect browser detection, or other tampering-related methods * `false` if none of the tampering checks return a positive result | [optional] | |**tamperingConfidence** | [**TamperingConfidence**](TamperingConfidence.md) | | [optional] | -|**tamperingMlScore** | **Double** | A score that indicates the models calculated probability that an event is coming from an anti detect browser. * Values above `0.8` indicate that the request is an anti detect browser based on the ml model * Values below `0.8` indicate that the request is not an anti detect browser based on the ml model | [optional] | +|**tamperingMlScore** | **Double** | The output of this model is captured as tampering_ml_score, a number indicating how likely an event is coming from an anti detect browser. Values close to 1 signify higher confidence and we consider anything above the threshold of 0.8 to be actionable (the result and anti_detect_browser fields conveniently captures that fact) | [optional] | |**tamperingDetails** | [**TamperingDetails**](TamperingDetails.md) | | [optional] | |**velocity** | [**Velocity**](Velocity.md) | | [optional] | |**virtualMachine** | **Boolean** | `true` if the request came from a browser running inside a virtual machine (e.g. VMWare), `false` otherwise. | [optional] | @@ -62,6 +63,8 @@ Contains results from Fingerprint Identification and all active Smart Signals. |**vpnOriginCountry** | **String** | Country of the request (only for Android SDK version >= 2.4.0, ISO 3166 format or unknown). | [optional] | |**vpnMethods** | [**VpnMethods**](VpnMethods.md) | | [optional] | |**highActivityDevice** | **Boolean** | Flag indicating if the request came from a high-activity visitor. | [optional] | +|**rareDevice** | **Boolean** | `true` if the device is considered rare based on its combination of hardware and software attributes. A device is classified as rare if it falls within the top 99.9 percentile (lowest-frequency segment) of observed traffic, or if its configuration has not been previously seen (`not_seen`). > This Smart Signal is currently in beta and only available to select customers. If you are interested, please [contact our support team](https://fingerprint.com/support/). | [optional] | +|**rareDevicePercentileBucket** | [**RareDevicePercentileBucket**](RareDevicePercentileBucket.md) | | [optional] | |**rawDeviceAttributes** | [**RawDeviceAttributes**](RawDeviceAttributes.md) | | [optional] | diff --git a/docs/FingerprintApi.md b/docs/FingerprintApi.md index 617498de..d1af2668 100644 --- a/docs/FingerprintApi.md +++ b/docs/FingerprintApi.md @@ -216,7 +216,12 @@ The `/v4/events` endpoint provides a convenient way to search for past events ba - Searching for events associated with a single `linked_id` within a time range to get all events associated with your internal account identifier. - Excluding all bot traffic from the query (`good` and `bad` bots) -If you don't provide `start` or `end` parameters, the default search range is the **last 7 days**. +By default, the API searches events from the last 7 days, sorts them by newest first and returns the last 10 events. + +- Use `start` and `end` to specify the time range of the search. +- Use `reverse=true` to sort the results oldest first. +- Use `limit` to specify the number of events to return. +- Use `pagination_key` to get the next page of results if there are more than `limit` events. ### Filtering events with the `suspect` flag @@ -258,7 +263,7 @@ public class FingerprintApiExample { Region.ASIA */ FingerprintApi api = new FingerprintApi(FPJS_API_SECRET, Region.EUROPE); - Integer limit = 10; // Integer | Limit the number of events returned. + Integer limit = 10; // Integer | Maximum number of events to return. Results are selected from the time range (`start`, `end`), ordered by `reverse`, then truncated to provided `limit` size. So `reverse=true` returns the oldest N=`limit` events, otherwise the newest N=`limit` events. String paginationKey = "paginationKey_example"; // String | Use `pagination_key` to get the next page of results. When more results are available (e.g., you requested up to 100 results for your query using `limit`, but there are more than 100 events total matching your request), the `pagination_key` field is added to the response. The pagination key is an arbitrary string that should not be interpreted in any way and should be passed as-is. In the following request, use that value in the `pagination_key` parameter to get the next page of results: 1. First request, returning most recent 200 events: `GET api-base-url/events?limit=100` 2. Use `response.pagination_key` to get the next page of results: `GET api-base-url/events?limit=100&pagination_key=1740815825085` String visitorId = "visitorId_example"; // String | Unique [visitor identifier](https://docs.fingerprint.com/reference/js-agent-v4-get-function#visitor_id) issued by Fingerprint Identification and all active Smart Signals. Filter events by matching Visitor ID (`identification.visitor_id` property). String highRecallId = "highRecallId_example"; // String | The High Recall ID is a supplementary browser identifier designed for use cases that require wider coverage over precision. Compared to the standard visitor ID, the High Recall ID strives to match incoming browsers more generously (rather than precisely) with existing browsers and thus identifies fewer browsers as new. The High Recall ID is best suited for use cases that are sensitive to browsers being identified as new and where mismatched browsers are not detrimental. Filter events by matching High Recall ID (`supplementary_id_high_recall.visitor_id` property). @@ -270,9 +275,9 @@ public class FingerprintApiExample { String bundleId = "bundleId_example"; // String | Filter events by the Bundle ID (iOS) associated with the event. String packageName = "packageName_example"; // String | Filter events by the Package Name (Android) associated with the event. String origin = "origin_example"; // String | Filter events by the origin field of the event. This is applicable to web events only (e.g., https://example.com) - Long start = 56L; // Long | Filter events with a timestamp greater than the start time, in Unix time (milliseconds). - Long end = 56L; // Long | Filter events with a timestamp smaller than the end time, in Unix time (milliseconds). - Boolean reverse = true; // Boolean | Sort events in reverse timestamp order. + Long start = 1767225600000L; // Long | Include events that happened after this point (with timestamp greater than or equal the provided `start` Unix milliseconds value). Defaults to 7 days ago. Setting `start` does not change `end`'s default of `now` — adjust it separately if needed. + Long end = 1769903999000L; // Long | Include events that happened before this point (with timestamp less than or equal the provided `end` Unix milliseconds value). Defaults to now. Setting `end` does not change `start`'s default of `7 days ago` — adjust it separately if needed. + Boolean reverse = true; // Boolean | When `true`, sort events oldest first (ascending timestamp order). Default is newest first (descending timestamp order). Boolean suspect = true; // Boolean | Filter events previously tagged as suspicious via the [Update API](https://docs.fingerprint.com/reference/server-api-v4-update-event). > Note: When using this parameter, only events with the `suspect` property explicitly set to `true` or `false` are returned. Events with undefined `suspect` property are left out of the response. Boolean vpn = true; // Boolean | Filter events by VPN Detection result. > Note: When using this parameter, only events with the `vpn` property set to `true` or `false` are returned. Events without a `vpn` Smart Signal result are left out of the response. Boolean virtualMachine = true; // Boolean | Filter events by Virtual Machine Detection result. > Note: When using this parameter, only events with the `virtual_machine` property set to `true` or `false` are returned. Events without a `virtual_machine` Smart Signal result are left out of the response. @@ -291,6 +296,8 @@ public class FingerprintApiExample { Boolean developerTools = true; // Boolean | Filter events by Developer Tools detection result. > Note: When using this parameter, only events with the `developer_tools` property set to `true` or `false` are returned. Events without a `developer_tools` Smart Signal result are left out of the response. Boolean locationSpoofing = true; // Boolean | Filter events by Location Spoofing detection result. > Note: When using this parameter, only events with the `location_spoofing` property set to `true` or `false` are returned. Events without a `location_spoofing` Smart Signal result are left out of the response. Boolean mitmAttack = true; // Boolean | Filter events by MITM (Man-in-the-Middle) Attack detection result. > Note: When using this parameter, only events with the `mitm_attack` property set to `true` or `false` are returned. Events without a `mitm_attack` Smart Signal result are left out of the response. + Boolean rareDevice = true; // Boolean | Filter events by Device Rarity detection result. > Note: When using this parameter, only events with the `rare_device` property set to `true` or `false` are returned. Events without a Device Rarity Smart Signal result are left out of the response. + SearchEventsRareDevicePercentileBucket rareDevicePercentileBucket = SearchEventsRareDevicePercentileBucket.fromValue(" Note: When using this parameter, only events with the `proxy` property set to `true` or `false` are returned. Events without a `proxy` Smart Signal result are left out of the response. String sdkVersion = "sdkVersion_example"; // String | Filter events by a specific SDK version associated with the identification event (`sdk.version` property). Example: `3.11.14` SearchEventsSdkPlatform sdkPlatform = SearchEventsSdkPlatform.fromValue("js"); // SearchEventsSdkPlatform | Filter events by the SDK Platform associated with the identification event (`sdk.platform` property) . `js` - Javascript agent (Web). `ios` - Apple iOS based devices. `android` - Android based devices. @@ -335,6 +342,8 @@ public class FingerprintApiExample { .setDeveloperTools(developerTools) .setLocationSpoofing(locationSpoofing) .setMitmAttack(mitmAttack) + .setRareDevice(rareDevice) + .setRareDevicePercentileBucket(rareDevicePercentileBucket) .setProxy(proxy) .setSdkVersion(sdkVersion) .setSdkPlatform(sdkPlatform) @@ -366,7 +375,7 @@ Object containing optional parameters for API method. Supports a fluent interfac | Name | Type | Description | Notes | |------------- | ------------- | ------------- | -------------| -| **limit** | **Integer**| Limit the number of events returned. | [optional] [default to 10] | +| **limit** | **Integer**| Maximum number of events to return. Results are selected from the time range (`start`, `end`), ordered by `reverse`, then truncated to provided `limit` size. So `reverse=true` returns the oldest N=`limit` events, otherwise the newest N=`limit` events. | [optional] [default to 10] | | **paginationKey** | **String**| Use `pagination_key` to get the next page of results. When more results are available (e.g., you requested up to 100 results for your query using `limit`, but there are more than 100 events total matching your request), the `pagination_key` field is added to the response. The pagination key is an arbitrary string that should not be interpreted in any way and should be passed as-is. In the following request, use that value in the `pagination_key` parameter to get the next page of results: 1. First request, returning most recent 200 events: `GET api-base-url/events?limit=100` 2. Use `response.pagination_key` to get the next page of results: `GET api-base-url/events?limit=100&pagination_key=1740815825085` | [optional] | | **visitorId** | **String**| Unique [visitor identifier](https://docs.fingerprint.com/reference/js-agent-v4-get-function#visitor_id) issued by Fingerprint Identification and all active Smart Signals. Filter events by matching Visitor ID (`identification.visitor_id` property). | [optional] | | **highRecallId** | **String**| The High Recall ID is a supplementary browser identifier designed for use cases that require wider coverage over precision. Compared to the standard visitor ID, the High Recall ID strives to match incoming browsers more generously (rather than precisely) with existing browsers and thus identifies fewer browsers as new. The High Recall ID is best suited for use cases that are sensitive to browsers being identified as new and where mismatched browsers are not detrimental. Filter events by matching High Recall ID (`supplementary_id_high_recall.visitor_id` property). | [optional] | @@ -378,9 +387,9 @@ Object containing optional parameters for API method. Supports a fluent interfac | **bundleId** | **String**| Filter events by the Bundle ID (iOS) associated with the event. | [optional] | | **packageName** | **String**| Filter events by the Package Name (Android) associated with the event. | [optional] | | **origin** | **String**| Filter events by the origin field of the event. This is applicable to web events only (e.g., https://example.com) | [optional] | -| **start** | **Long**| Filter events with a timestamp greater than the start time, in Unix time (milliseconds). | [optional] | -| **end** | **Long**| Filter events with a timestamp smaller than the end time, in Unix time (milliseconds). | [optional] | -| **reverse** | **Boolean**| Sort events in reverse timestamp order. | [optional] | +| **start** | **Long**| Include events that happened after this point (with timestamp greater than or equal the provided `start` Unix milliseconds value). Defaults to 7 days ago. Setting `start` does not change `end`'s default of `now` — adjust it separately if needed. | [optional] | +| **end** | **Long**| Include events that happened before this point (with timestamp less than or equal the provided `end` Unix milliseconds value). Defaults to now. Setting `end` does not change `start`'s default of `7 days ago` — adjust it separately if needed. | [optional] | +| **reverse** | **Boolean**| When `true`, sort events oldest first (ascending timestamp order). Default is newest first (descending timestamp order). | [optional] | | **suspect** | **Boolean**| Filter events previously tagged as suspicious via the [Update API](https://docs.fingerprint.com/reference/server-api-v4-update-event). > Note: When using this parameter, only events with the `suspect` property explicitly set to `true` or `false` are returned. Events with undefined `suspect` property are left out of the response. | [optional] | | **vpn** | **Boolean**| Filter events by VPN Detection result. > Note: When using this parameter, only events with the `vpn` property set to `true` or `false` are returned. Events without a `vpn` Smart Signal result are left out of the response. | [optional] | | **virtualMachine** | **Boolean**| Filter events by Virtual Machine Detection result. > Note: When using this parameter, only events with the `virtual_machine` property set to `true` or `false` are returned. Events without a `virtual_machine` Smart Signal result are left out of the response. | [optional] | @@ -399,6 +408,8 @@ Object containing optional parameters for API method. Supports a fluent interfac | **developerTools** | **Boolean**| Filter events by Developer Tools detection result. > Note: When using this parameter, only events with the `developer_tools` property set to `true` or `false` are returned. Events without a `developer_tools` Smart Signal result are left out of the response. | [optional] | | **locationSpoofing** | **Boolean**| Filter events by Location Spoofing detection result. > Note: When using this parameter, only events with the `location_spoofing` property set to `true` or `false` are returned. Events without a `location_spoofing` Smart Signal result are left out of the response. | [optional] | | **mitmAttack** | **Boolean**| Filter events by MITM (Man-in-the-Middle) Attack detection result. > Note: When using this parameter, only events with the `mitm_attack` property set to `true` or `false` are returned. Events without a `mitm_attack` Smart Signal result are left out of the response. | [optional] | +| **rareDevice** | **Boolean**| Filter events by Device Rarity detection result. > Note: When using this parameter, only events with the `rare_device` property set to `true` or `false` are returned. Events without a Device Rarity Smart Signal result are left out of the response. | [optional] | +| **rareDevicePercentileBucket** | **SearchEventsRareDevicePercentileBucket**| Filter events by Device Rarity percentile bucket. ` Note: When using this parameter, only events with the `proxy` property set to `true` or `false` are returned. Events without a `proxy` Smart Signal result are left out of the response. | [optional] | | **sdkVersion** | **String**| Filter events by a specific SDK version associated with the identification event (`sdk.version` property). Example: `3.11.14` | [optional] | | **sdkPlatform** | **SearchEventsSdkPlatform**| Filter events by the SDK Platform associated with the identification event (`sdk.platform` property) . `js` - Javascript agent (Web). `ios` - Apple iOS based devices. `android` - Android based devices. | [optional] [enum: js, android, ios] | diff --git a/docs/RareDevicePercentileBucket.md b/docs/RareDevicePercentileBucket.md new file mode 100644 index 00000000..387f37fc --- /dev/null +++ b/docs/RareDevicePercentileBucket.md @@ -0,0 +1,26 @@ + + +# RareDevicePercentileBucket +The rarity percentile bucket of the device, indicating how uncommon the device configuration is compared to all observed devices. +> This Smart Signal is currently in beta and only available to select customers. If you are interested, please [contact our support team](https://fingerprint.com/support/). + + +## Enum + + +* `_P95` (value: `" + Maximum number of events to return. Results are selected from the + time range (`start`, `end`), ordered by `reverse`, then truncated to + provided `limit` size. So `reverse=true` returns the oldest + N=`limit` events, otherwise the newest N=`limit` events. - name: pagination_key in: query schema: @@ -368,23 +381,30 @@ paths: schema: type: integer format: int64 + example: 1767225600000 description: > - Filter events with a timestamp greater than the start time, in Unix - time (milliseconds). + Include events that happened after this point (with timestamp + greater than or equal the provided `start` Unix milliseconds value). + Defaults to 7 days ago. Setting `start` does not change `end`'s + default of `now` — adjust it separately if needed. - name: end in: query schema: type: integer format: int64 + example: 1769903999000 description: > - Filter events with a timestamp smaller than the end time, in Unix - time (milliseconds). + Include events that happened before this point (with timestamp less + than or equal the provided `end` Unix milliseconds value). Defaults + to now. Setting `end` does not change `start`'s default of `7 days + ago` — adjust it separately if needed. - name: reverse in: query schema: type: boolean - description: | - Sort events in reverse timestamp order. + description: > + When `true`, sort events oldest first (ascending timestamp order). + Default is newest first (descending timestamp order). - name: suspect in: query schema: @@ -582,6 +602,29 @@ paths: `mitm_attack` property set to `true` or `false` are returned. Events without a `mitm_attack` Smart Signal result are left out of the response. + - name: rare_device + in: query + schema: + type: boolean + description: > + Filter events by Device Rarity detection result. + + > Note: When using this parameter, only events with the + `rare_device` property set to `true` or `false` are returned. Events + without a Device Rarity Smart Signal result are left out of the + response. + - name: rare_device_percentile_bucket + in: query + schema: + $ref: '#/components/schemas/SearchEventsRareDevicePercentileBucket' + description: | + Filter events by Device Rarity percentile bucket. + ` + Machine learning–based proxy score, represented as a floating-point + value between 0 and 1 (inclusive), with up to three decimal places of + precision. A higher score means a higher confidence in the positive + `proxy` detection result Incognito: type: boolean description: > @@ -1528,30 +1581,57 @@ components: Tampering: type: boolean description: > - Flag indicating browser tampering was detected. This happens when - either: - * There are inconsistencies in the browser configuration that cross internal tampering thresholds (see `tampering_details.anomaly_score`). - * The browser signature resembles an "anti-detect" browser specifically designed to evade fingerprinting (see `tampering_details.anti_detect_browser`). + The field can be used as a standalone flag for tampering detection. + Alternatively, the more granular fields documented below can be used for + workflows that require more context. + + * `true` if tampering is detected through an anomalous browser + signature, anti-detect browser detection, or other tampering-related + methods + + * `false` if none of the tampering checks return a positive result TamperingConfidence: type: string enum: - low - medium - high - description: | - Confidence level of the tampering detection. - If a proxy is not detected, confidence is "high". - If it's detected, can be "low", "medium", or "high". + description: > + The confidence level indicates how certain Fingerprint is that the + current request involves browser tampering. This confidence level is + determined by evaluating multiple factors, such as heuristic rules, + probabilistic anomaly detection, an anti detect browser ml model, and + other relevant methods. It is conveyed as a string with possible values + such as high, medium, or low + + In case of tampering: `true` + + * **High confidence**: heuristic anti detect browser signals and the ml + model are triggered, or all of the methods are triggered. + + * **Medium confidence**: either the ml model triggers alone, the anomaly + score triggers alone with or without the heuristic anti detect browser + methods trigger. + + * **Low confidence**: only the heuristic anti detect methods are + triggered. + + + In case of tampering: `false` + + * **High confidence:** Strong signals suggest the user is not tampering + with their request. TamperingMlScore: type: number format: double minimum: 0 maximum: 1 description: > - A score that indicates the models calculated probability that an event - is coming from an anti detect browser. - * Values above `0.8` indicate that the request is an anti detect browser based on the ml model - * Values below `0.8` indicate that the request is not an anti detect browser based on the ml model + The output of this model is captured as tampering_ml_score, a number + indicating how likely an event is coming from an anti detect browser. + Values close to 1 signify higher confidence and we consider anything + above the threshold of 0.8 to be actionable (the result and + anti_detect_browser fields conveniently captures that fact) TamperingDetails: type: object properties: @@ -1564,18 +1644,30 @@ components: - android - ios - browser - description: | - Confidence score (`0.0 - 1.0`) for tampering detection: - * Values above `0.5` indicate tampering. - * Values below `0.5` indicate genuine browsers. + description: > + The output of this model is captured as anomaly_score, a statistical + score indicating how rare the visitor's browser signature is + compared to the overall population. Values close to 1 signify highly + anomalous browsers and we consider anything above the threshold of + 0.5 to be actionable (the result field conveniently captures that + fact). anti_detect_browser: type: boolean x-platforms: - browser description: > - True if the identified browser resembles an "anti-detect" browser, - such as Incognition, which attempts to evade identification by - manipulating its fingerprint. + Detects whether the request shows evidence of anti-detect browser + usage. + + This field may be triggered by: + + * heuristic detection of known anti-detect browser behavior + + * machine learning detection of anti-detect browser patterns + + + Examples of anti-detect browsers include tools such as AdsPower, + DolphinAnty, OctoBrowser, and GoLogin. VelocityData: type: object description: > @@ -1758,6 +1850,34 @@ components: HighActivity: type: boolean description: Flag indicating if the request came from a high-activity visitor. + RareDevice: + type: boolean + description: > + `true` if the device is considered rare based on its combination of + hardware and software attributes. A device is classified as rare if it + falls within the top 99.9 percentile (lowest-frequency segment) of + observed traffic, or if its configuration has not been previously seen + (`not_seen`). + + > This Smart Signal is currently in beta and only available to select + customers. If you are interested, please [contact our support + team](https://fingerprint.com/support/). + RareDevicePercentileBucket: + type: string + description: > + The rarity percentile bucket of the device, indicating how uncommon the + device configuration is compared to all observed devices. + + > This Smart Signal is currently in beta and only available to select + customers. If you are interested, please [contact our support + team](https://fingerprint.com/support/). + enum: + - @@ -1853,7 +1973,7 @@ components: description: > Navigator languages reported by the agent including fallbacks. Each inner array represents ordered language preferences reported by - different APIs. + different APIs. Available for both browsers and iOS devices items: type: array items: @@ -1894,7 +2014,7 @@ components: type: string ScreenResolution: type: array - description: Current screen resolution. + description: Current screen resolution. Available for both browsers and iOS devices minItems: 2 maxItems: 2 items: @@ -1924,7 +2044,6 @@ components: HardwareConcurrency: type: integer format: int32 - minimum: 1 description: Number of logical CPU cores reported by the browser. DateTimeLocale: type: string @@ -1998,6 +2117,18 @@ components: Math: type: string description: Hash of Math APIs used for entropy collection. + DeviceModel: + type: string + description: Device model string. Available only for Android and iOS devices. + DeviceManufacturer: + type: string + description: Device manufacturer string. Available only for Android and iOS devices. + FontHash: + type: string + description: Unique identifier for the user’s installed fonts. + TimezoneOffset: + type: string + description: UTC offset in "±HH:MM" format derived from the detected IANA timezone. RawDeviceAttributes: type: object description: > @@ -2055,6 +2186,14 @@ components: $ref: '#/components/schemas/IndexedDb' math: $ref: '#/components/schemas/Math' + device_model: + $ref: '#/components/schemas/DeviceModel' + device_manufacturer: + $ref: '#/components/schemas/DeviceManufacturer' + font_hash: + $ref: '#/components/schemas/FontHash' + timezone_offset: + $ref: '#/components/schemas/TimezoneOffset' Event: type: object description: >- @@ -2229,6 +2368,10 @@ components: - android - ios - browser + proxy_ml_score: + $ref: '#/components/schemas/ProxyMLScore' + x-platforms: + - browser incognito: $ref: '#/components/schemas/Incognito' x-platforms: @@ -2340,14 +2483,25 @@ components: - android - ios - browser + rare_device: + $ref: '#/components/schemas/RareDevice' + x-platforms: + - browser + rare_device_percentile_bucket: + $ref: '#/components/schemas/RareDevicePercentileBucket' + x-platforms: + - browser raw_device_attributes: $ref: '#/components/schemas/RawDeviceAttributes' x-platforms: + - android + - ios - browser ErrorCode: type: string enum: - request_cannot_be_parsed + - request_read_timeout - secret_api_key_required - secret_api_key_not_found - public_api_key_required @@ -2370,6 +2524,9 @@ components: * `request_cannot_be_parsed` - The query parameters or JSON payload contains some errors that prevented us from parsing it (wrong type/surpassed limits). + * `request_read_timeout` - The request body could not be read before the + connection timed out. + * `secret_api_key_required` - secret API key in header is missing or empty. @@ -2506,6 +2663,23 @@ components: > Note: When using this parameter, only events with the `vpn.confidence` property set to a valid value are returned. Events without a `vpn` Smart Signal result are left out of the response. + SearchEventsRareDevicePercentileBucket: + type: string + enum: + - Note: When using this parameter, only events with the `rare_device` property set to `true` or `false` are returned. Events without a Device Rarity Smart Signal result are left out of the response. + */ + public Boolean getRareDevice() { + return rareDevice; + } + + /** + * setter for rareDevice - Filter events by Device Rarity detection result. > Note: When using this parameter, only events with the `rare_device` property set to `true` or `false` are returned. Events without a Device Rarity Smart Signal result are left out of the response. + */ + public SearchEventsOptionalParams setRareDevice(Boolean rareDevice) { + this.rareDevice = rareDevice; + return this; + } + + /** + * getter for rareDevicePercentileBucket - Filter events by Device Rarity percentile bucket. ` Note: When using this parameter, only events with the `proxy` property set to `true` or `false` are returned. Events without a `proxy` Smart Signal result are left out of the response. */ @@ -945,7 +979,7 @@ public SearchEventsOptionalParams setSimulator(Boolean simulator) { /** * Search events - * ## Search The `/v4/events` endpoint provides a convenient way to search for past events based on specific parameters. Typical use cases and queries include: - Searching for events associated with a single `visitor_id` within a time range to get historical behavior of a visitor. - Searching for events associated with a single `linked_id` within a time range to get all events associated with your internal account identifier. - Excluding all bot traffic from the query (`good` and `bad` bots) If you don't provide `start` or `end` parameters, the default search range is the **last 7 days**. ### Filtering events with the `suspect` flag The `/v4/events` endpoint unlocks a powerful method for fraud protection analytics. The `suspect` flag is exposed in all events where it was previously set by the update API. You can also apply the `suspect` query parameter as a filter to find all potentially fraudulent activity that you previously marked as `suspect`. This helps identify patterns of fraudulent behavior. ### Environment scoping If you use a secret key that is scoped to an environment, you will only get events associated with the same environment. With a workspace-scoped environment, you will get events from all environments. Smart Signals not activated for your workspace or are not included in the response. + * ## Search The `/v4/events` endpoint provides a convenient way to search for past events based on specific parameters. Typical use cases and queries include: - Searching for events associated with a single `visitor_id` within a time range to get historical behavior of a visitor. - Searching for events associated with a single `linked_id` within a time range to get all events associated with your internal account identifier. - Excluding all bot traffic from the query (`good` and `bad` bots) By default, the API searches events from the last 7 days, sorts them by newest first and returns the last 10 events. - Use `start` and `end` to specify the time range of the search. - Use `reverse=true` to sort the results oldest first. - Use `limit` to specify the number of events to return. - Use `pagination_key` to get the next page of results if there are more than `limit` events. ### Filtering events with the `suspect` flag The `/v4/events` endpoint unlocks a powerful method for fraud protection analytics. The `suspect` flag is exposed in all events where it was previously set by the update API. You can also apply the `suspect` query parameter as a filter to find all potentially fraudulent activity that you previously marked as `suspect`. This helps identify patterns of fraudulent behavior. ### Environment scoping If you use a secret key that is scoped to an environment, you will only get events associated with the same environment. With a workspace-scoped environment, you will get events from all environments. Smart Signals not activated for your workspace or are not included in the response. * @param searchEventsOptionalParams Object containing optional parameters for API method. (optional) * @return EventSearch * @throws ApiException if fails to make API call @@ -965,7 +999,7 @@ public EventSearch searchEvents(SearchEventsOptionalParams searchEventsOptionalP /** * Search events - * ## Search The `/v4/events` endpoint provides a convenient way to search for past events based on specific parameters. Typical use cases and queries include: - Searching for events associated with a single `visitor_id` within a time range to get historical behavior of a visitor. - Searching for events associated with a single `linked_id` within a time range to get all events associated with your internal account identifier. - Excluding all bot traffic from the query (`good` and `bad` bots) If you don't provide `start` or `end` parameters, the default search range is the **last 7 days**. ### Filtering events with the `suspect` flag The `/v4/events` endpoint unlocks a powerful method for fraud protection analytics. The `suspect` flag is exposed in all events where it was previously set by the update API. You can also apply the `suspect` query parameter as a filter to find all potentially fraudulent activity that you previously marked as `suspect`. This helps identify patterns of fraudulent behavior. ### Environment scoping If you use a secret key that is scoped to an environment, you will only get events associated with the same environment. With a workspace-scoped environment, you will get events from all environments. Smart Signals not activated for your workspace or are not included in the response. + * ## Search The `/v4/events` endpoint provides a convenient way to search for past events based on specific parameters. Typical use cases and queries include: - Searching for events associated with a single `visitor_id` within a time range to get historical behavior of a visitor. - Searching for events associated with a single `linked_id` within a time range to get all events associated with your internal account identifier. - Excluding all bot traffic from the query (`good` and `bad` bots) By default, the API searches events from the last 7 days, sorts them by newest first and returns the last 10 events. - Use `start` and `end` to specify the time range of the search. - Use `reverse=true` to sort the results oldest first. - Use `limit` to specify the number of events to return. - Use `pagination_key` to get the next page of results if there are more than `limit` events. ### Filtering events with the `suspect` flag The `/v4/events` endpoint unlocks a powerful method for fraud protection analytics. The `suspect` flag is exposed in all events where it was previously set by the update API. You can also apply the `suspect` query parameter as a filter to find all potentially fraudulent activity that you previously marked as `suspect`. This helps identify patterns of fraudulent behavior. ### Environment scoping If you use a secret key that is scoped to an environment, you will only get events associated with the same environment. With a workspace-scoped environment, you will get events from all environments. Smart Signals not activated for your workspace or are not included in the response. * @param searchEventsOptionalParams Object containing optional parameters for API method. (optional) * @return ApiResponse * @throws ApiException if fails to make API call @@ -1071,6 +1105,14 @@ public ApiResponse searchEventsWithHttpInfo( localVarQueryParams.addAll( apiClient.parameterToPairs( "", "mitm_attack", searchEventsOptionalParams.getMitmAttack())); + localVarQueryParams.addAll( + apiClient.parameterToPairs( + "", "rare_device", searchEventsOptionalParams.getRareDevice())); + localVarQueryParams.addAll( + apiClient.parameterToPairs( + "", + "rare_device_percentile_bucket", + searchEventsOptionalParams.getRareDevicePercentileBucket())); localVarQueryParams.addAll( apiClient.parameterToPairs("", "proxy", searchEventsOptionalParams.getProxy())); localVarQueryParams.addAll( diff --git a/sdk/src/main/java/com/fingerprint/v4/model/ErrorCode.java b/sdk/src/main/java/com/fingerprint/v4/model/ErrorCode.java index 91d7f3b5..f5e67298 100644 --- a/sdk/src/main/java/com/fingerprint/v4/model/ErrorCode.java +++ b/sdk/src/main/java/com/fingerprint/v4/model/ErrorCode.java @@ -16,11 +16,13 @@ import com.fasterxml.jackson.annotation.JsonValue; /** - * Error code: * `request_cannot_be_parsed` - The query parameters or JSON payload contains some errors that prevented us from parsing it (wrong type/surpassed limits). * `secret_api_key_required` - secret API key in header is missing or empty. * `secret_api_key_not_found` - No Fingerprint workspace found for specified secret API key. * `public_api_key_required` - public API key in header is missing or empty. * `public_api_key_not_found` - No Fingerprint workspace found for specified public API key. * `subscription_not_active` - Fingerprint workspace is not active. * `wrong_region` - Server and workspace region differ. * `feature_not_enabled` - This feature (for example, Delete API) is not enabled for your workspace. * `visitor_not_found` - The specified visitor ID was not found. It never existed or it may have already been deleted. * `too_many_requests` - The limit on secret API key requests per second has been exceeded. * `state_not_ready` - The event specified with event ID is not ready for updates yet. Try again. This error happens in rare cases when update API is called immediately after receiving the event ID on the client. In case you need to send information right away, we recommend using the JS agent API instead. * `failed` - Internal server error. * `event_not_found` - The specified event ID was not found. It never existed, expired, or it has been deleted. * `missing_module` - The request is invalid because it is missing a required module. * `payload_too_large` - The request payload is too large and cannot be processed. * `service_unavailable` - The service was unable to process the request. * `ruleset_not_found` - The specified ruleset was not found. It never existed or it has been deleted. + * Error code: * `request_cannot_be_parsed` - The query parameters or JSON payload contains some errors that prevented us from parsing it (wrong type/surpassed limits). * `request_read_timeout` - The request body could not be read before the connection timed out. * `secret_api_key_required` - secret API key in header is missing or empty. * `secret_api_key_not_found` - No Fingerprint workspace found for specified secret API key. * `public_api_key_required` - public API key in header is missing or empty. * `public_api_key_not_found` - No Fingerprint workspace found for specified public API key. * `subscription_not_active` - Fingerprint workspace is not active. * `wrong_region` - Server and workspace region differ. * `feature_not_enabled` - This feature (for example, Delete API) is not enabled for your workspace. * `visitor_not_found` - The specified visitor ID was not found. It never existed or it may have already been deleted. * `too_many_requests` - The limit on secret API key requests per second has been exceeded. * `state_not_ready` - The event specified with event ID is not ready for updates yet. Try again. This error happens in rare cases when update API is called immediately after receiving the event ID on the client. In case you need to send information right away, we recommend using the JS agent API instead. * `failed` - Internal server error. * `event_not_found` - The specified event ID was not found. It never existed, expired, or it has been deleted. * `missing_module` - The request is invalid because it is missing a required module. * `payload_too_large` - The request payload is too large and cannot be processed. * `service_unavailable` - The service was unable to process the request. * `ruleset_not_found` - The specified ruleset was not found. It never existed or it has been deleted. */ public enum ErrorCode { REQUEST_CANNOT_BE_PARSED("request_cannot_be_parsed"), + REQUEST_READ_TIMEOUT("request_read_timeout"), + SECRET_API_KEY_REQUIRED("secret_api_key_required"), SECRET_API_KEY_NOT_FOUND("secret_api_key_not_found"), diff --git a/sdk/src/main/java/com/fingerprint/v4/model/Event.java b/sdk/src/main/java/com/fingerprint/v4/model/Event.java index 61e16094..e6ff31ff 100644 --- a/sdk/src/main/java/com/fingerprint/v4/model/Event.java +++ b/sdk/src/main/java/com/fingerprint/v4/model/Event.java @@ -55,6 +55,7 @@ Event.JSON_PROPERTY_PROXY, Event.JSON_PROPERTY_PROXY_CONFIDENCE, Event.JSON_PROPERTY_PROXY_DETAILS, + Event.JSON_PROPERTY_PROXY_ML_SCORE, Event.JSON_PROPERTY_INCOGNITO, Event.JSON_PROPERTY_JAILBROKEN, Event.JSON_PROPERTY_LOCATION_SPOOFING, @@ -77,6 +78,8 @@ Event.JSON_PROPERTY_VPN_ORIGIN_COUNTRY, Event.JSON_PROPERTY_VPN_METHODS, Event.JSON_PROPERTY_HIGH_ACTIVITY_DEVICE, + Event.JSON_PROPERTY_RARE_DEVICE, + Event.JSON_PROPERTY_RARE_DEVICE_PERCENTILE_BUCKET, Event.JSON_PROPERTY_RAW_DEVICE_ATTRIBUTES }) @jakarta.annotation.Generated( @@ -183,6 +186,9 @@ public class Event { public static final String JSON_PROPERTY_PROXY_DETAILS = "proxy_details"; @jakarta.annotation.Nullable private ProxyDetails proxyDetails; + public static final String JSON_PROPERTY_PROXY_ML_SCORE = "proxy_ml_score"; + @jakarta.annotation.Nullable private Double proxyMlScore; + public static final String JSON_PROPERTY_INCOGNITO = "incognito"; @jakarta.annotation.Nullable private Boolean incognito; @@ -249,6 +255,13 @@ public class Event { public static final String JSON_PROPERTY_HIGH_ACTIVITY_DEVICE = "high_activity_device"; @jakarta.annotation.Nullable private Boolean highActivityDevice; + public static final String JSON_PROPERTY_RARE_DEVICE = "rare_device"; + @jakarta.annotation.Nullable private Boolean rareDevice; + + public static final String JSON_PROPERTY_RARE_DEVICE_PERCENTILE_BUCKET = + "rare_device_percentile_bucket"; + @jakarta.annotation.Nullable private RareDevicePercentileBucket rareDevicePercentileBucket; + public static final String JSON_PROPERTY_RAW_DEVICE_ATTRIBUTES = "raw_device_attributes"; @jakarta.annotation.Nullable private RawDeviceAttributes rawDeviceAttributes; @@ -972,6 +985,30 @@ public void setProxyDetails(@jakarta.annotation.Nullable ProxyDetails proxyDetai this.proxyDetails = proxyDetails; } + public Event proxyMlScore(@jakarta.annotation.Nullable Double proxyMlScore) { + this.proxyMlScore = proxyMlScore; + return this; + } + + /** + * Machine learning–based proxy score, represented as a floating-point value between 0 and 1 (inclusive), with up to three decimal places of precision. A higher score means a higher confidence in the positive `proxy` detection result + * minimum: 0 + * maximum: 1 + * @return proxyMlScore + */ + @jakarta.annotation.Nullable + @JsonProperty(value = JSON_PROPERTY_PROXY_ML_SCORE, required = false) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public Double getProxyMlScore() { + return proxyMlScore; + } + + @JsonProperty(value = JSON_PROPERTY_PROXY_ML_SCORE, required = false) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public void setProxyMlScore(@jakarta.annotation.Nullable Double proxyMlScore) { + this.proxyMlScore = proxyMlScore; + } + public Event incognito(@jakarta.annotation.Nullable Boolean incognito) { this.incognito = incognito; return this; @@ -1176,7 +1213,7 @@ public Event tampering(@jakarta.annotation.Nullable Boolean tampering) { } /** - * Flag indicating browser tampering was detected. This happens when either: * There are inconsistencies in the browser configuration that cross internal tampering thresholds (see `tampering_details.anomaly_score`). * The browser signature resembles an \"anti-detect\" browser specifically designed to evade fingerprinting (see `tampering_details.anti_detect_browser`). + * The field can be used as a standalone flag for tampering detection. Alternatively, the more granular fields documented below can be used for workflows that require more context. * `true` if tampering is detected through an anomalous browser signature, anti-detect browser detection, or other tampering-related methods * `false` if none of the tampering checks return a positive result * @return tampering */ @jakarta.annotation.Nullable @@ -1222,7 +1259,7 @@ public Event tamperingMlScore(@jakarta.annotation.Nullable Double tamperingMlSco } /** - * A score that indicates the models calculated probability that an event is coming from an anti detect browser. * Values above `0.8` indicate that the request is an anti detect browser based on the ml model * Values below `0.8` indicate that the request is not an anti detect browser based on the ml model + * The output of this model is captured as tampering_ml_score, a number indicating how likely an event is coming from an anti detect browser. Values close to 1 signify higher confidence and we consider anything above the threshold of 0.8 to be actionable (the result and anti_detect_browser fields conveniently captures that fact) * minimum: 0 * maximum: 1 * @return tamperingMlScore @@ -1462,6 +1499,52 @@ public void setHighActivityDevice(@jakarta.annotation.Nullable Boolean highActiv this.highActivityDevice = highActivityDevice; } + public Event rareDevice(@jakarta.annotation.Nullable Boolean rareDevice) { + this.rareDevice = rareDevice; + return this; + } + + /** + * `true` if the device is considered rare based on its combination of hardware and software attributes. A device is classified as rare if it falls within the top 99.9 percentile (lowest-frequency segment) of observed traffic, or if its configuration has not been previously seen (`not_seen`). > This Smart Signal is currently in beta and only available to select customers. If you are interested, please [contact our support team](https://fingerprint.com/support/). + * @return rareDevice + */ + @jakarta.annotation.Nullable + @JsonProperty(value = JSON_PROPERTY_RARE_DEVICE, required = false) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public Boolean getRareDevice() { + return rareDevice; + } + + @JsonProperty(value = JSON_PROPERTY_RARE_DEVICE, required = false) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public void setRareDevice(@jakarta.annotation.Nullable Boolean rareDevice) { + this.rareDevice = rareDevice; + } + + public Event rareDevicePercentileBucket( + @jakarta.annotation.Nullable RareDevicePercentileBucket rareDevicePercentileBucket) { + this.rareDevicePercentileBucket = rareDevicePercentileBucket; + return this; + } + + /** + * Get rareDevicePercentileBucket + * @return rareDevicePercentileBucket + */ + @jakarta.annotation.Nullable + @JsonProperty(value = JSON_PROPERTY_RARE_DEVICE_PERCENTILE_BUCKET, required = false) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public RareDevicePercentileBucket getRareDevicePercentileBucket() { + return rareDevicePercentileBucket; + } + + @JsonProperty(value = JSON_PROPERTY_RARE_DEVICE_PERCENTILE_BUCKET, required = false) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public void setRareDevicePercentileBucket( + @jakarta.annotation.Nullable RareDevicePercentileBucket rareDevicePercentileBucket) { + this.rareDevicePercentileBucket = rareDevicePercentileBucket; + } + public Event rawDeviceAttributes( @jakarta.annotation.Nullable RawDeviceAttributes rawDeviceAttributes) { this.rawDeviceAttributes = rawDeviceAttributes; @@ -1531,6 +1614,7 @@ public boolean equals(Object o) { && Objects.equals(this.proxy, event.proxy) && Objects.equals(this.proxyConfidence, event.proxyConfidence) && Objects.equals(this.proxyDetails, event.proxyDetails) + && Objects.equals(this.proxyMlScore, event.proxyMlScore) && Objects.equals(this.incognito, event.incognito) && Objects.equals(this.jailbroken, event.jailbroken) && Objects.equals(this.locationSpoofing, event.locationSpoofing) @@ -1553,6 +1637,8 @@ public boolean equals(Object o) { && Objects.equals(this.vpnOriginCountry, event.vpnOriginCountry) && Objects.equals(this.vpnMethods, event.vpnMethods) && Objects.equals(this.highActivityDevice, event.highActivityDevice) + && Objects.equals(this.rareDevice, event.rareDevice) + && Objects.equals(this.rareDevicePercentileBucket, event.rareDevicePercentileBucket) && Objects.equals(this.rawDeviceAttributes, event.rawDeviceAttributes); } @@ -1591,6 +1677,7 @@ public int hashCode() { proxy, proxyConfidence, proxyDetails, + proxyMlScore, incognito, jailbroken, locationSpoofing, @@ -1613,6 +1700,8 @@ public int hashCode() { vpnOriginCountry, vpnMethods, highActivityDevice, + rareDevice, + rareDevicePercentileBucket, rawDeviceAttributes); } @@ -1658,6 +1747,7 @@ public String toString() { sb.append(" proxy: ").append(toIndentedString(proxy)).append("\n"); sb.append(" proxyConfidence: ").append(toIndentedString(proxyConfidence)).append("\n"); sb.append(" proxyDetails: ").append(toIndentedString(proxyDetails)).append("\n"); + sb.append(" proxyMlScore: ").append(toIndentedString(proxyMlScore)).append("\n"); sb.append(" incognito: ").append(toIndentedString(incognito)).append("\n"); sb.append(" jailbroken: ").append(toIndentedString(jailbroken)).append("\n"); sb.append(" locationSpoofing: ").append(toIndentedString(locationSpoofing)).append("\n"); @@ -1684,6 +1774,10 @@ public String toString() { sb.append(" vpnOriginCountry: ").append(toIndentedString(vpnOriginCountry)).append("\n"); sb.append(" vpnMethods: ").append(toIndentedString(vpnMethods)).append("\n"); sb.append(" highActivityDevice: ").append(toIndentedString(highActivityDevice)).append("\n"); + sb.append(" rareDevice: ").append(toIndentedString(rareDevice)).append("\n"); + sb.append(" rareDevicePercentileBucket: ") + .append(toIndentedString(rareDevicePercentileBucket)) + .append("\n"); sb.append(" rawDeviceAttributes: ") .append(toIndentedString(rawDeviceAttributes)) .append("\n"); diff --git a/sdk/src/main/java/com/fingerprint/v4/model/RareDevicePercentileBucket.java b/sdk/src/main/java/com/fingerprint/v4/model/RareDevicePercentileBucket.java new file mode 100644 index 00000000..9fdefc6f --- /dev/null +++ b/sdk/src/main/java/com/fingerprint/v4/model/RareDevicePercentileBucket.java @@ -0,0 +1,61 @@ +/* + * Server API + * Fingerprint Server API allows you to get, search, and update Events in a server environment. It can be used for data exports, decision-making, and data analysis scenarios. Server API is intended for server-side usage, it's not intended to be used from the client side, whether it's a browser or a mobile device. + * + * The version of the OpenAPI document: 4 + * Contact: support@fingerprint.com + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +package com.fingerprint.v4.model; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +/** + * The rarity percentile bucket of the device, indicating how uncommon the device configuration is compared to all observed devices. > This Smart Signal is currently in beta and only available to select customers. If you are interested, please [contact our support team](https://fingerprint.com/support/). + */ +public enum RareDevicePercentileBucket { + _P95(" languagesItem) { } /** - * Navigator languages reported by the agent including fallbacks. Each inner array represents ordered language preferences reported by different APIs. + * Navigator languages reported by the agent including fallbacks. Each inner array represents ordered language preferences reported by different APIs. Available for both browsers and iOS devices * @return languages */ @jakarta.annotation.Nullable @@ -362,7 +378,7 @@ public RawDeviceAttributes addScreenResolutionItem(Integer screenResolutionItem) } /** - * Current screen resolution. + * Current screen resolution. Available for both browsers and iOS devices * @return screenResolution */ @jakarta.annotation.Nullable @@ -474,7 +490,6 @@ public RawDeviceAttributes hardwareConcurrency( /** * Number of logical CPU cores reported by the browser. - * minimum: 1 * @return hardwareConcurrency */ @jakarta.annotation.Nullable @@ -718,6 +733,95 @@ public void setMath(@jakarta.annotation.Nullable String math) { this.math = math; } + public RawDeviceAttributes deviceModel(@jakarta.annotation.Nullable String deviceModel) { + this.deviceModel = deviceModel; + return this; + } + + /** + * Device model string. Available only for Android and iOS devices. + * @return deviceModel + */ + @jakarta.annotation.Nullable + @JsonProperty(value = JSON_PROPERTY_DEVICE_MODEL, required = false) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public String getDeviceModel() { + return deviceModel; + } + + @JsonProperty(value = JSON_PROPERTY_DEVICE_MODEL, required = false) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public void setDeviceModel(@jakarta.annotation.Nullable String deviceModel) { + this.deviceModel = deviceModel; + } + + public RawDeviceAttributes deviceManufacturer( + @jakarta.annotation.Nullable String deviceManufacturer) { + this.deviceManufacturer = deviceManufacturer; + return this; + } + + /** + * Device manufacturer string. Available only for Android and iOS devices. + * @return deviceManufacturer + */ + @jakarta.annotation.Nullable + @JsonProperty(value = JSON_PROPERTY_DEVICE_MANUFACTURER, required = false) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public String getDeviceManufacturer() { + return deviceManufacturer; + } + + @JsonProperty(value = JSON_PROPERTY_DEVICE_MANUFACTURER, required = false) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public void setDeviceManufacturer(@jakarta.annotation.Nullable String deviceManufacturer) { + this.deviceManufacturer = deviceManufacturer; + } + + public RawDeviceAttributes fontHash(@jakarta.annotation.Nullable String fontHash) { + this.fontHash = fontHash; + return this; + } + + /** + * Unique identifier for the user’s installed fonts. + * @return fontHash + */ + @jakarta.annotation.Nullable + @JsonProperty(value = JSON_PROPERTY_FONT_HASH, required = false) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public String getFontHash() { + return fontHash; + } + + @JsonProperty(value = JSON_PROPERTY_FONT_HASH, required = false) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public void setFontHash(@jakarta.annotation.Nullable String fontHash) { + this.fontHash = fontHash; + } + + public RawDeviceAttributes timezoneOffset(@jakarta.annotation.Nullable String timezoneOffset) { + this.timezoneOffset = timezoneOffset; + return this; + } + + /** + * UTC offset in \"±HH:MM\" format derived from the detected IANA timezone. + * @return timezoneOffset + */ + @jakarta.annotation.Nullable + @JsonProperty(value = JSON_PROPERTY_TIMEZONE_OFFSET, required = false) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public String getTimezoneOffset() { + return timezoneOffset; + } + + @JsonProperty(value = JSON_PROPERTY_TIMEZONE_OFFSET, required = false) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public void setTimezoneOffset(@jakarta.annotation.Nullable String timezoneOffset) { + this.timezoneOffset = timezoneOffset; + } + /** * Return true if this RawDeviceAttributes object is equal to o. */ @@ -754,7 +858,11 @@ public boolean equals(Object o) { && Objects.equals(this.audio, rawDeviceAttributes.audio) && Objects.equals(this.plugins, rawDeviceAttributes.plugins) && Objects.equals(this.indexedDb, rawDeviceAttributes.indexedDb) - && Objects.equals(this.math, rawDeviceAttributes.math); + && Objects.equals(this.math, rawDeviceAttributes.math) + && Objects.equals(this.deviceModel, rawDeviceAttributes.deviceModel) + && Objects.equals(this.deviceManufacturer, rawDeviceAttributes.deviceManufacturer) + && Objects.equals(this.fontHash, rawDeviceAttributes.fontHash) + && Objects.equals(this.timezoneOffset, rawDeviceAttributes.timezoneOffset); } @Override @@ -784,7 +892,11 @@ public int hashCode() { audio, plugins, indexedDb, - math); + math, + deviceModel, + deviceManufacturer, + fontHash, + timezoneOffset); } @Override @@ -818,6 +930,10 @@ public String toString() { sb.append(" plugins: ").append(toIndentedString(plugins)).append("\n"); sb.append(" indexedDb: ").append(toIndentedString(indexedDb)).append("\n"); sb.append(" math: ").append(toIndentedString(math)).append("\n"); + sb.append(" deviceModel: ").append(toIndentedString(deviceModel)).append("\n"); + sb.append(" deviceManufacturer: ").append(toIndentedString(deviceManufacturer)).append("\n"); + sb.append(" fontHash: ").append(toIndentedString(fontHash)).append("\n"); + sb.append(" timezoneOffset: ").append(toIndentedString(timezoneOffset)).append("\n"); sb.append("}"); return sb.toString(); } diff --git a/sdk/src/main/java/com/fingerprint/v4/model/SearchEventsRareDevicePercentileBucket.java b/sdk/src/main/java/com/fingerprint/v4/model/SearchEventsRareDevicePercentileBucket.java new file mode 100644 index 00000000..e5e8d0f4 --- /dev/null +++ b/sdk/src/main/java/com/fingerprint/v4/model/SearchEventsRareDevicePercentileBucket.java @@ -0,0 +1,62 @@ +/* + * Server API + * Fingerprint Server API allows you to get, search, and update Events in a server environment. It can be used for data exports, decision-making, and data analysis scenarios. Server API is intended for server-side usage, it's not intended to be used from the client side, whether it's a browser or a mobile device. + * + * The version of the OpenAPI document: 4 + * Contact: support@fingerprint.com + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +package com.fingerprint.v4.model; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +/** + * Filter events by Device Rarity percentile bucket. `