From 1c5b35317d0d19c1a2e7d616ea991dea1c898463 Mon Sep 17 00:00:00 2001 From: mcnulty-fp Date: Fri, 15 May 2026 17:49:36 +0000 Subject: [PATCH 01/14] feat: sync OpenAPI schema to v3.3.0 --- .changeset/all-showers-trade.md | 5 + .changeset/beige-places-drop.md | 5 + .changeset/blue-roses-film.md | 5 + .changeset/curvy-rice-chew.md | 5 + .changeset/cute-pumas-pull.md | 5 + .changeset/developer-tools-android-v4.md | 5 + .changeset/developer-tools-ios.md | 5 + .changeset/events-rfc3339-timestamps.md | 5 + .changeset/fancy-spiders-flash.md | 5 + .changeset/loud-donuts-lead.md | 5 + .changeset/quick-cows-battle.md | 5 + .changeset/wet-socks-fold.md | 5 + .changeset/witty-lions-worry.md | 5 + .changeset/yellow-ducks-spend.md | 5 + .schema-version | 2 +- resources/fingerprint-server-api.yaml | 367 ++++++++++++++---- src/generatedApiTypes.ts | 189 ++++++--- .../events/get_event_200.json | 9 +- .../events/get_event_ruleset_200.json | 7 + .../events/get_event_with_bot_info_200.json | 9 +- .../events/search/get_event_search_200.json | 9 +- 21 files changed, 531 insertions(+), 131 deletions(-) create mode 100644 .changeset/all-showers-trade.md create mode 100644 .changeset/beige-places-drop.md create mode 100644 .changeset/blue-roses-film.md create mode 100644 .changeset/curvy-rice-chew.md create mode 100644 .changeset/cute-pumas-pull.md create mode 100644 .changeset/developer-tools-android-v4.md create mode 100644 .changeset/developer-tools-ios.md create mode 100644 .changeset/events-rfc3339-timestamps.md create mode 100644 .changeset/fancy-spiders-flash.md create mode 100644 .changeset/loud-donuts-lead.md create mode 100644 .changeset/quick-cows-battle.md create mode 100644 .changeset/wet-socks-fold.md create mode 100644 .changeset/witty-lions-worry.md create mode 100644 .changeset/yellow-ducks-spend.md diff --git a/.changeset/all-showers-trade.md b/.changeset/all-showers-trade.md new file mode 100644 index 00000000..9e5a228f --- /dev/null +++ b/.changeset/all-showers-trade.md @@ -0,0 +1,5 @@ +--- +'@fingerprint/node-sdk': patch +--- + +**events-search**: Remove `default` property from `reverse` query parameter \ No newline at end of file diff --git a/.changeset/beige-places-drop.md b/.changeset/beige-places-drop.md new file mode 100644 index 00000000..f9b26823 --- /dev/null +++ b/.changeset/beige-places-drop.md @@ -0,0 +1,5 @@ +--- +'@fingerprint/node-sdk': patch +--- + +**events**: Clarify availability of proxy and VM ML score signals \ No newline at end of file diff --git a/.changeset/blue-roses-film.md b/.changeset/blue-roses-film.md new file mode 100644 index 00000000..455b96a1 --- /dev/null +++ b/.changeset/blue-roses-film.md @@ -0,0 +1,5 @@ +--- +'@fingerprint/node-sdk': patch +--- + +**events**: Clarify semantics of `incremental_identification_status` \ No newline at end of file diff --git a/.changeset/curvy-rice-chew.md b/.changeset/curvy-rice-chew.md new file mode 100644 index 00000000..d9b22421 --- /dev/null +++ b/.changeset/curvy-rice-chew.md @@ -0,0 +1,5 @@ +--- +'@fingerprint/node-sdk': patch +--- + +**visitors**: Clarify rate limits for `deleteVisitorData` operation \ No newline at end of file diff --git a/.changeset/cute-pumas-pull.md b/.changeset/cute-pumas-pull.md new file mode 100644 index 00000000..a18779a6 --- /dev/null +++ b/.changeset/cute-pumas-pull.md @@ -0,0 +1,5 @@ +--- +'@fingerprint/node-sdk': minor +--- + +**events-search**: Add `start_date_time` and `end_date_time` RFC3339 timestamp filters \ No newline at end of file diff --git a/.changeset/developer-tools-android-v4.md b/.changeset/developer-tools-android-v4.md new file mode 100644 index 00000000..8b3cc828 --- /dev/null +++ b/.changeset/developer-tools-android-v4.md @@ -0,0 +1,5 @@ +--- +'@fingerprint/node-sdk': minor +--- + +**events**: Add Android platform support to `developer_tools` smart signal diff --git a/.changeset/developer-tools-ios.md b/.changeset/developer-tools-ios.md new file mode 100644 index 00000000..e65a2d31 --- /dev/null +++ b/.changeset/developer-tools-ios.md @@ -0,0 +1,5 @@ +--- +'@fingerprint/node-sdk': minor +--- + +**events**: Add iOS platform support to `developer_tools` smart signal for API v3 diff --git a/.changeset/events-rfc3339-timestamps.md b/.changeset/events-rfc3339-timestamps.md new file mode 100644 index 00000000..05c50a79 --- /dev/null +++ b/.changeset/events-rfc3339-timestamps.md @@ -0,0 +1,5 @@ +--- +'@fingerprint/node-sdk': minor +--- + +**events-search**: Accept RFC3339 timestamps for `start` and `end` filter parameters in addition to Unix milliseconds diff --git a/.changeset/fancy-spiders-flash.md b/.changeset/fancy-spiders-flash.md new file mode 100644 index 00000000..6defcf48 --- /dev/null +++ b/.changeset/fancy-spiders-flash.md @@ -0,0 +1,5 @@ +--- +'@fingerprint/node-sdk': minor +--- + +**events**: Add `labels` to `Event` \ No newline at end of file diff --git a/.changeset/loud-donuts-lead.md b/.changeset/loud-donuts-lead.md new file mode 100644 index 00000000..041420ed --- /dev/null +++ b/.changeset/loud-donuts-lead.md @@ -0,0 +1,5 @@ +--- +'@fingerprint/node-sdk': patch +--- + +**events-search**: Clarify availability of `rare_device` and `rare_device_percentile_bucket` query parameters \ No newline at end of file diff --git a/.changeset/quick-cows-battle.md b/.changeset/quick-cows-battle.md new file mode 100644 index 00000000..fca976b4 --- /dev/null +++ b/.changeset/quick-cows-battle.md @@ -0,0 +1,5 @@ +--- +'@fingerprint/node-sdk': minor +--- + +**events**: Add iOS platform support to `developer_tools` \ No newline at end of file diff --git a/.changeset/wet-socks-fold.md b/.changeset/wet-socks-fold.md new file mode 100644 index 00000000..4bf0d1c8 --- /dev/null +++ b/.changeset/wet-socks-fold.md @@ -0,0 +1,5 @@ +--- +'@fingerprint/node-sdk': patch +--- + +**events-search**: Fix `pagination_key` example \ No newline at end of file diff --git a/.changeset/witty-lions-worry.md b/.changeset/witty-lions-worry.md new file mode 100644 index 00000000..5054cf61 --- /dev/null +++ b/.changeset/witty-lions-worry.md @@ -0,0 +1,5 @@ +--- +'@fingerprint/node-sdk': minor +--- + +**events-search**: Add `bot_info` filter parameters \ No newline at end of file diff --git a/.changeset/yellow-ducks-spend.md b/.changeset/yellow-ducks-spend.md new file mode 100644 index 00000000..411024b6 --- /dev/null +++ b/.changeset/yellow-ducks-spend.md @@ -0,0 +1,5 @@ +--- +'@fingerprint/node-sdk': minor +--- + +**events-search**: Add `unknown` value to `BotInfoCategory` \ No newline at end of file diff --git a/.schema-version b/.schema-version index aa6c8967..e682ea42 100644 --- a/.schema-version +++ b/.schema-version @@ -1 +1 @@ -v3.2.0 \ No newline at end of file +v3.3.0 \ No newline at end of file diff --git a/resources/fingerprint-server-api.yaml b/resources/fingerprint-server-api.yaml index 9ac62608..037e39f3 100644 --- a/resources/fingerprint-server-api.yaml +++ b/resources/fingerprint-server-api.yaml @@ -270,7 +270,7 @@ paths: `pagination_key` parameter to get the next page of results: - 1. First request, returning most recent 200 events: `GET + 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: @@ -317,6 +317,99 @@ paths: > 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. + - name: bot_info + in: query + schema: + $ref: '#/components/schemas/SearchEventsBotInfo' + description: | + Filter events by their Bot Info result, specifically: + - `all` - events where any kind of bot was detected. + - `none` - events where no bot was detected. + - name: bot_info_category + in: query + style: form + schema: + type: array + items: + $ref: '#/components/schemas/BotInfoCategory' + description: > + Filter events by their Bot Info Category. + + + Multiple categories can be provided using the repeated keys syntax. + For example, + `bot_info_category=ai_agent&bot_info_category=ai_assistant`, will + match events with a Bot Info Category of `ai_agent` or + `ai_assistant`. Other notations like comma-separated or bracket + notation are not supported. + - name: bot_info_identity + in: query + style: form + schema: + type: array + items: + $ref: '#/components/schemas/BotInfoIdentity' + description: > + Filter events by their Bot Info Identity type. + + + Multiple identity types can be provided using the repeated keys + syntax. For example, + `bot_info_identity=verified&bot_info_identity=signed`, will match + events with a Bot Info Identity of `verified` or `signed`. Other + notations like comma-separated or bracket notation are not + supported. + - name: bot_info_confidence + in: query + style: form + schema: + type: array + items: + $ref: '#/components/schemas/BotInfoConfidence' + description: > + Filter events by their Bot Info Confidence. + + + Multiple confidences can be provided using the repeated keys syntax. + For example, `bot_info_confidence=high&bot_info_confidence=medium`, + will match events with a Bot Info Confidence of `high` or `medium`. + Other notations like comma-separated or bracket notation are not + supported. + - name: bot_info_provider + in: query + style: form + schema: + type: array + items: + type: string + description: > + Filter events by their Bot Info Provider. The provider must match + exactly, partial or wildcard matching is not supported. + + + Multiple Providers can be provided using the repeated keys syntax. + For example, `bot_info_provider=OpenAI&bot_info_provider=AWS`, will + match events with a Bot Info Provider of `OpenAI` or `AWS`. Other + notations like comma-separated or bracket notation are not + supported. + - name: bot_info_name + in: query + style: form + schema: + type: array + items: + type: string + description: > + 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. - name: ip_address in: query schema: @@ -379,32 +472,41 @@ paths: - name: start in: query schema: - type: integer - format: int64 - example: 1767225600000 + oneOf: + - type: integer + format: int64 + example: 1767225600000 + - type: string + format: date-time + example: '2026-01-01T00:00:00Z' description: > Include events that happened after this point (with timestamp - greater than or equal the provided `start` Unix milliseconds value). - Defaults to 7 days ago. Setting `start` does not change `end`'s - default of `now` — adjust it separately if needed. + greater than or equal the provided `start` Unix milliseconds value + or RFC3339 timestamp). Defaults to 7 days ago. Setting `start` does + not change `end`'s default of `now` — adjust it separately if + needed. - name: end in: query schema: - type: integer - format: int64 - example: 1769903999000 + oneOf: + - type: integer + format: int64 + example: 1769903999000 + - type: string + format: date-time + example: '2026-01-31T23:59:59Z' description: > Include events that happened before this point (with timestamp less - than or equal the provided `end` Unix milliseconds value). Defaults - to now. Setting `end` does not change `start`'s default of `7 days - ago` — adjust it separately if needed. + than or equal the provided `end` Unix milliseconds value or RFC3339 + timestamp). Defaults to now. Setting `end` does not change `start`'s + default of `7 days ago` — adjust it separately if needed. - name: reverse in: query schema: type: boolean description: > When `true`, sort events oldest first (ascending timestamp order). - Default is newest first (descending timestamp order). + Defaults to `false` (newest first, descending timestamp order). - name: suspect in: query schema: @@ -613,18 +715,34 @@ paths: `rare_device` property set to `true` or `false` are returned. Events without a Device Rarity Smart Signal result are left out of the response. + + + > 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/). - name: rare_device_percentile_bucket in: query schema: $ref: '#/components/schemas/SearchEventsRareDevicePercentileBucket' - description: | + description: > Filter events by Device Rarity percentile bucket. + ` 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/). - name: proxy in: query schema: @@ -758,59 +876,71 @@ paths: tags: - Fingerprint operationId: deleteVisitorData - summary: Delete data by visitor ID + summary: Delete a visitor ID description: > - Request deleting all data associated with the specified visitor ID. This - API is useful for compliance with privacy regulations. + Use this API to request the deletion of all data associated with a + specific visitor ID. - ### Which data is deleted? + Upon a request to delete data for a visitor ID, - - Browser (or device) properties + - 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. - - Identification requests made from this browser (or device) + - 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). - #### Browser (or device) properties - - Represents the data that Fingerprint collected from this specific - browser (or device) and everything inferred and derived from it. + The following timeline illustrates which events are deleted and which + remain after a DELETE API request: - - Upon request to delete, this data is deleted asynchronously (typically - within a few minutes) and it will no longer be used to identify this - browser (or device) for your [Fingerprint - Workspace](https://docs.fingerprint.com/docs/glossary#fingerprint-workspace). + ``` + Day 1: First visit from browser A. (Assigned visitor ID: VID1000) - #### Identification requests made from this browser (or device) + Day 2: Browser A revisits. (Assigned the same visitor ID: VID1000) - - Fingerprint stores the identification requests made from a browser (or - device) for up to 30 (or 90) days depending on your plan. To learn more, - see [Data - Retention](https://docs.fingerprint.com/docs/regions#data-retention). + Day 13: Browser A revisits. (Assigned the same visitor ID: VID1000) - - Upon request to delete, the identification requests that were made by - this browser - - Within the past 10 days are deleted within 24 hrs. - - Outside of 10 days are allowed to purge as per your data retention period. + Day 14: Delete VID1000 - ### Corollary + Day 15: Browser A re-visits. (Assigned a different visitor ID: VID9999) - After requesting to delete a visitor ID, + Day 15: GET /events/day-13 (Returns 404. The event is within the 10 days + of deleting VID1000 and will have been deleted) - - If the same browser (or device) requests to identify, it will receive - a different visitor ID. + Day 16: GET /events/day-2 (Returns 200. The event is outside of the 10 + days of deleting VID1000 and is still available) - - If you request [`/v4/events` - API](https://docs.fingerprint.com/reference/server-api-v4-get-event) - with an `event_id` that was made outside of the 10 days, you will still - receive a valid response. + ``` - ### Interested? + ### Availability - Please [contact our support team](https://fingerprint.com/support/) to - enable it for you. Otherwise, you will receive a 403. + 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/). parameters: - name: visitor_id in: path @@ -875,10 +1005,13 @@ components: description: > Only included for requests using incremental identification. - - `partially_completed` - the event did not receive the second "update" - request. + - `partially_completed` - Indicates this event corresponds to a + 'minimal' request. Smart Signals, even if included in your plan, are not + computed; hence, their values must be ignored. - - `completed` - the event was updated and all information is available. + - `completed` - Indicates this event corresponds to a 'complete' + request. Smart Signals, if included in your plan, are computed; hence, + their values are valid and relevant. enum: - partially_completed - completed @@ -1146,6 +1279,47 @@ components: type: string description: | Additional classification of the bot type if detected. + BotInfoCategory: + type: string + enum: + - advertising_and_marketing + - aggregator + - ai_agent + - ai_assistant + - ai_browser + - ai_crawler + - ai_search + - browser_automation + - ecommerce + - monitoring_and_analytics + - other + - scraping + - security + - search_engine_crawler + - search_engine_optimization + - unknown + description: | + The type and purpose of the bot. + BotInfoIdentity: + type: string + enum: + - verified + - signed + - spoofed + - unknown + description: | + The verification status of the bot's identity: + * `verified` - well-known bot with publicly verifiable identity, directed by the bot provider. + * `signed` - bot that signs its platform via Web Bot Auth, directed by the bot provider's customers. + * `spoofed` - bot that claims a public identity but fails verification. + * `unknown` - bot that does not publish a verifiable identity. + BotInfoConfidence: + type: string + enum: + - low + - medium + - high + description: Confidence level of the bot identification. BotInfo: type: object description: Extended bot information. @@ -1157,8 +1331,7 @@ components: - confidence properties: category: - type: string - description: The type and purpose of the bot. + $ref: '#/components/schemas/BotInfoCategory' provider: type: string description: The organization or company operating the bot. @@ -1169,25 +1342,9 @@ components: type: string description: The specific name or identifier of the bot. identity: - type: string - enum: - - verified - - signed - - spoofed - - unknown - description: | - The verification status of the bot's identity: - * `verified` - well-known bot with publicly verifiable identity, directed by the bot provider. - * `signed` - bot that signs its platform via Web Bot Auth, directed by the bot provider’s customers. - * `spoofed` - bot that claims a public identity but fails verification. - * `unknown` - bot that does not publish a verifiable identity. + $ref: '#/components/schemas/BotInfoIdentity' confidence: - type: string - enum: - - low - - medium - - high - description: Confidence level of the bot identification. + $ref: '#/components/schemas/BotInfoConfidence' ClonedApp: type: boolean description: > @@ -1202,8 +1359,8 @@ components: DeveloperTools: type: boolean description: > - `true` if the browser is Chrome with DevTools open or Firefox with - Developer Tools open, `false` otherwise. + `true` if the browser has DevTools open (Chrome, Firefox) or the + Android/iOS device has Developer Tools enabled, `false` otherwise. Emulator: type: boolean description: > @@ -1402,7 +1559,9 @@ components: 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 + `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/). Incognito: type: boolean description: > @@ -1762,10 +1921,13 @@ components: minimum: 0 maximum: 1 description: > - Machine learning–based virtual machine score, represented as a + 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 + 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/). Vpn: type: boolean description: | @@ -2194,6 +2356,27 @@ components: $ref: '#/components/schemas/FontHash' timezone_offset: $ref: '#/components/schemas/TimezoneOffset' + Labels: + type: array + items: + type: object + properties: + label: + type: string + prediction: + type: boolean + ml_score: + type: number + format: double + minimum: 0 + maximum: 1 + description: > + Each label returns a prediction (true or false) for a specific use case + (label field) based on a machine learning score. The machine learning + score is determined by a model trained on customer data for that use + case. This field is in the beta phase and only available to select + customers. If you are interested, please [contact our support + team](https://fingerprint.com/support/). Event: type: object description: >- @@ -2324,6 +2507,8 @@ components: $ref: '#/components/schemas/DeveloperTools' x-platforms: - browser + - android + - ios emulator: $ref: '#/components/schemas/Emulator' x-platforms: @@ -2494,9 +2679,15 @@ components: raw_device_attributes: $ref: '#/components/schemas/RawDeviceAttributes' x-platforms: - - android + - browser - ios + - android + labels: + $ref: '#/components/schemas/Labels' + x-platforms: - browser + - ios + - android ErrorCode: type: string enum: @@ -2645,6 +2836,15 @@ components: > 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: + type: string + enum: + - all + - none + description: | + Filter events by their Bot Info result, specifically: + - `all` - events where any kind of bot was detected. + - `none` - events where no bot was detected. SearchEventsVpnConfidence: type: string enum: @@ -2672,14 +2872,25 @@ components: - p99.5-p99.9 - p99.9+ - not_seen - description: | + description: > Filter events by Device Rarity percentile bucket. + ` 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/). SearchEventsSdkPlatform: type: string enum: diff --git a/src/generatedApiTypes.ts b/src/generatedApiTypes.ts index 621006d1..9f31ff5c 100644 --- a/src/generatedApiTypes.ts +++ b/src/generatedApiTypes.ts @@ -92,30 +92,34 @@ export interface paths { put?: never post?: never /** - * Delete data by visitor ID - * @description Request deleting all data associated with the specified visitor ID. This API is useful for compliance with privacy regulations. + * Delete a visitor ID + * @description Use this API to request the deletion of all data associated with a specific visitor ID. * - * ### Which data is deleted? - * - Browser (or device) properties - * - Identification requests made from this browser (or device) + * 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). * - * #### Browser (or device) properties - * - Represents the data that Fingerprint collected from this specific browser (or device) and everything inferred and derived from it. - * - Upon request to delete, this data is deleted asynchronously (typically within a few minutes) and it will no longer be used to identify this browser (or device) for your [Fingerprint Workspace](https://docs.fingerprint.com/docs/glossary#fingerprint-workspace). + * 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) + * ``` * - * #### Identification requests made from this browser (or device) - * - Fingerprint stores the identification requests made from a browser (or device) for up to 30 (or 90) days depending on your plan. To learn more, see [Data Retention](https://docs.fingerprint.com/docs/regions#data-retention). - * - Upon request to delete, the identification requests that were made by this browser - * - Within the past 10 days are deleted within 24 hrs. - * - Outside of 10 days are allowed to purge as per your data retention period. + * ### Availability + * This API is available only for Enterprise plans **upon request**. If you are interested, please [contact our support team](https://fingerprint.com/support/). * - * ### Corollary - * After requesting to delete a visitor ID, - * - If the same browser (or device) requests to identify, it will receive a different visitor ID. - * - If you request [`/v4/events` API](https://docs.fingerprint.com/reference/server-api-v4-get-event) with an `event_id` that was made outside of the 10 days, you will still receive a valid response. + * ### Rate limits and daily quota + * The rate limits and daily quota for this API **differ** from those for our other API. * - * ### Interested? - * Please [contact our support team](https://fingerprint.com/support/) to enable it for you. Otherwise, you will receive a 403. + * 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/). * */ delete: operations['deleteVisitorData'] @@ -138,8 +142,8 @@ export interface components { Timestamp: number /** * @description Only included for requests using incremental identification. - * - `partially_completed` - the event did not receive the second "update" request. - * - `completed` - the event was updated and all information is available. + * - `partially_completed` - Indicates this event corresponds to a 'minimal' request. Smart Signals, even if included in your plan, are not computed; hence, their values must be ignored. + * - `completed` - Indicates this event corresponds to a 'complete' request. Smart Signals, if included in your plan, are computed; hence, their values are valid and relevant. * * @enum {string} */ @@ -290,38 +294,70 @@ export interface components { /** @description Additional classification of the bot type if detected. * */ BotType: string + /** + * @description The type and purpose of the bot. + * + * @enum {string} + */ + BotInfoCategory: + | 'advertising_and_marketing' + | 'aggregator' + | 'ai_agent' + | 'ai_assistant' + | 'ai_browser' + | 'ai_crawler' + | 'ai_search' + | 'browser_automation' + | 'ecommerce' + | 'monitoring_and_analytics' + | 'other' + | 'scraping' + | 'security' + | 'search_engine_crawler' + | 'search_engine_optimization' + | 'unknown' + /** + * @description The verification status of the bot's identity: + * * `verified` - well-known bot with publicly verifiable identity, directed by the bot provider. + * * `signed` - bot that signs its platform via Web Bot Auth, directed by the bot provider's customers. + * * `spoofed` - bot that claims a public identity but fails verification. + * * `unknown` - bot that does not publish a verifiable identity. + * + * @enum {string} + */ + BotInfoIdentity: 'verified' | 'signed' | 'spoofed' | 'unknown' + /** + * @description Confidence level of the bot identification. + * @enum {string} + */ + BotInfoConfidence: 'low' | 'medium' | 'high' /** @description Extended bot information. */ BotInfo: { - /** @description The type and purpose of the bot. */ - category: string + /** @description The type and purpose of the bot. + * */ + category: components['schemas']['BotInfoCategory'] /** @description The organization or company operating the bot. */ provider: string /** @description The URL of the bot provider's website. */ provider_url?: string /** @description The specific name or identifier of the bot. */ name: string - /** - * @description The verification status of the bot's identity: + /** @description The verification status of the bot's identity: * * `verified` - well-known bot with publicly verifiable identity, directed by the bot provider. - * * `signed` - bot that signs its platform via Web Bot Auth, directed by the bot provider’s customers. + * * `signed` - bot that signs its platform via Web Bot Auth, directed by the bot provider's customers. * * `spoofed` - bot that claims a public identity but fails verification. * * `unknown` - bot that does not publish a verifiable identity. - * - * @enum {string} - */ - identity: 'verified' | 'signed' | 'spoofed' | 'unknown' - /** - * @description Confidence level of the bot identification. - * @enum {string} - */ - confidence: 'low' | 'medium' | 'high' + * */ + identity: components['schemas']['BotInfoIdentity'] + /** @description Confidence level of the bot identification. */ + confidence: components['schemas']['BotInfoConfidence'] } /** @description 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. * */ ClonedApp: boolean - /** @description `true` if the browser is Chrome with DevTools open or Firefox with Developer Tools open, `false` otherwise. + /** @description `true` if the browser has DevTools open (Chrome, Firefox) or the Android/iOS device has Developer Tools enabled, `false` otherwise. * */ DeveloperTools: boolean /** @description Android specific emulator detection. There are 2 values: @@ -426,7 +462,7 @@ export interface components { } /** * Format: double - * @description 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 + * @description 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/). * */ ProxyMLScore: number @@ -629,7 +665,7 @@ export interface components { VirtualMachine: boolean /** * Format: double - * @description 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 + * @description 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/). * */ VirtualMachineMLScore: number @@ -909,6 +945,14 @@ export interface components { /** @description UTC offset in "±HH:MM" format derived from the detected IANA timezone. */ timezone_offset?: components['schemas']['TimezoneOffset'] } + /** @description Each label returns a prediction (true or false) for a specific use case (label field) based on a machine learning score. The machine learning score is determined by a model trained on customer data for that use case. This field is in the beta phase and only available to select customers. If you are interested, please [contact our support team](https://fingerprint.com/support/). + * */ + Labels: { + label?: string + prediction?: boolean + /** Format: double */ + ml_score?: number + }[] /** @description Contains results from Fingerprint Identification and all active Smart Signals. */ Event: { /** @description Unique identifier of the user's request. The first portion of the event_id is a unix epoch milliseconds timestamp For example: `1758130560902.8tRtrH` @@ -917,8 +961,8 @@ export interface components { /** @description Timestamp of the event with millisecond precision in Unix time. */ timestamp: components['schemas']['Timestamp'] /** @description Only included for requests using incremental identification. - * - `partially_completed` - the event did not receive the second "update" request. - * - `completed` - the event was updated and all information is available. + * - `partially_completed` - Indicates this event corresponds to a 'minimal' request. Smart Signals, even if included in your plan, are not computed; hence, their values must be ignored. + * - `completed` - Indicates this event corresponds to a 'complete' request. Smart Signals, if included in your plan, are computed; hence, their values are valid and relevant. * */ incremental_identification_status?: components['schemas']['IncrementalIdentificationStatus'] /** @description A customer-provided id that was sent with the request. */ @@ -975,7 +1019,7 @@ export interface components { * * `false` - No signs of cloned application detected or the client is not Android. * */ cloned_app?: components['schemas']['ClonedApp'] - /** @description `true` if the browser is Chrome with DevTools open or Firefox with Developer Tools open, `false` otherwise. + /** @description `true` if the browser has DevTools open (Chrome, Firefox) or the Android/iOS device has Developer Tools enabled, `false` otherwise. * */ developer_tools?: components['schemas']['DeveloperTools'] /** @description Android specific emulator detection. There are 2 values: @@ -1002,7 +1046,7 @@ export interface components { proxy_confidence?: components['schemas']['ProxyConfidence'] /** @description Proxy detection details (present if `proxy` is `true`) */ proxy_details?: components['schemas']['ProxyDetails'] - /** @description 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 + /** @description 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/). * */ proxy_ml_score?: components['schemas']['ProxyMLScore'] /** @description `true` if we detected incognito mode used in the browser, `false` otherwise. @@ -1080,7 +1124,7 @@ export interface components { /** @description `true` if the request came from a browser running inside a virtual machine (e.g. VMWare), `false` otherwise. * */ virtual_machine?: components['schemas']['VirtualMachine'] - /** @description 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 + /** @description 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/). * */ virtual_machine_ml_score?: components['schemas']['VirtualMachineMLScore'] /** @description VPN or other anonymizing service has been used when sending the request. @@ -1108,6 +1152,9 @@ export interface components { /** @description A curated subset of raw browser/device attributes that the API surface exposes. Each property contains a value or object with the data for the collected signal. * */ raw_device_attributes?: components['schemas']['RawDeviceAttributes'] + /** @description Each label returns a prediction (true or false) for a specific use case (label field) based on a machine learning score. The machine learning score is determined by a model trained on customer data for that use case. This field is in the beta phase and only available to select customers. If you are interested, please [contact our support team](https://fingerprint.com/support/). + * */ + labels?: components['schemas']['Labels'] } /** * @description Error code: @@ -1220,6 +1267,14 @@ export interface components { * @enum {string} */ SearchEventsBot: 'all' | 'good' | 'bad' | 'none' + /** + * @description Filter events by their Bot Info result, specifically: + * - `all` - events where any kind of bot was detected. + * - `none` - events where no bot was detected. + * + * @enum {string} + */ + SearchEventsBotInfo: 'all' | 'none' /** * @description Filter events by VPN Detection result confidence level. * `high` - events with high VPN Detection confidence. @@ -1239,6 +1294,8 @@ export interface components { * `p99.9+` - device is in the top 0.1% (rarest). * `not_seen` - device configuration has never been observed before. * + * > This Smart Signal is currently in beta and only available to select customers. If you are interested, please [contact our support team](https://fingerprint.com/support/). + * * @enum {string} */ SearchEventsRareDevicePercentileBucket: ' 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. * */ bot?: components['schemas']['SearchEventsBot'] + /** @description Filter events by their Bot Info result, specifically: + * - `all` - events where any kind of bot was detected. + * - `none` - events where no bot was detected. + * */ + bot_info?: components['schemas']['SearchEventsBotInfo'] + /** @description Filter events by their Bot Info Category. + * + * Multiple categories can be provided using the repeated keys syntax. For example, `bot_info_category=ai_agent&bot_info_category=ai_assistant`, will match events with a Bot Info Category of `ai_agent` or `ai_assistant`. Other notations like comma-separated or bracket notation are not supported. + * */ + bot_info_category?: components['schemas']['BotInfoCategory'][] + /** @description Filter events by their Bot Info Identity type. + * + * Multiple identity types can be provided using the repeated keys syntax. For example, `bot_info_identity=verified&bot_info_identity=signed`, will match events with a Bot Info Identity of `verified` or `signed`. Other notations like comma-separated or bracket notation are not supported. + * */ + bot_info_identity?: components['schemas']['BotInfoIdentity'][] + /** @description Filter events by their Bot Info Confidence. + * + * Multiple confidences can be provided using the repeated keys syntax. For example, `bot_info_confidence=high&bot_info_confidence=medium`, will match events with a Bot Info Confidence of `high` or `medium`. Other notations like comma-separated or bracket notation are not supported. + * */ + bot_info_confidence?: components['schemas']['BotInfoConfidence'][] + /** @description Filter events by their Bot Info Provider. The provider must match exactly, partial or wildcard matching is not supported. + * + * Multiple Providers can be provided using the repeated keys syntax. For example, `bot_info_provider=OpenAI&bot_info_provider=AWS`, will match events with a Bot Info Provider of `OpenAI` or `AWS`. Other notations like comma-separated or bracket notation are not supported. + * */ + bot_info_provider?: string[] + /** @description 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. + * */ + bot_info_name?: string[] /** @description 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 * */ @@ -1457,13 +1544,13 @@ export interface operations { /** @description Filter events by the origin field of the event. This is applicable to web events only (e.g., https://example.com) * */ origin?: string - /** @description Include events that happened after this point (with timestamp greater than or equal the provided `start` Unix milliseconds value). Defaults to 7 days ago. Setting `start` does not change `end`'s default of `now` — adjust it separately if needed. + /** @description Include events that happened after this point (with timestamp greater than or equal the provided `start` Unix milliseconds value or RFC3339 timestamp). Defaults to 7 days ago. Setting `start` does not change `end`'s default of `now` — adjust it separately if needed. * */ - start?: number - /** @description Include events that happened before this point (with timestamp less than or equal the provided `end` Unix milliseconds value). Defaults to now. Setting `end` does not change `start`'s default of `7 days ago` — adjust it separately if needed. + start?: number | string + /** @description Include events that happened before this point (with timestamp less than or equal the provided `end` Unix milliseconds value or RFC3339 timestamp). Defaults to now. Setting `end` does not change `start`'s default of `7 days ago` — adjust it separately if needed. * */ - end?: number - /** @description When `true`, sort events oldest first (ascending timestamp order). Default is newest first (descending timestamp order). + end?: number | string + /** @description When `true`, sort events oldest first (ascending timestamp order). Defaults to `false` (newest first, descending timestamp order). * */ reverse?: boolean /** @description Filter events previously tagged as suspicious via the [Update API](https://docs.fingerprint.com/reference/server-api-v4-update-event). @@ -1543,6 +1630,8 @@ export interface operations { mitm_attack?: boolean /** @description Filter events by Device Rarity detection result. * > Note: When using this parameter, only events with the `rare_device` property set to `true` or `false` are returned. Events without a Device Rarity Smart Signal result are left out of the response. + * + * > 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/). * */ rare_device?: boolean /** @description Filter events by Device Rarity percentile bucket. @@ -1552,6 +1641,8 @@ export interface operations { * `p99.5-p99.9` - device is in the 99.5th to 99.9th percentile. * `p99.9+` - device is in the top 0.1% (rarest). * `not_seen` - device configuration has never been observed before. + * + * > 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/). * */ rare_device_percentile_bucket?: components['schemas']['SearchEventsRareDevicePercentileBucket'] /** @description Filter events by Proxy detection result. diff --git a/tests/mocked-responses-tests/mocked-responses-data/events/get_event_200.json b/tests/mocked-responses-tests/mocked-responses-data/events/get_event_200.json index f7b20849..aa38a408 100644 --- a/tests/mocked-responses-tests/mocked-responses-data/events/get_event_200.json +++ b/tests/mocked-responses-tests/mocked-responses-data/events/get_event_200.json @@ -286,5 +286,12 @@ "audio": 124.04347745512496 }, "rare_device": false, - "rare_device_percentile_bucket": " Date: Mon, 18 May 2026 23:37:09 +0100 Subject: [PATCH 02/14] feat: require label in Labels schema Co-authored-by: Cursor --- resources/fingerprint-server-api.yaml | 2 ++ src/generatedApiTypes.ts | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/resources/fingerprint-server-api.yaml b/resources/fingerprint-server-api.yaml index 037e39f3..0b7dd1f7 100644 --- a/resources/fingerprint-server-api.yaml +++ b/resources/fingerprint-server-api.yaml @@ -2360,6 +2360,8 @@ components: type: array items: type: object + required: + - label properties: label: type: string diff --git a/src/generatedApiTypes.ts b/src/generatedApiTypes.ts index 9f31ff5c..462182a4 100644 --- a/src/generatedApiTypes.ts +++ b/src/generatedApiTypes.ts @@ -948,7 +948,7 @@ export interface components { /** @description Each label returns a prediction (true or false) for a specific use case (label field) based on a machine learning score. The machine learning score is determined by a model trained on customer data for that use case. This field is in the beta phase and only available to select customers. If you are interested, please [contact our support team](https://fingerprint.com/support/). * */ Labels: { - label?: string + label: string prediction?: boolean /** Format: double */ ml_score?: number From ab99c5e49b789b242feaabbae8173138d2019d52 Mon Sep 17 00:00:00 2001 From: Juraj Uhlar Date: Mon, 18 May 2026 23:40:42 +0100 Subject: [PATCH 03/14] fix: use 89-day search window in smoke tests Co-authored-by: Cursor --- tests/functional-tests/smokeTests.mjs | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/tests/functional-tests/smokeTests.mjs b/tests/functional-tests/smokeTests.mjs index 5775c0ef..5cdf72aa 100644 --- a/tests/functional-tests/smokeTests.mjs +++ b/tests/functional-tests/smokeTests.mjs @@ -1,11 +1,6 @@ -import { - FingerprintServerApiClient, - Region, - RequestError, - TooManyRequestsError, -} from '@fingerprint/node-sdk' +import { FingerprintServerApiClient, Region, RequestError, TooManyRequestsError } from '@fingerprint/node-sdk' import { config } from 'dotenv' -import assert from "node:assert"; +import assert from 'node:assert' config() const REGION_MAP = { eu: Region.EU, ap: Region.AP, us: Region.Global } @@ -77,8 +72,8 @@ async function validateRulesetEvaluationForBlock(client, start, end) { rule_expression: 'incognito', type: 'block', status_code: 403, - headers: [ { name: 'Content-Type', value: 'application/json' } ], - body: '{"message": "Incognito not allowed"}' + headers: [{ name: 'Content-Type', value: 'application/json' }], + body: '{"message": "Incognito not allowed"}', } assert.deepStrictEqual(event.rule_action, expected) @@ -106,7 +101,7 @@ async function validateRulesetEvaluationForAllow(client, start, end) { rule_id: 'r_OPnYaU9dKEke9X', rule_expression: 'environment_id != "non-an-environment-id"', type: 'allow', - request_header_modifications: { remove: [], set: [ { name: 'X-Allowed', value: 'true' } ], append: [] } + request_header_modifications: { remove: [], set: [{ name: 'X-Allowed', value: 'true' }], append: [] }, } assert.deepStrictEqual(event.rule_action, expected) @@ -137,7 +132,8 @@ async function main() { try { const client = createClient() const end = Date.now() - const start = end - 90 * 24 * 60 * 60 * 1000 + // API rejects start times older than 90 days; use 89 days to stay within the limit. + const start = end - 89 * 24 * 60 * 60 * 1000 const recent = await getRecentEvents(client, start, end) const [firstEvent] = recent.events From ef2dcaddebef01cf4e026094b65f717a4dc97fd5 Mon Sep 17 00:00:00 2001 From: Juraj Uhlar Date: Tue, 19 May 2026 10:21:08 +0100 Subject: [PATCH 04/14] chore: add example typecheck and lint .mjs files Enable @ts-check on examples with a dedicated check:examples script. Extend lint to cover .mjs so examples are linted in CI. Co-authored-by: Cursor --- example/deleteVisitor.mjs | 1 + example/getEvent.mjs | 1 + example/searchEvents.mjs | 24 +++++++++++++++--------- example/unsealResult.mjs | 1 + example/updateEvent.mjs | 11 ++++++----- example/validateWebhookSignature.mjs | 1 + package.json | 3 ++- tsconfig.examples.json | 13 +++++++++++++ 8 files changed, 40 insertions(+), 15 deletions(-) create mode 100644 tsconfig.examples.json diff --git a/example/deleteVisitor.mjs b/example/deleteVisitor.mjs index 571ab472..3f5fda32 100644 --- a/example/deleteVisitor.mjs +++ b/example/deleteVisitor.mjs @@ -1,3 +1,4 @@ +// @ts-check import { FingerprintServerApiClient, Region, RequestError } from '@fingerprint/node-sdk' import { config } from 'dotenv' config() diff --git a/example/getEvent.mjs b/example/getEvent.mjs index 95988466..bf7548d1 100644 --- a/example/getEvent.mjs +++ b/example/getEvent.mjs @@ -1,3 +1,4 @@ +// @ts-check import { FingerprintServerApiClient, Region, RequestError } from '@fingerprint/node-sdk' import { config } from 'dotenv' config() diff --git a/example/searchEvents.mjs b/example/searchEvents.mjs index 32a0bfc3..4545198f 100644 --- a/example/searchEvents.mjs +++ b/example/searchEvents.mjs @@ -1,3 +1,4 @@ +// @ts-check import { FingerprintServerApiClient, Region, RequestError } from '@fingerprint/node-sdk' import { config } from 'dotenv' config() @@ -19,17 +20,22 @@ if (envRegion === 'eu') { const client = new FingerprintServerApiClient({ region, apiKey }) +/** @type {import('@fingerprint/node-sdk').SearchEventsFilter} */ const filter = { limit: 10, - // pagination_key: '', - // bot: 'all', - // visitor_id: 'TaDnMBz9XCpZNuSzFUqP', - // ip_address: '192.168.0.1/32', - // linked_id: '', - //start: 1620000000000, - //end: 1630000000000, - //reverse: true, - //suspect: false, + pagination_key: '', + bot: 'all', + visitor_id: 'TaDnMBz9XCpZNuSzFUqP', + ip_address: '192.168.0.1/32', + linked_id: '', + // Unix milliseconds: + start: 1620000000000, + end: 1630000000000, + // RFC3339 timestamps (alternative to Unix ms): + // start: '2026-01-01T00:00:00Z', + // end: '2026-01-31T23:59:59Z', + reverse: true, + suspect: false, } try { diff --git a/example/unsealResult.mjs b/example/unsealResult.mjs index 446eb47d..1c4b2d7d 100644 --- a/example/unsealResult.mjs +++ b/example/unsealResult.mjs @@ -1,3 +1,4 @@ +// @ts-check import { unsealEventsResponse, DecryptionAlgorithm } from '@fingerprint/node-sdk' import { config } from 'dotenv' config() diff --git a/example/updateEvent.mjs b/example/updateEvent.mjs index ed1fcb0b..f741c230 100644 --- a/example/updateEvent.mjs +++ b/example/updateEvent.mjs @@ -1,3 +1,4 @@ +// @ts-check import { FingerprintServerApiClient, RequestError, Region } from '@fingerprint/node-sdk' import { config } from 'dotenv' @@ -28,11 +29,11 @@ const client = new FingerprintServerApiClient({ region, apiKey }) try { await client.updateEvent(eventId, { - tags: { - key: 'value', - }, - linked_id: 'new_linked_id', - suspect: false, + tags: { + key: 'value', + }, + linked_id: 'new_linked_id', + suspect: false, }) console.log('Event updated') diff --git a/example/validateWebhookSignature.mjs b/example/validateWebhookSignature.mjs index c3337eae..d44f5b4b 100644 --- a/example/validateWebhookSignature.mjs +++ b/example/validateWebhookSignature.mjs @@ -1,3 +1,4 @@ +// @ts-check import { isValidWebhookSignature } from '@fingerprint/node-sdk' /** diff --git a/package.json b/package.json index f5ac9e10..e1a3671f 100644 --- a/package.json +++ b/package.json @@ -27,8 +27,9 @@ "scripts": { "prepare": "husky install", "build": "rimraf dist && rollup -c rollup.config.js --bundleConfigAsCjs", - "lint": "eslint --ext .js,.ts --ignore-path .gitignore --max-warnings 0 .", + "lint": "eslint --ext .js,.ts,.mjs --ignore-path .gitignore --max-warnings 0 .", "lint:fix": "pnpm lint --fix", + "check:examples": "tsc --noEmit -p tsconfig.examples.json", "test": "jest", "test:coverage": "jest --coverage", "test:dts": "tsc --noEmit --isolatedModules dist/index.d.ts", diff --git a/tsconfig.examples.json b/tsconfig.examples.json new file mode 100644 index 00000000..2a68cf6a --- /dev/null +++ b/tsconfig.examples.json @@ -0,0 +1,13 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "allowJs": true, + "checkJs": true, + "noEmit": true, + "module": "ESNext", + "moduleResolution": "Bundler", + "lib": ["ES2022"], + "types": ["node"] + }, + "include": ["example/**/*.mjs"] +} From e51e6f192925adc2b5087b5f645c41b2c591c465 Mon Sep 17 00:00:00 2001 From: Juraj Uhlar Date: Tue, 19 May 2026 10:21:49 +0100 Subject: [PATCH 05/14] docs: update search and delete API JSDoc for OpenAPI v3.3.0 Add mocked tests for bot_info filters and RFC3339 start/end timestamps. Co-authored-by: Cursor --- src/serverApiClient.ts | 19 ++++--- .../searchEventsTests.spec.ts | 57 +++++++++++++------ 2 files changed, 53 insertions(+), 23 deletions(-) diff --git a/src/serverApiClient.ts b/src/serverApiClient.ts index 26f0fd51..1d0c9f16 100644 --- a/src/serverApiClient.ts +++ b/src/serverApiClient.ts @@ -163,12 +163,17 @@ export class FingerprintServerApiClient implements FingerprintApi { } /** - * Delete data by visitor ID - * Request deleting all data associated with the specified visitor ID. This API is useful for compliance with privacy regulations. All delete requests are queued: - * Recent data (10 days or newer) belonging to the specified visitor will be deleted within 24 hours. * Data from older (11 days or more) identification events will be deleted after 90 days. - * If you are interested in using this API, please [contact our support team](https://fingerprint.com/support/) to activate it for you. Otherwise, you will receive a 403. + * Request deletion of all data associated with the specified visitor ID. * - * @param visitorId The [visitor ID](https://dev.fingerprint.com/docs/js-agent#visitorid) you want to delete.* + * Browser (or device) data is deleted asynchronously, typically within a few minutes. + * Identification events from the past 10 days are typically deleted within 24 hours. + * Older events are purged per your [data retention period](https://docs.fingerprint.com/docs/regions#data-retention). + * + * Available for Enterprise plans upon request; otherwise returns 403. + * Rate limits differ from other APIs: 30 requests/hour and 500 requests/day (contact + * [support](https://fingerprint.com/support/) to request higher limits). + * + * @param visitorId The [visitor ID](https://dev.fingerprint.com/docs/js-agent#visitorid) to delete. * * @return {Promise} Promise that resolves when the deletion request is successfully queued * @@ -233,8 +238,8 @@ export class FingerprintServerApiClient implements FingerprintApi { * with your custom identifier. * @param {string|undefined} filter.url - Filter events by the URL (`url` property) associated with the event. * @param {string|undefined} filter.origin - Filter events by the origin field of the event. Origin could be the website domain or mobile app bundle ID (eg: com.foo.bar) - * @param {number|undefined} filter.start - Filter events with a timestamp greater than the start time, in Unix time (milliseconds). - * @param {number|undefined} filter.end - Filter events with a timestamp smaller than the end time, in Unix time (milliseconds). + * @param {number|string|undefined} filter.start - Filter events with a timestamp greater than or equal to this value, as Unix milliseconds or an RFC3339 timestamp (e.g. `2026-01-01T00:00:00Z`). Defaults to 7 days ago. + * @param {number|string|undefined} filter.end - Filter events with a timestamp less than or equal to this value, as Unix milliseconds or an RFC3339 timestamp. Defaults to now. * @param {boolean|undefined} filter.reverse - Sort events in reverse timestamp order. * @param {boolean|undefined} filter.suspect - Filter events previously tagged as suspicious via the [Update API](https://dev.fingerprint.com/reference/updateevent). * @param {boolean|undefined} filter.vpn - Filter events by VPN Detection result. diff --git a/tests/mocked-responses-tests/searchEventsTests.spec.ts b/tests/mocked-responses-tests/searchEventsTests.spec.ts index 32af3d84..4703068d 100644 --- a/tests/mocked-responses-tests/searchEventsTests.spec.ts +++ b/tests/mocked-responses-tests/searchEventsTests.spec.ts @@ -7,6 +7,26 @@ jest.spyOn(global, 'fetch') const mockFetch = fetch as unknown as jest.Mock +function expectedSearchEventsUrl(filters: NonNullable): string { + const queryParams = new URLSearchParams() + for (const [key, value] of Object.entries(filters)) { + if (value === undefined || value === null) { + continue + } + + if (Array.isArray(value)) { + for (const v of value) { + queryParams.append(key, String(v)) + } + } else { + queryParams.set(key, String(value)) + } + } + queryParams.set('ii', getIntegrationInfo()) + + return `https://api.fpjs.io/v4/events?${queryParams.toString()}` +} + describe('[Mocked response] Search Events', () => { const apiKey = 'dummy_api_key' const client = new FingerprintServerApiClient({ apiKey }) @@ -77,6 +97,12 @@ describe('[Mocked response] Search Events', () => { const filters: SearchEventsFilter = { limit: 10, bot: 'all', + bot_info: 'all', + bot_info_category: ['ai_agent', 'ai_assistant'], + bot_info_identity: ['verified', 'signed'], + bot_info_confidence: ['high', 'medium'], + bot_info_provider: ['OpenAI', 'AWS'], + bot_info_name: ['ChatGPT Agent', 'Bedrock AgentCore'], visitor_id: 'visitor_id', ip_address: '192.168.0.1/32', linked_id: 'linked_id', @@ -114,26 +140,25 @@ describe('[Mocked response] Search Events', () => { expect(response).toEqual(getEventsSearch) - const baseUrl = 'https://api.fpjs.io/v4/events' - const queryParams = new URLSearchParams() - for (const [key, value] of Object.entries(filters)) { - if (value === undefined || value === null) { - continue - } + expect(mockFetch).toHaveBeenCalledWith(expectedSearchEventsUrl(filters), { + headers: { Authorization: `Bearer ${apiKey}` }, + method: 'GET', + }) + }) - if (Array.isArray(value)) { - for (const v of value) { - queryParams.append(key, String(v)) - } - } else { - queryParams.set(key, String(value)) - } + test('with RFC3339 start and end timestamps', async () => { + mockFetch.mockReturnValue(Promise.resolve(createJsonResponse(getEventsSearch))) + + const filters: SearchEventsFilter = { + limit: 10, + start: '2026-01-01T00:00:00Z', + end: '2026-01-31T23:59:59Z', } - queryParams.set('ii', getIntegrationInfo()) - const expectedUrl = `${baseUrl}?${queryParams.toString()}` + const response = await client.searchEvents(filters) - expect(mockFetch).toHaveBeenCalledWith(expectedUrl, { + expect(response).toEqual(getEventsSearch) + expect(mockFetch).toHaveBeenCalledWith(expectedSearchEventsUrl(filters), { headers: { Authorization: `Bearer ${apiKey}` }, method: 'GET', }) From bbd6920ec684fa1ee9221be47b675a2ee1c72547 Mon Sep 17 00:00:00 2001 From: Juraj Uhlar Date: Tue, 19 May 2026 10:22:58 +0100 Subject: [PATCH 06/14] chore: consolidate changesets for OpenAPI v3.3.0 Merge duplicate developer_tools and RFC3339 changeset entries. Co-authored-by: Cursor --- .changeset/all-showers-trade.md | 5 ----- .changeset/cute-pumas-pull.md | 5 ----- .changeset/developer-tools-android-v4.md | 5 ----- .changeset/developer-tools-ios.md | 5 ----- .changeset/developer-tools-mobile-platforms.md | 5 +++++ .changeset/quick-cows-battle.md | 5 ----- 6 files changed, 5 insertions(+), 25 deletions(-) delete mode 100644 .changeset/all-showers-trade.md delete mode 100644 .changeset/cute-pumas-pull.md delete mode 100644 .changeset/developer-tools-android-v4.md delete mode 100644 .changeset/developer-tools-ios.md create mode 100644 .changeset/developer-tools-mobile-platforms.md delete mode 100644 .changeset/quick-cows-battle.md diff --git a/.changeset/all-showers-trade.md b/.changeset/all-showers-trade.md deleted file mode 100644 index 9e5a228f..00000000 --- a/.changeset/all-showers-trade.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@fingerprint/node-sdk': patch ---- - -**events-search**: Remove `default` property from `reverse` query parameter \ No newline at end of file diff --git a/.changeset/cute-pumas-pull.md b/.changeset/cute-pumas-pull.md deleted file mode 100644 index a18779a6..00000000 --- a/.changeset/cute-pumas-pull.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@fingerprint/node-sdk': minor ---- - -**events-search**: Add `start_date_time` and `end_date_time` RFC3339 timestamp filters \ No newline at end of file diff --git a/.changeset/developer-tools-android-v4.md b/.changeset/developer-tools-android-v4.md deleted file mode 100644 index 8b3cc828..00000000 --- a/.changeset/developer-tools-android-v4.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@fingerprint/node-sdk': minor ---- - -**events**: Add Android platform support to `developer_tools` smart signal diff --git a/.changeset/developer-tools-ios.md b/.changeset/developer-tools-ios.md deleted file mode 100644 index e65a2d31..00000000 --- a/.changeset/developer-tools-ios.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@fingerprint/node-sdk': minor ---- - -**events**: Add iOS platform support to `developer_tools` smart signal for API v3 diff --git a/.changeset/developer-tools-mobile-platforms.md b/.changeset/developer-tools-mobile-platforms.md new file mode 100644 index 00000000..705035dd --- /dev/null +++ b/.changeset/developer-tools-mobile-platforms.md @@ -0,0 +1,5 @@ +--- +'@fingerprint/node-sdk': minor +--- + +**events**: Add Android and iOS platform support to `developer_tools` smart signal diff --git a/.changeset/quick-cows-battle.md b/.changeset/quick-cows-battle.md deleted file mode 100644 index fca976b4..00000000 --- a/.changeset/quick-cows-battle.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@fingerprint/node-sdk': minor ---- - -**events**: Add iOS platform support to `developer_tools` \ No newline at end of file From ed8d5ab32e2b79f73ad85a9151f332fa3c8131c7 Mon Sep 17 00:00:00 2001 From: Juraj Uhlar Date: Tue, 19 May 2026 10:39:05 +0100 Subject: [PATCH 07/14] chore: document breaking TypeScript types for OpenAPI v3.3.0 Add a changeset for BotInfo.category narrowing and note RFC3339 start/end widening. Co-authored-by: Cursor --- .changeset/events-rfc3339-timestamps.md | 2 ++ .changeset/openapi-v3.3-breaking-types.md | 8 ++++++++ 2 files changed, 10 insertions(+) create mode 100644 .changeset/openapi-v3.3-breaking-types.md diff --git a/.changeset/events-rfc3339-timestamps.md b/.changeset/events-rfc3339-timestamps.md index 05c50a79..df5c008e 100644 --- a/.changeset/events-rfc3339-timestamps.md +++ b/.changeset/events-rfc3339-timestamps.md @@ -3,3 +3,5 @@ --- **events-search**: Accept RFC3339 timestamps for `start` and `end` filter parameters in addition to Unix milliseconds + +**types**: `SearchEventsFilter.start` and `SearchEventsFilter.end` are now `number | string` (widening; not breaking for existing Unix millisecond usage). diff --git a/.changeset/openapi-v3.3-breaking-types.md b/.changeset/openapi-v3.3-breaking-types.md new file mode 100644 index 00000000..817a73f2 --- /dev/null +++ b/.changeset/openapi-v3.3-breaking-types.md @@ -0,0 +1,8 @@ +--- +'@fingerprint/node-sdk': minor +--- + +**types**: Breaking changes in generated TypeScript types from OpenAPI v3.3.0: + +- `BotInfo.category` is now `BotInfoCategory` instead of `string`. Update assignments, comparisons, and narrowing that assumed a free-form string. +- `BotInfoCategory` adds new enum members (including `unknown`). Exhaustive `switch` statements must be updated. From ce2ebc22aedcdc1a78491e0f4e62aa62f7a02bba Mon Sep 17 00:00:00 2001 From: Juraj Uhlar Date: Tue, 19 May 2026 10:41:49 +0100 Subject: [PATCH 08/14] chore: run example typecheck in CI via test:dts Chain check:examples after declaration emit check so examples are validated post-build. Co-authored-by: Cursor --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e1a3671f..031a9d9c 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "check:examples": "tsc --noEmit -p tsconfig.examples.json", "test": "jest", "test:coverage": "jest --coverage", - "test:dts": "tsc --noEmit --isolatedModules dist/index.d.ts", + "test:dts": "tsc --noEmit --isolatedModules dist/index.d.ts && pnpm check:examples", "generateTypes": "node generate.mjs && pnpm lint:fix", "docs": "typedoc src/index.ts --out docs" }, From 9231c0a2d46a9f93fb599ed9810ce234f98ba18e Mon Sep 17 00:00:00 2001 From: Juraj Uhlar Date: Tue, 19 May 2026 11:55:15 +0100 Subject: [PATCH 09/14] docs: address search events review comments --- example/searchEvents.mjs | 26 +++++++++++++------------- src/serverApiClient.ts | 13 +++++++++---- 2 files changed, 22 insertions(+), 17 deletions(-) diff --git a/example/searchEvents.mjs b/example/searchEvents.mjs index 4545198f..275ca36f 100644 --- a/example/searchEvents.mjs +++ b/example/searchEvents.mjs @@ -23,19 +23,19 @@ const client = new FingerprintServerApiClient({ region, apiKey }) /** @type {import('@fingerprint/node-sdk').SearchEventsFilter} */ const filter = { limit: 10, - pagination_key: '', - bot: 'all', - visitor_id: 'TaDnMBz9XCpZNuSzFUqP', - ip_address: '192.168.0.1/32', - linked_id: '', - // Unix milliseconds: - start: 1620000000000, - end: 1630000000000, - // RFC3339 timestamps (alternative to Unix ms): - // start: '2026-01-01T00:00:00Z', - // end: '2026-01-31T23:59:59Z', - reverse: true, - suspect: false, + // pagination_key: '', + // bot: 'all', + // visitor_id: 'TaDnMBz9XCpZNuSzFUqP', + // ip_address: '192.168.0.1/32', + // linked_id: '', + // // Unix milliseconds: + // start: 1620000000000, + // end: 1630000000000, + // // RFC3339 timestamps (alternative to Unix ms): + // // start: '2026-01-01T00:00:00Z', + // // end: '2026-01-31T23:59:59Z', + // reverse: true, + // suspect: false, } try { diff --git a/src/serverApiClient.ts b/src/serverApiClient.ts index 1d0c9f16..287f72e4 100644 --- a/src/serverApiClient.ts +++ b/src/serverApiClient.ts @@ -226,10 +226,15 @@ export class FingerprintServerApiClient implements FingerprintApi { * - events where no bot was detected. * * Allowed values: `all`, `good`, `bad`, `none`. - * @param {string|undefined} filter.ip_address - Filter events by IP address range. The range can be as specific as a - * single IP (/32 for IPv4 or /128 for IPv6). - * All ip_address filters must use CIDR notation, for example, - * 10.0.0.0/24, 192.168.0.1/32 + * @param {'all'|'none'|undefined} filter.bot_info - Filter events by Bot Info result. + * Allowed values: `all`, `none`. + * @param {string[]|undefined} filter.bot_info_category - Filter events by Bot Info category. Provide multiple values using repeated query parameters. + * @param {string[]|undefined} filter.bot_info_identity - Filter events by Bot Info identity type. Provide multiple values using repeated query parameters. + * @param {string[]|undefined} filter.bot_info_confidence - Filter events by Bot Info confidence. Provide multiple values using repeated query parameters. + * @param {string[]|undefined} filter.bot_info_provider - Filter events by exact Bot Info provider. Provide multiple values using repeated query parameters. + * @param {string[]|undefined} filter.bot_info_name - Filter events by exact Bot Info name. Provide multiple values using repeated query parameters. + * @param {string|undefined} filter.ip_address - Filter events by IP address or IP range. If CIDR notation is not used, /32 for IPv4 or /128 for IPv6 is assumed. + * Examples: 10.0.0.0/24, 192.168.0.1, 192.168.0.1/32. * @param {string|undefined} filter.linked_id - Filter events by your custom identifier. * You can use [linked IDs](https://dev.fingerprint.com/reference/get-function#linkedid) to * associate identification requests with your own identifier, for From a37033b6b4296a253959328426716336da23ba3e Mon Sep 17 00:00:00 2001 From: Juraj Uhlar Date: Tue, 19 May 2026 12:03:34 +0100 Subject: [PATCH 10/14] chore: rename typecheck scripts and add local typecheck:source Run example typecheck via typecheck:examples in test:dts; keep typecheck:source for local use only. Co-authored-by: Cursor --- .github/workflows/build.yml | 2 -- package.json | 5 +++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d939c74c..69e04757 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -8,5 +8,3 @@ jobs: build-and-check: name: Build project and run CI checks uses: fingerprintjs/dx-team-toolkit/.github/workflows/build-typescript-project.yml@v1 - - diff --git a/package.json b/package.json index 031a9d9c..16dc9248 100644 --- a/package.json +++ b/package.json @@ -29,10 +29,11 @@ "build": "rimraf dist && rollup -c rollup.config.js --bundleConfigAsCjs", "lint": "eslint --ext .js,.ts,.mjs --ignore-path .gitignore --max-warnings 0 .", "lint:fix": "pnpm lint --fix", - "check:examples": "tsc --noEmit -p tsconfig.examples.json", + "typecheck:source": "tsc --noEmit -p tsconfig.json", + "typecheck:examples": "tsc --noEmit -p tsconfig.examples.json", "test": "jest", "test:coverage": "jest --coverage", - "test:dts": "tsc --noEmit --isolatedModules dist/index.d.ts && pnpm check:examples", + "test:dts": "tsc --noEmit --isolatedModules dist/index.d.ts && pnpm typecheck:examples", "generateTypes": "node generate.mjs && pnpm lint:fix", "docs": "typedoc src/index.ts --out docs" }, From 9e6a821c82a04258d7964f25af5ae638c8bd52fb Mon Sep 17 00:00:00 2001 From: Juraj Uhlar Date: Tue, 19 May 2026 12:35:10 +0100 Subject: [PATCH 11/14] chore: clean up changesets --- .changeset/events-rfc3339-timestamps.md | 7 ------- .changeset/openapi-v3.3-breaking-types.md | 5 +++-- .changeset/yellow-ducks-spend.md | 5 ----- 3 files changed, 3 insertions(+), 14 deletions(-) delete mode 100644 .changeset/events-rfc3339-timestamps.md delete mode 100644 .changeset/yellow-ducks-spend.md diff --git a/.changeset/events-rfc3339-timestamps.md b/.changeset/events-rfc3339-timestamps.md deleted file mode 100644 index df5c008e..00000000 --- a/.changeset/events-rfc3339-timestamps.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@fingerprint/node-sdk': minor ---- - -**events-search**: Accept RFC3339 timestamps for `start` and `end` filter parameters in addition to Unix milliseconds - -**types**: `SearchEventsFilter.start` and `SearchEventsFilter.end` are now `number | string` (widening; not breaking for existing Unix millisecond usage). diff --git a/.changeset/openapi-v3.3-breaking-types.md b/.changeset/openapi-v3.3-breaking-types.md index 817a73f2..6a4412fb 100644 --- a/.changeset/openapi-v3.3-breaking-types.md +++ b/.changeset/openapi-v3.3-breaking-types.md @@ -2,7 +2,8 @@ '@fingerprint/node-sdk': minor --- -**types**: Breaking changes in generated TypeScript types from OpenAPI v3.3.0: +**types**: Type-breaking changes in generated TypeScript types for OpenAPI v3.3.0: +- `SearchEventsFilter.start` and `SearchEventsFilter.end` are now `number | string` (RFC3339 strings in addition to Unix milliseconds) - `BotInfo.category` is now `BotInfoCategory` instead of `string`. Update assignments, comparisons, and narrowing that assumed a free-form string. -- `BotInfoCategory` adds new enum members (including `unknown`). Exhaustive `switch` statements must be updated. +- `BotInfoCategory` includes new enum members such as `unknown` (exhaustive `switch` statements may need updates) diff --git a/.changeset/yellow-ducks-spend.md b/.changeset/yellow-ducks-spend.md deleted file mode 100644 index 411024b6..00000000 --- a/.changeset/yellow-ducks-spend.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@fingerprint/node-sdk': minor ---- - -**events-search**: Add `unknown` value to `BotInfoCategory` \ No newline at end of file From d86ab8ddd64444b425256e698f1ac5abbeb11e5a Mon Sep 17 00:00:00 2001 From: Juraj Uhlar Date: Tue, 19 May 2026 12:40:56 +0100 Subject: [PATCH 12/14] chore: move example typecheck config --- tsconfig.examples.json => example/tsconfig.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) rename tsconfig.examples.json => example/tsconfig.json (75%) diff --git a/tsconfig.examples.json b/example/tsconfig.json similarity index 75% rename from tsconfig.examples.json rename to example/tsconfig.json index 2a68cf6a..337409ef 100644 --- a/tsconfig.examples.json +++ b/example/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "./tsconfig.json", + "extends": "../tsconfig.json", "compilerOptions": { "allowJs": true, "checkJs": true, @@ -9,5 +9,5 @@ "lib": ["ES2022"], "types": ["node"] }, - "include": ["example/**/*.mjs"] + "include": ["*.mjs"] } diff --git a/package.json b/package.json index 16dc9248..a4eb8588 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "lint": "eslint --ext .js,.ts,.mjs --ignore-path .gitignore --max-warnings 0 .", "lint:fix": "pnpm lint --fix", "typecheck:source": "tsc --noEmit -p tsconfig.json", - "typecheck:examples": "tsc --noEmit -p tsconfig.examples.json", + "typecheck:examples": "tsc --noEmit -p example/tsconfig.json", "test": "jest", "test:coverage": "jest --coverage", "test:dts": "tsc --noEmit --isolatedModules dist/index.d.ts && pnpm typecheck:examples", From b65ec9cfeb5c63c4db77de066b6fe7df01ff0e37 Mon Sep 17 00:00:00 2001 From: Juraj Uhlar Date: Tue, 19 May 2026 12:48:53 +0100 Subject: [PATCH 13/14] chore: enter pre-release mode Enter changesets pre-release mode with test tag for OpenAPI v3.3.0. Co-authored-by: Cursor --- .changeset/pre.json | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 .changeset/pre.json diff --git a/.changeset/pre.json b/.changeset/pre.json new file mode 100644 index 00000000..45f029b9 --- /dev/null +++ b/.changeset/pre.json @@ -0,0 +1,10 @@ +{ + "mode": "pre", + "tag": "test", + "initialVersions": { + "@fingerprint/node-sdk": "7.2.0", + "node-sdk-example": "1.0.0", + "node-sdk-smoke-tests": "2.0.0" + }, + "changesets": [] +} From 61fba367fccd935df314f021945789d16a66a45a Mon Sep 17 00:00:00 2001 From: Juraj Uhlar Date: Tue, 19 May 2026 12:49:39 +0100 Subject: [PATCH 14/14] chore: drop example and smoke-tests from pre-release config Co-authored-by: Cursor --- .changeset/pre.json | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.changeset/pre.json b/.changeset/pre.json index 45f029b9..d98dd356 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -2,9 +2,7 @@ "mode": "pre", "tag": "test", "initialVersions": { - "@fingerprint/node-sdk": "7.2.0", - "node-sdk-example": "1.0.0", - "node-sdk-smoke-tests": "2.0.0" + "@fingerprint/node-sdk": "7.2.0" }, "changesets": [] }