From 25ed765d9e0bf3b836d63628bd65ebd1bedd3dd3 Mon Sep 17 00:00:00 2001 From: necipallef Date: Fri, 21 Aug 2026 08:37:30 +0000 Subject: [PATCH 1/3] feat: sync OpenAPI schema to v3.7.0 --- .../events-search-active-call-filter.md | 5 ++ ...-attributes-keyboard-layout-name-events.md | 5 ++ .schema-version | 2 +- docs/FingerprintApi.md | 6 ++- docs/RawDeviceAttributes.md | 1 + fingerprint_server_sdk/api/fingerprint_api.py | 32 ++++++++++++ .../models/raw_device_attributes.py | 6 +++ res/fingerprint-server-api.yaml | 24 +++++++++ test/mocks/errors/400_edge_ip_required.json | 6 +++ test/mocks/errors/400_edge_unknown_field.json | 6 +++ .../errors/400_request_read_timeout.json | 6 +++ test/mocks/errors/413_payload_too_large.json | 6 +++ test/mocks/events/get_event_200.json | 1 + .../get_event_200_with_unknown_field.json | 1 + test/mocks/events/get_event_ruleset_200.json | 1 + .../events/get_event_with_bot_info_200.json | 1 + .../mocks/events/get_event_with_edge_200.json | 51 +++++++++++++++++++ .../events/search/get_event_search_200.json | 1 + 18 files changed, 158 insertions(+), 3 deletions(-) create mode 100644 .changeset/events-search-active-call-filter.md create mode 100644 .changeset/raw-device-attributes-keyboard-layout-name-events.md create mode 100644 test/mocks/errors/400_edge_ip_required.json create mode 100644 test/mocks/errors/400_edge_unknown_field.json create mode 100644 test/mocks/errors/400_request_read_timeout.json create mode 100644 test/mocks/errors/413_payload_too_large.json create mode 100644 test/mocks/events/get_event_with_edge_200.json diff --git a/.changeset/events-search-active-call-filter.md b/.changeset/events-search-active-call-filter.md new file mode 100644 index 00000000..cd9fb722 --- /dev/null +++ b/.changeset/events-search-active-call-filter.md @@ -0,0 +1,5 @@ +--- +'@fingerprint/python-sdk': minor +--- + +**events-search**: Add `active_call` filter parameter diff --git a/.changeset/raw-device-attributes-keyboard-layout-name-events.md b/.changeset/raw-device-attributes-keyboard-layout-name-events.md new file mode 100644 index 00000000..1577eb9e --- /dev/null +++ b/.changeset/raw-device-attributes-keyboard-layout-name-events.md @@ -0,0 +1,5 @@ +--- +'@fingerprint/python-sdk': minor +--- + +Add `keyboard_layout_name` to `RawDeviceAttributes` diff --git a/.schema-version b/.schema-version index c03b60b0..ac47b436 100644 --- a/.schema-version +++ b/.schema-version @@ -1 +1 @@ -v3.6.0 \ No newline at end of file +v3.7.0 \ No newline at end of file diff --git a/docs/FingerprintApi.md b/docs/FingerprintApi.md index 926a8d20..5510916a 100644 --- a/docs/FingerprintApi.md +++ b/docs/FingerprintApi.md @@ -188,7 +188,7 @@ Name | Type | Description | Notes [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) # **search_events** -> EventSearch search_events(limit=limit, pagination_key=pagination_key, visitor_id=visitor_id, high_recall_id=high_recall_id, bot=bot, bot_info=bot_info, bot_info_category=bot_info_category, bot_info_identity=bot_info_identity, bot_info_confidence=bot_info_confidence, bot_info_provider=bot_info_provider, bot_info_name=bot_info_name, ip_address=ip_address, asn=asn, linked_id=linked_id, url=url, bundle_id=bundle_id, package_name=package_name, origin=origin, start=start, end=end, reverse=reverse, suspect=suspect, vpn=vpn, virtual_machine=virtual_machine, tampering=tampering, anti_detect_browser=anti_detect_browser, incognito=incognito, privacy_settings=privacy_settings, jailbroken=jailbroken, frida=frida, factory_reset=factory_reset, cloned_app=cloned_app, emulator=emulator, root_apps=root_apps, vpn_confidence=vpn_confidence, min_suspect_score=min_suspect_score, developer_tools=developer_tools, location_spoofing=location_spoofing, mitm_attack=mitm_attack, rare_device=rare_device, rare_device_percentile_bucket=rare_device_percentile_bucket, proxy=proxy, sdk_version=sdk_version, sdk_platform=sdk_platform, environment=environment, proximity_id=proximity_id, total_hits=total_hits, tor_node=tor_node, incremental_identification_status=incremental_identification_status, simulator=simulator, source=source) +> EventSearch search_events(limit=limit, pagination_key=pagination_key, visitor_id=visitor_id, high_recall_id=high_recall_id, bot=bot, bot_info=bot_info, bot_info_category=bot_info_category, bot_info_identity=bot_info_identity, bot_info_confidence=bot_info_confidence, bot_info_provider=bot_info_provider, bot_info_name=bot_info_name, ip_address=ip_address, asn=asn, linked_id=linked_id, url=url, bundle_id=bundle_id, package_name=package_name, origin=origin, start=start, end=end, reverse=reverse, suspect=suspect, vpn=vpn, virtual_machine=virtual_machine, tampering=tampering, anti_detect_browser=anti_detect_browser, incognito=incognito, privacy_settings=privacy_settings, jailbroken=jailbroken, frida=frida, factory_reset=factory_reset, cloned_app=cloned_app, emulator=emulator, root_apps=root_apps, vpn_confidence=vpn_confidence, min_suspect_score=min_suspect_score, developer_tools=developer_tools, location_spoofing=location_spoofing, mitm_attack=mitm_attack, rare_device=rare_device, rare_device_percentile_bucket=rare_device_percentile_bucket, proxy=proxy, sdk_version=sdk_version, sdk_platform=sdk_platform, environment=environment, proximity_id=proximity_id, total_hits=total_hits, tor_node=tor_node, incremental_identification_status=incremental_identification_status, simulator=simulator, active_call=active_call, source=source) Search events @@ -300,11 +300,12 @@ total_hits: int = 100 # When set, the response will include a `total_hits` prope tor_node: bool = True # Filter events by Tor Node detection result. > Note: When using this parameter, only events with the `tor_node` property set to `true` or `false` are returned. Events without a `tor_node` detection result are left out of the response. (optional) incremental_identification_status: SearchEventsIncrementalIdentificationStatus = fingerprint_server_sdk.SearchEventsIncrementalIdentificationStatus() # Filter events by their incremental identification status (`incremental_identification_status` property). Non incremental identification events are left out of the response. (optional) simulator: bool = True # Filter events by iOS Simulator Detection result. > Note: When using this parameter, only events with the `simulator` property set to `true` or `false` are returned. Events without a `simulator` Smart Signal result are left out of the response. (optional) +active_call: bool = True # Filter events by Active Call Detection result on mobile devices. > Note: When using this parameter, only events with the `active_call` property set to `true` or `false` are returned. Events without an `active_call` Smart Signal result are left out of the response. (optional) source: List[SearchEventsSource] = [fingerprint_server_sdk.SearchEventsSource()] # Selects the source of events to search. When omitted, only traditional identification events generated from devices are returned (the default behavior). When set to `edge`, only Automation Intelligence (Edge) events are returned. To retrieve all events regardless of source, you must make two requests. One with the `source` parameter set to `edge`, and another with the `source` parameter omitted. > Note: The Automation Intelligence API is in public preview testing phase. If you encounter any issues, please [contact](https://fingerprint.com/support/) our support team. (optional) try: # Search events - api_response = api_instance.search_events(limit=limit, pagination_key=pagination_key, visitor_id=visitor_id, high_recall_id=high_recall_id, bot=bot, bot_info=bot_info, bot_info_category=bot_info_category, bot_info_identity=bot_info_identity, bot_info_confidence=bot_info_confidence, bot_info_provider=bot_info_provider, bot_info_name=bot_info_name, ip_address=ip_address, asn=asn, linked_id=linked_id, url=url, bundle_id=bundle_id, package_name=package_name, origin=origin, start=start, end=end, reverse=reverse, suspect=suspect, vpn=vpn, virtual_machine=virtual_machine, tampering=tampering, anti_detect_browser=anti_detect_browser, incognito=incognito, privacy_settings=privacy_settings, jailbroken=jailbroken, frida=frida, factory_reset=factory_reset, cloned_app=cloned_app, emulator=emulator, root_apps=root_apps, vpn_confidence=vpn_confidence, min_suspect_score=min_suspect_score, developer_tools=developer_tools, location_spoofing=location_spoofing, mitm_attack=mitm_attack, rare_device=rare_device, rare_device_percentile_bucket=rare_device_percentile_bucket, proxy=proxy, sdk_version=sdk_version, sdk_platform=sdk_platform, environment=environment, proximity_id=proximity_id, total_hits=total_hits, tor_node=tor_node, incremental_identification_status=incremental_identification_status, simulator=simulator, source=source) + api_response = api_instance.search_events(limit=limit, pagination_key=pagination_key, visitor_id=visitor_id, high_recall_id=high_recall_id, bot=bot, bot_info=bot_info, bot_info_category=bot_info_category, bot_info_identity=bot_info_identity, bot_info_confidence=bot_info_confidence, bot_info_provider=bot_info_provider, bot_info_name=bot_info_name, ip_address=ip_address, asn=asn, linked_id=linked_id, url=url, bundle_id=bundle_id, package_name=package_name, origin=origin, start=start, end=end, reverse=reverse, suspect=suspect, vpn=vpn, virtual_machine=virtual_machine, tampering=tampering, anti_detect_browser=anti_detect_browser, incognito=incognito, privacy_settings=privacy_settings, jailbroken=jailbroken, frida=frida, factory_reset=factory_reset, cloned_app=cloned_app, emulator=emulator, root_apps=root_apps, vpn_confidence=vpn_confidence, min_suspect_score=min_suspect_score, developer_tools=developer_tools, location_spoofing=location_spoofing, mitm_attack=mitm_attack, rare_device=rare_device, rare_device_percentile_bucket=rare_device_percentile_bucket, proxy=proxy, sdk_version=sdk_version, sdk_platform=sdk_platform, environment=environment, proximity_id=proximity_id, total_hits=total_hits, tor_node=tor_node, incremental_identification_status=incremental_identification_status, simulator=simulator, active_call=active_call, source=source) print("The response of FingerprintApi->search_events:\n") pprint(api_response) except ApiException as e: @@ -373,6 +374,7 @@ Name | Type | Description | Notes **tor_node** | **bool**| Filter events by Tor Node detection result. > Note: When using this parameter, only events with the `tor_node` property set to `true` or `false` are returned. Events without a `tor_node` detection result are left out of the response. | [optional] **incremental_identification_status** | [**SearchEventsIncrementalIdentificationStatus**](.md)| Filter events by their incremental identification status (`incremental_identification_status` property). Non incremental identification events are left out of the response. | [optional] **simulator** | **bool**| Filter events by iOS Simulator Detection result. > Note: When using this parameter, only events with the `simulator` property set to `true` or `false` are returned. Events without a `simulator` Smart Signal result are left out of the response. | [optional] + **active_call** | **bool**| Filter events by Active Call Detection result on mobile devices. > Note: When using this parameter, only events with the `active_call` property set to `true` or `false` are returned. Events without an `active_call` Smart Signal result are left out of the response. | [optional] **source** | [**List[SearchEventsSource]**](SearchEventsSource.md)| Selects the source of events to search. When omitted, only traditional identification events generated from devices are returned (the default behavior). When set to `edge`, only Automation Intelligence (Edge) events are returned. To retrieve all events regardless of source, you must make two requests. One with the `source` parameter set to `edge`, and another with the `source` parameter omitted. > Note: The Automation Intelligence API is in public preview testing phase. If you encounter any issues, please [contact](https://fingerprint.com/support/) our support team. | [optional] ### Return type diff --git a/docs/RawDeviceAttributes.md b/docs/RawDeviceAttributes.md index d3cca510..9178559e 100644 --- a/docs/RawDeviceAttributes.md +++ b/docs/RawDeviceAttributes.md @@ -38,6 +38,7 @@ Name | Type | Description | Notes **battery_charging** | **bool** | When `true`, the device is currently charging. Available only for web devices on Chromium-based browsers. | [optional] **battery_low_power_mode** | **bool** | Whether the device's low power mode is enabled. Available only for Android and iOS devices. | [optional] **keyboard_layout_hash** | **str** | Unique identifier for the user's keyboard layout. | [optional] +**keyboard_layout_name** | **str** | Name of the user's configured keyboard layout as a BCP 47-style identifier. Only available in Chromium-based browsers, omitted otherwise. | [optional] [[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/fingerprint_server_sdk/api/fingerprint_api.py b/fingerprint_server_sdk/api/fingerprint_api.py index 9164f2c9..243eeda5 100644 --- a/fingerprint_server_sdk/api/fingerprint_api.py +++ b/fingerprint_server_sdk/api/fingerprint_api.py @@ -870,6 +870,12 @@ def search_events( description='Filter events by iOS Simulator Detection result. > Note: When using this parameter, only events with the `simulator` property set to `true` or `false` are returned. Events without a `simulator` Smart Signal result are left out of the response. ' ), ] = None, + active_call: Annotated[ + Optional[StrictBool], + Field( + description='Filter events by Active Call Detection result on mobile devices. > Note: When using this parameter, only events with the `active_call` property set to `true` or `false` are returned. Events without an `active_call` Smart Signal result are left out of the response. ' + ), + ] = None, source: Annotated[ Optional[Annotated[list[SearchEventsSource], Field(max_length=1)]], Field( @@ -989,6 +995,8 @@ def search_events( :type incremental_identification_status: SearchEventsIncrementalIdentificationStatus :param simulator: Filter events by iOS Simulator Detection result. > Note: When using this parameter, only events with the `simulator` property set to `true` or `false` are returned. Events without a `simulator` Smart Signal result are left out of the response. :type simulator: bool + :param active_call: Filter events by Active Call Detection result on mobile devices. > Note: When using this parameter, only events with the `active_call` property set to `true` or `false` are returned. Events without an `active_call` Smart Signal result are left out of the response. + :type active_call: bool :param source: Selects the source of events to search. When omitted, only traditional identification events generated from devices are returned (the default behavior). When set to `edge`, only Automation Intelligence (Edge) events are returned. To retrieve all events regardless of source, you must make two requests. One with the `source` parameter set to `edge`, and another with the `source` parameter omitted. > Note: The Automation Intelligence API is in public preview testing phase. If you encounter any issues, please [contact](https://fingerprint.com/support/) our support team. :type source: List[SearchEventsSource] :param _request_timeout: timeout setting for this request. If one @@ -1060,6 +1068,7 @@ def search_events( tor_node=tor_node, incremental_identification_status=incremental_identification_status, simulator=simulator, + active_call=active_call, source=source, _request_auth=_request_auth, _content_type=_content_type, @@ -1384,6 +1393,12 @@ def search_events_with_http_info( description='Filter events by iOS Simulator Detection result. > Note: When using this parameter, only events with the `simulator` property set to `true` or `false` are returned. Events without a `simulator` Smart Signal result are left out of the response. ' ), ] = None, + active_call: Annotated[ + Optional[StrictBool], + Field( + description='Filter events by Active Call Detection result on mobile devices. > Note: When using this parameter, only events with the `active_call` property set to `true` or `false` are returned. Events without an `active_call` Smart Signal result are left out of the response. ' + ), + ] = None, source: Annotated[ Optional[Annotated[list[SearchEventsSource], Field(max_length=1)]], Field( @@ -1503,6 +1518,8 @@ def search_events_with_http_info( :type incremental_identification_status: SearchEventsIncrementalIdentificationStatus :param simulator: Filter events by iOS Simulator Detection result. > Note: When using this parameter, only events with the `simulator` property set to `true` or `false` are returned. Events without a `simulator` Smart Signal result are left out of the response. :type simulator: bool + :param active_call: Filter events by Active Call Detection result on mobile devices. > Note: When using this parameter, only events with the `active_call` property set to `true` or `false` are returned. Events without an `active_call` Smart Signal result are left out of the response. + :type active_call: bool :param source: Selects the source of events to search. When omitted, only traditional identification events generated from devices are returned (the default behavior). When set to `edge`, only Automation Intelligence (Edge) events are returned. To retrieve all events regardless of source, you must make two requests. One with the `source` parameter set to `edge`, and another with the `source` parameter omitted. > Note: The Automation Intelligence API is in public preview testing phase. If you encounter any issues, please [contact](https://fingerprint.com/support/) our support team. :type source: List[SearchEventsSource] :param _request_timeout: timeout setting for this request. If one @@ -1574,6 +1591,7 @@ def search_events_with_http_info( tor_node=tor_node, incremental_identification_status=incremental_identification_status, simulator=simulator, + active_call=active_call, source=source, _request_auth=_request_auth, _content_type=_content_type, @@ -1898,6 +1916,12 @@ def search_events_without_preload_content( description='Filter events by iOS Simulator Detection result. > Note: When using this parameter, only events with the `simulator` property set to `true` or `false` are returned. Events without a `simulator` Smart Signal result are left out of the response. ' ), ] = None, + active_call: Annotated[ + Optional[StrictBool], + Field( + description='Filter events by Active Call Detection result on mobile devices. > Note: When using this parameter, only events with the `active_call` property set to `true` or `false` are returned. Events without an `active_call` Smart Signal result are left out of the response. ' + ), + ] = None, source: Annotated[ Optional[Annotated[list[SearchEventsSource], Field(max_length=1)]], Field( @@ -2017,6 +2041,8 @@ def search_events_without_preload_content( :type incremental_identification_status: SearchEventsIncrementalIdentificationStatus :param simulator: Filter events by iOS Simulator Detection result. > Note: When using this parameter, only events with the `simulator` property set to `true` or `false` are returned. Events without a `simulator` Smart Signal result are left out of the response. :type simulator: bool + :param active_call: Filter events by Active Call Detection result on mobile devices. > Note: When using this parameter, only events with the `active_call` property set to `true` or `false` are returned. Events without an `active_call` Smart Signal result are left out of the response. + :type active_call: bool :param source: Selects the source of events to search. When omitted, only traditional identification events generated from devices are returned (the default behavior). When set to `edge`, only Automation Intelligence (Edge) events are returned. To retrieve all events regardless of source, you must make two requests. One with the `source` parameter set to `edge`, and another with the `source` parameter omitted. > Note: The Automation Intelligence API is in public preview testing phase. If you encounter any issues, please [contact](https://fingerprint.com/support/) our support team. :type source: List[SearchEventsSource] :param _request_timeout: timeout setting for this request. If one @@ -2088,6 +2114,7 @@ def search_events_without_preload_content( tor_node=tor_node, incremental_identification_status=incremental_identification_status, simulator=simulator, + active_call=active_call, source=source, _request_auth=_request_auth, _content_type=_content_type, @@ -2159,6 +2186,7 @@ def _search_events_serialize( tor_node: Optional[bool], incremental_identification_status: Optional[SearchEventsIncrementalIdentificationStatus], simulator: Optional[bool], + active_call: Optional[bool], source: Optional[list[SearchEventsSource]], _request_auth: Optional[dict[StrictStr, Any]], _content_type: Optional[StrictStr], @@ -2397,6 +2425,10 @@ def _search_events_serialize( if simulator is not None: _query_params.append(('simulator', simulator)) + # process the query parameters + if active_call is not None: + _query_params.append(('active_call', active_call)) + # process the query parameters if source is not None: _query_params.append(('source', source)) diff --git a/fingerprint_server_sdk/models/raw_device_attributes.py b/fingerprint_server_sdk/models/raw_device_attributes.py index a842546a..424f9528 100644 --- a/fingerprint_server_sdk/models/raw_device_attributes.py +++ b/fingerprint_server_sdk/models/raw_device_attributes.py @@ -130,6 +130,10 @@ class RawDeviceAttributes(BaseModel): keyboard_layout_hash: Optional[StrictStr] = Field( default=None, description="Unique identifier for the user's keyboard layout." ) + keyboard_layout_name: Optional[StrictStr] = Field( + default=None, + description="Name of the user's configured keyboard layout as a BCP 47-style identifier. Only available in Chromium-based browsers, omitted otherwise.", + ) __properties: ClassVar[list[str]] = [ 'font_preferences', 'emoji', @@ -164,6 +168,7 @@ class RawDeviceAttributes(BaseModel): 'battery_charging', 'battery_low_power_mode', 'keyboard_layout_hash', + 'keyboard_layout_name', ] model_config = ConfigDict( @@ -286,6 +291,7 @@ def from_dict(cls, obj: Optional[dict[str, Any]]) -> Optional[Self]: 'battery_charging': obj.get('battery_charging'), 'battery_low_power_mode': obj.get('battery_low_power_mode'), 'keyboard_layout_hash': obj.get('keyboard_layout_hash'), + 'keyboard_layout_name': obj.get('keyboard_layout_name'), } ) return _obj diff --git a/res/fingerprint-server-api.yaml b/res/fingerprint-server-api.yaml index f20cd1d4..3c2626a5 100644 --- a/res/fingerprint-server-api.yaml +++ b/res/fingerprint-server-api.yaml @@ -940,6 +940,18 @@ paths: > Note: When using this parameter, only events with the `simulator` property set to `true` or `false` are returned. Events without a `simulator` Smart Signal result are left out of the response. + - name: active_call + in: query + schema: + type: boolean + description: > + Filter events by Active Call Detection result on mobile devices. + + + > Note: When using this parameter, only events with the + `active_call` property set to `true` or `false` are returned. Events + without an `active_call` Smart Signal result are left out of the + response. - name: source in: query required: false @@ -2957,6 +2969,16 @@ components: examples: - 3f33b68235d36b8821147349f1161379 description: Unique identifier for the user's keyboard layout. + KeyboardLayoutName: + type: string + examples: + - en-US + - de-DE + - ja-JP + description: >- + Name of the user's configured keyboard layout as a BCP 47-style + identifier. Only available in Chromium-based browsers, omitted + otherwise. RawDeviceAttributes: type: object description: > @@ -3031,6 +3053,8 @@ components: $ref: '#/components/schemas/BatteryLowPowerMode' keyboard_layout_hash: $ref: '#/components/schemas/KeyboardLayoutHash' + keyboard_layout_name: + $ref: '#/components/schemas/KeyboardLayoutName' Labels: type: array items: diff --git a/test/mocks/errors/400_edge_ip_required.json b/test/mocks/errors/400_edge_ip_required.json new file mode 100644 index 00000000..8f055f8f --- /dev/null +++ b/test/mocks/errors/400_edge_ip_required.json @@ -0,0 +1,6 @@ +{ + "error": { + "code": "request_cannot_be_parsed", + "message": "at least one of ipv4_address or ipv6_address is required" + } +} diff --git a/test/mocks/errors/400_edge_unknown_field.json b/test/mocks/errors/400_edge_unknown_field.json new file mode 100644 index 00000000..c0a153ef --- /dev/null +++ b/test/mocks/errors/400_edge_unknown_field.json @@ -0,0 +1,6 @@ +{ + "error": { + "code": "request_cannot_be_parsed", + "message": "request body contains an unknown field \"unknown\"" + } +} \ No newline at end of file diff --git a/test/mocks/errors/400_request_read_timeout.json b/test/mocks/errors/400_request_read_timeout.json new file mode 100644 index 00000000..89daaca8 --- /dev/null +++ b/test/mocks/errors/400_request_read_timeout.json @@ -0,0 +1,6 @@ +{ + "error": { + "code": "request_read_timeout", + "message": "request read timeout" + } +} \ No newline at end of file diff --git a/test/mocks/errors/413_payload_too_large.json b/test/mocks/errors/413_payload_too_large.json new file mode 100644 index 00000000..00a1c6f9 --- /dev/null +++ b/test/mocks/errors/413_payload_too_large.json @@ -0,0 +1,6 @@ +{ + "error": { + "code": "payload_too_large", + "message": "payload too large" + } +} diff --git a/test/mocks/events/get_event_200.json b/test/mocks/events/get_event_200.json index 6d6c726e..72f12f44 100644 --- a/test/mocks/events/get_event_200.json +++ b/test/mocks/events/get_event_200.json @@ -296,6 +296,7 @@ "date_time_locale": "en-US", "audio": 124.04347745512496, "keyboard_layout_hash": "691e3845c85c202a1514b6fd7ef17065", + "keyboard_layout_name": "en-US", "battery_charging": true, "battery_level": 80, "battery_low_power_mode": true, diff --git a/test/mocks/events/get_event_200_with_unknown_field.json b/test/mocks/events/get_event_200_with_unknown_field.json index bdbf8715..e6712e39 100644 --- a/test/mocks/events/get_event_200_with_unknown_field.json +++ b/test/mocks/events/get_event_200_with_unknown_field.json @@ -297,6 +297,7 @@ "date_time_locale": "en-US", "audio": 124.04347745512496, "keyboard_layout_hash": "691e3845c85c202a1514b6fd7ef17065", + "keyboard_layout_name": "en-US", "battery_charging": true, "battery_level": 80, "battery_low_power_mode": true, diff --git a/test/mocks/events/get_event_ruleset_200.json b/test/mocks/events/get_event_ruleset_200.json index 1e5337c0..f775f7d9 100644 --- a/test/mocks/events/get_event_ruleset_200.json +++ b/test/mocks/events/get_event_ruleset_200.json @@ -296,6 +296,7 @@ "date_time_locale": "en-US", "audio": 124.04347745512496, "keyboard_layout_hash": "691e3845c85c202a1514b6fd7ef17065", + "keyboard_layout_name": "en-US", "battery_charging": true, "battery_level": 80, "battery_low_power_mode": true, diff --git a/test/mocks/events/get_event_with_bot_info_200.json b/test/mocks/events/get_event_with_bot_info_200.json index b44a687a..98ca7d5c 100644 --- a/test/mocks/events/get_event_with_bot_info_200.json +++ b/test/mocks/events/get_event_with_bot_info_200.json @@ -302,6 +302,7 @@ "date_time_locale": "en-US", "audio": 124.04347745512496, "keyboard_layout_hash": "691e3845c85c202a1514b6fd7ef17065", + "keyboard_layout_name": "en-US", "battery_charging": true, "battery_level": 80, "battery_low_power_mode": true, diff --git a/test/mocks/events/get_event_with_edge_200.json b/test/mocks/events/get_event_with_edge_200.json new file mode 100644 index 00000000..387c86eb --- /dev/null +++ b/test/mocks/events/get_event_with_edge_200.json @@ -0,0 +1,51 @@ +{ + "event_id": "1758130560902.8tRtrH", + "timestamp": 1758130560902, + "source": "edge", + "url": "https://example.com/login?foo=bar", + "bot_info": { + "category": "ai_agent", + "provider": "OpenAI", + "provider_url": "https://openai.com", + "name": "ChatGPT Agent", + "identity": "signed", + "confidence": "high" + }, + "ip_info": { + "v4": { + "address": "104.210.139.192", + "geolocation": { + "accuracy_radius": 20, + "latitude": 29.42412, + "longitude": -98.49363, + "postal_code": "78205", + "timezone": "America/Chicago", + "city_name": "San Antonio", + "country_code": "US", + "country_name": "United States", + "continent_code": "NA", + "continent_name": "North America", + "subdivisions": [ + { + "iso_code": "TX", + "name": "Texas" + } + ] + }, + "asn": "8075", + "asn_name": "Microsoft Corporation", + "asn_network": "104.208.0.0/13", + "asn_type": "hosting", + "datacenter_result": true, + "datacenter_name": "Microsoft Azure" + } + }, + "proxy": false, + "proxy_confidence": "high", + "vpn": false, + "vpn_confidence": "medium", + "vpn_methods": { + "public_vpn": false, + "relay": false + } +} \ No newline at end of file diff --git a/test/mocks/events/search/get_event_search_200.json b/test/mocks/events/search/get_event_search_200.json index daad06b0..8e9dbdc8 100644 --- a/test/mocks/events/search/get_event_search_200.json +++ b/test/mocks/events/search/get_event_search_200.json @@ -298,6 +298,7 @@ "date_time_locale": "en-US", "audio": 124.04347745512496, "keyboard_layout_hash": "691e3845c85c202a1514b6fd7ef17065", + "keyboard_layout_name": "en-US", "battery_charging": true, "battery_level": 80, "battery_low_power_mode": true, From 4f75bbdeb74302c39d4edc02ac7c4f03585f15ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eray=20Ayd=C4=B1n?= Date: Mon, 24 Aug 2026 12:44:31 +0300 Subject: [PATCH 2/3] test: remove unused mock fixtures --- test/mocks/errors/400_edge_ip_required.json | 6 --- test/mocks/errors/400_edge_unknown_field.json | 6 --- .../errors/400_request_read_timeout.json | 6 --- test/mocks/errors/413_payload_too_large.json | 6 --- .../mocks/events/get_event_with_edge_200.json | 51 ------------------- 5 files changed, 75 deletions(-) delete mode 100644 test/mocks/errors/400_edge_ip_required.json delete mode 100644 test/mocks/errors/400_edge_unknown_field.json delete mode 100644 test/mocks/errors/400_request_read_timeout.json delete mode 100644 test/mocks/errors/413_payload_too_large.json delete mode 100644 test/mocks/events/get_event_with_edge_200.json diff --git a/test/mocks/errors/400_edge_ip_required.json b/test/mocks/errors/400_edge_ip_required.json deleted file mode 100644 index 8f055f8f..00000000 --- a/test/mocks/errors/400_edge_ip_required.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "error": { - "code": "request_cannot_be_parsed", - "message": "at least one of ipv4_address or ipv6_address is required" - } -} diff --git a/test/mocks/errors/400_edge_unknown_field.json b/test/mocks/errors/400_edge_unknown_field.json deleted file mode 100644 index c0a153ef..00000000 --- a/test/mocks/errors/400_edge_unknown_field.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "error": { - "code": "request_cannot_be_parsed", - "message": "request body contains an unknown field \"unknown\"" - } -} \ No newline at end of file diff --git a/test/mocks/errors/400_request_read_timeout.json b/test/mocks/errors/400_request_read_timeout.json deleted file mode 100644 index 89daaca8..00000000 --- a/test/mocks/errors/400_request_read_timeout.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "error": { - "code": "request_read_timeout", - "message": "request read timeout" - } -} \ No newline at end of file diff --git a/test/mocks/errors/413_payload_too_large.json b/test/mocks/errors/413_payload_too_large.json deleted file mode 100644 index 00a1c6f9..00000000 --- a/test/mocks/errors/413_payload_too_large.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "error": { - "code": "payload_too_large", - "message": "payload too large" - } -} diff --git a/test/mocks/events/get_event_with_edge_200.json b/test/mocks/events/get_event_with_edge_200.json deleted file mode 100644 index 387c86eb..00000000 --- a/test/mocks/events/get_event_with_edge_200.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "event_id": "1758130560902.8tRtrH", - "timestamp": 1758130560902, - "source": "edge", - "url": "https://example.com/login?foo=bar", - "bot_info": { - "category": "ai_agent", - "provider": "OpenAI", - "provider_url": "https://openai.com", - "name": "ChatGPT Agent", - "identity": "signed", - "confidence": "high" - }, - "ip_info": { - "v4": { - "address": "104.210.139.192", - "geolocation": { - "accuracy_radius": 20, - "latitude": 29.42412, - "longitude": -98.49363, - "postal_code": "78205", - "timezone": "America/Chicago", - "city_name": "San Antonio", - "country_code": "US", - "country_name": "United States", - "continent_code": "NA", - "continent_name": "North America", - "subdivisions": [ - { - "iso_code": "TX", - "name": "Texas" - } - ] - }, - "asn": "8075", - "asn_name": "Microsoft Corporation", - "asn_network": "104.208.0.0/13", - "asn_type": "hosting", - "datacenter_result": true, - "datacenter_name": "Microsoft Azure" - } - }, - "proxy": false, - "proxy_confidence": "high", - "vpn": false, - "vpn_confidence": "medium", - "vpn_methods": { - "public_vpn": false, - "relay": false - } -} \ No newline at end of file From 3e382b810e63d9748d4edc00ff5ef48b6168222f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eray=20Ayd=C4=B1n?= Date: Mon, 24 Aug 2026 12:45:05 +0300 Subject: [PATCH 3/3] test: cover active_call in search events filters --- test/test_fingerprint_api.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/test_fingerprint_api.py b/test/test_fingerprint_api.py index 4df81e56..a44e2e20 100644 --- a/test/test_fingerprint_api.py +++ b/test/test_fingerprint_api.py @@ -429,6 +429,7 @@ def test_search_events_all_params(self) -> None: SearchEventsIncrementalIdentificationStatus.PARTIALLY_COMPLETED ), 'simulator': True, + 'active_call': True, 'bot_info': SearchEventsBotInfo.ALL, 'bot_info_category': [BotInfoCategory.AI_AGENT, BotInfoCategory.SECURITY], 'bot_info_identity': [BotInfoIdentity.SPOOFED], @@ -488,6 +489,7 @@ def test_search_events_all_params(self) -> None: 'tor_node': 'true', 'incremental_identification_status': 'partially_completed', 'simulator': 'true', + 'active_call': 'true', 'source': ['edge'], }