From 1f3513df2c8be961c5270667f231cce8968f52a6 Mon Sep 17 00:00:00 2001 From: Juraj Uhlar Date: Mon, 31 Aug 2026 15:51:34 +0100 Subject: [PATCH 1/5] chore: generate flattened Event with optional source INTER-2457 option C. Event stays a single model; EventEdge is additive for POST /edge. --- README.md | 4 + docs/EdgeRequest.md | 20 + docs/EdgeRequestHeadersInner.md | 14 + docs/Event.md | 26 +- docs/EventEdge.md | 27 + docs/FingerprintApi.md | 120 +++- res/fingerprint-server-api.yaml | 488 ++++++++++--- .../fingerprint/v4/api/FingerprintApi.java | 113 ++- .../com/fingerprint/v4/model/EdgeRequest.java | 285 ++++++++ .../v4/model/EdgeRequestHeadersInner.java | 126 ++++ .../java/com/fingerprint/v4/model/Event.java | 674 +++++++++--------- .../com/fingerprint/v4/model/EventEdge.java | 484 +++++++++++++ 12 files changed, 1915 insertions(+), 466 deletions(-) create mode 100644 docs/EdgeRequest.md create mode 100644 docs/EdgeRequestHeadersInner.md create mode 100644 docs/EventEdge.md create mode 100644 sdk/src/main/java/com/fingerprint/v4/model/EdgeRequest.java create mode 100644 sdk/src/main/java/com/fingerprint/v4/model/EdgeRequestHeadersInner.java create mode 100644 sdk/src/main/java/com/fingerprint/v4/model/EventEdge.java diff --git a/README.md b/README.md index d694a5d..8b1ea2e 100644 --- a/README.md +++ b/README.md @@ -321,6 +321,7 @@ All URIs are relative to *https://api.fpjs.io/v4* Class | Method | HTTP request | Description ------------ | ------------- | ------------- | ------------- +*FingerprintApi* | [**analyzeRequestForAutomationIntelligence**](docs/FingerprintApi.md#analyzeRequestForAutomationIntelligence) | **POST** /edge | Collect Automation Intelligence. *FingerprintApi* | [**deleteVisitorData**](docs/FingerprintApi.md#deleteVisitorData) | **DELETE** /visitors/{visitor_id} | Delete a visitor ID *FingerprintApi* | [**getEvent**](docs/FingerprintApi.md#getEvent) | **GET** /events/{event_id} | Get an event by event ID *FingerprintApi* | [**searchEvents**](docs/FingerprintApi.md#searchEvents) | **GET** /events | Search events @@ -336,11 +337,14 @@ Class | Method | HTTP request | Description - [BotResult](docs/BotResult.md) - [BrowserDetails](docs/BrowserDetails.md) - [Canvas](docs/Canvas.md) + - [EdgeRequest](docs/EdgeRequest.md) + - [EdgeRequestHeadersInner](docs/EdgeRequestHeadersInner.md) - [Emoji](docs/Emoji.md) - [Error](docs/Error.md) - [ErrorCode](docs/ErrorCode.md) - [ErrorResponse](docs/ErrorResponse.md) - [Event](docs/Event.md) + - [EventEdge](docs/EventEdge.md) - [EventRuleAction](docs/EventRuleAction.md) - [EventRuleActionAllow](docs/EventRuleActionAllow.md) - [EventRuleActionBlock](docs/EventRuleActionBlock.md) diff --git a/docs/EdgeRequest.md b/docs/EdgeRequest.md new file mode 100644 index 0000000..cb8980a --- /dev/null +++ b/docs/EdgeRequest.md @@ -0,0 +1,20 @@ + + +# EdgeRequest + +HTTP request metadata (including the HTTP method, headers and IP address) sent by you (your server) to the Fingerprint API for IP and bot analysis. To improve accuracy, retain as much of the original semantics of the HTTP request as possible. For example, preserve the order of the request headers and their capitalization. At least one of `ipv4_address` or `ipv6_address` must be provided; a request with neither is rejected with a `400` error. If both IPv4 and IPv6 are provided, IP intelligence will be provided for each address. If an IPv4-mapped IPv6 address is provided in the `ipv6_address` request property, the IP intelligence will be provided in the `ipv4_address` property of the response. + +## Properties + +| Name | Type | Description | Notes | +|------------ | ------------- | ------------- | -------------| +|**headers** | [**List<EdgeRequestHeadersInner>**](EdgeRequestHeadersInner.md) | Ordered header entries from the request made to your server. Each entry represents one header line. If one header name appears as multiple lines, send each as a separate item in the array. Headers that contain authentication or session data must still be included, but with with their value set to an empty string. This includes headers like `Authorization` and `Cookie`, but may contain more depending on your specific project, for instance `Proxy-Authenticate` or `X-Api-Key`. Omitting the headers entirely changes the shape of the request and can affect detection. Never forward the real secret values. Whenever possible, we recommend preserving header order and capitalization to provide the best accuracy, however it’s not a strict requirement if your runtime does not maintain http header order or canonicalizes header names. | | +|**method** | **String** | The original HTTP method of the request. If supported in your runtime, preserve the original casing. | | +|**url** | **URI** | Absolute URL of the request, without a \\#fragment suffix. Only HTTP and HTTPS schemes are supported. | | +|**ipv4Address** | **String** | Client IPv4 address observed by your server. | [optional] | +|**ipv6Address** | **String** | Client IPv6 address observed by your server. | [optional] | +|**linkedId** | **String** | A customer-provided id that was sent with the request. | [optional] | +|**tags** | **Map<String, Object>** | A customer-provided value or an object that was sent with the identification request or updated later. | [optional] | + + + diff --git a/docs/EdgeRequestHeadersInner.md b/docs/EdgeRequestHeadersInner.md new file mode 100644 index 0000000..2e6c1db --- /dev/null +++ b/docs/EdgeRequestHeadersInner.md @@ -0,0 +1,14 @@ + + +# EdgeRequestHeadersInner + + +## Properties + +| Name | Type | Description | Notes | +|------------ | ------------- | ------------- | -------------| +|**name** | **String** | Header name as forwarded by your server. Headers must be valid according to RFC 7230 and will be canonicalized according to RFC 9112. | | +|**value** | **String** | Value of a single forwarded header entry. Be careful to preserve the original encoding and escaping. For example, do not double escape quotes. | | + + + diff --git a/docs/Event.md b/docs/Event.md index e041621..2ce4901 100644 --- a/docs/Event.md +++ b/docs/Event.md @@ -2,7 +2,7 @@ # Event -Contains results from Fingerprint Identification and all active Smart Signals. Some Smart Signals are only supported for certain device types, these fields will be omitted for events not generated from the supported devices. Consult the [Smart Signals reference](https://docs.fingerprint.com/docs/smart-signals-reference) for more details. +An identification event (`source: device`) or an Automation Intelligence event (`source: edge`). Use `source` to tell them apart. Device events include Identification and device-derived Smart Signals. Edge events do not. Consult the [Smart Signals reference](https://docs.fingerprint.com/docs/smart-signals-reference) for more details. ## Properties @@ -10,17 +10,25 @@ Contains results from Fingerprint Identification and all active Smart Signals. S |------------ | ------------- | ------------- | -------------| |**eventId** | **String** | Unique identifier of the user's request. The first portion of the event_id is a unix epoch milliseconds timestamp. | | |**timestamp** | **Long** | Timestamp of the event with millisecond precision in Unix time. | | +|**linkedId** | **String** | A customer-provided id that was sent with the request. | [optional] | +|**tags** | **Map<String, Object>** | A customer-provided value or an object that was sent with the identification request or updated later. | [optional] | +|**url** | **String** | Page URL from which the request was sent. | [optional] | +|**botInfo** | [**BotInfo**](BotInfo.md) | | [optional] | +|**ipInfo** | [**IPInfo**](IPInfo.md) | | [optional] | +|**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] | +|**vpn** | **Boolean** | VPN or other anonymizing service has been used when sending the request. | [optional] | +|**vpnConfidence** | [**VpnConfidence**](VpnConfidence.md) | | [optional] | +|**vpnMethods** | [**VpnMethods**](VpnMethods.md) | | [optional] | |**source** | [**EventSource**](EventSource.md) | | [optional] | |**incrementalIdentificationStatus** | [**IncrementalIdentificationStatus**](IncrementalIdentificationStatus.md) | | [optional] | -|**linkedId** | **String** | A customer-provided id that was sent with the request. | [optional] | |**environmentId** | **String** | Environment Id of the event. | [optional] | -|**suspect** | **Boolean** | Field is `true` if you have previously set the `suspect` flag for this event using the [Server API Update event endpoint](https://docs.fingerprint.com/reference/server-api-v4-update-event). | [optional] | +|**suspect** | **Boolean** | Field is `true` if you have previously set the `suspect` flag for this event using the [Server API Update event endpoint](https://docs.fingerprint.com/reference/server-api-update-event). | [optional] | |**sdk** | [**SDK**](SDK.md) | | [optional] | |**replayed** | **Boolean** | `true` if we determined that this payload was replayed, `false` otherwise. | [optional] | |**identification** | [**Identification**](Identification.md) | | [optional] | |**supplementaryIdHighRecall** | [**SupplementaryIDHighRecall**](SupplementaryIDHighRecall.md) | | [optional] | -|**tags** | **Map<String, Object>** | A customer-provided value or an object that was sent with the identification request or updated later. | [optional] | -|**url** | **String** | Page URL from which the request was sent. | [optional] | |**bundleId** | **String** | Bundle Id of the iOS application integrated with the Fingerprint SDK for the event. | [optional] | |**packageName** | **String** | Package name of the Android application integrated with the Fingerprint SDK for the event. | [optional] | |**ipAddress** | **String** | IP address of the requesting browser or bot. | [optional] | @@ -34,17 +42,12 @@ Contains results from Fingerprint Identification and all active Smart Signals. S |**activeCall** | **Boolean** | Indicates whether the mobile device had an active call (cellular or VoIP) at the time of the request. Available from SDK 2.16.0+ on iOS and Android. | [optional] | |**bot** | [**BotResult**](BotResult.md) | | [optional] | |**botType** | **String** | Additional classification of the bot type if detected. | [optional] | -|**botInfo** | [**BotInfo**](BotInfo.md) | | [optional] | |**clonedApp** | **Boolean** | Android specific cloned application detection. There are 2 values: * `true` - Presence of app cloners work detected (e.g. fully cloned application found or launch of it inside of a not main working profile detected). * `false` - No signs of cloned application detected or the client is not Android. | [optional] | |**developerTools** | **Boolean** | `true` if the browser has DevTools open (Chrome, Firefox) or the Android/iOS device has Developer Tools enabled, `false` otherwise. | [optional] | |**emulator** | **Boolean** | Android specific emulator detection. There are 2 values: * `true` - Emulated environment detected (e.g. launch inside of AVD). * `false` - No signs of emulated environment detected or the client is not Android. | [optional] | |**factoryResetTimestamp** | **Long** | The time of the most recent factory reset that happened on the **mobile device** is expressed as Unix epoch time. When a factory reset cannot be detected on the mobile device or when the request is initiated from a browser, this field will correspond to the *epoch* time (i.e 1 Jan 1970 UTC) as a value of 0. See [Factory Reset Detection](https://docs.fingerprint.com/docs/smart-signals-reference#factory-reset-detection) to learn more about this Smart Signal. | [optional] | |**frida** | **Boolean** | [Frida](https://frida.re/docs/) detection for Android and iOS devices. There are 2 values: * `true` - Frida detected * `false` - No signs of Frida or the client is not a mobile device. | [optional] | |**ipBlocklist** | [**IPBlockList**](IPBlockList.md) | | [optional] | -|**ipInfo** | [**IPInfo**](IPInfo.md) | | [optional] | -|**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. 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] | |**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] | @@ -62,12 +65,9 @@ Contains results from Fingerprint Identification and all active Smart Signals. S |**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] | |**virtualMachineMlScore** | **Double** | Machine learning–based virtual machine 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 `virtual_machine` detection result. 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] | -|**vpn** | **Boolean** | VPN or other anonymizing service has been used when sending the request. | [optional] | -|**vpnConfidence** | [**VpnConfidence**](VpnConfidence.md) | | [optional] | |**vpnMlScore** | **Double** | Machine learning–based VPN 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 `vpn` detection result. 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] | |**vpnOriginTimezone** | **String** | Local timezone which is used in timezone_mismatch method. | [optional] | |**vpnOriginCountry** | **String** | Country of the request (Android SDK version >= 2.4.0, iOS SDK version >= 2.9.0, JS agent >= 3.12.9 / 4.0.2), 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] | diff --git a/docs/EventEdge.md b/docs/EventEdge.md new file mode 100644 index 0000000..7477c32 --- /dev/null +++ b/docs/EventEdge.md @@ -0,0 +1,27 @@ + + +# EventEdge + +IP and bot analysis for an event generated by the Automation Intelligence API (`/edge` endpoint). No client-side collection agent is involved, so Identification (`visitor_id`) and device-telemetry-derived Smart Signals are not available. + +## Properties + +| Name | Type | Description | Notes | +|------------ | ------------- | ------------- | -------------| +|**eventId** | **String** | Unique identifier of the user's request. The first portion of the event_id is a unix epoch milliseconds timestamp. | | +|**timestamp** | **Long** | Timestamp of the event with millisecond precision in Unix time. | | +|**linkedId** | **String** | A customer-provided id that was sent with the request. | [optional] | +|**tags** | **Map<String, Object>** | A customer-provided value or an object that was sent with the identification request or updated later. | [optional] | +|**url** | **String** | Page URL from which the request was sent. | [optional] | +|**botInfo** | [**BotInfo**](BotInfo.md) | | [optional] | +|**ipInfo** | [**IPInfo**](IPInfo.md) | | | +|**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] | +|**vpn** | **Boolean** | VPN or other anonymizing service has been used when sending the request. | [optional] | +|**vpnConfidence** | [**VpnConfidence**](VpnConfidence.md) | | [optional] | +|**vpnMethods** | [**VpnMethods**](VpnMethods.md) | | [optional] | +|**source** | [**EventSource**](EventSource.md) | | | + + + diff --git a/docs/FingerprintApi.md b/docs/FingerprintApi.md index 74968f9..4861e51 100644 --- a/docs/FingerprintApi.md +++ b/docs/FingerprintApi.md @@ -4,6 +4,7 @@ All URIs are relative to *https://api.fpjs.io/v4* | Method | HTTP request | Description | |------------- | ------------- | -------------| +| [**analyzeRequestForAutomationIntelligence**](FingerprintApi.md#analyzeRequestForAutomationIntelligence) | **POST** /edge | Collect Automation Intelligence. | | [**deleteVisitorData**](FingerprintApi.md#deleteVisitorData) | **DELETE** /visitors/{visitor_id} | Delete a visitor ID | | [**getEvent**](FingerprintApi.md#getEvent) | **GET** /events/{event_id} | Get an event by event ID | | [**searchEvents**](FingerprintApi.md#searchEvents) | **GET** /events | Search events | @@ -11,6 +12,101 @@ All URIs are relative to *https://api.fpjs.io/v4* +## analyzeRequestForAutomationIntelligence + +> EventEdge analyzeRequestForAutomationIntelligence(edgeRequest) + +Collect Automation Intelligence. + +The Automation Intelligence API gives you the tools to determine whether traffic is legitimate and should be accepted by your application. + +This feature is currently in a Public Preview testing phase. All feedback is welcome! If you encounter any issues, please [contact our support team](https://fingerprint.com/support/). + +The API detects automation tools like AI Agents, AI Assistants, AI Browsers, and other bots. Additionally, it provides IP intelligence like geolocation, residential proxy, VPN and data center detection. + +Automation Intelligence is derived from HTTP request metadata that reaches your server. It does not require the use of a JavaScript client-side agent or mobile SDKs to collect device context. + +The API is fast, with average response times of less than 30ms, making it a great fit for edge, pre-origin or middleware contexts. The API is platform-agnostic and can be used with different CDN providers, cloud platforms, or any server backend. + +Because this API doesn’t require the use of a client-side device collection agent, it doesn’t support device identification via `visitor_id` and a few Smart Signals derived from deep device telemetry. + +### Event Retrieval + +Events created by the Automation Intelligence API can be fetched via the [`/v4/events/{event_id}`](https://docs.fingerprint.com/reference/server-api-get-event) API using the `event_id` present in the API response. + +Fetch all Automation Intelligence API events via the [`/v4/events?source=edge`](https://docs.fingerprint.com/reference/server-api-search-events#parameter-source) API. + + +### Example + +```java +package main; + +import java.util.*; + +import com.fingerprint.v4.api.FingerprintApi; +import com.fingerprint.v4.model.*; +import com.fingerprint.v4.sdk.ApiClient; +import com.fingerprint.v4.sdk.ApiException; +import com.fingerprint.v4.sdk.Region; + +public class FingerprintApiExample { + // Fingerprint Secret API Key + private static final String FPJS_API_SECRET = "Fingerprint Secret API Key"; + public static void main(String... args) { + // Create a new api client instance from Configuration with your Fingerprint Server API Key and your Fingerprint Server API Region. + /* + You can specify a region on getDefaultApiClient function's second parameter + If you leave the second parameter empty, then Region.GLOBAL will be used as a default region + Options for regions are: + Region.GLOBAL + Region.EUROPE + Region.ASIA + */ + FingerprintApi api = new FingerprintApi(FPJS_API_SECRET, Region.EUROPE); + EdgeRequest edgeRequest = new EdgeRequest(); // EdgeRequest | + try { + EventEdge result = api.analyzeRequestForAutomationIntelligence(edgeRequest); + System.out.println(result); + } catch (ApiException e) { + System.err.println("Exception when calling FingerprintApi.analyzeRequestForAutomationIntelligence:" + e.getMessage()); + } + } +} +``` + + +### Parameters + + +| Name | Type | Description | Notes | +|------------- | ------------- | ------------- | -------------| +| **edgeRequest** | [**EdgeRequest**](EdgeRequest.md)| | | + +### Return type + +[**EventEdge**](EventEdge.md) + +### Authorization + +[bearerAuth](../README.md#bearerAuth) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +| **200** | OK. | - | +| **400** | Bad request. The request payload is not valid. | - | +| **403** | Forbidden. Access to this API is denied. | - | +| **413** | Bad request. The request payload is too large. | - | +| **429** | Too Many Requests. The request is throttled. | - | +| **500** | Workspace error. | - | + + ## deleteVisitorData > deleteVisitorData(visitorId) @@ -73,7 +169,7 @@ public class FingerprintApiExample { Region.ASIA */ FingerprintApi api = new FingerprintApi(FPJS_API_SECRET, Region.EUROPE); - String visitorId = "Ibk1527CUFmcnjLwIs4A9"; // String | The [visitor ID](https://docs.fingerprint.com/reference/js-agent-v4-get-function#visitor_id) you want to delete. + String visitorId = "Ibk1527CUFmcnjLwIs4A9"; // String | The [visitor ID](https://docs.fingerprint.com/reference/js-agent-get-function#visitor_id) you want to delete. try { api.deleteVisitorData(visitorId); } catch (ApiException e) { @@ -89,7 +185,7 @@ public class FingerprintApiExample { | Name | Type | Description | Notes | |------------- | ------------- | ------------- | -------------| -| **visitorId** | **String**| The [visitor ID](https://docs.fingerprint.com/reference/js-agent-v4-get-function#visitor_id) you want to delete. | | +| **visitorId** | **String**| The [visitor ID](https://docs.fingerprint.com/reference/js-agent-get-function#visitor_id) you want to delete. | | ### Return type @@ -120,10 +216,12 @@ null (empty response body) Get an event by event ID -Get a detailed analysis of an individual identification event, including Smart Signals. +Get a detailed analysis of an individual event, including Smart Signals. Use `event_id` as the URL path parameter. This API method is scoped to a request, i.e. all returned information is by `event_id`. +Returns `EventDevice` when `source` is `device`, and `EventEdge` when `source` is `edge`. + ### Example @@ -152,7 +250,7 @@ public class FingerprintApiExample { Region.ASIA */ FingerprintApi api = new FingerprintApi(FPJS_API_SECRET, Region.EUROPE); - String eventId = "1708102555327.NLOjmg"; // String | The unique [identifier](https://docs.fingerprint.com/reference/js-agent-v4-get-function#event_id) of each identification request (`requestId` can be used in its place). + String eventId = "1708102555327.NLOjmg"; // String | The unique [identifier](https://docs.fingerprint.com/reference/js-agent-get-function#event_id) of each identification request (`requestId` can be used in its place). String rulesetId = "D6N9Kbk9HRWrIWGz"; // String | The ID of the ruleset to evaluate against the event, producing the action to take for this event. The resulting action is returned in the `rule_action` attribute of the response. try { Event result = api.getEvent(eventId, new FingerprintApi.GetEventOptionalParams() @@ -171,7 +269,7 @@ public class FingerprintApiExample { | Name | Type | Description | Notes | |------------- | ------------- | ------------- | -------------| -| **eventId** | **String**| The unique [identifier](https://docs.fingerprint.com/reference/js-agent-v4-get-function#event_id) of each identification request (`requestId` can be used in its place). | | +| **eventId** | **String**| The unique [identifier](https://docs.fingerprint.com/reference/js-agent-get-function#event_id) of each identification request (`requestId` can be used in its place). | | | **getEventOptionalParams** | [**FingerprintApi.GetEventOptionalParams**](#fingerprintapigeteventoptionalparams) | | [optional] | #### FingerprintApi.GetEventOptionalParams @@ -270,7 +368,7 @@ public class FingerprintApiExample { FingerprintApi api = new FingerprintApi(FPJS_API_SECRET, Region.EUROPE); Integer limit = 10; // Integer | Maximum number of events to return. Defaults to 10 when omitted. 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 = "S9rgMMUb4z3X5t5pr_tSgoSZlmyF0O8X7kCV2m981-iY1LmRTjraa1rTk3L-hQExnDWCi0RA-zAIjaVSTNO2AN2eqQWgzT0RjbieMxRfSdkM-HmOhdOgdQvYfPG3vqU1DJKh4Q"; // 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 100 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=S9rgMMUb4z3X5t5pr_tSgoSZlmyF0O8X7kCV2m981-iY1LmRTjraa1rTk3L-hQExnDWCi0RA-zAIjaVSTNO2AN2eqQWgzT0RjbieMxRfSdkM-HmOhdOgdQvYfPG3vqU1DJKh4Q` - String visitorId = "Ibk1527CUFmcnjLwIs4A9"; // 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 visitorId = "Ibk1527CUFmcnjLwIs4A9"; // String | Unique [visitor identifier](https://docs.fingerprint.com/reference/js-agent-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 = "Ibk1527CUFmcnjLwIs4A9"; // 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). SearchEventsBot bot = SearchEventsBot.fromValue("all"); // SearchEventsBot | Filter events by the Bot Detection result, specifically: `all` - events where any kind of bot was detected. `good` - events where a good bot was detected. `bad` - events where a bad bot was detected. `none` - events where no bot was detected. > Note: When using this parameter, only events with the `bot` property set to a valid value are returned. Events without a `bot` Smart Signal result are left out of the response. SearchEventsBotInfo botInfo = SearchEventsBotInfo.fromValue("all"); // SearchEventsBotInfo | Filter events by their Bot Info result, specifically: - `all` - events where any kind of bot was detected. - `none` - events where no bot was detected, and no `bot_info` was present. @@ -281,7 +379,7 @@ public class FingerprintApiExample { List botInfoName = Arrays.asList(); // List | Filter events by their Bot Info Name. The name must match exactly, partial or wildcard matching is not supported. Multiple Names can be provided using the repeated keys syntax. For example, `bot_info_name=ChatGPT%20Agent&bot_info_name=Bedrock%20AgentCore`, will match events with a Bot Info Name of `ChatGPT Agent` or `Bedrock AgentCore`. Other notations like comma-separated or bracket notation are not supported. String ipAddress = "61.127.217.15"; // String | Filter events by IP address or IP range (if CIDR notation is used). If CIDR notation is not used, a /32 for IPv4 or /128 for IPv6 is assumed. Examples of range based queries: 10.0.0.0/24, 192.168.0.1/32 String asn = "12876"; // String | Filter events by the ASN associated with the event's IP address. This corresponds to the `ip_info.(v4|v6).asn` property in the response. - String linkedId = "somelinkedId"; // String | Filter events by your custom identifier. You can use [linked Ids](https://docs.fingerprint.com/reference/js-agent-v4-get-function#linkedid) to associate identification requests with your own identifier, for example, session Id, purchase Id, or transaction Id. You can then use this `linked_id` parameter to retrieve all events associated with your custom identifier. + String linkedId = "somelinkedId"; // String | Filter events by your custom identifier. You can use [linked Ids](https://docs.fingerprint.com/reference/js-agent-get-function#linkedid) to associate identification requests with your own identifier, for example, session Id, purchase Id, or transaction Id. You can then use this `linked_id` parameter to retrieve all events associated with your custom identifier. String url = "https://example.com/login"; // String | Filter events by the URL (`url` property) associated with the event. String bundleId = "com.example.app"; // String | Filter events by the Bundle ID (iOS) associated with the event. String packageName = "com.example.app"; // String | Filter events by the Package Name (Android) associated with the event. @@ -402,7 +500,7 @@ Object containing optional parameters for API method. Supports a fluent interfac |------------- | ------------- | ------------- | -------------| | **limit** | **Integer**| Maximum number of events to return. Defaults to 10 when omitted. 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] | | **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 100 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=S9rgMMUb4z3X5t5pr_tSgoSZlmyF0O8X7kCV2m981-iY1LmRTjraa1rTk3L-hQExnDWCi0RA-zAIjaVSTNO2AN2eqQWgzT0RjbieMxRfSdkM-HmOhdOgdQvYfPG3vqU1DJKh4Q` | [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] | +| **visitorId** | **String**| Unique [visitor identifier](https://docs.fingerprint.com/reference/js-agent-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] | | **bot** | **SearchEventsBot**| Filter events by the Bot Detection result, specifically: `all` - events where any kind of bot was detected. `good` - events where a good bot was detected. `bad` - events where a bad bot was detected. `none` - events where no bot was detected. > Note: When using this parameter, only events with the `bot` property set to a valid value are returned. Events without a `bot` Smart Signal result are left out of the response. | [optional] [enum: all, good, bad, none] | | **botInfo** | **SearchEventsBotInfo**| Filter events by their Bot Info result, specifically: - `all` - events where any kind of bot was detected. - `none` - events where no bot was detected, and no `bot_info` was present. | [optional] [enum: all, none] | @@ -413,7 +511,7 @@ Object containing optional parameters for API method. Supports a fluent interfac | **botInfoName** | **List<String>**| Filter events by their Bot Info Name. The name must match exactly, partial or wildcard matching is not supported. Multiple Names can be provided using the repeated keys syntax. For example, `bot_info_name=ChatGPT%20Agent&bot_info_name=Bedrock%20AgentCore`, will match events with a Bot Info Name of `ChatGPT Agent` or `Bedrock AgentCore`. Other notations like comma-separated or bracket notation are not supported. | [optional] | | **ipAddress** | **String**| Filter events by IP address or IP range (if CIDR notation is used). If CIDR notation is not used, a /32 for IPv4 or /128 for IPv6 is assumed. Examples of range based queries: 10.0.0.0/24, 192.168.0.1/32 | [optional] | | **asn** | **String**| Filter events by the ASN associated with the event's IP address. This corresponds to the `ip_info.(v4|v6).asn` property in the response. | [optional] | -| **linkedId** | **String**| Filter events by your custom identifier. You can use [linked Ids](https://docs.fingerprint.com/reference/js-agent-v4-get-function#linkedid) to associate identification requests with your own identifier, for example, session Id, purchase Id, or transaction Id. You can then use this `linked_id` parameter to retrieve all events associated with your custom identifier. | [optional] | +| **linkedId** | **String**| Filter events by your custom identifier. You can use [linked Ids](https://docs.fingerprint.com/reference/js-agent-get-function#linkedid) to associate identification requests with your own identifier, for example, session Id, purchase Id, or transaction Id. You can then use this `linked_id` parameter to retrieve all events associated with your custom identifier. | [optional] | | **url** | **String**| Filter events by the URL (`url` property) associated with the event. | [optional] | | **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] | @@ -524,7 +622,7 @@ public class FingerprintApiExample { Region.ASIA */ FingerprintApi api = new FingerprintApi(FPJS_API_SECRET, Region.EUROPE); - String eventId = "1708102555327.NLOjmg"; // String | The unique event [identifier](https://docs.fingerprint.com/reference/js-agent-v4-get-function#event_id). + String eventId = "1708102555327.NLOjmg"; // String | The unique event [identifier](https://docs.fingerprint.com/reference/js-agent-get-function#event_id). EventUpdate eventUpdate = new EventUpdate(); // EventUpdate | try { api.updateEvent(eventId, eventUpdate); @@ -541,7 +639,7 @@ public class FingerprintApiExample { | Name | Type | Description | Notes | |------------- | ------------- | ------------- | -------------| -| **eventId** | **String**| The unique event [identifier](https://docs.fingerprint.com/reference/js-agent-v4-get-function#event_id). | | +| **eventId** | **String**| The unique event [identifier](https://docs.fingerprint.com/reference/js-agent-get-function#event_id). | | | **eventUpdate** | [**EventUpdate**](EventUpdate.md)| | | ### Return type diff --git a/res/fingerprint-server-api.yaml b/res/fingerprint-server-api.yaml index 842bfbb..4e87ab0 100644 --- a/res/fingerprint-server-api.yaml +++ b/res/fingerprint-server-api.yaml @@ -37,6 +37,97 @@ servers: security: - bearerAuth: [] paths: + /edge: + post: + tags: + - Fingerprint + operationId: analyzeRequestForAutomationIntelligence + summary: Collect Automation Intelligence. + description: > + The Automation Intelligence API gives you the tools to determine whether + traffic is legitimate and should be accepted by your application. + + + This feature is currently in a Public Preview testing phase. All + feedback is welcome! If you encounter any issues, please [contact our + support team](https://fingerprint.com/support/). + + + The API detects automation tools like AI Agents, AI Assistants, AI + Browsers, and other bots. Additionally, it provides IP intelligence like + geolocation, residential proxy, VPN and data center detection. + + + Automation Intelligence is derived from HTTP request metadata that + reaches your server. It does not require the use of a JavaScript + client-side agent or mobile SDKs to collect device context. + + + The API is fast, with average response times of less than 30ms, making + it a great fit for edge, pre-origin or middleware contexts. The API is + platform-agnostic and can be used with different CDN providers, cloud + platforms, or any server backend. + + + Because this API doesn’t require the use of a client-side device + collection agent, it doesn’t support device identification via + `visitor_id` and a few Smart Signals derived from deep device telemetry. + + + ### Event Retrieval + + + Events created by the Automation Intelligence API can be fetched via the + [`/v4/events/{event_id}`](https://docs.fingerprint.com/reference/server-api-get-event) + API using the `event_id` present in the API response. + + + Fetch all Automation Intelligence API events via the + [`/v4/events?source=edge`](https://docs.fingerprint.com/reference/server-api-search-events#parameter-source) + API. + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/EdgeRequest' + responses: + '200': + description: OK. + content: + application/json: + schema: + $ref: '#/components/schemas/EventEdge' + '400': + description: Bad request. The request payload is not valid. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '403': + description: Forbidden. Access to this API is denied. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '413': + description: Bad request. The request payload is too large. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '429': + description: Too Many Requests. The request is throttled. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '500': + description: Workspace error. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' /events/{event_id}: get: tags: @@ -44,12 +135,15 @@ paths: operationId: getEvent summary: Get an event by event ID description: > - Get a detailed analysis of an individual identification event, including - Smart Signals. + Get a detailed analysis of an individual event, including Smart Signals. Use `event_id` as the URL path parameter. This API method is scoped to a request, i.e. all returned information is by `event_id`. + + + Returns `EventDevice` when `source` is `device`, and `EventEdge` when + `source` is `edge`. parameters: - name: event_id in: path @@ -61,7 +155,7 @@ paths: example: 1708102555327.NLOjmg description: >- The unique - [identifier](https://docs.fingerprint.com/reference/js-agent-v4-get-function#event_id) + [identifier](https://docs.fingerprint.com/reference/js-agent-get-function#event_id) of each identification request (`requestId` can be used in its place). - name: ruleset_id @@ -165,7 +259,7 @@ paths: example: 1708102555327.NLOjmg description: >- The unique event - [identifier](https://docs.fingerprint.com/reference/js-agent-v4-get-function#event_id). + [identifier](https://docs.fingerprint.com/reference/js-agent-get-function#event_id). requestBody: required: true content: @@ -317,7 +411,7 @@ paths: example: Ibk1527CUFmcnjLwIs4A9 description: > Unique [visitor - identifier](https://docs.fingerprint.com/reference/js-agent-v4-get-function#visitor_id) + identifier](https://docs.fingerprint.com/reference/js-agent-get-function#visitor_id) issued by Fingerprint Identification and all active Smart Signals. @@ -492,7 +586,7 @@ paths: You can use [linked - Ids](https://docs.fingerprint.com/reference/js-agent-v4-get-function#linkedid) + Ids](https://docs.fingerprint.com/reference/js-agent-get-function#linkedid) to associate identification requests with your own identifier, for example, session Id, purchase Id, or transaction Id. You can then use this `linked_id` parameter to retrieve all events associated @@ -1124,7 +1218,7 @@ paths: example: Ibk1527CUFmcnjLwIs4A9 description: >- The [visitor - ID](https://docs.fingerprint.com/reference/js-agent-v4-get-function#visitor_id) + ID](https://docs.fingerprint.com/reference/js-agent-get-function#visitor_id) you want to delete. responses: '200': @@ -1177,6 +1271,127 @@ components: identification request or updated later. additionalProperties: true required: [] + EdgeRequest: + type: object + description: >- + HTTP request metadata (including the HTTP method, headers and IP + address) sent by you (your server) to the Fingerprint API for IP and bot + analysis. To improve accuracy, retain as much of the original semantics + of the HTTP request as possible. For example, preserve the order of the + request headers and their capitalization. + + At least one of `ipv4_address` or `ipv6_address` must be provided; a + request with neither is rejected with a `400` error. If both IPv4 and + IPv6 are provided, IP intelligence will be provided for each address. If + an IPv4-mapped IPv6 address is provided in the `ipv6_address` request + property, the IP intelligence will be provided in the `ipv4_address` + property of the response. + required: + - headers + - method + - url + properties: + headers: + type: array + description: > + Ordered header entries from the request made to your server. Each + entry represents one header line. If one header name appears as + multiple lines, send each as a separate item in the array. + + + Headers that contain authentication or session data must still be + included, but with with their value set to an empty string. This + includes headers like `Authorization` and `Cookie`, but may contain + more depending on your specific project, for instance + `Proxy-Authenticate` or `X-Api-Key`. Omitting the headers entirely + changes the shape of the request and can affect detection. Never + forward the real secret values. + + + Whenever possible, we recommend preserving header order and + capitalization to provide the best accuracy, however it’s not a + strict requirement if your runtime does not maintain http header + order or canonicalizes header names. + minItems: 1 + items: + type: object + required: + - name + - value + properties: + name: + type: string + examples: + - User-Agent + description: >- + Header name as forwarded by your server. Headers must be valid + according to RFC 7230 and will be canonicalized according to + RFC 9112. + value: + type: string + examples: + - Mozilla/5.0 + description: >- + Value of a single forwarded header entry. Be careful to + preserve the original encoding and escaping. For example, do + not double escape quotes. + examples: + - - name: Host + value: example.com + - name: User-Agent + value: Mozilla/5.0 + - name: Accept-Language + value: en-US,en;q=0.9 + - - name: Host + value: example.com + - name: User-Agent + value: Mozilla/5.0 + - name: Accept-Encoding + value: gzip + - name: Accept-Encoding + value: deflate + method: + type: string + description: >- + The original HTTP method of the request. If supported in your + runtime, preserve the original casing. + examples: + - GET + - POST + - PUT + - PATCH + - DELETE + url: + type: string + description: >- + Absolute URL of the request, without a \#fragment suffix. Only HTTP + and HTTPS schemes are supported. + format: uri + examples: + - http://example.com + - https://example.com/checkout?method=card + ipv4_address: + type: string + description: Client IPv4 address observed by your server. + format: ipv4 + examples: + - 34.162.244.71 + - 3.208.0.3 + - 173.56.0.4 + ipv6_address: + type: string + description: Client IPv6 address observed by your server. + format: ipv6 + examples: + - 2001:4860:4801:10::1 + - 2600:1f42:abcd:5678:9876:fedc:1357:2468 + - 2001:4868:85f:1a2b:3c4d:5e6f:7890:abcd + - ::ffff:22a2:f447 + - ::ffff:34.162.244.71 + linked_id: + $ref: '#/components/schemas/LinkedId' + tags: + $ref: '#/components/schemas/Tags' EventId: type: string examples: @@ -1190,19 +1405,6 @@ components: format: int64 examples: - 1708102555327 - EventSource: - type: string - description: > - Identifies how the event was generated. - - - `device` - the event was generated by the JS agent or a mobile SDK - running on an end-user device. - - - `edge` - the event was generated by the Automation Intelligence API - (`/edge` endpoint), analyzing a request intercepted at the edge. - enum: - - device - - edge Url: type: string examples: @@ -1610,6 +1812,109 @@ components: description: > `true` if the request came from a device running a VPN, `false` otherwise. + EventSource: + type: string + description: > + Identifies how the event was generated. + + - `device` - the event was generated by the JS agent or a mobile SDK + running on an end-user device. + + - `edge` - the event was generated by the Automation Intelligence API + (`/edge` endpoint), analyzing a request intercepted at the edge. + enum: + - device + - edge + EventEdge: + type: object + description: > + IP and bot analysis for an event generated by the Automation + Intelligence API (`/edge` endpoint). No client-side collection agent is + involved, so Identification (`visitor_id`) and device-telemetry-derived + Smart Signals are not available. + properties: + event_id: + $ref: '#/components/schemas/EventId' + x-platforms: + - android + - ios + - browser + timestamp: + $ref: '#/components/schemas/Timestamp' + x-platforms: + - android + - ios + - browser + linked_id: + $ref: '#/components/schemas/LinkedId' + x-platforms: + - android + - ios + - browser + tags: + $ref: '#/components/schemas/Tags' + x-platforms: + - android + - ios + - browser + url: + $ref: '#/components/schemas/Url' + x-platforms: + - browser + bot_info: + $ref: '#/components/schemas/BotInfo' + x-platforms: + - browser + ip_info: + $ref: '#/components/schemas/IPInfo' + x-platforms: + - android + - ios + - browser + proxy: + $ref: '#/components/schemas/Proxy' + x-platforms: + - android + - ios + - browser + proxy_confidence: + $ref: '#/components/schemas/ProxyConfidence' + x-platforms: + - android + - ios + - browser + proxy_details: + $ref: '#/components/schemas/ProxyDetails' + x-platforms: + - android + - ios + - browser + vpn: + $ref: '#/components/schemas/Vpn' + x-platforms: + - android + - ios + - browser + vpn_confidence: + $ref: '#/components/schemas/VpnConfidence' + x-platforms: + - android + - ios + - browser + vpn_methods: + $ref: '#/components/schemas/VpnMethods' + x-platforms: + - android + - ios + - browser + source: + $ref: '#/components/schemas/EventSource' + const: edge + required: + - event_id + - timestamp + - source + - ip_info ErrorCode: type: string enum: @@ -1729,7 +2034,7 @@ components: description: >- Field is `true` if you have previously set the `suspect` flag for this event using the [Server API Update event - endpoint](https://docs.fingerprint.com/reference/server-api-v4-update-event). + endpoint](https://docs.fingerprint.com/reference/server-api-update-event). Integration: type: object required: [] @@ -3098,16 +3403,18 @@ components: team](https://fingerprint.com/support/). Event: type: object - description: >- - Contains results from Fingerprint Identification and all active Smart - Signals. Some Smart Signals are only supported for certain device types, - these fields will be omitted for events not generated from the supported - devices. Consult the [Smart Signals + description: > + An identification event (`source: device`) or an Automation Intelligence + event (`source: edge`). + + + Use `source` to tell them apart. Device events include Identification + and device-derived Smart Signals. Edge events do not. + + + Consult the [Smart Signals reference](https://docs.fingerprint.com/docs/smart-signals-reference) for more details. - required: - - event_id - - timestamp properties: event_id: $ref: '#/components/schemas/EventId' @@ -3121,22 +3428,74 @@ components: - android - ios - browser - source: - $ref: '#/components/schemas/EventSource' + linked_id: + $ref: '#/components/schemas/LinkedId' x-platforms: - android - ios - browser - incremental_identification_status: - $ref: '#/components/schemas/IncrementalIdentificationStatus' + tags: + $ref: '#/components/schemas/Tags' x-platforms: + - android + - ios - browser - linked_id: - $ref: '#/components/schemas/LinkedId' + url: + $ref: '#/components/schemas/Url' + x-platforms: + - browser + bot_info: + $ref: '#/components/schemas/BotInfo' + x-platforms: + - browser + ip_info: + $ref: '#/components/schemas/IPInfo' + x-platforms: + - android + - ios + - browser + proxy: + $ref: '#/components/schemas/Proxy' + x-platforms: + - android + - ios + - browser + proxy_confidence: + $ref: '#/components/schemas/ProxyConfidence' + x-platforms: + - android + - ios + - browser + proxy_details: + $ref: '#/components/schemas/ProxyDetails' x-platforms: - android - ios - browser + vpn: + $ref: '#/components/schemas/Vpn' + x-platforms: + - android + - ios + - browser + vpn_confidence: + $ref: '#/components/schemas/VpnConfidence' + x-platforms: + - android + - ios + - browser + vpn_methods: + $ref: '#/components/schemas/VpnMethods' + x-platforms: + - android + - ios + - browser + source: + $ref: '#/components/schemas/EventSource' + incremental_identification_status: + $ref: '#/components/schemas/IncrementalIdentificationStatus' + x-platforms: + - browser environment_id: $ref: '#/components/schemas/EnvironmentId' x-platforms: @@ -3173,16 +3532,6 @@ components: - android - ios - browser - tags: - $ref: '#/components/schemas/Tags' - x-platforms: - - android - - ios - - browser - url: - $ref: '#/components/schemas/Url' - x-platforms: - - browser bundle_id: $ref: '#/components/schemas/BundleId' x-platforms: @@ -3248,10 +3597,6 @@ components: $ref: '#/components/schemas/BotType' x-platforms: - browser - bot_info: - $ref: '#/components/schemas/BotInfo' - x-platforms: - - browser cloned_app: $ref: '#/components/schemas/ClonedApp' x-platforms: @@ -3282,30 +3627,6 @@ components: - android - ios - browser - ip_info: - $ref: '#/components/schemas/IPInfo' - x-platforms: - - android - - ios - - browser - proxy: - $ref: '#/components/schemas/Proxy' - x-platforms: - - android - - ios - - browser - proxy_confidence: - $ref: '#/components/schemas/ProxyConfidence' - x-platforms: - - android - - ios - - browser - proxy_details: - $ref: '#/components/schemas/ProxyDetails' - x-platforms: - - android - - ios - - browser proxy_ml_score: $ref: '#/components/schemas/ProxyMLScore' x-platforms: @@ -3386,18 +3707,6 @@ components: $ref: '#/components/schemas/VirtualMachineMLScore' x-platforms: - browser - vpn: - $ref: '#/components/schemas/Vpn' - x-platforms: - - android - - ios - - browser - vpn_confidence: - $ref: '#/components/schemas/VpnConfidence' - x-platforms: - - android - - ios - - browser vpn_ml_score: $ref: '#/components/schemas/VpnMLScore' x-platforms: @@ -3413,12 +3722,6 @@ components: x-platforms: - android - ios - vpn_methods: - $ref: '#/components/schemas/VpnMethods' - x-platforms: - - android - - ios - - browser high_activity_device: $ref: '#/components/schemas/HighActivity' x-platforms: @@ -3445,6 +3748,9 @@ components: - browser - ios - android + required: + - event_id + - timestamp EventUpdate: type: object required: [] diff --git a/sdk/src/main/java/com/fingerprint/v4/api/FingerprintApi.java b/sdk/src/main/java/com/fingerprint/v4/api/FingerprintApi.java index e335038..2940eac 100644 --- a/sdk/src/main/java/com/fingerprint/v4/api/FingerprintApi.java +++ b/sdk/src/main/java/com/fingerprint/v4/api/FingerprintApi.java @@ -3,7 +3,9 @@ import com.fingerprint.v4.model.BotInfoCategory; import com.fingerprint.v4.model.BotInfoConfidence; import com.fingerprint.v4.model.BotInfoIdentity; +import com.fingerprint.v4.model.EdgeRequest; import com.fingerprint.v4.model.Event; +import com.fingerprint.v4.model.EventEdge; import com.fingerprint.v4.model.EventSearch; import com.fingerprint.v4.model.EventUpdate; import com.fingerprint.v4.model.SearchEventsBot; @@ -67,10 +69,93 @@ public void setApiClient(ApiClient apiClient) { this.apiClient = apiClient; } + /** + * Collect Automation Intelligence. + * The Automation Intelligence API gives you the tools to determine whether traffic is legitimate and should be accepted by your application. This feature is currently in a Public Preview testing phase. All feedback is welcome! If you encounter any issues, please [contact our support team](https://fingerprint.com/support/). The API detects automation tools like AI Agents, AI Assistants, AI Browsers, and other bots. Additionally, it provides IP intelligence like geolocation, residential proxy, VPN and data center detection. Automation Intelligence is derived from HTTP request metadata that reaches your server. It does not require the use of a JavaScript client-side agent or mobile SDKs to collect device context. The API is fast, with average response times of less than 30ms, making it a great fit for edge, pre-origin or middleware contexts. The API is platform-agnostic and can be used with different CDN providers, cloud platforms, or any server backend. Because this API doesn’t require the use of a client-side device collection agent, it doesn’t support device identification via `visitor_id` and a few Smart Signals derived from deep device telemetry. ### Event Retrieval Events created by the Automation Intelligence API can be fetched via the [`/v4/events/{event_id}`](https://docs.fingerprint.com/reference/server-api-get-event) API using the `event_id` present in the API response. Fetch all Automation Intelligence API events via the [`/v4/events?source=edge`](https://docs.fingerprint.com/reference/server-api-search-events#parameter-source) API. + * @param edgeRequest (required) + * @return EventEdge + * @throws ApiException if fails to make API call + * @http.response.details + * + * + * + * + * + * + * + * + *
Status Code Description Response Headers
200 OK. -
400 Bad request. The request payload is not valid. -
403 Forbidden. Access to this API is denied. -
413 Bad request. The request payload is too large. -
429 Too Many Requests. The request is throttled. -
500 Workspace error. -
+ */ + public EventEdge analyzeRequestForAutomationIntelligence(EdgeRequest edgeRequest) + throws ApiException { + return analyzeRequestForAutomationIntelligenceWithHttpInfo(edgeRequest).getData(); + } + + /** + * Collect Automation Intelligence. + * The Automation Intelligence API gives you the tools to determine whether traffic is legitimate and should be accepted by your application. This feature is currently in a Public Preview testing phase. All feedback is welcome! If you encounter any issues, please [contact our support team](https://fingerprint.com/support/). The API detects automation tools like AI Agents, AI Assistants, AI Browsers, and other bots. Additionally, it provides IP intelligence like geolocation, residential proxy, VPN and data center detection. Automation Intelligence is derived from HTTP request metadata that reaches your server. It does not require the use of a JavaScript client-side agent or mobile SDKs to collect device context. The API is fast, with average response times of less than 30ms, making it a great fit for edge, pre-origin or middleware contexts. The API is platform-agnostic and can be used with different CDN providers, cloud platforms, or any server backend. Because this API doesn’t require the use of a client-side device collection agent, it doesn’t support device identification via `visitor_id` and a few Smart Signals derived from deep device telemetry. ### Event Retrieval Events created by the Automation Intelligence API can be fetched via the [`/v4/events/{event_id}`](https://docs.fingerprint.com/reference/server-api-get-event) API using the `event_id` present in the API response. Fetch all Automation Intelligence API events via the [`/v4/events?source=edge`](https://docs.fingerprint.com/reference/server-api-search-events#parameter-source) API. + * @param edgeRequest (required) + * @return ApiResponse + * @throws ApiException if fails to make API call + * @http.response.details + * + * + * + * + * + * + * + * + *
Status Code Description Response Headers
200 OK. -
400 Bad request. The request payload is not valid. -
403 Forbidden. Access to this API is denied. -
413 Bad request. The request payload is too large. -
429 Too Many Requests. The request is throttled. -
500 Workspace error. -
+ */ + public ApiResponse analyzeRequestForAutomationIntelligenceWithHttpInfo( + EdgeRequest edgeRequest) throws ApiException { + Object localVarPostBody = edgeRequest; + + // verify the required parameter 'edgeRequest' is set + if (edgeRequest == null) { + throw new ApiException( + 400, + "Missing the required parameter 'edgeRequest' when calling analyzeRequestForAutomationIntelligence"); + } + + // create path and map variables + String localVarPath = "/edge"; + + // query params + List localVarQueryParams = new ArrayList(); + Map localVarHeaderParams = new HashMap(); + Map localVarCookieParams = new HashMap(); + Map localVarFormParams = new HashMap(); + + localVarQueryParams.add(new Pair("ii", INTEGRATION_INFO)); + + final String localVarAccept = apiClient.selectHeaderAccept("application/json"); + final String localVarContentType = apiClient.selectHeaderContentType("application/json"); + String[] localVarAuthNames = new String[] {"bearerAuth"}; + + GenericType localVarReturnType = new GenericType() {}; + + return apiClient.invokeAPI( + "FingerprintApi.analyzeRequestForAutomationIntelligence", + localVarPath, + "POST", + localVarQueryParams, + localVarPostBody, + localVarHeaderParams, + localVarCookieParams, + localVarFormParams, + localVarAccept, + localVarContentType, + localVarAuthNames, + localVarReturnType, + false); + } + /** * Delete a visitor ID * Use this API to request the deletion of all data associated with a specific visitor ID. Upon a request to delete data for a visitor ID, - The data collected from the corresponding browser (or device) will be deleted asynchronously, typically within a few minutes. This data will no longer be available to identify this browser (or device). When the same browser (or device) revisits, it will receive a new visitor ID. - The identification events made from this browser (or device) in the past 10 days are typically deleted within 24 hrs. - The identification events made from this browser (or device) outside of the 10 days will be purged as per your [data retention period](https://docs.fingerprint.com/docs/regions#data-retention). The following timeline illustrates which events are deleted and which remain after a DELETE API request: ``` Day 1: First visit from browser A. (Assigned visitor ID: VID1000) Day 2: Browser A revisits. (Assigned the same visitor ID: VID1000) Day 13: Browser A revisits. (Assigned the same visitor ID: VID1000) Day 14: Delete VID1000 Day 15: Browser A re-visits. (Assigned a different visitor ID: VID9999) Day 15: GET /events/day-13 (Returns 404. The event is within the 10 days of deleting VID1000 and will have been deleted) Day 16: GET /events/day-2 (Returns 200. The event is outside of the 10 days of deleting VID1000 and is still available) ``` ### Availability This API is available only for Enterprise plans **upon request**. If you are interested, please [contact our support team](https://fingerprint.com/support/). ### Rate limits and daily quota The rate limits and daily quota for this API **differ** from those for our other API. The maximum number of DELETE requests that can be made in an hour cannot exceed 30 RPH, and the maximum number that can be made in a day cannot exceed 500 RPD. You can request an increase to these limits by contacting [our support team](https://fingerprint.com/support/). - * @param visitorId The [visitor ID](https://docs.fingerprint.com/reference/js-agent-v4-get-function#visitor_id) you want to delete. (required) + * @param visitorId The [visitor ID](https://docs.fingerprint.com/reference/js-agent-get-function#visitor_id) you want to delete. (required) * @throws ApiException if fails to make API call * @http.response.details * @@ -89,7 +174,7 @@ public void deleteVisitorData(String visitorId) throws ApiException { /** * Delete a visitor ID * Use this API to request the deletion of all data associated with a specific visitor ID. Upon a request to delete data for a visitor ID, - The data collected from the corresponding browser (or device) will be deleted asynchronously, typically within a few minutes. This data will no longer be available to identify this browser (or device). When the same browser (or device) revisits, it will receive a new visitor ID. - The identification events made from this browser (or device) in the past 10 days are typically deleted within 24 hrs. - The identification events made from this browser (or device) outside of the 10 days will be purged as per your [data retention period](https://docs.fingerprint.com/docs/regions#data-retention). The following timeline illustrates which events are deleted and which remain after a DELETE API request: ``` Day 1: First visit from browser A. (Assigned visitor ID: VID1000) Day 2: Browser A revisits. (Assigned the same visitor ID: VID1000) Day 13: Browser A revisits. (Assigned the same visitor ID: VID1000) Day 14: Delete VID1000 Day 15: Browser A re-visits. (Assigned a different visitor ID: VID9999) Day 15: GET /events/day-13 (Returns 404. The event is within the 10 days of deleting VID1000 and will have been deleted) Day 16: GET /events/day-2 (Returns 200. The event is outside of the 10 days of deleting VID1000 and is still available) ``` ### Availability This API is available only for Enterprise plans **upon request**. If you are interested, please [contact our support team](https://fingerprint.com/support/). ### Rate limits and daily quota The rate limits and daily quota for this API **differ** from those for our other API. The maximum number of DELETE requests that can be made in an hour cannot exceed 30 RPH, and the maximum number that can be made in a day cannot exceed 500 RPD. You can request an increase to these limits by contacting [our support team](https://fingerprint.com/support/). - * @param visitorId The [visitor ID](https://docs.fingerprint.com/reference/js-agent-v4-get-function#visitor_id) you want to delete. (required) + * @param visitorId The [visitor ID](https://docs.fingerprint.com/reference/js-agent-get-function#visitor_id) you want to delete. (required) * @return ApiResponse * @throws ApiException if fails to make API call * @http.response.details @@ -166,8 +251,8 @@ public GetEventOptionalParams setRulesetId(String rulesetId) { /** * Get an event by event ID - * Get a detailed analysis of an individual identification event, including Smart Signals. Use `event_id` as the URL path parameter. This API method is scoped to a request, i.e. all returned information is by `event_id`. - * @param eventId The unique [identifier](https://docs.fingerprint.com/reference/js-agent-v4-get-function#event_id) of each identification request (`requestId` can be used in its place). (required) + * Get a detailed analysis of an individual event, including Smart Signals. Use `event_id` as the URL path parameter. This API method is scoped to a request, i.e. all returned information is by `event_id`. Returns `EventDevice` when `source` is `device`, and `EventEdge` when `source` is `edge`. + * @param eventId The unique [identifier](https://docs.fingerprint.com/reference/js-agent-get-function#event_id) of each identification request (`requestId` can be used in its place). (required) * @return Event * @throws ApiException if fails to make API call * @http.response.details @@ -188,8 +273,8 @@ public Event getEvent(String eventId) throws ApiException { /** * Get an event by event ID - * Get a detailed analysis of an individual identification event, including Smart Signals. Use `event_id` as the URL path parameter. This API method is scoped to a request, i.e. all returned information is by `event_id`. - * @param eventId The unique [identifier](https://docs.fingerprint.com/reference/js-agent-v4-get-function#event_id) of each identification request (`requestId` can be used in its place). (required) + * Get a detailed analysis of an individual event, including Smart Signals. Use `event_id` as the URL path parameter. This API method is scoped to a request, i.e. all returned information is by `event_id`. Returns `EventDevice` when `source` is `device`, and `EventEdge` when `source` is `edge`. + * @param eventId The unique [identifier](https://docs.fingerprint.com/reference/js-agent-get-function#event_id) of each identification request (`requestId` can be used in its place). (required) * @param getEventOptionalParams Object containing optional parameters for API method. (optional) * @return Event * @throws ApiException if fails to make API call @@ -212,8 +297,8 @@ public Event getEvent(String eventId, GetEventOptionalParams getEventOptionalPar /** * Get an event by event ID - * Get a detailed analysis of an individual identification event, including Smart Signals. Use `event_id` as the URL path parameter. This API method is scoped to a request, i.e. all returned information is by `event_id`. - * @param eventId The unique [identifier](https://docs.fingerprint.com/reference/js-agent-v4-get-function#event_id) of each identification request (`requestId` can be used in its place). (required) + * Get a detailed analysis of an individual event, including Smart Signals. Use `event_id` as the URL path parameter. This API method is scoped to a request, i.e. all returned information is by `event_id`. Returns `EventDevice` when `source` is `device`, and `EventEdge` when `source` is `edge`. + * @param eventId The unique [identifier](https://docs.fingerprint.com/reference/js-agent-get-function#event_id) of each identification request (`requestId` can be used in its place). (required) * @param getEventOptionalParams Object containing optional parameters for API method. (optional) * @return ApiResponse * @throws ApiException if fails to make API call @@ -364,14 +449,14 @@ public SearchEventsOptionalParams setPaginationKey(String paginationKey) { } /** - * getter for visitorId - 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). + * getter for visitorId - Unique [visitor identifier](https://docs.fingerprint.com/reference/js-agent-get-function#visitor_id) issued by Fingerprint Identification and all active Smart Signals. Filter events by matching Visitor ID (`identification.visitor_id` property). */ public String getVisitorId() { return visitorId; } /** - * setter for visitorId - 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). + * setter for visitorId - Unique [visitor identifier](https://docs.fingerprint.com/reference/js-agent-get-function#visitor_id) issued by Fingerprint Identification and all active Smart Signals. Filter events by matching Visitor ID (`identification.visitor_id` property). */ public SearchEventsOptionalParams setVisitorId(String visitorId) { this.visitorId = visitorId; @@ -530,14 +615,14 @@ public SearchEventsOptionalParams setAsn(String asn) { } /** - * getter for linkedId - Filter events by your custom identifier. You can use [linked Ids](https://docs.fingerprint.com/reference/js-agent-v4-get-function#linkedid) to associate identification requests with your own identifier, for example, session Id, purchase Id, or transaction Id. You can then use this `linked_id` parameter to retrieve all events associated with your custom identifier. + * getter for linkedId - Filter events by your custom identifier. You can use [linked Ids](https://docs.fingerprint.com/reference/js-agent-get-function#linkedid) to associate identification requests with your own identifier, for example, session Id, purchase Id, or transaction Id. You can then use this `linked_id` parameter to retrieve all events associated with your custom identifier. */ public String getLinkedId() { return linkedId; } /** - * setter for linkedId - Filter events by your custom identifier. You can use [linked Ids](https://docs.fingerprint.com/reference/js-agent-v4-get-function#linkedid) to associate identification requests with your own identifier, for example, session Id, purchase Id, or transaction Id. You can then use this `linked_id` parameter to retrieve all events associated with your custom identifier. + * setter for linkedId - Filter events by your custom identifier. You can use [linked Ids](https://docs.fingerprint.com/reference/js-agent-get-function#linkedid) to associate identification requests with your own identifier, for example, session Id, purchase Id, or transaction Id. You can then use this `linked_id` parameter to retrieve all events associated with your custom identifier. */ public SearchEventsOptionalParams setLinkedId(String linkedId) { this.linkedId = linkedId; @@ -1395,7 +1480,7 @@ public ApiResponse searchEventsWithHttpInfo( /** * Update an event * Change information in existing events specified by `event_id` or *flag suspicious events*. When an event is created, it can be assigned `linked_id` and `tags` submitted through the JS agent parameters. This information might not have been available on the client initially, so the Server API permits updating these attributes after the fact. **Warning** It's not possible to update events older than one month. **Warning** Trying to update an event immediately after creation may temporarily result in an error (HTTP 409 Conflict. The event is not mutable yet.) as the event is fully propagated across our systems. In such a case, simply retry the request. - * @param eventId The unique event [identifier](https://docs.fingerprint.com/reference/js-agent-v4-get-function#event_id). (required) + * @param eventId The unique event [identifier](https://docs.fingerprint.com/reference/js-agent-get-function#event_id). (required) * @param eventUpdate (required) * @throws ApiException if fails to make API call * @http.response.details @@ -1415,7 +1500,7 @@ public void updateEvent(String eventId, EventUpdate eventUpdate) throws ApiExcep /** * Update an event * Change information in existing events specified by `event_id` or *flag suspicious events*. When an event is created, it can be assigned `linked_id` and `tags` submitted through the JS agent parameters. This information might not have been available on the client initially, so the Server API permits updating these attributes after the fact. **Warning** It's not possible to update events older than one month. **Warning** Trying to update an event immediately after creation may temporarily result in an error (HTTP 409 Conflict. The event is not mutable yet.) as the event is fully propagated across our systems. In such a case, simply retry the request. - * @param eventId The unique event [identifier](https://docs.fingerprint.com/reference/js-agent-v4-get-function#event_id). (required) + * @param eventId The unique event [identifier](https://docs.fingerprint.com/reference/js-agent-get-function#event_id). (required) * @param eventUpdate (required) * @return ApiResponse * @throws ApiException if fails to make API call diff --git a/sdk/src/main/java/com/fingerprint/v4/model/EdgeRequest.java b/sdk/src/main/java/com/fingerprint/v4/model/EdgeRequest.java new file mode 100644 index 0000000..50bd5a8 --- /dev/null +++ b/sdk/src/main/java/com/fingerprint/v4/model/EdgeRequest.java @@ -0,0 +1,285 @@ +/* + * 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 API also supports collection of Automation Intelligence for requests to your server in edge, pre-origin, or middleware contexts. + * + * 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.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import java.net.URI; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * HTTP request metadata (including the HTTP method, headers and IP address) sent by you (your server) to the Fingerprint API for IP and bot analysis. To improve accuracy, retain as much of the original semantics of the HTTP request as possible. For example, preserve the order of the request headers and their capitalization. At least one of `ipv4_address` or `ipv6_address` must be provided; a request with neither is rejected with a `400` error. If both IPv4 and IPv6 are provided, IP intelligence will be provided for each address. If an IPv4-mapped IPv6 address is provided in the `ipv6_address` request property, the IP intelligence will be provided in the `ipv4_address` property of the response. + */ +@JsonPropertyOrder({ + EdgeRequest.JSON_PROPERTY_HEADERS, + EdgeRequest.JSON_PROPERTY_METHOD, + EdgeRequest.JSON_PROPERTY_URL, + EdgeRequest.JSON_PROPERTY_IPV4_ADDRESS, + EdgeRequest.JSON_PROPERTY_IPV6_ADDRESS, + EdgeRequest.JSON_PROPERTY_LINKED_ID, + EdgeRequest.JSON_PROPERTY_TAGS +}) +@jakarta.annotation.Generated( + value = "org.openapitools.codegen.languages.JavaClientCodegen", + comments = "Generator version: 7.24.0") +public class EdgeRequest { + public static final String JSON_PROPERTY_HEADERS = "headers"; + @jakarta.annotation.Nonnull private List headers = new ArrayList<>(); + + public static final String JSON_PROPERTY_METHOD = "method"; + @jakarta.annotation.Nonnull private String method; + + public static final String JSON_PROPERTY_URL = "url"; + @jakarta.annotation.Nonnull private URI url; + + public static final String JSON_PROPERTY_IPV4_ADDRESS = "ipv4_address"; + @jakarta.annotation.Nullable private String ipv4Address; + + public static final String JSON_PROPERTY_IPV6_ADDRESS = "ipv6_address"; + @jakarta.annotation.Nullable private String ipv6Address; + + public static final String JSON_PROPERTY_LINKED_ID = "linked_id"; + @jakarta.annotation.Nullable private String linkedId; + + public static final String JSON_PROPERTY_TAGS = "tags"; + @jakarta.annotation.Nullable private Map tags = new HashMap<>(); + + public EdgeRequest() {} + + public EdgeRequest headers(@jakarta.annotation.Nonnull List headers) { + this.headers = headers; + return this; + } + + public EdgeRequest addHeadersItem(EdgeRequestHeadersInner headersItem) { + if (this.headers == null) { + this.headers = new ArrayList<>(); + } + this.headers.add(headersItem); + return this; + } + + /** + * Ordered header entries from the request made to your server. Each entry represents one header line. If one header name appears as multiple lines, send each as a separate item in the array. Headers that contain authentication or session data must still be included, but with with their value set to an empty string. This includes headers like `Authorization` and `Cookie`, but may contain more depending on your specific project, for instance `Proxy-Authenticate` or `X-Api-Key`. Omitting the headers entirely changes the shape of the request and can affect detection. Never forward the real secret values. Whenever possible, we recommend preserving header order and capitalization to provide the best accuracy, however it’s not a strict requirement if your runtime does not maintain http header order or canonicalizes header names. + * @return headers + */ + @jakarta.annotation.Nonnull + @JsonProperty(value = JSON_PROPERTY_HEADERS, required = true) + @JsonInclude(value = JsonInclude.Include.ALWAYS) + public List getHeaders() { + return headers; + } + + @JsonProperty(value = JSON_PROPERTY_HEADERS, required = true) + @JsonInclude(value = JsonInclude.Include.ALWAYS) + public void setHeaders(@jakarta.annotation.Nonnull List headers) { + this.headers = headers; + } + + public EdgeRequest method(@jakarta.annotation.Nonnull String method) { + this.method = method; + return this; + } + + /** + * The original HTTP method of the request. If supported in your runtime, preserve the original casing. + * @return method + */ + @jakarta.annotation.Nonnull + @JsonProperty(value = JSON_PROPERTY_METHOD, required = true) + @JsonInclude(value = JsonInclude.Include.ALWAYS) + public String getMethod() { + return method; + } + + @JsonProperty(value = JSON_PROPERTY_METHOD, required = true) + @JsonInclude(value = JsonInclude.Include.ALWAYS) + public void setMethod(@jakarta.annotation.Nonnull String method) { + this.method = method; + } + + public EdgeRequest url(@jakarta.annotation.Nonnull URI url) { + this.url = url; + return this; + } + + /** + * Absolute URL of the request, without a \\#fragment suffix. Only HTTP and HTTPS schemes are supported. + * @return url + */ + @jakarta.annotation.Nonnull + @JsonProperty(value = JSON_PROPERTY_URL, required = true) + @JsonInclude(value = JsonInclude.Include.ALWAYS) + public URI getUrl() { + return url; + } + + @JsonProperty(value = JSON_PROPERTY_URL, required = true) + @JsonInclude(value = JsonInclude.Include.ALWAYS) + public void setUrl(@jakarta.annotation.Nonnull URI url) { + this.url = url; + } + + public EdgeRequest ipv4Address(@jakarta.annotation.Nullable String ipv4Address) { + this.ipv4Address = ipv4Address; + return this; + } + + /** + * Client IPv4 address observed by your server. + * @return ipv4Address + */ + @jakarta.annotation.Nullable + @JsonProperty(value = JSON_PROPERTY_IPV4_ADDRESS, required = false) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public String getIpv4Address() { + return ipv4Address; + } + + @JsonProperty(value = JSON_PROPERTY_IPV4_ADDRESS, required = false) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public void setIpv4Address(@jakarta.annotation.Nullable String ipv4Address) { + this.ipv4Address = ipv4Address; + } + + public EdgeRequest ipv6Address(@jakarta.annotation.Nullable String ipv6Address) { + this.ipv6Address = ipv6Address; + return this; + } + + /** + * Client IPv6 address observed by your server. + * @return ipv6Address + */ + @jakarta.annotation.Nullable + @JsonProperty(value = JSON_PROPERTY_IPV6_ADDRESS, required = false) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public String getIpv6Address() { + return ipv6Address; + } + + @JsonProperty(value = JSON_PROPERTY_IPV6_ADDRESS, required = false) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public void setIpv6Address(@jakarta.annotation.Nullable String ipv6Address) { + this.ipv6Address = ipv6Address; + } + + public EdgeRequest linkedId(@jakarta.annotation.Nullable String linkedId) { + this.linkedId = linkedId; + return this; + } + + /** + * A customer-provided id that was sent with the request. + * @return linkedId + */ + @jakarta.annotation.Nullable + @JsonProperty(value = JSON_PROPERTY_LINKED_ID, required = false) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public String getLinkedId() { + return linkedId; + } + + @JsonProperty(value = JSON_PROPERTY_LINKED_ID, required = false) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public void setLinkedId(@jakarta.annotation.Nullable String linkedId) { + this.linkedId = linkedId; + } + + public EdgeRequest tags(@jakarta.annotation.Nullable Map tags) { + this.tags = tags; + return this; + } + + public EdgeRequest putTagsItem(String key, Object tagsItem) { + if (this.tags == null) { + this.tags = new HashMap<>(); + } + this.tags.put(key, tagsItem); + return this; + } + + /** + * A customer-provided value or an object that was sent with the identification request or updated later. + * @return tags + */ + @jakarta.annotation.Nullable + @JsonProperty(value = JSON_PROPERTY_TAGS, required = false) + @JsonInclude(content = JsonInclude.Include.ALWAYS, value = JsonInclude.Include.USE_DEFAULTS) + public Map getTags() { + return tags; + } + + @JsonProperty(value = JSON_PROPERTY_TAGS, required = false) + @JsonInclude(content = JsonInclude.Include.ALWAYS, value = JsonInclude.Include.USE_DEFAULTS) + public void setTags(@jakarta.annotation.Nullable Map tags) { + this.tags = tags; + } + + /** + * Return true if this EdgeRequest object is equal to o. + */ + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + EdgeRequest edgeRequest = (EdgeRequest) o; + return Objects.equals(this.headers, edgeRequest.headers) + && Objects.equals(this.method, edgeRequest.method) + && Objects.equals(this.url, edgeRequest.url) + && Objects.equals(this.ipv4Address, edgeRequest.ipv4Address) + && Objects.equals(this.ipv6Address, edgeRequest.ipv6Address) + && Objects.equals(this.linkedId, edgeRequest.linkedId) + && Objects.equals(this.tags, edgeRequest.tags); + } + + @Override + public int hashCode() { + return Objects.hash(headers, method, url, ipv4Address, ipv6Address, linkedId, tags); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class EdgeRequest {\n"); + sb.append(" headers: ").append(toIndentedString(headers)).append("\n"); + sb.append(" method: ").append(toIndentedString(method)).append("\n"); + sb.append(" url: ").append(toIndentedString(url)).append("\n"); + sb.append(" ipv4Address: ").append(toIndentedString(ipv4Address)).append("\n"); + sb.append(" ipv6Address: ").append(toIndentedString(ipv6Address)).append("\n"); + sb.append(" linkedId: ").append(toIndentedString(linkedId)).append("\n"); + sb.append(" tags: ").append(toIndentedString(tags)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} diff --git a/sdk/src/main/java/com/fingerprint/v4/model/EdgeRequestHeadersInner.java b/sdk/src/main/java/com/fingerprint/v4/model/EdgeRequestHeadersInner.java new file mode 100644 index 0000000..f605b7a --- /dev/null +++ b/sdk/src/main/java/com/fingerprint/v4/model/EdgeRequestHeadersInner.java @@ -0,0 +1,126 @@ +/* + * 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 API also supports collection of Automation Intelligence for requests to your server in edge, pre-origin, or middleware contexts. + * + * 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.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import com.fasterxml.jackson.annotation.JsonTypeName; +import java.util.Objects; + +/** + * EdgeRequestHeadersInner + */ +@JsonPropertyOrder({ + EdgeRequestHeadersInner.JSON_PROPERTY_NAME, + EdgeRequestHeadersInner.JSON_PROPERTY_VALUE +}) +@JsonTypeName("EdgeRequest_headers_inner") +@jakarta.annotation.Generated( + value = "org.openapitools.codegen.languages.JavaClientCodegen", + comments = "Generator version: 7.24.0") +public class EdgeRequestHeadersInner { + public static final String JSON_PROPERTY_NAME = "name"; + @jakarta.annotation.Nonnull private String name; + + public static final String JSON_PROPERTY_VALUE = "value"; + @jakarta.annotation.Nonnull private String value; + + public EdgeRequestHeadersInner() {} + + public EdgeRequestHeadersInner name(@jakarta.annotation.Nonnull String name) { + this.name = name; + return this; + } + + /** + * Header name as forwarded by your server. Headers must be valid according to RFC 7230 and will be canonicalized according to RFC 9112. + * @return name + */ + @jakarta.annotation.Nonnull + @JsonProperty(value = JSON_PROPERTY_NAME, required = true) + @JsonInclude(value = JsonInclude.Include.ALWAYS) + public String getName() { + return name; + } + + @JsonProperty(value = JSON_PROPERTY_NAME, required = true) + @JsonInclude(value = JsonInclude.Include.ALWAYS) + public void setName(@jakarta.annotation.Nonnull String name) { + this.name = name; + } + + public EdgeRequestHeadersInner value(@jakarta.annotation.Nonnull String value) { + this.value = value; + return this; + } + + /** + * Value of a single forwarded header entry. Be careful to preserve the original encoding and escaping. For example, do not double escape quotes. + * @return value + */ + @jakarta.annotation.Nonnull + @JsonProperty(value = JSON_PROPERTY_VALUE, required = true) + @JsonInclude(value = JsonInclude.Include.ALWAYS) + public String getValue() { + return value; + } + + @JsonProperty(value = JSON_PROPERTY_VALUE, required = true) + @JsonInclude(value = JsonInclude.Include.ALWAYS) + public void setValue(@jakarta.annotation.Nonnull String value) { + this.value = value; + } + + /** + * Return true if this EdgeRequest_headers_inner object is equal to o. + */ + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + EdgeRequestHeadersInner edgeRequestHeadersInner = (EdgeRequestHeadersInner) o; + return Objects.equals(this.name, edgeRequestHeadersInner.name) + && Objects.equals(this.value, edgeRequestHeadersInner.value); + } + + @Override + public int hashCode() { + return Objects.hash(name, value); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class EdgeRequestHeadersInner {\n"); + sb.append(" name: ").append(toIndentedString(name)).append("\n"); + sb.append(" value: ").append(toIndentedString(value)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} 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 923ef8b..97a1b25 100644 --- a/sdk/src/main/java/com/fingerprint/v4/model/Event.java +++ b/sdk/src/main/java/com/fingerprint/v4/model/Event.java @@ -22,22 +22,30 @@ import java.util.Objects; /** - * Contains results from Fingerprint Identification and all active Smart Signals. Some Smart Signals are only supported for certain device types, these fields will be omitted for events not generated from the supported devices. Consult the [Smart Signals reference](https://docs.fingerprint.com/docs/smart-signals-reference) for more details. + * An identification event (`source: device`) or an Automation Intelligence event (`source: edge`). Use `source` to tell them apart. Device events include Identification and device-derived Smart Signals. Edge events do not. Consult the [Smart Signals reference](https://docs.fingerprint.com/docs/smart-signals-reference) for more details. */ @JsonPropertyOrder({ Event.JSON_PROPERTY_EVENT_ID, Event.JSON_PROPERTY_TIMESTAMP, + Event.JSON_PROPERTY_LINKED_ID, + Event.JSON_PROPERTY_TAGS, + Event.JSON_PROPERTY_URL, + Event.JSON_PROPERTY_BOT_INFO, + Event.JSON_PROPERTY_IP_INFO, + Event.JSON_PROPERTY_PROXY, + Event.JSON_PROPERTY_PROXY_CONFIDENCE, + Event.JSON_PROPERTY_PROXY_DETAILS, + Event.JSON_PROPERTY_VPN, + Event.JSON_PROPERTY_VPN_CONFIDENCE, + Event.JSON_PROPERTY_VPN_METHODS, Event.JSON_PROPERTY_SOURCE, Event.JSON_PROPERTY_INCREMENTAL_IDENTIFICATION_STATUS, - Event.JSON_PROPERTY_LINKED_ID, Event.JSON_PROPERTY_ENVIRONMENT_ID, Event.JSON_PROPERTY_SUSPECT, Event.JSON_PROPERTY_SDK, Event.JSON_PROPERTY_REPLAYED, Event.JSON_PROPERTY_IDENTIFICATION, Event.JSON_PROPERTY_SUPPLEMENTARY_ID_HIGH_RECALL, - Event.JSON_PROPERTY_TAGS, - Event.JSON_PROPERTY_URL, Event.JSON_PROPERTY_BUNDLE_ID, Event.JSON_PROPERTY_PACKAGE_NAME, Event.JSON_PROPERTY_IP_ADDRESS, @@ -51,17 +59,12 @@ Event.JSON_PROPERTY_ACTIVE_CALL, Event.JSON_PROPERTY_BOT, Event.JSON_PROPERTY_BOT_TYPE, - Event.JSON_PROPERTY_BOT_INFO, Event.JSON_PROPERTY_CLONED_APP, Event.JSON_PROPERTY_DEVELOPER_TOOLS, Event.JSON_PROPERTY_EMULATOR, Event.JSON_PROPERTY_FACTORY_RESET_TIMESTAMP, Event.JSON_PROPERTY_FRIDA, Event.JSON_PROPERTY_IP_BLOCKLIST, - Event.JSON_PROPERTY_IP_INFO, - 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, @@ -79,12 +82,9 @@ Event.JSON_PROPERTY_VELOCITY, Event.JSON_PROPERTY_VIRTUAL_MACHINE, Event.JSON_PROPERTY_VIRTUAL_MACHINE_ML_SCORE, - Event.JSON_PROPERTY_VPN, - Event.JSON_PROPERTY_VPN_CONFIDENCE, Event.JSON_PROPERTY_VPN_ML_SCORE, Event.JSON_PROPERTY_VPN_ORIGIN_TIMEZONE, 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, @@ -101,6 +101,39 @@ public class Event { public static final String JSON_PROPERTY_TIMESTAMP = "timestamp"; @jakarta.annotation.Nonnull private Long timestamp; + public static final String JSON_PROPERTY_LINKED_ID = "linked_id"; + @jakarta.annotation.Nullable private String linkedId; + + public static final String JSON_PROPERTY_TAGS = "tags"; + @jakarta.annotation.Nullable private Map tags = new HashMap<>(); + + public static final String JSON_PROPERTY_URL = "url"; + @jakarta.annotation.Nullable private String url; + + public static final String JSON_PROPERTY_BOT_INFO = "bot_info"; + @jakarta.annotation.Nullable private BotInfo botInfo; + + public static final String JSON_PROPERTY_IP_INFO = "ip_info"; + @jakarta.annotation.Nullable private IPInfo ipInfo; + + public static final String JSON_PROPERTY_PROXY = "proxy"; + @jakarta.annotation.Nullable private Boolean proxy; + + public static final String JSON_PROPERTY_PROXY_CONFIDENCE = "proxy_confidence"; + @jakarta.annotation.Nullable private ProxyConfidence proxyConfidence; + + public static final String JSON_PROPERTY_PROXY_DETAILS = "proxy_details"; + @jakarta.annotation.Nullable private ProxyDetails proxyDetails; + + public static final String JSON_PROPERTY_VPN = "vpn"; + @jakarta.annotation.Nullable private Boolean vpn; + + public static final String JSON_PROPERTY_VPN_CONFIDENCE = "vpn_confidence"; + @jakarta.annotation.Nullable private VpnConfidence vpnConfidence; + + public static final String JSON_PROPERTY_VPN_METHODS = "vpn_methods"; + @jakarta.annotation.Nullable private VpnMethods vpnMethods; + public static final String JSON_PROPERTY_SOURCE = "source"; @jakarta.annotation.Nullable private EventSource source; @@ -110,9 +143,6 @@ public class Event { @jakarta.annotation.Nullable private IncrementalIdentificationStatus incrementalIdentificationStatus; - public static final String JSON_PROPERTY_LINKED_ID = "linked_id"; - @jakarta.annotation.Nullable private String linkedId; - public static final String JSON_PROPERTY_ENVIRONMENT_ID = "environment_id"; @jakarta.annotation.Nullable private String environmentId; @@ -132,12 +162,6 @@ public class Event { "supplementary_id_high_recall"; @jakarta.annotation.Nullable private SupplementaryIDHighRecall supplementaryIdHighRecall; - public static final String JSON_PROPERTY_TAGS = "tags"; - @jakarta.annotation.Nullable private Map tags = new HashMap<>(); - - public static final String JSON_PROPERTY_URL = "url"; - @jakarta.annotation.Nullable private String url; - public static final String JSON_PROPERTY_BUNDLE_ID = "bundle_id"; @jakarta.annotation.Nullable private String bundleId; @@ -177,9 +201,6 @@ public class Event { public static final String JSON_PROPERTY_BOT_TYPE = "bot_type"; @jakarta.annotation.Nullable private String botType; - public static final String JSON_PROPERTY_BOT_INFO = "bot_info"; - @jakarta.annotation.Nullable private BotInfo botInfo; - public static final String JSON_PROPERTY_CLONED_APP = "cloned_app"; @jakarta.annotation.Nullable private Boolean clonedApp; @@ -198,18 +219,6 @@ public class Event { public static final String JSON_PROPERTY_IP_BLOCKLIST = "ip_blocklist"; @jakarta.annotation.Nullable private IPBlockList ipBlocklist; - public static final String JSON_PROPERTY_IP_INFO = "ip_info"; - @jakarta.annotation.Nullable private IPInfo ipInfo; - - public static final String JSON_PROPERTY_PROXY = "proxy"; - @jakarta.annotation.Nullable private Boolean proxy; - - public static final String JSON_PROPERTY_PROXY_CONFIDENCE = "proxy_confidence"; - @jakarta.annotation.Nullable private ProxyConfidence proxyConfidence; - - 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; @@ -261,12 +270,6 @@ public class Event { public static final String JSON_PROPERTY_VIRTUAL_MACHINE_ML_SCORE = "virtual_machine_ml_score"; @jakarta.annotation.Nullable private Double virtualMachineMlScore; - public static final String JSON_PROPERTY_VPN = "vpn"; - @jakarta.annotation.Nullable private Boolean vpn; - - public static final String JSON_PROPERTY_VPN_CONFIDENCE = "vpn_confidence"; - @jakarta.annotation.Nullable private VpnConfidence vpnConfidence; - public static final String JSON_PROPERTY_VPN_ML_SCORE = "vpn_ml_score"; @jakarta.annotation.Nullable private Double vpnMlScore; @@ -276,9 +279,6 @@ public class Event { public static final String JSON_PROPERTY_VPN_ORIGIN_COUNTRY = "vpn_origin_country"; @jakarta.annotation.Nullable private String vpnOriginCountry; - public static final String JSON_PROPERTY_VPN_METHODS = "vpn_methods"; - @jakarta.annotation.Nullable private VpnMethods vpnMethods; - public static final String JSON_PROPERTY_HIGH_ACTIVITY_DEVICE = "high_activity_device"; @jakarta.annotation.Nullable private Boolean highActivityDevice; @@ -341,6 +341,256 @@ public void setTimestamp(@jakarta.annotation.Nonnull Long timestamp) { this.timestamp = timestamp; } + public Event linkedId(@jakarta.annotation.Nullable String linkedId) { + this.linkedId = linkedId; + return this; + } + + /** + * A customer-provided id that was sent with the request. + * @return linkedId + */ + @jakarta.annotation.Nullable + @JsonProperty(value = JSON_PROPERTY_LINKED_ID, required = false) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public String getLinkedId() { + return linkedId; + } + + @JsonProperty(value = JSON_PROPERTY_LINKED_ID, required = false) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public void setLinkedId(@jakarta.annotation.Nullable String linkedId) { + this.linkedId = linkedId; + } + + public Event tags(@jakarta.annotation.Nullable Map tags) { + this.tags = tags; + return this; + } + + public Event putTagsItem(String key, Object tagsItem) { + if (this.tags == null) { + this.tags = new HashMap<>(); + } + this.tags.put(key, tagsItem); + return this; + } + + /** + * A customer-provided value or an object that was sent with the identification request or updated later. + * @return tags + */ + @jakarta.annotation.Nullable + @JsonProperty(value = JSON_PROPERTY_TAGS, required = false) + @JsonInclude(content = JsonInclude.Include.ALWAYS, value = JsonInclude.Include.USE_DEFAULTS) + public Map getTags() { + return tags; + } + + @JsonProperty(value = JSON_PROPERTY_TAGS, required = false) + @JsonInclude(content = JsonInclude.Include.ALWAYS, value = JsonInclude.Include.USE_DEFAULTS) + public void setTags(@jakarta.annotation.Nullable Map tags) { + this.tags = tags; + } + + public Event url(@jakarta.annotation.Nullable String url) { + this.url = url; + return this; + } + + /** + * Page URL from which the request was sent. + * @return url + */ + @jakarta.annotation.Nullable + @JsonProperty(value = JSON_PROPERTY_URL, required = false) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public String getUrl() { + return url; + } + + @JsonProperty(value = JSON_PROPERTY_URL, required = false) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public void setUrl(@jakarta.annotation.Nullable String url) { + this.url = url; + } + + public Event botInfo(@jakarta.annotation.Nullable BotInfo botInfo) { + this.botInfo = botInfo; + return this; + } + + /** + * Get botInfo + * @return botInfo + */ + @jakarta.annotation.Nullable + @JsonProperty(value = JSON_PROPERTY_BOT_INFO, required = false) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public BotInfo getBotInfo() { + return botInfo; + } + + @JsonProperty(value = JSON_PROPERTY_BOT_INFO, required = false) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public void setBotInfo(@jakarta.annotation.Nullable BotInfo botInfo) { + this.botInfo = botInfo; + } + + public Event ipInfo(@jakarta.annotation.Nullable IPInfo ipInfo) { + this.ipInfo = ipInfo; + return this; + } + + /** + * Get ipInfo + * @return ipInfo + */ + @jakarta.annotation.Nullable + @JsonProperty(value = JSON_PROPERTY_IP_INFO, required = false) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public IPInfo getIpInfo() { + return ipInfo; + } + + @JsonProperty(value = JSON_PROPERTY_IP_INFO, required = false) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public void setIpInfo(@jakarta.annotation.Nullable IPInfo ipInfo) { + this.ipInfo = ipInfo; + } + + public Event proxy(@jakarta.annotation.Nullable Boolean proxy) { + this.proxy = proxy; + return this; + } + + /** + * IP address was used by a public proxy provider or belonged to a known recent residential proxy + * @return proxy + */ + @jakarta.annotation.Nullable + @JsonProperty(value = JSON_PROPERTY_PROXY, required = false) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public Boolean getProxy() { + return proxy; + } + + @JsonProperty(value = JSON_PROPERTY_PROXY, required = false) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public void setProxy(@jakarta.annotation.Nullable Boolean proxy) { + this.proxy = proxy; + } + + public Event proxyConfidence(@jakarta.annotation.Nullable ProxyConfidence proxyConfidence) { + this.proxyConfidence = proxyConfidence; + return this; + } + + /** + * Get proxyConfidence + * @return proxyConfidence + */ + @jakarta.annotation.Nullable + @JsonProperty(value = JSON_PROPERTY_PROXY_CONFIDENCE, required = false) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public ProxyConfidence getProxyConfidence() { + return proxyConfidence; + } + + @JsonProperty(value = JSON_PROPERTY_PROXY_CONFIDENCE, required = false) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public void setProxyConfidence(@jakarta.annotation.Nullable ProxyConfidence proxyConfidence) { + this.proxyConfidence = proxyConfidence; + } + + public Event proxyDetails(@jakarta.annotation.Nullable ProxyDetails proxyDetails) { + this.proxyDetails = proxyDetails; + return this; + } + + /** + * Get proxyDetails + * @return proxyDetails + */ + @jakarta.annotation.Nullable + @JsonProperty(value = JSON_PROPERTY_PROXY_DETAILS, required = false) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public ProxyDetails getProxyDetails() { + return proxyDetails; + } + + @JsonProperty(value = JSON_PROPERTY_PROXY_DETAILS, required = false) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public void setProxyDetails(@jakarta.annotation.Nullable ProxyDetails proxyDetails) { + this.proxyDetails = proxyDetails; + } + + public Event vpn(@jakarta.annotation.Nullable Boolean vpn) { + this.vpn = vpn; + return this; + } + + /** + * VPN or other anonymizing service has been used when sending the request. + * @return vpn + */ + @jakarta.annotation.Nullable + @JsonProperty(value = JSON_PROPERTY_VPN, required = false) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public Boolean getVpn() { + return vpn; + } + + @JsonProperty(value = JSON_PROPERTY_VPN, required = false) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public void setVpn(@jakarta.annotation.Nullable Boolean vpn) { + this.vpn = vpn; + } + + public Event vpnConfidence(@jakarta.annotation.Nullable VpnConfidence vpnConfidence) { + this.vpnConfidence = vpnConfidence; + return this; + } + + /** + * Get vpnConfidence + * @return vpnConfidence + */ + @jakarta.annotation.Nullable + @JsonProperty(value = JSON_PROPERTY_VPN_CONFIDENCE, required = false) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public VpnConfidence getVpnConfidence() { + return vpnConfidence; + } + + @JsonProperty(value = JSON_PROPERTY_VPN_CONFIDENCE, required = false) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public void setVpnConfidence(@jakarta.annotation.Nullable VpnConfidence vpnConfidence) { + this.vpnConfidence = vpnConfidence; + } + + public Event vpnMethods(@jakarta.annotation.Nullable VpnMethods vpnMethods) { + this.vpnMethods = vpnMethods; + return this; + } + + /** + * Get vpnMethods + * @return vpnMethods + */ + @jakarta.annotation.Nullable + @JsonProperty(value = JSON_PROPERTY_VPN_METHODS, required = false) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public VpnMethods getVpnMethods() { + return vpnMethods; + } + + @JsonProperty(value = JSON_PROPERTY_VPN_METHODS, required = false) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public void setVpnMethods(@jakarta.annotation.Nullable VpnMethods vpnMethods) { + this.vpnMethods = vpnMethods; + } + public Event source(@jakarta.annotation.Nullable EventSource source) { this.source = source; return this; @@ -389,28 +639,6 @@ public void setIncrementalIdentificationStatus( this.incrementalIdentificationStatus = incrementalIdentificationStatus; } - public Event linkedId(@jakarta.annotation.Nullable String linkedId) { - this.linkedId = linkedId; - return this; - } - - /** - * A customer-provided id that was sent with the request. - * @return linkedId - */ - @jakarta.annotation.Nullable - @JsonProperty(value = JSON_PROPERTY_LINKED_ID, required = false) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) - public String getLinkedId() { - return linkedId; - } - - @JsonProperty(value = JSON_PROPERTY_LINKED_ID, required = false) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) - public void setLinkedId(@jakarta.annotation.Nullable String linkedId) { - this.linkedId = linkedId; - } - public Event environmentId(@jakarta.annotation.Nullable String environmentId) { this.environmentId = environmentId; return this; @@ -439,7 +667,7 @@ public Event suspect(@jakarta.annotation.Nullable Boolean suspect) { } /** - * Field is `true` if you have previously set the `suspect` flag for this event using the [Server API Update event endpoint](https://docs.fingerprint.com/reference/server-api-v4-update-event). + * Field is `true` if you have previously set the `suspect` flag for this event using the [Server API Update event endpoint](https://docs.fingerprint.com/reference/server-api-update-event). * @return suspect */ @jakarta.annotation.Nullable @@ -529,72 +757,20 @@ public Event supplementaryIdHighRecall( /** * Get supplementaryIdHighRecall - * @return supplementaryIdHighRecall - */ - @jakarta.annotation.Nullable - @JsonProperty(value = JSON_PROPERTY_SUPPLEMENTARY_ID_HIGH_RECALL, required = false) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) - public SupplementaryIDHighRecall getSupplementaryIdHighRecall() { - return supplementaryIdHighRecall; - } - - @JsonProperty(value = JSON_PROPERTY_SUPPLEMENTARY_ID_HIGH_RECALL, required = false) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) - public void setSupplementaryIdHighRecall( - @jakarta.annotation.Nullable SupplementaryIDHighRecall supplementaryIdHighRecall) { - this.supplementaryIdHighRecall = supplementaryIdHighRecall; - } - - public Event tags(@jakarta.annotation.Nullable Map tags) { - this.tags = tags; - return this; - } - - public Event putTagsItem(String key, Object tagsItem) { - if (this.tags == null) { - this.tags = new HashMap<>(); - } - this.tags.put(key, tagsItem); - return this; - } - - /** - * A customer-provided value or an object that was sent with the identification request or updated later. - * @return tags - */ - @jakarta.annotation.Nullable - @JsonProperty(value = JSON_PROPERTY_TAGS, required = false) - @JsonInclude(content = JsonInclude.Include.ALWAYS, value = JsonInclude.Include.USE_DEFAULTS) - public Map getTags() { - return tags; - } - - @JsonProperty(value = JSON_PROPERTY_TAGS, required = false) - @JsonInclude(content = JsonInclude.Include.ALWAYS, value = JsonInclude.Include.USE_DEFAULTS) - public void setTags(@jakarta.annotation.Nullable Map tags) { - this.tags = tags; - } - - public Event url(@jakarta.annotation.Nullable String url) { - this.url = url; - return this; - } - - /** - * Page URL from which the request was sent. - * @return url + * @return supplementaryIdHighRecall */ @jakarta.annotation.Nullable - @JsonProperty(value = JSON_PROPERTY_URL, required = false) + @JsonProperty(value = JSON_PROPERTY_SUPPLEMENTARY_ID_HIGH_RECALL, required = false) @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) - public String getUrl() { - return url; + public SupplementaryIDHighRecall getSupplementaryIdHighRecall() { + return supplementaryIdHighRecall; } - @JsonProperty(value = JSON_PROPERTY_URL, required = false) + @JsonProperty(value = JSON_PROPERTY_SUPPLEMENTARY_ID_HIGH_RECALL, required = false) @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) - public void setUrl(@jakarta.annotation.Nullable String url) { - this.url = url; + public void setSupplementaryIdHighRecall( + @jakarta.annotation.Nullable SupplementaryIDHighRecall supplementaryIdHighRecall) { + this.supplementaryIdHighRecall = supplementaryIdHighRecall; } public Event bundleId(@jakarta.annotation.Nullable String bundleId) { @@ -883,28 +1059,6 @@ public void setBotType(@jakarta.annotation.Nullable String botType) { this.botType = botType; } - public Event botInfo(@jakarta.annotation.Nullable BotInfo botInfo) { - this.botInfo = botInfo; - return this; - } - - /** - * Get botInfo - * @return botInfo - */ - @jakarta.annotation.Nullable - @JsonProperty(value = JSON_PROPERTY_BOT_INFO, required = false) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) - public BotInfo getBotInfo() { - return botInfo; - } - - @JsonProperty(value = JSON_PROPERTY_BOT_INFO, required = false) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) - public void setBotInfo(@jakarta.annotation.Nullable BotInfo botInfo) { - this.botInfo = botInfo; - } - public Event clonedApp(@jakarta.annotation.Nullable Boolean clonedApp) { this.clonedApp = clonedApp; return this; @@ -1037,94 +1191,6 @@ public void setIpBlocklist(@jakarta.annotation.Nullable IPBlockList ipBlocklist) this.ipBlocklist = ipBlocklist; } - public Event ipInfo(@jakarta.annotation.Nullable IPInfo ipInfo) { - this.ipInfo = ipInfo; - return this; - } - - /** - * Get ipInfo - * @return ipInfo - */ - @jakarta.annotation.Nullable - @JsonProperty(value = JSON_PROPERTY_IP_INFO, required = false) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) - public IPInfo getIpInfo() { - return ipInfo; - } - - @JsonProperty(value = JSON_PROPERTY_IP_INFO, required = false) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) - public void setIpInfo(@jakarta.annotation.Nullable IPInfo ipInfo) { - this.ipInfo = ipInfo; - } - - public Event proxy(@jakarta.annotation.Nullable Boolean proxy) { - this.proxy = proxy; - return this; - } - - /** - * IP address was used by a public proxy provider or belonged to a known recent residential proxy - * @return proxy - */ - @jakarta.annotation.Nullable - @JsonProperty(value = JSON_PROPERTY_PROXY, required = false) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) - public Boolean getProxy() { - return proxy; - } - - @JsonProperty(value = JSON_PROPERTY_PROXY, required = false) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) - public void setProxy(@jakarta.annotation.Nullable Boolean proxy) { - this.proxy = proxy; - } - - public Event proxyConfidence(@jakarta.annotation.Nullable ProxyConfidence proxyConfidence) { - this.proxyConfidence = proxyConfidence; - return this; - } - - /** - * Get proxyConfidence - * @return proxyConfidence - */ - @jakarta.annotation.Nullable - @JsonProperty(value = JSON_PROPERTY_PROXY_CONFIDENCE, required = false) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) - public ProxyConfidence getProxyConfidence() { - return proxyConfidence; - } - - @JsonProperty(value = JSON_PROPERTY_PROXY_CONFIDENCE, required = false) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) - public void setProxyConfidence(@jakarta.annotation.Nullable ProxyConfidence proxyConfidence) { - this.proxyConfidence = proxyConfidence; - } - - public Event proxyDetails(@jakarta.annotation.Nullable ProxyDetails proxyDetails) { - this.proxyDetails = proxyDetails; - return this; - } - - /** - * Get proxyDetails - * @return proxyDetails - */ - @jakarta.annotation.Nullable - @JsonProperty(value = JSON_PROPERTY_PROXY_DETAILS, required = false) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) - public ProxyDetails getProxyDetails() { - return proxyDetails; - } - - @JsonProperty(value = JSON_PROPERTY_PROXY_DETAILS, required = false) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) - public void setProxyDetails(@jakarta.annotation.Nullable ProxyDetails proxyDetails) { - this.proxyDetails = proxyDetails; - } - public Event proxyMlScore(@jakarta.annotation.Nullable Double proxyMlScore) { this.proxyMlScore = proxyMlScore; return this; @@ -1507,50 +1573,6 @@ public void setVirtualMachineMlScore(@jakarta.annotation.Nullable Double virtual this.virtualMachineMlScore = virtualMachineMlScore; } - public Event vpn(@jakarta.annotation.Nullable Boolean vpn) { - this.vpn = vpn; - return this; - } - - /** - * VPN or other anonymizing service has been used when sending the request. - * @return vpn - */ - @jakarta.annotation.Nullable - @JsonProperty(value = JSON_PROPERTY_VPN, required = false) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) - public Boolean getVpn() { - return vpn; - } - - @JsonProperty(value = JSON_PROPERTY_VPN, required = false) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) - public void setVpn(@jakarta.annotation.Nullable Boolean vpn) { - this.vpn = vpn; - } - - public Event vpnConfidence(@jakarta.annotation.Nullable VpnConfidence vpnConfidence) { - this.vpnConfidence = vpnConfidence; - return this; - } - - /** - * Get vpnConfidence - * @return vpnConfidence - */ - @jakarta.annotation.Nullable - @JsonProperty(value = JSON_PROPERTY_VPN_CONFIDENCE, required = false) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) - public VpnConfidence getVpnConfidence() { - return vpnConfidence; - } - - @JsonProperty(value = JSON_PROPERTY_VPN_CONFIDENCE, required = false) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) - public void setVpnConfidence(@jakarta.annotation.Nullable VpnConfidence vpnConfidence) { - this.vpnConfidence = vpnConfidence; - } - public Event vpnMlScore(@jakarta.annotation.Nullable Double vpnMlScore) { this.vpnMlScore = vpnMlScore; return this; @@ -1619,28 +1641,6 @@ public void setVpnOriginCountry(@jakarta.annotation.Nullable String vpnOriginCou this.vpnOriginCountry = vpnOriginCountry; } - public Event vpnMethods(@jakarta.annotation.Nullable VpnMethods vpnMethods) { - this.vpnMethods = vpnMethods; - return this; - } - - /** - * Get vpnMethods - * @return vpnMethods - */ - @jakarta.annotation.Nullable - @JsonProperty(value = JSON_PROPERTY_VPN_METHODS, required = false) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) - public VpnMethods getVpnMethods() { - return vpnMethods; - } - - @JsonProperty(value = JSON_PROPERTY_VPN_METHODS, required = false) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) - public void setVpnMethods(@jakarta.annotation.Nullable VpnMethods vpnMethods) { - this.vpnMethods = vpnMethods; - } - public Event highActivityDevice(@jakarta.annotation.Nullable Boolean highActivityDevice) { this.highActivityDevice = highActivityDevice; return this; @@ -1777,18 +1777,26 @@ public boolean equals(Object o) { Event event = (Event) o; return Objects.equals(this.eventId, event.eventId) && Objects.equals(this.timestamp, event.timestamp) + && Objects.equals(this.linkedId, event.linkedId) + && Objects.equals(this.tags, event.tags) + && Objects.equals(this.url, event.url) + && Objects.equals(this.botInfo, event.botInfo) + && Objects.equals(this.ipInfo, event.ipInfo) + && Objects.equals(this.proxy, event.proxy) + && Objects.equals(this.proxyConfidence, event.proxyConfidence) + && Objects.equals(this.proxyDetails, event.proxyDetails) + && Objects.equals(this.vpn, event.vpn) + && Objects.equals(this.vpnConfidence, event.vpnConfidence) + && Objects.equals(this.vpnMethods, event.vpnMethods) && Objects.equals(this.source, event.source) && Objects.equals( this.incrementalIdentificationStatus, event.incrementalIdentificationStatus) - && Objects.equals(this.linkedId, event.linkedId) && Objects.equals(this.environmentId, event.environmentId) && Objects.equals(this.suspect, event.suspect) && Objects.equals(this.sdk, event.sdk) && Objects.equals(this.replayed, event.replayed) && Objects.equals(this.identification, event.identification) && Objects.equals(this.supplementaryIdHighRecall, event.supplementaryIdHighRecall) - && Objects.equals(this.tags, event.tags) - && Objects.equals(this.url, event.url) && Objects.equals(this.bundleId, event.bundleId) && Objects.equals(this.packageName, event.packageName) && Objects.equals(this.ipAddress, event.ipAddress) @@ -1802,17 +1810,12 @@ public boolean equals(Object o) { && Objects.equals(this.activeCall, event.activeCall) && Objects.equals(this.bot, event.bot) && Objects.equals(this.botType, event.botType) - && Objects.equals(this.botInfo, event.botInfo) && Objects.equals(this.clonedApp, event.clonedApp) && Objects.equals(this.developerTools, event.developerTools) && Objects.equals(this.emulator, event.emulator) && Objects.equals(this.factoryResetTimestamp, event.factoryResetTimestamp) && Objects.equals(this.frida, event.frida) && Objects.equals(this.ipBlocklist, event.ipBlocklist) - && Objects.equals(this.ipInfo, event.ipInfo) - && 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) @@ -1830,12 +1833,9 @@ public boolean equals(Object o) { && Objects.equals(this.velocity, event.velocity) && Objects.equals(this.virtualMachine, event.virtualMachine) && Objects.equals(this.virtualMachineMlScore, event.virtualMachineMlScore) - && Objects.equals(this.vpn, event.vpn) - && Objects.equals(this.vpnConfidence, event.vpnConfidence) && Objects.equals(this.vpnMlScore, event.vpnMlScore) && Objects.equals(this.vpnOriginTimezone, event.vpnOriginTimezone) && 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) @@ -1848,17 +1848,25 @@ public int hashCode() { return Objects.hash( eventId, timestamp, + linkedId, + tags, + url, + botInfo, + ipInfo, + proxy, + proxyConfidence, + proxyDetails, + vpn, + vpnConfidence, + vpnMethods, source, incrementalIdentificationStatus, - linkedId, environmentId, suspect, sdk, replayed, identification, supplementaryIdHighRecall, - tags, - url, bundleId, packageName, ipAddress, @@ -1872,17 +1880,12 @@ public int hashCode() { activeCall, bot, botType, - botInfo, clonedApp, developerTools, emulator, factoryResetTimestamp, frida, ipBlocklist, - ipInfo, - proxy, - proxyConfidence, - proxyDetails, proxyMlScore, incognito, jailbroken, @@ -1900,12 +1903,9 @@ public int hashCode() { velocity, virtualMachine, virtualMachineMlScore, - vpn, - vpnConfidence, vpnMlScore, vpnOriginTimezone, vpnOriginCountry, - vpnMethods, highActivityDevice, rareDevice, rareDevicePercentileBucket, @@ -1919,11 +1919,21 @@ public String toString() { sb.append("class Event {\n"); sb.append(" eventId: ").append(toIndentedString(eventId)).append("\n"); sb.append(" timestamp: ").append(toIndentedString(timestamp)).append("\n"); + sb.append(" linkedId: ").append(toIndentedString(linkedId)).append("\n"); + sb.append(" tags: ").append(toIndentedString(tags)).append("\n"); + sb.append(" url: ").append(toIndentedString(url)).append("\n"); + sb.append(" botInfo: ").append(toIndentedString(botInfo)).append("\n"); + sb.append(" ipInfo: ").append(toIndentedString(ipInfo)).append("\n"); + 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(" vpn: ").append(toIndentedString(vpn)).append("\n"); + sb.append(" vpnConfidence: ").append(toIndentedString(vpnConfidence)).append("\n"); + sb.append(" vpnMethods: ").append(toIndentedString(vpnMethods)).append("\n"); sb.append(" source: ").append(toIndentedString(source)).append("\n"); sb.append(" incrementalIdentificationStatus: ") .append(toIndentedString(incrementalIdentificationStatus)) .append("\n"); - sb.append(" linkedId: ").append(toIndentedString(linkedId)).append("\n"); sb.append(" environmentId: ").append(toIndentedString(environmentId)).append("\n"); sb.append(" suspect: ").append(toIndentedString(suspect)).append("\n"); sb.append(" sdk: ").append(toIndentedString(sdk)).append("\n"); @@ -1932,8 +1942,6 @@ public String toString() { sb.append(" supplementaryIdHighRecall: ") .append(toIndentedString(supplementaryIdHighRecall)) .append("\n"); - sb.append(" tags: ").append(toIndentedString(tags)).append("\n"); - sb.append(" url: ").append(toIndentedString(url)).append("\n"); sb.append(" bundleId: ").append(toIndentedString(bundleId)).append("\n"); sb.append(" packageName: ").append(toIndentedString(packageName)).append("\n"); sb.append(" ipAddress: ").append(toIndentedString(ipAddress)).append("\n"); @@ -1947,7 +1955,6 @@ public String toString() { sb.append(" activeCall: ").append(toIndentedString(activeCall)).append("\n"); sb.append(" bot: ").append(toIndentedString(bot)).append("\n"); sb.append(" botType: ").append(toIndentedString(botType)).append("\n"); - sb.append(" botInfo: ").append(toIndentedString(botInfo)).append("\n"); sb.append(" clonedApp: ").append(toIndentedString(clonedApp)).append("\n"); sb.append(" developerTools: ").append(toIndentedString(developerTools)).append("\n"); sb.append(" emulator: ").append(toIndentedString(emulator)).append("\n"); @@ -1956,10 +1963,6 @@ public String toString() { .append("\n"); sb.append(" frida: ").append(toIndentedString(frida)).append("\n"); sb.append(" ipBlocklist: ").append(toIndentedString(ipBlocklist)).append("\n"); - sb.append(" ipInfo: ").append(toIndentedString(ipInfo)).append("\n"); - 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"); @@ -1981,12 +1984,9 @@ public String toString() { sb.append(" virtualMachineMlScore: ") .append(toIndentedString(virtualMachineMlScore)) .append("\n"); - sb.append(" vpn: ").append(toIndentedString(vpn)).append("\n"); - sb.append(" vpnConfidence: ").append(toIndentedString(vpnConfidence)).append("\n"); sb.append(" vpnMlScore: ").append(toIndentedString(vpnMlScore)).append("\n"); sb.append(" vpnOriginTimezone: ").append(toIndentedString(vpnOriginTimezone)).append("\n"); 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: ") diff --git a/sdk/src/main/java/com/fingerprint/v4/model/EventEdge.java b/sdk/src/main/java/com/fingerprint/v4/model/EventEdge.java new file mode 100644 index 0000000..e54c748 --- /dev/null +++ b/sdk/src/main/java/com/fingerprint/v4/model/EventEdge.java @@ -0,0 +1,484 @@ +/* + * 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 API also supports collection of Automation Intelligence for requests to your server in edge, pre-origin, or middleware contexts. + * + * 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.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +/** + * IP and bot analysis for an event generated by the Automation Intelligence API (`/edge` endpoint). No client-side collection agent is involved, so Identification (`visitor_id`) and device-telemetry-derived Smart Signals are not available. + */ +@JsonPropertyOrder({ + EventEdge.JSON_PROPERTY_EVENT_ID, + EventEdge.JSON_PROPERTY_TIMESTAMP, + EventEdge.JSON_PROPERTY_LINKED_ID, + EventEdge.JSON_PROPERTY_TAGS, + EventEdge.JSON_PROPERTY_URL, + EventEdge.JSON_PROPERTY_BOT_INFO, + EventEdge.JSON_PROPERTY_IP_INFO, + EventEdge.JSON_PROPERTY_PROXY, + EventEdge.JSON_PROPERTY_PROXY_CONFIDENCE, + EventEdge.JSON_PROPERTY_PROXY_DETAILS, + EventEdge.JSON_PROPERTY_VPN, + EventEdge.JSON_PROPERTY_VPN_CONFIDENCE, + EventEdge.JSON_PROPERTY_VPN_METHODS, + EventEdge.JSON_PROPERTY_SOURCE +}) +@jakarta.annotation.Generated( + value = "org.openapitools.codegen.languages.JavaClientCodegen", + comments = "Generator version: 7.24.0") +public class EventEdge { + public static final String JSON_PROPERTY_EVENT_ID = "event_id"; + @jakarta.annotation.Nonnull private String eventId; + + public static final String JSON_PROPERTY_TIMESTAMP = "timestamp"; + @jakarta.annotation.Nonnull private Long timestamp; + + public static final String JSON_PROPERTY_LINKED_ID = "linked_id"; + @jakarta.annotation.Nullable private String linkedId; + + public static final String JSON_PROPERTY_TAGS = "tags"; + @jakarta.annotation.Nullable private Map tags = new HashMap<>(); + + public static final String JSON_PROPERTY_URL = "url"; + @jakarta.annotation.Nullable private String url; + + public static final String JSON_PROPERTY_BOT_INFO = "bot_info"; + @jakarta.annotation.Nullable private BotInfo botInfo; + + public static final String JSON_PROPERTY_IP_INFO = "ip_info"; + @jakarta.annotation.Nonnull private IPInfo ipInfo; + + public static final String JSON_PROPERTY_PROXY = "proxy"; + @jakarta.annotation.Nullable private Boolean proxy; + + public static final String JSON_PROPERTY_PROXY_CONFIDENCE = "proxy_confidence"; + @jakarta.annotation.Nullable private ProxyConfidence proxyConfidence; + + public static final String JSON_PROPERTY_PROXY_DETAILS = "proxy_details"; + @jakarta.annotation.Nullable private ProxyDetails proxyDetails; + + public static final String JSON_PROPERTY_VPN = "vpn"; + @jakarta.annotation.Nullable private Boolean vpn; + + public static final String JSON_PROPERTY_VPN_CONFIDENCE = "vpn_confidence"; + @jakarta.annotation.Nullable private VpnConfidence vpnConfidence; + + public static final String JSON_PROPERTY_VPN_METHODS = "vpn_methods"; + @jakarta.annotation.Nullable private VpnMethods vpnMethods; + + public static final String JSON_PROPERTY_SOURCE = "source"; + @jakarta.annotation.Nonnull private EventSource source; + + public EventEdge() {} + + public EventEdge eventId(@jakarta.annotation.Nonnull String eventId) { + this.eventId = eventId; + return this; + } + + /** + * Unique identifier of the user's request. The first portion of the event_id is a unix epoch milliseconds timestamp. + * @return eventId + */ + @jakarta.annotation.Nonnull + @JsonProperty(value = JSON_PROPERTY_EVENT_ID, required = true) + @JsonInclude(value = JsonInclude.Include.ALWAYS) + public String getEventId() { + return eventId; + } + + @JsonProperty(value = JSON_PROPERTY_EVENT_ID, required = true) + @JsonInclude(value = JsonInclude.Include.ALWAYS) + public void setEventId(@jakarta.annotation.Nonnull String eventId) { + this.eventId = eventId; + } + + public EventEdge timestamp(@jakarta.annotation.Nonnull Long timestamp) { + this.timestamp = timestamp; + return this; + } + + /** + * Timestamp of the event with millisecond precision in Unix time. + * @return timestamp + */ + @jakarta.annotation.Nonnull + @JsonProperty(value = JSON_PROPERTY_TIMESTAMP, required = true) + @JsonInclude(value = JsonInclude.Include.ALWAYS) + public Long getTimestamp() { + return timestamp; + } + + @JsonProperty(value = JSON_PROPERTY_TIMESTAMP, required = true) + @JsonInclude(value = JsonInclude.Include.ALWAYS) + public void setTimestamp(@jakarta.annotation.Nonnull Long timestamp) { + this.timestamp = timestamp; + } + + public EventEdge linkedId(@jakarta.annotation.Nullable String linkedId) { + this.linkedId = linkedId; + return this; + } + + /** + * A customer-provided id that was sent with the request. + * @return linkedId + */ + @jakarta.annotation.Nullable + @JsonProperty(value = JSON_PROPERTY_LINKED_ID, required = false) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public String getLinkedId() { + return linkedId; + } + + @JsonProperty(value = JSON_PROPERTY_LINKED_ID, required = false) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public void setLinkedId(@jakarta.annotation.Nullable String linkedId) { + this.linkedId = linkedId; + } + + public EventEdge tags(@jakarta.annotation.Nullable Map tags) { + this.tags = tags; + return this; + } + + public EventEdge putTagsItem(String key, Object tagsItem) { + if (this.tags == null) { + this.tags = new HashMap<>(); + } + this.tags.put(key, tagsItem); + return this; + } + + /** + * A customer-provided value or an object that was sent with the identification request or updated later. + * @return tags + */ + @jakarta.annotation.Nullable + @JsonProperty(value = JSON_PROPERTY_TAGS, required = false) + @JsonInclude(content = JsonInclude.Include.ALWAYS, value = JsonInclude.Include.USE_DEFAULTS) + public Map getTags() { + return tags; + } + + @JsonProperty(value = JSON_PROPERTY_TAGS, required = false) + @JsonInclude(content = JsonInclude.Include.ALWAYS, value = JsonInclude.Include.USE_DEFAULTS) + public void setTags(@jakarta.annotation.Nullable Map tags) { + this.tags = tags; + } + + public EventEdge url(@jakarta.annotation.Nullable String url) { + this.url = url; + return this; + } + + /** + * Page URL from which the request was sent. + * @return url + */ + @jakarta.annotation.Nullable + @JsonProperty(value = JSON_PROPERTY_URL, required = false) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public String getUrl() { + return url; + } + + @JsonProperty(value = JSON_PROPERTY_URL, required = false) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public void setUrl(@jakarta.annotation.Nullable String url) { + this.url = url; + } + + public EventEdge botInfo(@jakarta.annotation.Nullable BotInfo botInfo) { + this.botInfo = botInfo; + return this; + } + + /** + * Get botInfo + * @return botInfo + */ + @jakarta.annotation.Nullable + @JsonProperty(value = JSON_PROPERTY_BOT_INFO, required = false) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public BotInfo getBotInfo() { + return botInfo; + } + + @JsonProperty(value = JSON_PROPERTY_BOT_INFO, required = false) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public void setBotInfo(@jakarta.annotation.Nullable BotInfo botInfo) { + this.botInfo = botInfo; + } + + public EventEdge ipInfo(@jakarta.annotation.Nonnull IPInfo ipInfo) { + this.ipInfo = ipInfo; + return this; + } + + /** + * Get ipInfo + * @return ipInfo + */ + @jakarta.annotation.Nonnull + @JsonProperty(value = JSON_PROPERTY_IP_INFO, required = true) + @JsonInclude(value = JsonInclude.Include.ALWAYS) + public IPInfo getIpInfo() { + return ipInfo; + } + + @JsonProperty(value = JSON_PROPERTY_IP_INFO, required = true) + @JsonInclude(value = JsonInclude.Include.ALWAYS) + public void setIpInfo(@jakarta.annotation.Nonnull IPInfo ipInfo) { + this.ipInfo = ipInfo; + } + + public EventEdge proxy(@jakarta.annotation.Nullable Boolean proxy) { + this.proxy = proxy; + return this; + } + + /** + * IP address was used by a public proxy provider or belonged to a known recent residential proxy + * @return proxy + */ + @jakarta.annotation.Nullable + @JsonProperty(value = JSON_PROPERTY_PROXY, required = false) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public Boolean getProxy() { + return proxy; + } + + @JsonProperty(value = JSON_PROPERTY_PROXY, required = false) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public void setProxy(@jakarta.annotation.Nullable Boolean proxy) { + this.proxy = proxy; + } + + public EventEdge proxyConfidence(@jakarta.annotation.Nullable ProxyConfidence proxyConfidence) { + this.proxyConfidence = proxyConfidence; + return this; + } + + /** + * Get proxyConfidence + * @return proxyConfidence + */ + @jakarta.annotation.Nullable + @JsonProperty(value = JSON_PROPERTY_PROXY_CONFIDENCE, required = false) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public ProxyConfidence getProxyConfidence() { + return proxyConfidence; + } + + @JsonProperty(value = JSON_PROPERTY_PROXY_CONFIDENCE, required = false) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public void setProxyConfidence(@jakarta.annotation.Nullable ProxyConfidence proxyConfidence) { + this.proxyConfidence = proxyConfidence; + } + + public EventEdge proxyDetails(@jakarta.annotation.Nullable ProxyDetails proxyDetails) { + this.proxyDetails = proxyDetails; + return this; + } + + /** + * Get proxyDetails + * @return proxyDetails + */ + @jakarta.annotation.Nullable + @JsonProperty(value = JSON_PROPERTY_PROXY_DETAILS, required = false) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public ProxyDetails getProxyDetails() { + return proxyDetails; + } + + @JsonProperty(value = JSON_PROPERTY_PROXY_DETAILS, required = false) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public void setProxyDetails(@jakarta.annotation.Nullable ProxyDetails proxyDetails) { + this.proxyDetails = proxyDetails; + } + + public EventEdge vpn(@jakarta.annotation.Nullable Boolean vpn) { + this.vpn = vpn; + return this; + } + + /** + * VPN or other anonymizing service has been used when sending the request. + * @return vpn + */ + @jakarta.annotation.Nullable + @JsonProperty(value = JSON_PROPERTY_VPN, required = false) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public Boolean getVpn() { + return vpn; + } + + @JsonProperty(value = JSON_PROPERTY_VPN, required = false) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public void setVpn(@jakarta.annotation.Nullable Boolean vpn) { + this.vpn = vpn; + } + + public EventEdge vpnConfidence(@jakarta.annotation.Nullable VpnConfidence vpnConfidence) { + this.vpnConfidence = vpnConfidence; + return this; + } + + /** + * Get vpnConfidence + * @return vpnConfidence + */ + @jakarta.annotation.Nullable + @JsonProperty(value = JSON_PROPERTY_VPN_CONFIDENCE, required = false) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public VpnConfidence getVpnConfidence() { + return vpnConfidence; + } + + @JsonProperty(value = JSON_PROPERTY_VPN_CONFIDENCE, required = false) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public void setVpnConfidence(@jakarta.annotation.Nullable VpnConfidence vpnConfidence) { + this.vpnConfidence = vpnConfidence; + } + + public EventEdge vpnMethods(@jakarta.annotation.Nullable VpnMethods vpnMethods) { + this.vpnMethods = vpnMethods; + return this; + } + + /** + * Get vpnMethods + * @return vpnMethods + */ + @jakarta.annotation.Nullable + @JsonProperty(value = JSON_PROPERTY_VPN_METHODS, required = false) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public VpnMethods getVpnMethods() { + return vpnMethods; + } + + @JsonProperty(value = JSON_PROPERTY_VPN_METHODS, required = false) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + public void setVpnMethods(@jakarta.annotation.Nullable VpnMethods vpnMethods) { + this.vpnMethods = vpnMethods; + } + + public EventEdge source(@jakarta.annotation.Nonnull EventSource source) { + this.source = source; + return this; + } + + /** + * Get source + * @return source + */ + @jakarta.annotation.Nonnull + @JsonProperty(value = JSON_PROPERTY_SOURCE, required = true) + @JsonInclude(value = JsonInclude.Include.ALWAYS) + public EventSource getSource() { + return source; + } + + @JsonProperty(value = JSON_PROPERTY_SOURCE, required = true) + @JsonInclude(value = JsonInclude.Include.ALWAYS) + public void setSource(@jakarta.annotation.Nonnull EventSource source) { + this.source = source; + } + + /** + * Return true if this EventEdge object is equal to o. + */ + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + EventEdge eventEdge = (EventEdge) o; + return Objects.equals(this.eventId, eventEdge.eventId) + && Objects.equals(this.timestamp, eventEdge.timestamp) + && Objects.equals(this.linkedId, eventEdge.linkedId) + && Objects.equals(this.tags, eventEdge.tags) + && Objects.equals(this.url, eventEdge.url) + && Objects.equals(this.botInfo, eventEdge.botInfo) + && Objects.equals(this.ipInfo, eventEdge.ipInfo) + && Objects.equals(this.proxy, eventEdge.proxy) + && Objects.equals(this.proxyConfidence, eventEdge.proxyConfidence) + && Objects.equals(this.proxyDetails, eventEdge.proxyDetails) + && Objects.equals(this.vpn, eventEdge.vpn) + && Objects.equals(this.vpnConfidence, eventEdge.vpnConfidence) + && Objects.equals(this.vpnMethods, eventEdge.vpnMethods) + && Objects.equals(this.source, eventEdge.source); + } + + @Override + public int hashCode() { + return Objects.hash( + eventId, + timestamp, + linkedId, + tags, + url, + botInfo, + ipInfo, + proxy, + proxyConfidence, + proxyDetails, + vpn, + vpnConfidence, + vpnMethods, + source); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class EventEdge {\n"); + sb.append(" eventId: ").append(toIndentedString(eventId)).append("\n"); + sb.append(" timestamp: ").append(toIndentedString(timestamp)).append("\n"); + sb.append(" linkedId: ").append(toIndentedString(linkedId)).append("\n"); + sb.append(" tags: ").append(toIndentedString(tags)).append("\n"); + sb.append(" url: ").append(toIndentedString(url)).append("\n"); + sb.append(" botInfo: ").append(toIndentedString(botInfo)).append("\n"); + sb.append(" ipInfo: ").append(toIndentedString(ipInfo)).append("\n"); + 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(" vpn: ").append(toIndentedString(vpn)).append("\n"); + sb.append(" vpnConfidence: ").append(toIndentedString(vpnConfidence)).append("\n"); + sb.append(" vpnMethods: ").append(toIndentedString(vpnMethods)).append("\n"); + sb.append(" source: ").append(toIndentedString(source)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} From 0bd088f483253ae607f747faa61c767e0f1c7920 Mon Sep 17 00:00:00 2001 From: Juraj Uhlar Date: Mon, 31 Aug 2026 17:07:57 +0100 Subject: [PATCH 2/5] chore: sync from v4-normalized schema --- scripts/sync.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/sync.sh b/scripts/sync.sh index 23e78ff..aecec15 100755 --- a/scripts/sync.sh +++ b/scripts/sync.sh @@ -2,7 +2,8 @@ set -ex -curl -s -o ./res/fingerprint-server-api.yaml https://fingerprintjs.github.io/fingerprint-pro-server-api-openapi/schemas/fingerprint-server-api-v4.yaml +# Flattened Event (single object, source optional). start/end split into start + start_date_time. +curl -s -o ./res/fingerprint-server-api.yaml https://fingerprintjs.github.io/fingerprint-pro-server-api-openapi/schemas/fingerprint-server-api-v4-normalized.yaml examplesList=( 'webhook/webhook_event.json' From 8a5ad457c556f76fcba9df3bccc9b560144efc76 Mon Sep 17 00:00:00 2001 From: Juraj Uhlar Date: Mon, 31 Aug 2026 17:24:08 +0100 Subject: [PATCH 3/5] chore: sync schema with Event flatten x-platforms --- res/fingerprint-server-api.yaml | 36 +++---------------- .../mocks/webhook/webhook_event.json | 1 + 2 files changed, 5 insertions(+), 32 deletions(-) diff --git a/res/fingerprint-server-api.yaml b/res/fingerprint-server-api.yaml index 4e87ab0..e1f0af7 100644 --- a/res/fingerprint-server-api.yaml +++ b/res/fingerprint-server-api.yaml @@ -1859,54 +1859,22 @@ components: - browser url: $ref: '#/components/schemas/Url' - x-platforms: - - browser bot_info: $ref: '#/components/schemas/BotInfo' - x-platforms: - - browser ip_info: $ref: '#/components/schemas/IPInfo' - x-platforms: - - android - - ios - - browser proxy: $ref: '#/components/schemas/Proxy' - x-platforms: - - android - - ios - - browser proxy_confidence: $ref: '#/components/schemas/ProxyConfidence' - x-platforms: - - android - - ios - - browser proxy_details: $ref: '#/components/schemas/ProxyDetails' - x-platforms: - - android - - ios - - browser vpn: $ref: '#/components/schemas/Vpn' - x-platforms: - - android - - ios - - browser vpn_confidence: $ref: '#/components/schemas/VpnConfidence' - x-platforms: - - android - - ios - - browser vpn_methods: $ref: '#/components/schemas/VpnMethods' - x-platforms: - - android - - ios - - browser source: $ref: '#/components/schemas/EventSource' const: edge @@ -3492,6 +3460,10 @@ components: - browser source: $ref: '#/components/schemas/EventSource' + x-platforms: + - android + - ios + - browser incremental_identification_status: $ref: '#/components/schemas/IncrementalIdentificationStatus' x-platforms: diff --git a/sdk/src/test/resources/mocks/webhook/webhook_event.json b/sdk/src/test/resources/mocks/webhook/webhook_event.json index 3556791..407a005 100644 --- a/sdk/src/test/resources/mocks/webhook/webhook_event.json +++ b/sdk/src/test/resources/mocks/webhook/webhook_event.json @@ -1,4 +1,5 @@ { + "source": "device", "linked_id": "somelinkedId", "tags": {}, "timestamp": 1708102555327, From 69734a1fcf7c822d8d75d8fa16856d1d3e11a1e6 Mon Sep 17 00:00:00 2001 From: Juraj Uhlar Date: Mon, 31 Aug 2026 19:25:26 +0100 Subject: [PATCH 4/5] chore: sync schema get-event copy and EdgeRequest example --- docs/EdgeRequest.md | 2 +- docs/FingerprintApi.md | 2 +- res/fingerprint-server-api.yaml | 21 ++++++++++++++----- .../fingerprint/v4/api/FingerprintApi.java | 6 +++--- .../com/fingerprint/v4/model/EdgeRequest.java | 2 +- 5 files changed, 22 insertions(+), 11 deletions(-) diff --git a/docs/EdgeRequest.md b/docs/EdgeRequest.md index cb8980a..ddd5201 100644 --- a/docs/EdgeRequest.md +++ b/docs/EdgeRequest.md @@ -8,7 +8,7 @@ HTTP request metadata (including the HTTP method, headers and IP address) sent b | Name | Type | Description | Notes | |------------ | ------------- | ------------- | -------------| -|**headers** | [**List<EdgeRequestHeadersInner>**](EdgeRequestHeadersInner.md) | Ordered header entries from the request made to your server. Each entry represents one header line. If one header name appears as multiple lines, send each as a separate item in the array. Headers that contain authentication or session data must still be included, but with with their value set to an empty string. This includes headers like `Authorization` and `Cookie`, but may contain more depending on your specific project, for instance `Proxy-Authenticate` or `X-Api-Key`. Omitting the headers entirely changes the shape of the request and can affect detection. Never forward the real secret values. Whenever possible, we recommend preserving header order and capitalization to provide the best accuracy, however it’s not a strict requirement if your runtime does not maintain http header order or canonicalizes header names. | | +|**headers** | [**List<EdgeRequestHeadersInner>**](EdgeRequestHeadersInner.md) | Ordered header entries from the request made to your server. Each entry represents one header line. If one header name appears as multiple lines, send each as a separate item in the array. Headers that contain authentication or session data must still be included, but with their value set to an empty string. This includes headers like `Authorization` and `Cookie`, but may contain more depending on your specific project, for instance `Proxy-Authenticate` or `X-Api-Key`. Omitting the headers entirely changes the shape of the request and can affect detection. Never forward the real secret values. Whenever possible, we recommend preserving header order and capitalization to provide the best accuracy, however it’s not a strict requirement if your runtime does not maintain http header order or canonicalizes header names. | | |**method** | **String** | The original HTTP method of the request. If supported in your runtime, preserve the original casing. | | |**url** | **URI** | Absolute URL of the request, without a \\#fragment suffix. Only HTTP and HTTPS schemes are supported. | | |**ipv4Address** | **String** | Client IPv4 address observed by your server. | [optional] | diff --git a/docs/FingerprintApi.md b/docs/FingerprintApi.md index 4861e51..4410487 100644 --- a/docs/FingerprintApi.md +++ b/docs/FingerprintApi.md @@ -220,7 +220,7 @@ Get a detailed analysis of an individual event, including Smart Signals. Use `event_id` as the URL path parameter. This API method is scoped to a request, i.e. all returned information is by `event_id`. -Returns `EventDevice` when `source` is `device`, and `EventEdge` when `source` is `edge`. +Use `source` to tell identification events (`device`) from Automation Intelligence events (`edge`). ### Example diff --git a/res/fingerprint-server-api.yaml b/res/fingerprint-server-api.yaml index e1f0af7..3dac79e 100644 --- a/res/fingerprint-server-api.yaml +++ b/res/fingerprint-server-api.yaml @@ -142,8 +142,8 @@ paths: request, i.e. all returned information is by `event_id`. - Returns `EventDevice` when `source` is `device`, and `EventEdge` when - `source` is `edge`. + Use `source` to tell identification events (`device`) from Automation + Intelligence events (`edge`). parameters: - name: event_id in: path @@ -1286,6 +1286,17 @@ components: an IPv4-mapped IPv6 address is provided in the `ipv6_address` request property, the IP intelligence will be provided in the `ipv4_address` property of the response. + example: + method: GET + url: https://example.com/login + ipv4_address: 34.162.244.71 + headers: + - name: Host + value: example.com + - name: User-Agent + value: Mozilla/5.0 + - name: Authorization + value: '' required: - headers - method @@ -1300,9 +1311,9 @@ components: Headers that contain authentication or session data must still be - included, but with with their value set to an empty string. This - includes headers like `Authorization` and `Cookie`, but may contain - more depending on your specific project, for instance + included, but with their value set to an empty string. This includes + headers like `Authorization` and `Cookie`, but may contain more + depending on your specific project, for instance `Proxy-Authenticate` or `X-Api-Key`. Omitting the headers entirely changes the shape of the request and can affect detection. Never forward the real secret values. diff --git a/sdk/src/main/java/com/fingerprint/v4/api/FingerprintApi.java b/sdk/src/main/java/com/fingerprint/v4/api/FingerprintApi.java index 2940eac..2cf10fd 100644 --- a/sdk/src/main/java/com/fingerprint/v4/api/FingerprintApi.java +++ b/sdk/src/main/java/com/fingerprint/v4/api/FingerprintApi.java @@ -251,7 +251,7 @@ public GetEventOptionalParams setRulesetId(String rulesetId) { /** * Get an event by event ID - * Get a detailed analysis of an individual event, including Smart Signals. Use `event_id` as the URL path parameter. This API method is scoped to a request, i.e. all returned information is by `event_id`. Returns `EventDevice` when `source` is `device`, and `EventEdge` when `source` is `edge`. + * Get a detailed analysis of an individual event, including Smart Signals. Use `event_id` as the URL path parameter. This API method is scoped to a request, i.e. all returned information is by `event_id`. Use `source` to tell identification events (`device`) from Automation Intelligence events (`edge`). * @param eventId The unique [identifier](https://docs.fingerprint.com/reference/js-agent-get-function#event_id) of each identification request (`requestId` can be used in its place). (required) * @return Event * @throws ApiException if fails to make API call @@ -273,7 +273,7 @@ public Event getEvent(String eventId) throws ApiException { /** * Get an event by event ID - * Get a detailed analysis of an individual event, including Smart Signals. Use `event_id` as the URL path parameter. This API method is scoped to a request, i.e. all returned information is by `event_id`. Returns `EventDevice` when `source` is `device`, and `EventEdge` when `source` is `edge`. + * Get a detailed analysis of an individual event, including Smart Signals. Use `event_id` as the URL path parameter. This API method is scoped to a request, i.e. all returned information is by `event_id`. Use `source` to tell identification events (`device`) from Automation Intelligence events (`edge`). * @param eventId The unique [identifier](https://docs.fingerprint.com/reference/js-agent-get-function#event_id) of each identification request (`requestId` can be used in its place). (required) * @param getEventOptionalParams Object containing optional parameters for API method. (optional) * @return Event @@ -297,7 +297,7 @@ public Event getEvent(String eventId, GetEventOptionalParams getEventOptionalPar /** * Get an event by event ID - * Get a detailed analysis of an individual event, including Smart Signals. Use `event_id` as the URL path parameter. This API method is scoped to a request, i.e. all returned information is by `event_id`. Returns `EventDevice` when `source` is `device`, and `EventEdge` when `source` is `edge`. + * Get a detailed analysis of an individual event, including Smart Signals. Use `event_id` as the URL path parameter. This API method is scoped to a request, i.e. all returned information is by `event_id`. Use `source` to tell identification events (`device`) from Automation Intelligence events (`edge`). * @param eventId The unique [identifier](https://docs.fingerprint.com/reference/js-agent-get-function#event_id) of each identification request (`requestId` can be used in its place). (required) * @param getEventOptionalParams Object containing optional parameters for API method. (optional) * @return ApiResponse diff --git a/sdk/src/main/java/com/fingerprint/v4/model/EdgeRequest.java b/sdk/src/main/java/com/fingerprint/v4/model/EdgeRequest.java index 50bd5a8..d454478 100644 --- a/sdk/src/main/java/com/fingerprint/v4/model/EdgeRequest.java +++ b/sdk/src/main/java/com/fingerprint/v4/model/EdgeRequest.java @@ -75,7 +75,7 @@ public EdgeRequest addHeadersItem(EdgeRequestHeadersInner headersItem) { } /** - * Ordered header entries from the request made to your server. Each entry represents one header line. If one header name appears as multiple lines, send each as a separate item in the array. Headers that contain authentication or session data must still be included, but with with their value set to an empty string. This includes headers like `Authorization` and `Cookie`, but may contain more depending on your specific project, for instance `Proxy-Authenticate` or `X-Api-Key`. Omitting the headers entirely changes the shape of the request and can affect detection. Never forward the real secret values. Whenever possible, we recommend preserving header order and capitalization to provide the best accuracy, however it’s not a strict requirement if your runtime does not maintain http header order or canonicalizes header names. + * Ordered header entries from the request made to your server. Each entry represents one header line. If one header name appears as multiple lines, send each as a separate item in the array. Headers that contain authentication or session data must still be included, but with their value set to an empty string. This includes headers like `Authorization` and `Cookie`, but may contain more depending on your specific project, for instance `Proxy-Authenticate` or `X-Api-Key`. Omitting the headers entirely changes the shape of the request and can affect detection. Never forward the real secret values. Whenever possible, we recommend preserving header order and capitalization to provide the best accuracy, however it’s not a strict requirement if your runtime does not maintain http header order or canonicalizes header names. * @return headers */ @jakarta.annotation.Nonnull From d9e65594329210115ecfca3e6c6145c5855e0287 Mon Sep 17 00:00:00 2001 From: Juraj Uhlar Date: Fri, 4 Sep 2026 14:01:26 +0100 Subject: [PATCH 5/5] fix: regenerate after Event source allOf + const --- res/fingerprint-server-api.yaml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/res/fingerprint-server-api.yaml b/res/fingerprint-server-api.yaml index 3dac79e..71a1c13 100644 --- a/res/fingerprint-server-api.yaml +++ b/res/fingerprint-server-api.yaml @@ -1887,8 +1887,9 @@ components: vpn_methods: $ref: '#/components/schemas/VpnMethods' source: - $ref: '#/components/schemas/EventSource' - const: edge + allOf: + - $ref: '#/components/schemas/EventSource' + - const: edge required: - event_id - timestamp