Skip to content

[SPIKE option C] EventDevice | EventEdge union; flatten Event for most SDKs (INTER-2457) - #465

Closed
JuroUhlar wants to merge 8 commits into
mainfrom
spike/INTER-2457-option-c
Closed

JuroUhlar wants to merge 8 commits into
mainfrom
spike/INTER-2457-option-c

Conversation

@JuroUhlar

@JuroUhlar JuroUhlar commented Aug 31, 2026 •

Copy link
Copy Markdown
Contributor

SPIKE. Do not merge. Option C for INTER-2457. Distinct from the earlier spike that left Event as oneOf in every SDK schema.

  • Docs and Node: Event is EventDevice | EventEdge, discriminator source.
  • Python/PHP: new fingerprint-server-api-v4-flat.yaml (Event flattened, source optional, start/end still date|int).
  • Go/Java/.NET: v4-normalized.yaml also flattens Event (and still splits start/end).
  • POST /edge returns EventEdge. EdgeResponse removed.
  • Sync workflow: Python/PHP pull v4-flat.yaml.
  • EventEdge has no x-platforms (no sdk.platform on edge). EventDevice still marks url / bot_info as browser.
  • Koala source schema: koala#18408 (same union; generators walk EventDevice; wrap at HTTP).
  • source on both variants is allOf: [$ref EventSource, const] like EventRuleAction.type. Flatten still unwraps to an optional $ref.

SDK spikes (option C)

SDK This spike Previous spike (union everywhere — do not use)
Node fingerprintjs/node-sdk#279 fingerprintjs/node-sdk#278
Python fingerprintjs/python-sdk#225 fingerprintjs/python-sdk#224
PHP fingerprintjs/php-sdk#272 fingerprintjs/php-sdk#271
Java fingerprintjs/java-sdk#50 fingerprintjs/java-sdk#49
Go fingerprintjs/go-sdk#102 fingerprintjs/go-sdk#101
.NET fingerprintjs/dotnet-sdk#201 fingerprintjs/dotnet-sdk#200

Discussion point: flatten property order

flattenNamedSchemaOneOfTransformer emits Event properties in EventDevice order, not the last published Event order. source moves from 3rd toward the VPN block. JSON and named accessors are fine. Two generated breaks:

  • .NET positional Event( ctor: source is no longer the 3rd arg; Option<string> slots can silently mis-bind. See dotnet-sdk#201.
  • PHP searchEvents last two optionals swapped (source ↔ active_call). See php-sdk#272.

Fix if we need a literal no-break: reorder flattened Event.properties to the last published Event key order after merge.

Discussion point: source required on the union, optional in flat SDKs

source has to be required on EventDevice / EventEdge for the discriminator. JSON Schema could leave it optional on Device only, but OpenAPI codegen treats a missing discriminator as undefined. Flat SDK schemas still strip it from required. Generated the unflattened union once for Java/Go/Python/.NET/PHP: same shapes as EventRuleAction. No nested SourceEnum. Later majors: stop flattening + default omit to device (Java UnknownEvent / Go both-nil are wrong for missing source). PHP stays a merged bag until templates change, same as RuleAction.

Known: EventEdge YAML duplication

Request/IP fields (url, bot_info, ip_info, proxy*, vpn*) are copied on EventDevice and EventEdge. They can drift.

Known: flattened Event keeps Device x-platforms on url / bot_info

Those tags mean JS-agent identification (url is page URL, bot_info is BotD). Edge has the same fields from the HTTP request you POST, so it omits x-platforms. Flatten keeps the Device tags when Edge omits them, so merged Event.url / bot_info stay browser. SDK generators ignore x-platforms; this is schema metadata only.

To fix: stop copying x-platforms onto overlapping fields, or drop url / bot_info tags on the flattened Event.

SPIKE INTER-2457 option C. Docs and Node keep the union. Other SDK schemas flatten Event with source optional. Do not merge.
@changeset-bot

changeset-bot Bot commented Aug 31, 2026 •

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 767520f

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
Name Type
fingerprint-pro-server-api-openapi Minor

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@github-actions

github-actions Bot commented Aug 31, 2026 •

Copy link
Copy Markdown
Contributor

Schema Diff vs Published Schemas

  • Generated at: 2026-08-31T18:24:56.768Z
  • Published source: https://fingerprintjs.github.io/fingerprint-pro-server-api-openapi/schemas
  • Compared schemas: 9
  • Changed schemas: 4 (1 new)

fingerprint-server-api-v4-flat.yaml 🆕 NEW

Summary: +7 added, -0 removed, ~0 modified

Added elements (7)
  • /components
  • /info
  • /openapi
  • /paths
  • /security
  • /servers
  • /tags
Removed elements (0)

None

Modified elements (0)

None

Changed lines patch
--- a/schemas/fingerprint-server-api-v4-flat.yaml
+++ b/schemas/fingerprint-server-api-v4-flat.yaml
@@ -0,0 +1,3870 @@
+openapi: 3.1.1
+info:
+  title: Server API
+  description: >
+    Fingerprint Server API allows you to get, search, and update Events in a
+    server environment. It can be used for data exports, decision-making, and
+    data analysis scenarios.
+
+    Server API is intended for server-side usage, it's not intended to be used
+    from the client side, whether it's a browser or a mobile device.
+
+    The API also supports collection of Automation Intelligence for requests to
+    your server in edge, pre-origin, or middleware contexts.
+  version: '4'
+  contact:
+    name: Fingerprint Support
+    email: support@fingerprint.com
+  license:
+    name: MIT
+    url: >-
+      https://github.com/fingerprintjs/fingerprint-pro-server-api-openapi/blob/main/LICENSE
+tags:
+  - name: Fingerprint
+    description: >-
+      Using the Server API you can retrieve information about individual
+      analysis events or event history of individual visitors.
+    externalDocs:
+      description: API documentation
+      url: https://docs.fingerprint.com/reference/server-api
+servers:
+  - url: https://api.fpjs.io/v4
+    description: Global
+  - url: https://eu.api.fpjs.io/v4
+    description: EU
+  - url: https://ap.api.fpjs.io/v4
+    description: Asia (Mumbai)
+security:
+  - bearerAuth: []
+paths:
+  /edge:
+    post:
+      tags:
+        - Fingerprint
+      operationId: analyzeRequestForAutomationIntelligence
+      summary: Collect Automation Intelligence.
+      description: >
+        The Automation Intelligence API gives you the tools to determine whether
+        traffic is legitimate and should be accepted by your application.
+
+
+        This feature is currently in a Public Preview testing phase. All
+        feedback is welcome! If you encounter any issues, please [contact our
+        support team](https://fingerprint.com/support/).
+
+
+        The API detects automation tools like AI Agents, AI Assistants, AI
+        Browsers, and other bots. Additionally, it provides IP intelligence like
+        geolocation, residential proxy, VPN and data center detection.
+
+
+        Automation Intelligence is derived from HTTP request metadata that
+        reaches your server. It does not require the use of a JavaScript
+        client-side agent or mobile SDKs to collect device context.
+
+
+        The API is fast, with average response times of less than 30ms, making
+        it a great fit for edge, pre-origin or middleware contexts. The API is
+        platform-agnostic and can be used with different CDN providers, cloud
+        platforms, or any server backend.
+
+
+        Because this API doesn’t require the use of a client-side device
+        collection agent, it doesn’t support device identification via
+        `visitor_id` and a few Smart Signals derived from deep device telemetry.
+
+
+        ### Event Retrieval
+
+
+        Events created by the Automation Intelligence API can be fetched via the
+        [`/v4/events/{event_id}`](https://docs.fingerprint.com/reference/server-api-get-event)
+        API using the `event_id` present in the API response.
+
+
+        Fetch all Automation Intelligence API events via the
+        [`/v4/events?source=edge`](https://docs.fingerprint.com/reference/server-api-search-events#parameter-source)
+        API.
+      requestBody:
+        required: true
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/EdgeRequest'
+      responses:
+        '200':
+          description: OK.
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/EventEdge'
+        '400':
+          description: Bad request. The request payload is not valid.
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ErrorResponse'
+        '403':
+          description: Forbidden. Access to this API is denied.
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ErrorResponse'
+        '413':
+          description: Bad request. The request payload is too large.
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ErrorResponse'
+        '429':
+          description: Too Many Requests. The request is throttled.
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ErrorResponse'
+        '500':
+          description: Workspace error.
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ErrorResponse'
+  /events/{event_id}:
+    get:
+      tags:
+        - Fingerprint
+      operationId: getEvent
+      summary: Get an event by event ID
+      description: >
+        Get a detailed analysis of an individual event, including Smart Signals.
+
+
+        Use `event_id` as the URL path parameter. This API method is scoped to a
+        request, i.e. all returned information is by `event_id`.
+
+
+        Use `source` to tell identification events (`device`) from Automation
+        Intelligence events (`edge`).
+      parameters:
+        - name: event_id
+          in: path
+          required: true
+          schema:
+            type: string
+            examples:
+              - 1708102555327.NLOjmg
+            example: 1708102555327.NLOjmg
+          description: >-
+            The unique
+            [identifier](https://docs.fingerprint.com/reference/js-agent-get-function#event_id)
+            of each identification request (`requestId` can be used in its
+            place).
+        - name: ruleset_id
+          in: query
+          required: false
+          schema:
+            type: string
+            examples:
+              - D6N9Kbk9HRWrIWGz
+            example: D6N9Kbk9HRWrIWGz
+          description: >
+            The ID of the ruleset to evaluate against the event, producing the
+            action to take for this event.
+
+            The resulting action is returned in the `rule_action` attribute of
+            the response.
+      responses:
+        '200':
+          description: OK.
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/Event'
+        '400':
+          description: Bad request. The event Id provided is not valid.
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ErrorResponse'
+        '403':
+          description: Forbidden. Access to this API is denied.
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ErrorResponse'
+        '404':
+          description: Not found. The event Id cannot be found in this workspace's data.
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ErrorResponse'
+        '429':
+          description: >
+            Too Many Requests. The request is throttled.
+
+            To protect service stability during rare periods of extreme load, we
+            may return HTTP 429 responses with message `too many search
+            requests` even if you are within your assigned rate limits.
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ErrorResponse'
+        '500':
+          description: Workspace error.
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ErrorResponse'
+        '504':
+          description: >-
+            Gateway Timeout. Search execution exceeded the allowed timeout
+            window.
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ErrorResponse'
+    patch:
+      tags:
+        - Fingerprint
+      operationId: updateEvent
+      summary: Update an event
+      description: >
+        Change information in existing events specified by `event_id` or *flag
+        suspicious events*.
+
+
+        When an event is created, it can be assigned `linked_id` and `tags`
+        submitted through the JS agent parameters. 
+
+        This information might not have been available on the client initially,
+        so the Server API permits updating these attributes after the fact.
+
+
+        **Warning** It's not possible to update events older than one month. 
+
+
+        **Warning** Trying to update an event immediately after creation may
+        temporarily result in an 
+
+        error (HTTP 409 Conflict. The event is not mutable yet.) as the event is
+        fully propagated across our systems. In such a case, simply retry the
+        request.
+      parameters:
+        - name: event_id
+          in: path
+          required: true
+          schema:
+            type: string
+            examples:
+              - 1708102555327.NLOjmg
+            example: 1708102555327.NLOjmg
+          description: >-
+            The unique event
+            [identifier](https://docs.fingerprint.com/reference/js-agent-get-function#event_id).
+      requestBody:
+        required: true
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/EventUpdate'
+      responses:
+        '200':
+          description: OK.
+        '400':
+          description: Bad request. The request payload is not valid.
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ErrorResponse'
+        '403':
+          description: Forbidden. Access to this API is denied.
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ErrorResponse'
+        '404':
+          description: Not found. The event Id cannot be found in this workspace's data.
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ErrorResponse'
+        '409':
+          description: Conflict. The event is not mutable yet.
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ErrorResponse'
+  /events:
+    get:
+      tags:
+        - Fingerprint
+      operationId: searchEvents
+      x-dotnet-use-request-object: true
+      summary: Search events
+      description: >
+        ## Search
+
+
+        The `/v4/events` endpoint provides a convenient way to search for past
+        events based on specific parameters. Typical use cases and queries
+        include:
+
+
+        - Searching for events associated with a single `visitor_id` within a
+        time range to get historical behavior of a visitor.
+
+        - Searching for events associated with a single `linked_id` within a
+        time range to get all events associated with your internal account
+        identifier.
+
+        - Excluding all bot traffic from the query (`good` and `bad` bots)
+
+
+        By default, the API searches events from the last 7 days, sorts them by
+        newest first and returns the last 10 events.
+
+
+        - Use `start` and `end` to specify the time range of the search.
+
+        - Use `reverse=true` to sort the results oldest first.
+
+        - Use `limit` to specify the number of events to return.
+
+        - Use `pagination_key` to get the next page of results if there are more
+        than `limit` events.
+
+
+        ### Filtering events with the `suspect` flag
+
+
+        The `/v4/events` endpoint unlocks a powerful method for fraud protection
+        analytics. The `suspect` flag is exposed in all events where it was
+        previously set by the update API.
+
+
+        You can also apply the `suspect` query parameter as a filter to find all
+        potentially fraudulent activity that you previously marked as `suspect`.
+        This helps identify patterns of fraudulent behavior.
+
+
+        ### Environment scoping
+
+
+        If you use a secret key that is scoped to an environment, you will only
+        get events associated with the same environment. With a workspace-scoped
+        environment, you will get events from all environments.
+
+
+        Smart Signals not activated for your workspace or are not included in
+        the response.
+      parameters:
+        - name: limit
+          in: query
+          required: false
+          schema:
+            type: integer
+            format: int32
+            minimum: 1
+            maximum: 100
+            examples:
+              - 10
+            example: 10
+          description: >
+            Maximum number of events to return. Defaults to 10 when omitted.
+            Results are selected from the time range (`start`, `end`), ordered
+            by `reverse`, then truncated to provided `limit` size. So
+            `reverse=true` returns the oldest N=`limit` events, otherwise the
+            newest N=`limit` events.
+        - name: pagination_key
+          in: query
+          schema:
+            type: string
+            examples:
+              - >-
+                S9rgMMUb4z3X5t5pr_tSgoSZlmyF0O8X7kCV2m981-iY1LmRTjraa1rTk3L-hQExnDWCi0RA-zAIjaVSTNO2AN2eqQWgzT0RjbieMxRfSdkM-HmOhdOgdQvYfPG3vqU1DJKh4Q
+            example: >-
+              S9rgMMUb4z3X5t5pr_tSgoSZlmyF0O8X7kCV2m981-iY1LmRTjraa1rTk3L-hQExnDWCi0RA-zAIjaVSTNO2AN2eqQWgzT0RjbieMxRfSdkM-HmOhdOgdQvYfPG3vqU1DJKh4Q
+          description: >
+            Use `pagination_key` to get the next page of results.
+
+
+            When more results are available (e.g., you requested up to 100
+            results for your query using `limit`, but there are more than 100
+            events total matching your request), the `pagination_key` field is
+            added to the response. The pagination key is an arbitrary string
+            that should not be interpreted in any way and should be passed
+            as-is. In the following request, use that value in the
+            `pagination_key` parameter to get the next page of results:
+
+
+            1. First request, returning most recent 100 events: `GET
+            api-base-url/events?limit=100`
+
+            2. Use `response.pagination_key` to get the next page of results:
+            `GET
+            api-base-url/events?limit=100&pagination_key=S9rgMMUb4z3X5t5pr_tSgoSZlmyF0O8X7kCV2m981-iY1LmRTjraa1rTk3L-hQExnDWCi0RA-zAIjaVSTNO2AN2eqQWgzT0RjbieMxRfSdkM-HmOhdOgdQvYfPG3vqU1DJKh4Q`
+        - name: visitor_id
+          in: query
+          schema:
+            type: string
+            examples:
+              - Ibk1527CUFmcnjLwIs4A9
+            example: Ibk1527CUFmcnjLwIs4A9
+          description: >
+            Unique [visitor
+            identifier](https://docs.fingerprint.com/reference/js-agent-get-function#visitor_id)
+            issued by Fingerprint Identification and all active Smart Signals.
+
+
+            Filter events by matching Visitor ID (`identification.visitor_id`
+            property).
+        - name: high_recall_id
+          in: query
+          schema:
+            type: string
+            examples:
+              - Ibk1527CUFmcnjLwIs4A9
+            example: Ibk1527CUFmcnjLwIs4A9
+          description: >
+            The High Recall ID is a supplementary browser identifier designed
+            for use cases that require wider coverage over precision. Compared
+            to the standard visitor ID, the High Recall ID strives to match
+            incoming browsers more generously (rather than precisely) with
+            existing browsers and thus identifies fewer browsers as new. The
+            High Recall ID is best suited for use cases that are sensitive to
+            browsers being identified as new and where mismatched browsers are
+            not detrimental.
+
+
+            Filter events by matching High Recall ID
+            (`supplementary_id_high_recall.visitor_id` property).
+        - name: bot
+          in: query
+          schema:
+            $ref: '#/components/schemas/SearchEventsBot'
+          description: >
+            Filter events by the Bot Detection result, specifically:
+              `all` - events where any kind of bot was detected.
+              `good` - events where a good bot was detected.
+              `bad` - events where a bad bot was detected.
+              `none` - events where no bot was detected.
+            > Note: When using this parameter, only events with the `bot`
+            property set to a valid value are returned. Events without a `bot`
+            Smart Signal result are left out of the response.
+        - 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, and no `bot_info` was present.
+        - 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
+              examples:
+                - OpenAI
+              example: OpenAI
+          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
+              examples:
+                - ChatGPT-User
+              example: ChatGPT-User
+          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:
+            type: string
+            examples:
+              - 61.127.217.15
+            example: 61.127.217.15
+          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
+        - name: asn
+          in: query
+          schema:
+            type: string
+            examples:
+              - '12876'
+            example: '12876'
+          description: >
+            Filter events by the ASN associated with the event's IP address.
+
+            This corresponds to the `ip_info.(v4|v6).asn` property in the
+            response.
+        - name: linked_id
+          in: query
+          schema:
+            type: string
+            examples:
+              - somelinkedId
+            example: somelinkedId
+          description: >
+            Filter events by your custom identifier.
+
+
+            You can use [linked
+            Ids](https://docs.fingerprint.com/reference/js-agent-get-function#linkedid)
+            to associate identification requests with your own identifier, for
+            example, session Id, purchase Id, or transaction Id. You can then
+            use this `linked_id` parameter to retrieve all events associated
+            with your custom identifier.
+        - name: url
+          in: query
+          schema:
+            type: string
+            examples:
+              - https://example.com/login
+            example: https://example.com/login
+          description: |
+            Filter events by the URL (`url` property) associated with the event.
+        - name: bundle_id
+          in: query
+          schema:
+            type: string
+            examples:
+              - com.example.app
+            example: com.example.app
+          description: |
+            Filter events by the Bundle ID (iOS) associated with the event.
+        - name: package_name
+          in: query
+          schema:
+            type: string
+            examples:
+              - com.example.app
+            example: com.example.app
+          description: >
+            Filter events by the Package Name (Android) associated with the
+            event.
+        - name: origin
+          in: query
+          schema:
+            type: string
+            examples:
+              - https://example.com
+            example: https://example.com
+          description: >
+            Filter events by the origin field of the event. This is applicable
+            to web events only (e.g., https://example.com)
+        - name: start
+          in: query
+          schema:
+            oneOf:
+              - type: string
+                format: date-time
+                examples:
+                  - '2026-01-01T00:00:00Z'
+                example: '2026-01-01T00:00:00Z'
+              - type: integer
+                format: int64
+                examples:
+                  - 1767225600000
+                example: 1767225600000
+            examples:
+              - '2026-01-01T00:00:00Z'
+            example: '2026-01-01T00:00:00Z'
+          description: >
+            Include events that happened after the provided `start` date
+            formatted as an RFC3339 timestamp. For backward compatibility, a
+            Unix milliseconds timestamp is also accepted. Defaults to 7 days
+            ago. Setting `start` does not change the default `end` date of `now`
+            — adjust it separately if needed.
+        - name: end
+          in: query
+          schema:
+            oneOf:
+              - type: string
+                format: date-time
+                examples:
+                  - '2026-01-31T23:59:59Z'
+                example: '2026-01-31T23:59:59Z'
+              - type: integer
+                format: int64
+                examples:
+                  - 1769903999000
+                example: 1769903999000
+            examples:
+              - '2026-01-31T23:59:59Z'
+            example: '2026-01-31T23:59:59Z'
+          description: >
+            Include events that happened before the provided `end` date
+            formatted as an RFC3339 timestamp. For backward compatibility, a
+            Unix milliseconds timestamp is also accepted. Defaults to now.
+            Setting `end` does not change the default `start` date 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).
+            Defaults to `false` (newest first, descending timestamp order).
+        - name: suspect
+          in: query
+          schema:
+            type: boolean
+          description: >
+            Filter events previously tagged as suspicious via the [Update
+            API](https://docs.fingerprint.com/reference/server-api-v4-update-event).
+
+            > Note: When using this parameter, only events with the `suspect`
+            property explicitly set to `true` or `false` are returned. Events
+            with undefined `suspect` property are left out of the response.
+        - name: vpn
+          in: query
+          schema:
+            type: boolean
+          description: >
+            Filter events by VPN Detection result.
+
+            > Note: When using this parameter, only events with the `vpn`
+            property set to `true` or `false` are returned. Events without a
+            `vpn` Smart Signal result are left out of the response.
+        - name: virtual_machine
+          in: query
+          schema:
+            type: boolean
+          description: >
+            Filter events by Virtual Machine Detection result.
+
+            > Note: When using this parameter, only events with the
+            `virtual_machine` property set to `true` or `false` are returned.
+            Events without a `virtual_machine` Smart Signal result are left out
+            of the response.
+        - name: tampering
+          in: query
+          schema:
+            type: boolean
+          description: >
+            Filter events by Browser Tampering Detection result.
+
+            > Note: When using this parameter, only events with the `tampering`
+            property set to `true` or `false` are returned. Events without a
+            `tampering` Smart Signal result are left out of the response.
+        - name: anti_detect_browser
+          in: query
+          schema:
+            type: boolean
+          description: >
+            Filter events by Anti-detect Browser Detection result.
+
+            > Note: When using this parameter, only events with the
+            `tampering_details.anti_detect_browser` property set to `true` or
+            `false` are returned. Events without a `tampering` Smart Signal
+            result are left out of the response.
+        - name: incognito
+          in: query
+          schema:
+            type: boolean
+          description: >
+            Filter events by Browser Incognito Detection result.
+
+            > Note: When using this parameter, only events with the `incognito`
+            property set to `true` or `false` are returned. Events without an
+            `incognito` Smart Signal result are left out of the response.
+        - name: privacy_settings
+          in: query
+          schema:
+            type: boolean
+          description: >
+            Filter events by Privacy Settings Detection result.
+
+            > Note: When using this parameter, only events with the
+            `privacy_settings` property set to `true` or `false` are returned.
+            Events without a `privacy_settings` Smart Signal result are left out
+            of the response.
+        - name: jailbroken
+          in: query
+          schema:
+            type: boolean
+          description: >
+            Filter events by Jailbroken Device Detection result.
+
+            > Note: When using this parameter, only events with the `jailbroken`
+            property set to `true` or `false` are returned. Events without a
+            `jailbroken` Smart Signal result are left out of the response.
+        - name: frida
+          in: query
+          schema:
+            type: boolean
+          description: >
+            Filter events by Frida Detection result.
+
+            > Note: When using this parameter, only events with the `frida`
+            property set to `true` or `false` are returned. Events without a
+            `frida` Smart Signal result are left out of the response.
+        - name: factory_reset
+          in: query
+          schema:
+            type: boolean
+          description: >
+            Filter events by Factory Reset Detection result.
+
+            > Note: When using this parameter, only events with a
+            `factory_reset_timestamp` property populated are included. Events
+            without a `factory_reset_timestamp` Smart Signal result are left out
+            of the response.
+        - name: cloned_app
+          in: query
+          schema:
+            type: boolean
+          description: >
+            Filter events by Cloned App Detection result.
+
+            > Note: When using this parameter, only events with the `cloned_app`
+            property set to `true` or `false` are returned. Events without a
+            `cloned_app` Smart Signal result are left out of the response.
+        - name: emulator
+          in: query
+          schema:
+            type: boolean
+          description: >
+            Filter events by Android Emulator Detection result.
+
+            > Note: When using this parameter, only events with the `emulator`
+            property set to `true` or `false` are returned. Events without an
+            `emulator` Smart Signal result are left out of the response.
+        - name: root_apps
+          in: query
+          schema:
+            type: boolean
+          description: >
+            Filter events by Rooted Device Detection result.
+
+            > Note: When using this parameter, only events with the `root_apps`
+            property set to `true` or `false` are returned. Events without a
+            `root_apps` Smart Signal result are left out of the response.
+        - name: vpn_confidence
+          in: query
+          schema:
+            $ref: '#/components/schemas/SearchEventsVpnConfidence'
+          description: >
+            Filter events by VPN Detection result confidence level.
+
+            `high` - events with high VPN Detection confidence.
+
+            `medium` - events with medium VPN Detection confidence.
+
+            `low` - events with low VPN Detection confidence.
+
+            > Note: When using this parameter, only events with the
+            `vpn.confidence` property set to a valid value are returned. Events
+            without a `vpn` Smart Signal result are left out of the response.
+        - name: min_suspect_score
+          in: query
+          schema:
+            type: number
+            format: float
+            examples:
+              - 7.5
+            example: 7.5
+          description: >
+            Filter events with Suspect Score result above a provided minimum
+            threshold.
+
+            > Note: When using this parameter, only events where the
+            `suspect_score` property set to a value exceeding your threshold are
+            returned. Events without a `suspect_score` Smart Signal result are
+            left out of the response.
+        - name: developer_tools
+          in: query
+          schema:
+            type: boolean
+          description: >
+            Filter events by Developer Tools detection result.
+
+            > Note: When using this parameter, only events with the
+            `developer_tools` property set to `true` or `false` are returned.
+            Events without a `developer_tools` Smart Signal result are left out
+            of the response.
+        - name: location_spoofing
+          in: query
+          schema:
+            type: boolean
+          description: >
+            Filter events by Location Spoofing detection result.
+
+            > Note: When using this parameter, only events with the
+            `location_spoofing` property set to `true` or `false` are returned.
+            Events without a `location_spoofing` Smart Signal result are left
+            out of the response.
+        - name: mitm_attack
+          in: query
+          schema:
+            type: boolean
+          description: >
+            Filter events by MITM (Man-in-the-Middle) Attack detection result.
+
+            > Note: When using this parameter, only events with the
+            `mitm_attack` property set to `true` or `false` are returned. Events
+            without a `mitm_attack` Smart Signal result are left out of the
+            response.
+        - name: rare_device
+          in: query
+          schema:
+            type: boolean
+          description: >
+            Filter events by Device Rarity detection result.
+
+            > Note: When using this parameter, only events with the
+            `rare_device` property set to `true` or `false` are returned. Events
+            without a Device Rarity Smart Signal result are left out of the
+            response.
+
+
+            > 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: >
+            Filter events by Device Rarity percentile bucket.
+
+            `<p95` - device configuration is in the bottom 95% (most common).
+
+            `p95-p99` - device is in the 95th to 99th percentile.
+
+            `p99-p99.5` - device is in the 99th to 99.5th percentile.
+
+            `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/).
+        - name: proxy
+          in: query
+          schema:
+            type: boolean
+          description: >
+            Filter events by Proxy detection result.
+
+            > Note: When using this parameter, only events with the `proxy`
+            property set to `true` or `false` are returned. Events without a
+            `proxy` Smart Signal result are left out of the response.
+        - name: sdk_version
+          in: query
+          schema:
+            type: string
+            examples:
+              - 3.11.14
+            example: 3.11.14
+          description: >
+            Filter events by a specific SDK version associated with the
+            identification event (`sdk.version` property). Example: `3.11.14`
+        - name: sdk_platform
+          in: query
+          schema:
+            $ref: '#/components/schemas/SearchEventsSdkPlatform'
+          description: >
+            Filter events by the SDK Platform associated with the identification
+            event (`sdk.platform` property) .
+
+            `js` - Javascript agent (Web).
+
+            `ios` - Apple iOS based devices.
+
+            `android` - Android based devices.
+        - name: environment
+          in: query
+          description: >
+            Filter for events by providing one or more environment IDs
+            (`environment_id` property).
+
+
+            ### Array syntax
+
+            To provide multiple environment IDs, use the repeated keys syntax
+            (`environment=env1&environment=env2`).
+
+            Other notations like comma-separated (`environment=env1,env2`) or
+            bracket notation (`environment[]=env1&environment[]=env2`) are not
+            supported.
+          required: false
+          schema:
+            type: array
+            items:
+              type: string
+              examples:
+                - ae_47abaca3db2c7c43
+              example: ae_47abaca3db2c7c43
+          style: form
+        - name: proximity_id
+          in: query
+          schema:
+            type: string
+            examples:
+              - C9rJYBlOFsAfBwQ
+            example: C9rJYBlOFsAfBwQ
+          description: >
+            Filter events by the most precise Proximity ID provided by default.
+
+            > Note: When using this parameter, only events with the
+            `proximity.id` property matching the provided ID are returned.
+            Events without a `proximity` result are left out of the response.
+        - name: total_hits
+          in: query
+          schema:
+            type: integer
+            format: int64
+            minimum: 1
+            maximum: 1000
+            examples:
+              - 100
+            example: 100
+          description: >
+            When set, the response will include a `total_hits` property with a
+            count of total query matches across all pages, up to the specified
+            limit.
+        - name: tor_node
+          in: query
+          schema:
+            type: boolean
+          description: >
+            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.
+        - name: incremental_identification_status
+          in: query
+          schema:
+            $ref: '#/components/schemas/SearchEventsIncrementalIdentificationStatus'
+          description: >
+            Filter events by their incremental identification status
+            (`incremental_identification_status` property). Non incremental
+            identification events are left out of the response.
+        - name: simulator
+          in: query
+          schema:
+            type: boolean
+          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.
+        - 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
+          schema:
+            type: array
+            maxItems: 1
+            items:
+              $ref: '#/components/schemas/SearchEventsSource'
+          description: >
+            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.
+      responses:
+        '200':
+          description: Events matching the filter(s).
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/EventSearch'
+        '400':
+          description: >-
+            Bad request. One or more supplied search parameters are invalid, or
+            a required parameter is missing.
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ErrorResponse'
+        '403':
+          description: Forbidden. Access to this API is denied.
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ErrorResponse'
+        '404':
+          description: >-
+            Not found. The requested visitor does not exist in this workspace's
+            data.
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ErrorResponse'
+        '429':
+          description: >
+            Too Many Requests. The request is throttled.
+
+            To protect service stability during rare periods of extreme load, we
+            may return HTTP 429 responses with message `too many search
+            requests` even if you are within your assigned rate limits.
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ErrorResponse'
+        '500':
+          description: Workspace error.
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ErrorResponse'
+        '504':
+          description: >-
+            Gateway Timeout. Search execution exceeded the allowed timeout
+            window.
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ErrorResponse'
+  /visitors/{visitor_id}:
+    delete:
+      tags:
+        - Fingerprint
+      operationId: deleteVisitorData
+      summary: Delete a visitor ID
+      description: >
+        Use this API to request the deletion of all data associated with a
+        specific visitor ID.
+
+
+        Upon a request to delete data for a visitor ID,
+
+        - The data collected from the corresponding browser (or device) will be
+        deleted asynchronously, typically within a few minutes. This data will
+        no longer be available to identify this browser (or device). When the
+        same browser (or device) revisits, it will receive a new visitor ID.
+
+        - The identification events made from this browser (or device) in the
+        past 10 days are typically deleted within 24 hrs. 
+
+        - The identification events made from this browser (or device) outside
+        of the 10 days will be purged as per your [data retention
+        period](https://docs.fingerprint.com/docs/regions#data-retention).
+
+
+        The following timeline illustrates which events are deleted and which
+        remain after a DELETE API request:
+
+        ```
+
+        Day 1:  First visit from browser A. (Assigned visitor ID: VID1000)
+
+        Day 2:  Browser A revisits. (Assigned the same visitor ID: VID1000)
+
+        Day 13: Browser A revisits. (Assigned the same visitor ID: VID1000)
+
+        Day 14: Delete VID1000
+
+        Day 15: Browser A re-visits. (Assigned a different visitor ID: VID9999)
+
+        Day 15: GET /events/day-13 (Returns 404. The event is within the 10 days
+        of deleting VID1000 and will have been deleted)
+
+        Day 16: GET /events/day-2 (Returns 200. The event is outside of the 10
+        days of deleting VID1000 and is still available)
+
+        ```
+
+
+        ### Availability
+
+        This API is available only for Enterprise plans **upon request**. If you
+        are interested, please [contact our support
+        team](https://fingerprint.com/support/).
+
+
+        ### Rate limits and daily quota
+
+        The rate limits and daily quota for this API **differ** from those for
+        our other API.
+
+
+        The maximum number of DELETE requests that can be made in an hour cannot
+        exceed 30 RPH, and the maximum number that can be made in a day cannot
+        exceed 500 RPD.
+
+
+        You can request an increase to these limits by contacting [our support
+        team](https://fingerprint.com/support/).    
+      parameters:
+        - name: visitor_id
+          in: path
+          required: true
+          schema:
+            type: string
+            examples:
+              - Ibk1527CUFmcnjLwIs4A9
+            example: Ibk1527CUFmcnjLwIs4A9
+          description: >-
+            The [visitor
+            ID](https://docs.fingerprint.com/reference/js-agent-get-function#visitor_id)
+            you want to delete.
+      responses:
+        '200':
+          description: OK. The visitor ID is scheduled for deletion.
+        '400':
+          description: >-
+            Bad request. The visitor ID parameter is missing or in the wrong
+            format.
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ErrorResponse'
+        '403':
+          description: Forbidden. Access to this API is denied.
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ErrorResponse'
+        '404':
+          description: Not found. The visitor ID cannot be found in this workspace's data.
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ErrorResponse'
+        '429':
+          description: Too Many Requests. The request is throttled.
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ErrorResponse'
+components:
+  securitySchemes:
+    bearerAuth:
+      type: http
+      scheme: bearer
+      bearerFormat: string
+      description: >-
+        Add your Secret API Key to the Authorization header using the standard
+        Bearer format: `Authorization: Bearer <secret_api_key>`
+  schemas:
+    LinkedId:
+      type: string
+      examples:
+        - somelinkedId
+      description: A customer-provided id that was sent with the request.
+    Tags:
+      type: object
+      description: >-
+        A customer-provided value or an object that was sent with the
+        identification request or updated later.
+      additionalProperties: true
+      required: []
+    EdgeRequest:
+      type: object
+      description: >-
+        HTTP request metadata (including the HTTP method, headers and IP
+        address) sent by you (your server) to the Fingerprint API for IP and bot
+        analysis. To improve accuracy, retain as much of the original semantics
+        of the HTTP request as possible. For example, preserve the order of the
+        request headers and their capitalization.
+
+        At least one of `ipv4_address` or `ipv6_address` must be provided; a
+        request with neither is rejected with a `400` error. If both IPv4 and
+        IPv6 are provided, IP intelligence will be provided for each address. If
+        an IPv4-mapped IPv6 address is provided in the `ipv6_address` request
+        property, the IP intelligence will be provided in the `ipv4_address`
+        property of the response.
+      example:
+        method: GET
+        url: https://example.com/login
+        ipv4_address: 34.162.244.71
+        headers:
+          - name: Host
+            value: example.com
+          - name: User-Agent
+            value: Mozilla/5.0
+          - name: Authorization
+            value: ''
+      required:
+        - headers
+        - method
+        - url
+      properties:
+        headers:
+          type: array
+          description: >
+            Ordered header entries from the request made to your server. Each
+            entry represents one header line. If one header name appears as
+            multiple lines, send each as a separate item in the array.
+
+
+            Headers that contain authentication or session data must still be
+            included, but with their value set to an empty string. This includes
+            headers like `Authorization` and `Cookie`, but may contain more
+            depending on your specific project, for instance
+            `Proxy-Authenticate` or `X-Api-Key`. Omitting the headers entirely
+            changes the shape of the request and can affect detection. Never
+            forward the real secret values.
+
+
+            Whenever possible, we recommend preserving header order and
+            capitalization to provide the best accuracy, however it’s not a
+            strict requirement if your runtime does not maintain http header
+            order or canonicalizes header names.
+          minItems: 1
+          items:
+            type: object
+            required:
+              - name
+              - value
+            properties:
+              name:
+                type: string
+                examples:
+                  - User-Agent
+                description: >-
+                  Header name as forwarded by your server. Headers must be valid
+                  according to RFC 7230 and will be canonicalized according to
+                  RFC 9112.
+              value:
+                type: string
+                examples:
+                  - Mozilla/5.0
+                description: >-
+                  Value of a single forwarded header entry. Be careful to
+                  preserve the original encoding and escaping. For example, do
+                  not double escape quotes.
+          examples:
+            - - name: Host
+                value: example.com
+              - name: User-Agent
+                value: Mozilla/5.0
+              - name: Accept-Language
+                value: en-US,en;q=0.9
+            - - name: Host
+                value: example.com
+              - name: User-Agent
+                value: Mozilla/5.0
+              - name: Accept-Encoding
+                value: gzip
+              - name: Accept-Encoding
+                value: deflate
+        method:
+          type: string
+          description: >-
+            The original HTTP method of the request. If supported in your
+            runtime, preserve the original casing.
+          examples:
+            - GET
+            - POST
+            - PUT
+            - PATCH
+            - DELETE
+        url:
+          type: string
+          description: >-
+            Absolute URL of the request, without a \#fragment suffix. Only HTTP
+            and HTTPS schemes are supported.
+          format: uri
+          examples:
+            - http://example.com
+            - https://example.com/checkout?method=card
+        ipv4_address:
+          type: string
+          description: Client IPv4 address observed by your server.
+          format: ipv4
+          examples:
+            - 34.162.244.71
+            - 3.208.0.3
+            - 173.56.0.4
+        ipv6_address:
+          type: string
+          description: Client IPv6 address observed by your server.
+          format: ipv6
+          examples:
+            - 2001:4860:4801:10::1
+            - 2600:1f42:abcd:5678:9876:fedc:1357:2468
+            - 2001:4868:85f:1a2b:3c4d:5e6f:7890:abcd
+            - ::ffff:22a2:f447
+            - ::ffff:34.162.244.71
+        linked_id:
+          $ref: '#/components/schemas/LinkedId'
+        tags:
+          $ref: '#/components/schemas/Tags'
+    EventId:
+      type: string
+      examples:
+        - 1708102555327.NLOjmg
+      description: >
+        Unique identifier of the user's request. The first portion of the
+        event_id is a unix epoch milliseconds timestamp.
+    Timestamp:
+      description: Timestamp of the event with millisecond precision in Unix time.
+      type: integer
+      format: int64
+      examples:
+        - 1708102555327
+    Url:
+      type: string
+      examples:
+        - https://www.example.com/login
+      description: Page URL from which the request was sent.
+    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.
+      required:
+        - category
+        - provider
+        - name
+        - identity
+        - confidence
+      properties:
+        category:
+          type: string
+          description: |
+            The type and purpose of the bot.
+        provider:
+          type: string
+          description: The organization or company operating the bot.
+          examples:
+            - Anthropic
+            - Browserbase
+            - Google
+            - OpenAI
+        provider_url:
+          type: string
+          examples:
+            - https://chatgpt.com
+          description: The URL of the bot provider's website.
+        name:
+          type: string
+          description: The specific name or identifier of the bot.
+          examples:
+            - ClaudeBot
+            - Browserbase Agent
+            - Googlebot
+            - GPTBot
+            - ChatGPT-User
+        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.
+        confidence:
+          type: string
+          enum:
+            - low
+            - medium
+            - high
+          description: Confidence level of the bot identification.
+    Geolocation:
+      type: object
+      required: []
+      properties:
+        accuracy_radius:
+          type: integer
+          examples:
+            - 20
+          minimum: 0
+          description: >-
+            The IP address is likely to be within this radius (in km) of the
+            specified location.
+        latitude:
+          type: number
+          format: double
+          examples:
+            - 50.05
+          minimum: -90
+          maximum: 90
+        longitude:
+          type: number
+          format: double
+          examples:
+            - 14.4
+          minimum: -180
+          maximum: 180
+        postal_code:
+          type: string
+          examples:
+            - 150 00
+        timezone:
+          type: string
+          format: timezone
+          examples:
+            - Europe/Prague
+        city_name:
+          type: string
+          examples:
+            - Prague
+        country_code:
+          type: string
+          examples:
+            - CZ
+          minLength: 2
+          maxLength: 2
+        country_name:
+          type: string
+          examples:
+            - Czechia
+        continent_code:
+          type: string
+          examples:
+            - EU
+          minLength: 2
+          maxLength: 2
+        continent_name:
+          type: string
+          examples:
+            - Europe
+        subdivisions:
+          type: array
+          items:
+            type: object
+            required:
+              - iso_code
+              - name
+            properties:
+              iso_code:
+                type: string
+                examples:
+                  - '10'
+              name:
+                type: string
+                examples:
+                  - Hlavni mesto Praha
+    IPInfoV4:
+      type: object
+      required:
+        - address
+      properties:
+        address:
+          type: string
+          format: ipv4
+          examples:
+            - 94.142.239.124
+        geolocation:
+          $ref: '#/components/schemas/Geolocation'
+        asn:
+          type: string
+          examples:
+            - '396982'
+            - '16509'
+            - '701'
+        asn_name:
+          type: string
+          examples:
+            - Google LLC
+            - Amazon.com, Inc.
+            - Verizon Business
+        asn_network:
+          type: string
+          examples:
+            - 34.160.0.0/12
+            - 3.208.0.0/12
+            - 173.56.0.0/16
+        asn_type:
+          type: string
+          examples:
+            - hosting
+            - isp
+            - business
+            - education
+        datacenter_result:
+          type: boolean
+          description: When true, the request originated from a datacenter.
+        datacenter_name:
+          type: string
+          examples:
+            - Google Cloud
+            - Amazon AWS
+    IPInfoV6:
+      type: object
+      required:
+        - address
+      properties:
+        address:
+          type: string
+          format: ipv6
+          examples:
+            - 2001:db8:3333:4444:5555:6666:7777:8888
+        geolocation:
+          $ref: '#/components/schemas/Geolocation'
+        asn:
+          type: string
+          examples:
+            - '396982'
+            - '16509'
+            - '701'
+        asn_name:
+          type: string
+          examples:
+            - Google LLC
+            - Amazon.com, Inc.
+            - Verizon Business
+        asn_network:
+          type: string
+          examples:
+            - 2001:4860:4801:10::/64
+            - 2600:1f00::/24
+            - 2001:4868:800::/40
+        asn_type:
+          type: string
+          examples:
+            - hosting
+            - isp
+            - business
+            - education
+        datacenter_result:
+          type: boolean
+          description: When true, the request originated from a datacenter.
+        datacenter_name:
+          type: string
+          examples:
+            - Google Cloud
+            - Amazon AWS
+    IPInfo:
+      type: object
+      description: >-
+        Details about the request IP address. Has separate fields for v4 and v6
+        IP address versions.
+      required: []
+      properties:
+        v4:
+          $ref: '#/components/schemas/IPInfoV4'
+        v6:
+          $ref: '#/components/schemas/IPInfoV6'
+    Proxy:
+      type: boolean
+      description: >
+        IP address was used by a public proxy provider or belonged to a known
+        recent residential proxy
+    ProxyConfidence:
+      type: string
+      enum:
+        - low
+        - medium
+        - high
+      description: >
+        Confidence level of the proxy detection. If a proxy is not detected,
+        confidence is "high". If it's detected, can be "low", "medium", or
+        "high".
+    ProxyDetails:
+      type: object
+      description: Proxy detection details (present if `proxy` is `true`)
+      required:
+        - proxy_type
+      properties:
+        proxy_type:
+          type: string
+          enum:
+            - residential
+            - data_center
+            - unknown
+          description: |
+            Proxy type:
+             * `residential` - proxies that route through residential and telecom IP addresses to appear as legitimate traffic
+             * `data_center` - proxies which route through data centers
+             * `unknown` - reported when a proxy is detected solely by the ML model and the IP sources did not determine a specific type
+        last_seen_at:
+          type: integer
+          format: int64
+          examples:
+            - 1708102555327
+          description: >
+            Unix millisecond timestamp with hourly resolution of when this IP
+            was last seen as a proxy
+        provider:
+          type: string
+          examples:
+            - Massive
+          description: >
+            String representing the last proxy service provider detected when
+            this
+
+            IP was synced. An IP can be shared by multiple service providers.
+    Vpn:
+      type: boolean
+      description: |
+        VPN or other anonymizing service has been used when sending the request.
+    VpnConfidence:
+      type: string
+      enum:
+        - low
+        - medium
+        - high
+      description: >-
+        A confidence rating for the VPN detection result — "low", "medium", or
+        "high". Depends on the combination of results returned from all VPN
+        detection methods.
+    VpnMethods:
+      type: object
+      required: []
+      properties:
+        timezone_mismatch:
+          type: boolean
+          x-platforms:
+            - android
+            - ios
+            - browser
+          description: >-
+            The browser timezone doesn't match the timezone inferred from the
+            request IP address.
+        public_vpn:
+          type: boolean
+          x-platforms:
+            - android
+            - ios
+            - browser
+          description: >-
+            Request IP address is owned and used by a public VPN service
+            provider.
+        auxiliary_mobile:
+          type: boolean
+          x-platforms:
+            - android
+            - ios
+            - browser
+          description: >-
+            This method applies to mobile devices only. Indicates the result of
+            additional methods used to detect a VPN in mobile devices.
+        os_mismatch:
+          type: boolean
+          x-platforms:
+            - browser
+          description: >-
+            The browser runs on a different operating system than the operating
+            system inferred from the request network signature.
+        relay:
+          type: boolean
+          x-platforms:
+            - android
+            - ios
+            - browser
+          description: >
+            Request IP address belongs to a relay service provider, indicating
+            the use of relay services like [Apple Private
+            relay](https://support.apple.com/en-us/102602) or [Cloudflare
+            Warp](https://developers.cloudflare.com/warp-client/).
+
+
+            * Like VPNs, relay services anonymize the visitor's true IP address.
+
+            * Unlike traditional VPNs, relay services don't let visitors spoof
+            their location by choosing an exit node in a different country.
+
+
+            This field allows you to differentiate VPN users and relay service
+            users in your fraud prevention logic.
+        ml_prediction:
+          type: boolean
+          x-platforms:
+            - browser
+          description: >
+            `true` if the request came from a device running a VPN, `false`
+            otherwise.  
+    EventSource:
+      type: string
+      description: >
+        Identifies how the event was generated.
+
+        - `device` - the event was generated by the JS agent or a mobile SDK
+        running on an end-user device.
+
+        - `edge` - the event was generated by the Automation Intelligence API
+        (`/edge` endpoint), analyzing a request intercepted at the edge.
+      enum:
+        - device
+        - edge
+    EventEdge:
+      type: object
+      description: >
+        IP and bot analysis for an event generated by the Automation
+        Intelligence API (`/edge` endpoint). No client-side collection agent is
+        involved, so Identification (`visitor_id`) and device-telemetry-derived
+        Smart Signals are not available.
+      properties:
+        event_id:
+          $ref: '#/components/schemas/EventId'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        timestamp:
+          $ref: '#/components/schemas/Timestamp'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        linked_id:
+          $ref: '#/components/schemas/LinkedId'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        tags:
+          $ref: '#/components/schemas/Tags'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        url:
+          $ref: '#/components/schemas/Url'
+        bot_info:
+          $ref: '#/components/schemas/BotInfo'
+        ip_info:
+          $ref: '#/components/schemas/IPInfo'
+        proxy:
+          $ref: '#/components/schemas/Proxy'
+        proxy_confidence:
+          $ref: '#/components/schemas/ProxyConfidence'
+        proxy_details:
+          $ref: '#/components/schemas/ProxyDetails'
+        vpn:
+          $ref: '#/components/schemas/Vpn'
+        vpn_confidence:
+          $ref: '#/components/schemas/VpnConfidence'
+        vpn_methods:
+          $ref: '#/components/schemas/VpnMethods'
+        source:
+          $ref: '#/components/schemas/EventSource'
+          const: edge
+      required:
+        - event_id
+        - timestamp
+        - source
+        - ip_info
+    ErrorCode:
+      type: string
+      enum:
+        - request_cannot_be_parsed
+        - request_read_timeout
+        - secret_api_key_required
+        - secret_api_key_not_found
+        - public_api_key_required
+        - public_api_key_not_found
+        - subscription_not_active
+        - wrong_region
+        - feature_not_enabled
+        - visitor_not_found
+        - too_many_requests
+        - state_not_ready
+        - failed
+        - event_not_found
+        - missing_module
+        - payload_too_large
+        - service_unavailable
+        - ruleset_not_found
+      description: >
+        Error code:
+
+        * `request_cannot_be_parsed` - The query parameters or JSON payload
+        contains some errors
+          that prevented us from parsing it (wrong type/surpassed limits).
+        * `request_read_timeout` - The request body could not be read before the
+        connection timed out.
+
+        * `secret_api_key_required` - secret API key in header is missing or
+        empty.
+
+        * `secret_api_key_not_found` - No Fingerprint workspace found for
+        specified secret API key.
+
+        * `public_api_key_required` - public API key in header is missing or
+        empty.
+
+        * `public_api_key_not_found` - No Fingerprint workspace found for
+        specified public API key.
+
+        * `subscription_not_active` - Fingerprint workspace is not active.
+
+        * `wrong_region` - Server and workspace region differ.
+
+        * `feature_not_enabled` - This feature (for example, Delete API) is not
+        enabled for your workspace.
+
+        * `visitor_not_found` - The specified visitor ID was not found. It never
+        existed or it may have already been deleted.
+
+        * `too_many_requests` - The limit on secret API key requests per second
+        has been exceeded.
+
+        * `state_not_ready` - The event specified with event ID is
+          not ready for updates yet. Try again.
+          This error happens in rare cases when update API is called immediately
+          after receiving the event ID on the client. In case you need to send
+          information right away, we recommend using the JS agent API instead.
+        * `failed` - Internal server error.
+
+        * `event_not_found` - The specified event ID was not found. It never
+        existed, expired, or it has been deleted.
+
+        * `missing_module` - The request is invalid because it is missing a
+        required module.
+
+        * `payload_too_large` - The request payload is too large and cannot be
+        processed.
+
+        * `service_unavailable` - The service was unable to process the request.
+
+        * `ruleset_not_found` - The specified ruleset was not found. It never
+        existed or it has been deleted.
+    Error:
+      type: object
+      required:
+        - code
+        - message
+      properties:
+        code:
+          $ref: '#/components/schemas/ErrorCode'
+        message:
+          type: string
+          examples:
+            - Forbidden
+    ErrorResponse:
+      type: object
+      required:
+        - error
+      properties:
+        error:
+          $ref: '#/components/schemas/Error'
+    IncrementalIdentificationStatus:
+      type: string
+      description: >
+        Only included for requests using incremental identification.
+
+        - `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:
+        - partially_completed
+        - completed
+    EnvironmentId:
+      type: string
+      examples:
+        - ae_47abaca3db2c7c43
+      description: Environment Id of the event.
+    Suspect:
+      type: boolean
+      description: >-
+        Field is `true` if you have previously set the `suspect` flag for this
+        event using the [Server API Update event
+        endpoint](https://docs.fingerprint.com/reference/server-api-update-event).
+    Integration:
+      type: object
+      required: []
+      properties:
+        name:
+          type: string
+          examples:
+            - fingerprint-pro-react
+          description: The name of the specific integration.
+        version:
+          type: string
+          examples:
+            - 3.11.10
+          description: The version of the specific integration.
+        subintegration:
+          type: object
+          required: []
+          properties:
+            name:
+              type: string
+              examples:
+                - preact
+              description: The name of the specific subintegration.
+            version:
+              type: string
+              examples:
+                - 10.21.0
+              description: The version of the specific subintegration.
+    SDK:
+      type: object
+      description: Contains information about the SDK used to perform the request.
+      required:
+        - platform
+        - version
+      properties:
+        platform:
+          type: string
+          enum:
+            - js
+            - android
+            - ios
+            - unknown
+          description: Platform of the SDK used for the identification request.
+        version:
+          type: string
+          examples:
+            - 3.11.10
+          description: Version string of the SDK used for the identification request.
+        integrations:
+          type: array
+          items:
+            $ref: '#/components/schemas/Integration'
+    Replayed:
+      type: boolean
+      description: >
+        `true` if we determined that this payload was replayed, `false`
+        otherwise.
+    IdentificationConfidence:
+      type: object
+      description: >-
+        The confidence score represents the probability of a false-positive
+        identification. To learn more, visit [Confidence
+        Score](https://docs.fingerprint.com/docs/identification-accuracy-and-confidence#confidence-score).
+        Please note that the confidence score is not yet supported for [High
+        Recall
+        ID](https://docs.fingerprint.com/docs/supplementary-identifiers-highrecall). 
+      required:
+        - score
+      properties:
+        score:
+          type: number
+          format: double
+          examples:
+            - 0.97
+          minimum: 0
+          maximum: 1
+          description: >-
+            A floating-point number between 0 and 1 that represents the
+            probability of a false-positive identification. For High Recall ID,
+            this value is 0. 
+        version:
+          type: string
+          examples:
+            - '1.1'
+          description: >-
+            The version name of the method used to calculate the confidence
+            score. For High Recall ID, this value is "Not Supported". 
+        comment:
+          type: string
+          examples:
+            - Low confidence due to bot signals
+    Identification:
+      type: object
+      required:
+        - visitor_id
+        - visitor_found
+      properties:
+        visitor_id:
+          type: string
+          examples:
+            - Ibk1527CUFmcnjLwIs4A9
+          description: >-
+            String of 20 characters that uniquely identifies the visitor's
+            browser or mobile device.
+        confidence:
+          $ref: '#/components/schemas/IdentificationConfidence'
+        visitor_found:
+          type: boolean
+          description: Attribute represents if a visitor had been identified before.
+        first_seen_at:
+          type: integer
+          format: int64
+          examples:
+            - 1708102555327
+          description: >
+            Unix epoch time milliseconds timestamp indicating the time at which
+            this visitor ID was first seen. example: `1758069706642` -
+            Corresponding to Wed Sep 17 2025 00:41:46 GMT+0000
+        last_seen_at:
+          type: integer
+          format: int64
+          examples:
+            - 1708102555327
+          description: >
+            Unix epoch time milliseconds timestamp indicating the time at which
+            this visitor ID was last seen. example: `1758069706642` -
+            Corresponding to Wed Sep 17 2025 00:41:46 GMT+0000
+    SupplementaryIDHighRecall:
+      type: object
+      description: >-
+        The High Recall ID is a supplementary browser identifier designed for
+        use cases that require wider coverage over precision. Compared to the
+        standard visitor ID, the High Recall ID strives to match incoming
+        browsers more generously (rather than precisely) with existing browsers
+        and thus identifies fewer browsers as new. The High Recall ID is best
+        suited for use cases that are sensitive to browsers being identified as
+        new and where mismatched browsers are not detrimental.
+      required:
+        - visitor_id
+        - visitor_found
+      properties:
+        visitor_id:
+          type: string
+          examples:
+            - 0jnGMkPYXX37DqVa4ZIO3f_hr
+          description: >-
+            The High Recall identifier for the visitor's browser. It is an
+            alphanumeric string with a maximum length of 25 characters.
+        visitor_found:
+          type: boolean
+          description: >-
+            True if this is a returning browser and has been previously
+            identified. Otherwise, false.
+        confidence:
+          $ref: '#/components/schemas/IdentificationConfidence'
+        first_seen_at:
+          type: integer
+          format: int64
+          examples:
+            - 1778086556130
+          description: >
+            Unix epoch timestamp (in milliseconds) indicating when the browser
+            was first identified. example: `1758069706642` - Corresponding to
+            Wed Sep 17 2025 00:41:46 GMT+0000
+        last_seen_at:
+          type: integer
+          format: int64
+          examples:
+            - 1778604975494
+          description: >
+            Unix epoch timestamp (in milliseconds) corresponding to the most
+            recent visit by this browser. example: `1758069706642` -
+            Corresponding to Wed Sep 17 2025 00:41:46 GMT+0000
+    BundleId:
+      type: string
+      examples:
+        - com.foo.app
+      description: >
+        Bundle Id of the iOS application integrated with the Fingerprint SDK for
+        the event.
+    PackageName:
+      type: string
+      examples:
+        - com.foo.app
+      description: >
+        Package name of the Android application integrated with the Fingerprint
+        SDK for the event.
+    IpAddress:
+      type: string
+      examples:
+        - 61.127.217.15
+      description: IP address of the requesting browser or bot.
+    UserAgent:
+      type: string
+      examples:
+        - Mozilla/5.0 (Windows NT 6.1; Win64; x64) ....
+      description: User Agent of the client.
+    Device:
+      type: string
+      examples:
+        - Generic Smartphone
+        - Desktop
+        - iPhone
+      description: >
+        Device model or family extracted from the user agent string. On web,
+        this field is also present inside `browser_details`.
+    Os:
+      type: string
+      examples:
+        - Windows
+        - iOS
+        - Android
+      description: >
+        Operating system family extracted from the user agent string. On web,
+        this field is also present inside `browser_details`.
+    OsVersion:
+      type: string
+      examples:
+        - '17.4'
+        - '14'
+        - '10'
+      description: >
+        Operating system version string extracted from the user agent string. On
+        web, this field is also present inside `browser_details`.
+    ClientReferrer:
+      type: string
+      examples:
+        - https://example.com/blog/my-article
+      description: >
+        Client Referrer field corresponds to the `document.referrer` field
+        gathered during an identification request. The value is an empty string
+        if the user navigated to the page directly (not through a link, but, for
+        example, by using a bookmark).
+    BrowserDetails:
+      type: object
+      required:
+        - browser_name
+        - browser_full_version
+        - browser_major_version
+        - os
+        - os_version
+        - device
+      properties:
+        browser_name:
+          type: string
+          examples:
+            - Chrome
+        browser_major_version:
+          type: string
+          examples:
+            - '74'
+        browser_full_version:
+          type: string
+          examples:
+            - 74.0.3729
+        os:
+          type: string
+          examples:
+            - Windows
+        os_version:
+          type: string
+          examples:
+            - '7'
+        device:
+          type: string
+          examples:
+            - Other
+    Proximity:
+      type: object
+      description: >
+        Proximity ID represents a fixed geographical zone in a discrete global
+        grid within which the device is observed.
+      required:
+        - id
+        - precision_radius
+        - confidence
+      properties:
+        id:
+          type: string
+          examples:
+            - w1aTfd4MCvl
+          description: |
+            A stable privacy-preserving identifier for a given proximity zone.
+        precision_radius:
+          type: integer
+          format: int32
+          enum:
+            - 10
+            - 25
+            - 65
+            - 175
+            - 450
+            - 1200
+            - 3300
+            - 8500
+            - 22500
+          description: |
+            The radius of the proximity zone’s precision level, in meters.
+        confidence:
+          type: number
+          format: float
+          examples:
+            - 0.95
+          minimum: 0
+          maximum: 1
+          description: >
+            A value between `0` and `1` representing the likelihood that the
+            true device location lies within the mapped proximity zone.
+              * Scores closer to `1` indicate high confidence that the location is inside the mapped proximity zone.
+              * Scores closer to `0` indicate lower confidence, suggesting the true location may fall in an adjacent zone.
+    ActiveCall:
+      type: boolean
+      description: >
+        Indicates whether the mobile device had an active call (cellular or
+        VoIP) at the time of the request. Available from SDK 2.16.0+ on iOS and
+        Android.
+    BotResult:
+      type: string
+      enum:
+        - bad
+        - good
+        - not_detected
+      description: |
+        Bot detection result:
+         * `bad` - bad bot detected, such as Selenium, Puppeteer, Playwright, headless browsers, and so on
+         * `good` - good bot detected, such as Google bot, Baidu Spider, AlexaBot and so on
+         * `not_detected` - the visitor is not a bot
+    BotType:
+      type: string
+      examples:
+        - chatgpt_agent
+      description: |
+        Additional classification of the bot type if detected.
+    ClonedApp:
+      type: boolean
+      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.
+    DeveloperTools:
+      type: boolean
+      description: >
+        `true` if the browser has DevTools open (Chrome, Firefox) or the
+        Android/iOS device has Developer Tools enabled, `false` otherwise.
+    Emulator:
+      type: boolean
+      description: >
+        Android specific emulator detection. There are 2 values: 
+
+        * `true` - Emulated environment detected (e.g. launch inside of AVD). 
+
+        * `false` - No signs of emulated environment detected or the client is
+        not Android.
+    FactoryReset:
+      type: integer
+      format: int64
+      examples:
+        - 1708102555327
+      description: >
+        The time of the most recent factory reset that happened on the **mobile
+        device** is expressed as Unix epoch time. When a factory reset cannot be
+        detected on the mobile device or when the request is initiated from a
+        browser,  this field will correspond to the *epoch* time (i.e 1 Jan 1970
+        UTC) as a value of 0. See [Factory Reset
+        Detection](https://docs.fingerprint.com/docs/smart-signals-reference#factory-reset-detection)
+        to learn more about this Smart Signal.
+    Frida:
+      type: boolean
+      description: >
+        [Frida](https://frida.re/docs/) detection for Android and iOS devices.
+        There are 2 values:
+
+        * `true` - Frida detected
+
+        * `false` - No signs of Frida or the client is not a mobile device.
+    IPBlockList:
+      type: object
+      required: []
+      properties:
+        email_spam:
+          type: boolean
+          description: IP address was part of a known email spam attack (SMTP).
+        attack_source:
+          type: boolean
+          description: IP address was part of a known network attack (SSH/HTTPS).
+        tor_node:
+          type: boolean
+          description: IP address was part of known TOR network activity.
+    ProxyMLScore:
+      type: number
+      format: double
+      examples:
+        - 0.2
+      minimum: 0
+      maximum: 1
+      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/).
+    Incognito:
+      type: boolean
+      description: >
+        `true` if we detected incognito mode used in the browser, `false`
+        otherwise.
+    Jailbroken:
+      type: boolean
+      description: |
+        iOS specific jailbreak detection. There are 2 values: 
+        * `true` - Jailbreak detected.
+        * `false` - No signs of jailbreak or the client is not iOS.
+    LocationSpoofing:
+      type: boolean
+      description: >-
+        Flag indicating whether the request came from a mobile device with
+        location spoofing enabled.
+    MitMAttack:
+      type: boolean
+      description: >
+        * `true` - When requests made from your users' mobile devices to
+        Fingerprint servers have been intercepted and potentially modified. 
+
+        * `false` - Otherwise or when the request originated from a browser.
+
+        See [MitM Attack
+        Detection](https://docs.fingerprint.com/docs/smart-signals-reference#mitm-attack-detection)
+        to learn more about this Smart Signal.
+    PrivacySettings:
+      type: boolean
+      description: >
+        `true` if the request is from a privacy aware browser (e.g. Tor) or from
+        a browser in which fingerprinting is blocked. Otherwise `false`.
+    RootApps:
+      type: boolean
+      description: >
+        Android specific root management apps detection. There are 2 values: 
+
+        * `true` - Root Management Apps detected (e.g. Magisk).
+
+        * `false` - No Root Management Apps detected or the client isn't
+        Android.
+    RulesetId:
+      type: string
+      examples:
+        - rs_b1k1blhqpOX3kU
+      description: The ID of the evaluated ruleset.
+    RuleId:
+      type: string
+      examples:
+        - r_uE0af8497PFAOD
+      description: The ID of the rule that matched the identification event.
+    RuleExpression:
+      type: string
+      examples:
+        - bot in ["bad"] || incognito
+      description: The expression of the rule that matched the identification event.
+    RuleActionType:
+      type: string
+      description: Describes the action to take with the request.
+      enum:
+        - allow
+        - block
+    RuleActionHeaderField:
+      type: object
+      required:
+        - name
+        - value
+      properties:
+        name:
+          type: string
+          examples:
+            - Content-Type
+          description: The header field name.
+        value:
+          type: string
+          examples:
+            - application/json
+          description: The value of the header field.
+    RequestHeaderModifications:
+      type: object
+      description: >-
+        The set of header modifications to apply, in the following order:
+        remove, set, append.
+      required: []
+      properties:
+        remove:
+          type: array
+          description: The list of headers to remove.
+          items:
+            type: string
+            examples:
+              - X-Forwarded-For
+        set:
+          type: array
+          description: >-
+            The list of headers to set, overwriting any existing headers with
+            the same name.
+          items:
+            $ref: '#/components/schemas/RuleActionHeaderField'
+        append:
+          type: array
+          description: The list of headers to append.
+          items:
+            $ref: '#/components/schemas/RuleActionHeaderField'
+    EventRuleActionAllow:
+      description: >-
+        Informs the client that the request should be forwarded to the origin
+        with optional request header modifications.
+      type: object
+      properties:
+        ruleset_id:
+          $ref: '#/components/schemas/RulesetId'
+        rule_id:
+          $ref: '#/components/schemas/RuleId'
+        rule_expression:
+          $ref: '#/components/schemas/RuleExpression'
+        type:
+          allOf:
+            - $ref: '#/components/schemas/RuleActionType'
+            - const: allow
+        request_header_modifications:
+          $ref: '#/components/schemas/RequestHeaderModifications'
+      required:
+        - ruleset_id
+        - type
+    StatusCode:
+      type: integer
+      examples:
+        - 200
+      description: A valid HTTP status code.
+    RuleActionBody:
+      type: string
+      examples:
+        - '{"title":"Forbidden"}'
+      description: The response body to send to the client.
+    EventRuleActionBlock:
+      description: >-
+        Informs the client the request should be blocked using the response
+        described by this rule action.
+      type: object
+      properties:
+        ruleset_id:
+          $ref: '#/components/schemas/RulesetId'
+        rule_id:
+          $ref: '#/components/schemas/RuleId'
+        rule_expression:
+          $ref: '#/components/schemas/RuleExpression'
+        type:
+          allOf:
+            - $ref: '#/components/schemas/RuleActionType'
+            - const: block
+        status_code:
+          $ref: '#/components/schemas/StatusCode'
+        headers:
+          type: array
+          description: A list of headers to send.
+          items:
+            $ref: '#/components/schemas/RuleActionHeaderField'
+        body:
+          $ref: '#/components/schemas/RuleActionBody'
+      required:
+        - ruleset_id
+        - type
+    EventRuleAction:
+      type: object
+      description: >-
+        Describes the action the client should take, according to the rule in
+        the ruleset that matched the event. When getting an event by event ID,
+        the rule_action will only be included when the ruleset_id query
+        parameter is specified.
+      oneOf:
+        - $ref: '#/components/schemas/EventRuleActionAllow'
+        - $ref: '#/components/schemas/EventRuleActionBlock'
+      discriminator:
+        propertyName: type
+        mapping:
+          allow: '#/components/schemas/EventRuleActionAllow'
+          block: '#/components/schemas/EventRuleActionBlock'
+    Simulator:
+      type: boolean
+      description: |
+        iOS specific simulator detection. There are 2 values:
+        * `true` - Simulator environment detected.
+        * `false` - No signs of simulator or the client is not iOS.
+    SuspectScore:
+      type: integer
+      examples:
+        - 8
+      description: >
+        Suspect Score is an easy way to integrate Smart Signals into your fraud
+        protection work flow.  It is a weighted representation of all Smart
+        Signals present in the payload that helps identify suspicious activity.
+        The value range is [0; S] where S is sum of all Smart Signals weights. 
+        See more details here: https://docs.fingerprint.com/docs/suspect-score
+    Tampering:
+      type: boolean
+      description: >
+        The field can be used as a standalone flag for tampering detection.
+        Alternatively, the more granular fields documented below can be used for
+        workflows that require more context.
+
+        * `true` if tampering is detected through an anomalous browser
+        signature, anti-detect browser detection, or other tampering-related
+        methods
+
+        * `false` if none of the tampering checks return a positive result
+    TamperingConfidence:
+      type: string
+      enum:
+        - low
+        - medium
+        - high
+      description: >
+        The confidence level indicates how certain Fingerprint is that the
+        current request involves browser tampering. This confidence level is
+        determined by evaluating multiple factors, such as heuristic rules,
+        probabilistic anomaly detection, an anti detect browser ml model, and
+        other relevant methods. It is conveyed as a string with possible values
+        such as high, medium, or low
+
+        In case of tampering: `true`
+
+        * **High confidence**: heuristic anti detect browser signals and the ml
+        model are triggered, or all of the methods are triggered.
+
+        * **Medium confidence**: either the ml model triggers alone, the anomaly
+        score triggers alone with or without the heuristic anti detect browser
+        methods trigger.
+
+        * **Low confidence**: only the heuristic anti detect methods are
+        triggered.
+
+
+        In case of tampering: `false`
+
+        * **High confidence:** Strong signals suggest the user is not tampering
+        with their request.
+    TamperingMlScore:
+      type: number
+      format: double
+      examples:
+        - 0.5
+      minimum: 0
+      maximum: 1
+      description: >
+        The output of this model is captured as tampering_ml_score, a number
+        indicating how likely an event is coming from an anti detect browser.
+        Values close to 1 signify higher confidence and we consider anything
+        above the threshold of 0.8 to be actionable (the result and
+        anti_detect_browser fields conveniently captures that fact)
+    TamperingDetails:
+      type: object
+      required: []
+      properties:
+        anomaly_score:
+          type: number
+          format: double
+          examples:
+            - 0.5
+          minimum: 0
+          maximum: 1
+          x-platforms:
+            - android
+            - ios
+            - browser
+          description: >
+            The output of this model is captured as anomaly_score, a statistical
+            score indicating how rare the visitor's browser signature is
+            compared to the overall population. Values close to 1 signify highly
+            anomalous browsers and we consider anything above the threshold of
+            0.5 to be actionable (the result field conveniently captures that
+            fact).
+        anti_detect_browser:
+          type: boolean
+          x-platforms:
+            - browser
+          description: >
+            Detects whether the request shows evidence of anti-detect browser
+            usage.
+
+            This field may be triggered by:
+
+            * heuristic detection of known anti-detect browser behavior
+
+            * machine learning detection of anti-detect browser patterns
+
+
+            Examples of anti-detect browsers include tools such as AdsPower,
+            DolphinAnty, OctoBrowser, and GoLogin.
+    VelocityData:
+      type: object
+      description: >
+        Is absent if the velocity data could not be generated for the visitor
+        Id.
+      required:
+        - 5_minutes
+        - 1_hour
+      properties:
+        5_minutes:
+          type: integer
+          examples:
+            - 1
+          description: >
+            Count for the last 5 minutes of velocity data, from the time of the
+            event.
+        1_hour:
+          type: integer
+          examples:
+            - 5
+          description: >
+            Count for the last 1 hour of velocity data, from the time of the
+            event.
+        24_hours:
+          type: integer
+          examples:
+            - 5
+          description: >
+            Count for the last 24 hours of velocity data, from the time of the
+            event.
+    Velocity:
+      type: object
+      description: >
+        Sums key data points for a specific `visitor_id`, `ip_address` and
+        `linked_id` at three distinct time
+
+        intervals: 5 minutes, 1 hour, and 24 hours as follows: 
+
+
+        - Number of distinct IP addresses associated to the visitor Id.
+
+        - Number of distinct linked Ids associated with the visitor Id.
+
+        - Number of distinct countries associated with the visitor Id.
+
+        - Number of identification events associated with the visitor Id.
+
+        - Number of identification events associated with the detected IP
+        address.
+
+        - Number of distinct IP addresses associated with the provided linked
+        Id.
+
+        - Number of distinct visitor Ids associated with the provided linked Id.
+
+
+        The `24_hours` interval of `distinct_ip`, `distinct_linked_id`,
+        `distinct_country`,
+
+        `distinct_ip_by_linked_id` and `distinct_visitor_id_by_linked_id` will
+        be omitted 
+
+        if the number of `events` for the visitor Id in the last 24
+
+        hours (`events.['24_hours']`) is higher than 20.000.
+
+
+        All will not necessarily be returned in a response, some may be omitted
+        if the 
+
+        associated event does not have the required data, such as a linked_id.
+      required: []
+      properties:
+        distinct_ip:
+          $ref: '#/components/schemas/VelocityData'
+        distinct_linked_id:
+          $ref: '#/components/schemas/VelocityData'
+        distinct_country:
+          $ref: '#/components/schemas/VelocityData'
+        events:
+          $ref: '#/components/schemas/VelocityData'
+        ip_events:
+          $ref: '#/components/schemas/VelocityData'
+        distinct_ip_by_linked_id:
+          $ref: '#/components/schemas/VelocityData'
+        distinct_visitor_id_by_linked_id:
+          $ref: '#/components/schemas/VelocityData'
+    VirtualMachine:
+      type: boolean
+      description: >
+        `true` if the request came from a browser running inside a virtual
+        machine (e.g. VMWare), `false` otherwise.
+    VirtualMachineMLScore:
+      type: number
+      format: double
+      examples:
+        - 0.5
+      minimum: 0
+      maximum: 1
+      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/).
+    VpnMLScore:
+      type: number
+      format: double
+      examples:
+        - 0.2
+      minimum: 0
+      maximum: 1
+      description: >
+        Machine learning–based VPN score, represented as a floating-point value
+        between 0 and 1 (inclusive), with up to three decimal places of
+        precision. A higher score means a higher confidence in the positive
+        `vpn` detection result. This Smart Signal is currently in beta and only
+        available to select customers. If you are interested, please [contact
+        our support team](https://fingerprint.com/support/).
+    VpnOriginTimezone:
+      type: string
+      examples:
+        - Europe/Berlin
+      description: |
+        Local timezone which is used in timezone_mismatch method.
+    VpnOriginCountry:
+      type: string
+      examples:
+        - DE
+      description: >
+        Country of the request (Android SDK version >= 2.4.0, iOS SDK version >=
+        2.9.0, JS agent >= 3.12.9 / 4.0.2), ISO 3166 format or unknown.
+    HighActivity:
+      type: boolean
+      description: Flag indicating if the request came from a high-activity visitor.
+    RareDevice:
+      type: boolean
+      description: >
+        `true` if the device is considered rare based on its combination of
+        hardware and software attributes.  A device is classified as rare if it
+        falls within the top 99.9 percentile (lowest-frequency segment) of
+        observed traffic,  or if its configuration has not been previously seen
+        (`not_seen`).
+
+        > This Smart Signal is currently in beta and only available to select
+        customers. If you are interested, please [contact our support
+        team](https://fingerprint.com/support/).
+    RareDevicePercentileBucket:
+      type: string
+      description: >
+        The rarity percentile bucket of the device, indicating how uncommon the
+        device configuration is compared to all observed devices. 
+
+        > This Smart Signal is currently in beta and only available to select
+        customers. If you are interested, please [contact our support
+        team](https://fingerprint.com/support/).
+      enum:
+        - <p95
+        - p95-p99
+        - p99-p99.5
+        - p99.5-p99.9
+        - p99.9+
+        - not_seen
+    FontPreferences:
+      type: object
+      description: >
+        Baseline measurement of canonical fonts rendered on the device. Numeric
+        width metrics, in CSS pixels, for the canonical fonts collected by the
+        agent.
+      required: []
+      properties:
+        default:
+          type: number
+          format: double
+          examples:
+            - 147.5625
+        serif:
+          type: number
+          format: double
+          examples:
+            - 147.5625
+        sans:
+          type: number
+          format: double
+          examples:
+            - 144.015625
+        mono:
+          type: number
+          format: double
+          examples:
+            - 133.0625
+        apple:
+          type: number
+          format: double
+          examples:
+            - 147.5625
+        min:
+          type: number
+          format: double
+          examples:
+            - 9.234375
+        system:
+          type: number
+          format: double
+          examples:
+            - 146.09375
+    Emoji:
+      type: object
+      description: Bounding box metrics describing how the emoji glyph renders.
+      required: []
+      properties:
+        font:
+          type: string
+          examples:
+            - Times
+          description: Font family reported by the browser when drawing the emoji.
+        width:
+          type: number
+          format: double
+          examples:
+            - 1600
+        height:
+          type: number
+          format: double
+          examples:
+            - 18
+        top:
+          type: number
+          format: double
+          examples:
+            - 14
+        bottom:
+          type: number
+          format: double
+          examples:
+            - 32
+        left:
+          type: number
+          format: double
+          examples:
+            - 8
+        right:
+          type: number
+          format: double
+          examples:
+            - 1608
+        x:
+          type: number
+          format: double
+          examples:
+            - 8
+        'y':
+          type: number
+          format: double
+          examples:
+            - 14
+    Fonts:
+      type: array
+      description: List of fonts detected on the device.
+      items:
+        type: string
+        examples:
+          - Arial Unicode MS
+      examples:
+        - - Arial Unicode MS
+          - Gill Sans
+          - Helvetica Neue
+          - Menlo
+    DeviceMemory:
+      type: integer
+      format: int32
+      minimum: 0
+      examples:
+        - 8
+      description: >-
+        Rounded amount of RAM in gigabytes. Available for browsers, Android, and
+        iOS devices.
+    Timezone:
+      type: string
+      examples:
+        - America/Sao_Paulo
+      description: Timezone identifier detected on the client.
+    Canvas:
+      type: object
+      description: Canvas fingerprint containing winding flag plus geometry/text hashes.
+      required: []
+      properties:
+        winding:
+          type: boolean
+        geometry:
+          type: string
+          examples:
+            - db3c1462576a399a03ae93d0ab9eb5c4
+          description: Hash of geometry rendering output or `unsupported` markers.
+        text:
+          type: string
+          examples:
+            - 70c3d3f7eb4408dc37a6bf8af1c51029
+          description: Hash of text rendering output or `unsupported` markers.
+    Languages:
+      type: array
+      description: >
+        Navigator languages reported by the agent including fallbacks. Each
+        inner array represents ordered language preferences reported by
+        different APIs. Available for browsers, iOS, and Android devices.
+      items:
+        type: array
+        items:
+          type: string
+          examples:
+            - en-US
+    WebGlExtensions:
+      type: object
+      description: Hashes of WebGL context attributes and extension support.
+      required: []
+      properties:
+        context_attributes:
+          type: string
+          examples:
+            - 6b1ed336830d2bc96442a9d76373252a
+        parameters:
+          type: string
+          examples:
+            - ea118c48e308bc4b0677118bbb3019ec
+        shader_precisions:
+          type: string
+          examples:
+            - f223dfbcd580cf142da156d93790eb83
+        extensions:
+          type: string
+          examples:
+            - 57233d7b10f89fcd1ff95e3837ccd72d
+        extension_parameters:
+          type: string
+          examples:
+            - 86a8abb36f0cb30b5946dec0c761d042
+        unsupported_extensions:
+          type: array
+          items:
+            type: string
+            examples:
+              - WEBGL_compressed_texture_s3tc_srgb
+    WebGlBasics:
+      type: object
+      description: Render and vendor strings reported by the WebGL context.
+      required: []
+      properties:
+        version:
+          type: string
+          examples:
+            - WebGL 1.0 (OpenGL ES 2.0 Chromium)
+        vendor:
+          type: string
+          examples:
+            - WebKit
+        vendor_unmasked:
+          type: string
+          examples:
+            - Google Inc. (Apple)
+        renderer:
+          type: string
+          examples:
+            - WebKit WebGL
+        renderer_unmasked:
+          type: string
+          examples:
+            - 'ANGLE (Apple, ANGLE Metal Renderer: Apple M4, Unspecified Version)'
+        shading_language_version:
+          type: string
+          examples:
+            - WebGL GLSL ES 1.0 (OpenGL ES GLSL ES 1.0 Chromium)
+    ScreenResolution:
+      type: array
+      description: Current screen resolution. Available for both browsers and iOS devices
+      minItems: 2
+      maxItems: 2
+      items:
+        type: integer
+        format: int32
+        examples:
+          - 1920
+    TouchSupport:
+      type: object
+      description: Browser-reported touch capabilities.
+      required: []
+      properties:
+        touch_event:
+          type: boolean
+        touch_start:
+          type: boolean
+        max_touch_points:
+          type: integer
+          format: int64
+          examples:
+            - 0
+    Oscpu:
+      type: string
+      examples:
+        - Windows NT 6.1; Win64; x64
+      description: Navigator `oscpu` string.
+    Architecture:
+      type: integer
+      format: int32
+      examples:
+        - 127
+      description: Integer representing the CPU architecture exposed by the browser.
+    CookiesEnabled:
+      type: boolean
+      description: Whether the cookies are enabled in the browser.
+    HardwareConcurrency:
+      type: integer
+      format: int32
+      examples:
+        - 10
+      description: Number of logical CPU cores reported by the browser.
+    DateTimeLocale:
+      type: string
+      examples:
+        - en-US
+      description: >
+        Locale derived from the Intl.DateTimeFormat API. Negative values
+        indicate known error states. The negative statuses can be:
+
+        - "-1": A permanent status for browsers that don't support Intl API.
+
+        - "-2": A permanent status for browsers that don't supportDateTimeFormat
+        constructor.
+
+        - "-3": A permanent status for browsers in which DateTimeFormat locale
+        is undefined or null.
+    Vendor:
+      type: string
+      examples:
+        - Google Inc.
+      description: Navigator vendor string.
+    ColorDepth:
+      type: integer
+      format: int32
+      examples:
+        - 24
+      description: Screen color depth in bits.
+    Platform:
+      type: string
+      examples:
+        - MacIntel
+      description: Navigator platform string.
+    SessionStorage:
+      type: boolean
+      description: Whether sessionStorage is available.
+    LocalStorage:
+      type: boolean
+      description: Whether localStorage is available.
+    Audio:
+      type: number
+      format: double
+      examples:
+        - 124.04347745512496
+      description: >
+        AudioContext fingerprint or negative status when unavailable. The
+        negative statuses can be:
+
+        - -1: A permanent status for those browsers which are known to always
+        suspend audio context
+
+        - -2: A permanent status for browsers that don't support the signal
+
+        - -3: A temporary status that means that an unexpected timeout has
+        happened
+    Plugins:
+      type: array
+      description: Browser plugins reported by `navigator.plugins`.
+      items:
+        type: object
+        properties:
+          name:
+            type: string
+            examples:
+              - PDF Viewer
+          description:
+            type: string
+            examples:
+              - Portable Document Format
+          mimeTypes:
+            type: array
+            items:
+              type: object
+              required: []
+              properties:
+                type:
+                  type: string
+                  examples:
+                    - application/pdf
+                suffixes:
+                  type: string
+                  examples:
+                    - pdf
+                description:
+                  type: string
+                  examples:
+                    - Portable Document Format
+        required:
+          - name
+    IndexedDb:
+      type: boolean
+      description: Whether IndexedDB is available.
+    Math:
+      type: string
+      examples:
+        - 5f030fa7d2e5f9f757bfaf81642eb1a6
+      description: Hash of Math APIs used for entropy collection.
+    DeviceModel:
+      type: string
+      examples:
+        - iPhone 15 Pro
+      description: Device model string. Available only for Android and iOS devices.
+    DeviceManufacturer:
+      type: string
+      examples:
+        - Apple
+      description: Device manufacturer string. Available only for Android and iOS devices.
+    FontHash:
+      type: string
+      examples:
+        - e9f96f6c0e2c0b3a7a8b1d2c3e4f5a6b
+      description: Unique identifier for the user’s installed fonts.
+    TimezoneOffset:
+      type: string
+      examples:
+        - '+02:00'
+      description: UTC offset in "±HH:MM" format derived from the detected IANA timezone.
+    BatteryLevel:
+      type: integer
+      format: int32
+      minimum: 0
+      maximum: 100
+      examples:
+        - 75
+      description: >-
+        Battery charge level as a percentage (0-100). Available for Android,
+        iOS, and web devices. On web, only available in Chromium-based browsers.
+    BatteryCharging:
+      type: boolean
+      description: >-
+        When `true`, the device is currently charging. Available only for web
+        devices on Chromium-based browsers.
+    BatteryLowPowerMode:
+      type: boolean
+      description: >-
+        Whether the device's low power mode is enabled. Available only for
+        Android and iOS devices.
+    KeyboardLayoutHash:
+      type: string
+      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: >
+        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.
+      required: []
+      properties:
+        font_preferences:
+          $ref: '#/components/schemas/FontPreferences'
+        emoji:
+          $ref: '#/components/schemas/Emoji'
+        fonts:
+          $ref: '#/components/schemas/Fonts'
+        device_memory:
+          $ref: '#/components/schemas/DeviceMemory'
+        timezone:
+          $ref: '#/components/schemas/Timezone'
+        canvas:
+          $ref: '#/components/schemas/Canvas'
+        languages:
+          $ref: '#/components/schemas/Languages'
+        webgl_extensions:
+          $ref: '#/components/schemas/WebGlExtensions'
+        webgl_basics:
+          $ref: '#/components/schemas/WebGlBasics'
+        screen_resolution:
+          $ref: '#/components/schemas/ScreenResolution'
+        touch_support:
+          $ref: '#/components/schemas/TouchSupport'
+        oscpu:
+          $ref: '#/components/schemas/Oscpu'
+        architecture:
+          $ref: '#/components/schemas/Architecture'
+        cookies_enabled:
+          $ref: '#/components/schemas/CookiesEnabled'
+        hardware_concurrency:
+          $ref: '#/components/schemas/HardwareConcurrency'
+        date_time_locale:
+          $ref: '#/components/schemas/DateTimeLocale'
+        vendor:
+          $ref: '#/components/schemas/Vendor'
+        color_depth:
+          $ref: '#/components/schemas/ColorDepth'
+        platform:
+          $ref: '#/components/schemas/Platform'
+        session_storage:
+          $ref: '#/components/schemas/SessionStorage'
+        local_storage:
+          $ref: '#/components/schemas/LocalStorage'
+        audio:
+          $ref: '#/components/schemas/Audio'
+        plugins:
+          $ref: '#/components/schemas/Plugins'
+        indexed_db:
+          $ref: '#/components/schemas/IndexedDb'
+        math:
+          $ref: '#/components/schemas/Math'
+        device_model:
+          $ref: '#/components/schemas/DeviceModel'
+        device_manufacturer:
+          $ref: '#/components/schemas/DeviceManufacturer'
+        font_hash:
+          $ref: '#/components/schemas/FontHash'
+        timezone_offset:
+          $ref: '#/components/schemas/TimezoneOffset'
+        battery_level:
+          $ref: '#/components/schemas/BatteryLevel'
+        battery_charging:
+          $ref: '#/components/schemas/BatteryCharging'
+        battery_low_power_mode:
+          $ref: '#/components/schemas/BatteryLowPowerMode'
+        keyboard_layout_hash:
+          $ref: '#/components/schemas/KeyboardLayoutHash'
+        keyboard_layout_name:
+          $ref: '#/components/schemas/KeyboardLayoutName'
+    Labels:
+      type: array
+      items:
+        type: object
+        required:
+          - label
+        properties:
+          label:
+            type: string
+            examples:
+              - automation_tool
+          prediction:
+            type: boolean
+          ml_score:
+            type: number
+            format: double
+            examples:
+              - 0.95
+            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: >
+        An identification event (`source: device`) or an Automation Intelligence
+        event (`source: edge`).
+
+
+        Use `source` to tell them apart. Device events include Identification
+        and device-derived Smart Signals. Edge events do not.
+
+
+        Consult the [Smart Signals
+        reference](https://docs.fingerprint.com/docs/smart-signals-reference)
+        for more details.
+      properties:
+        event_id:
+          $ref: '#/components/schemas/EventId'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        timestamp:
+          $ref: '#/components/schemas/Timestamp'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        linked_id:
+          $ref: '#/components/schemas/LinkedId'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        tags:
+          $ref: '#/components/schemas/Tags'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        url:
+          $ref: '#/components/schemas/Url'
+          x-platforms:
+            - browser
+        bot_info:
+          $ref: '#/components/schemas/BotInfo'
+          x-platforms:
+            - browser
+        ip_info:
+          $ref: '#/components/schemas/IPInfo'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        proxy:
+          $ref: '#/components/schemas/Proxy'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        proxy_confidence:
+          $ref: '#/components/schemas/ProxyConfidence'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        proxy_details:
+          $ref: '#/components/schemas/ProxyDetails'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        vpn:
+          $ref: '#/components/schemas/Vpn'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        vpn_confidence:
+          $ref: '#/components/schemas/VpnConfidence'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        vpn_methods:
+          $ref: '#/components/schemas/VpnMethods'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        source:
+          $ref: '#/components/schemas/EventSource'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        incremental_identification_status:
+          $ref: '#/components/schemas/IncrementalIdentificationStatus'
+          x-platforms:
+            - browser
+        environment_id:
+          $ref: '#/components/schemas/EnvironmentId'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        suspect:
+          $ref: '#/components/schemas/Suspect'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        sdk:
+          $ref: '#/components/schemas/SDK'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        replayed:
+          $ref: '#/components/schemas/Replayed'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        identification:
+          $ref: '#/components/schemas/Identification'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        supplementary_id_high_recall:
+          $ref: '#/components/schemas/SupplementaryIDHighRecall'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        bundle_id:
+          $ref: '#/components/schemas/BundleId'
+          x-platforms:
+            - ios
+        package_name:
+          $ref: '#/components/schemas/PackageName'
+          x-platforms:
+            - android
+        ip_address:
+          $ref: '#/components/schemas/IpAddress'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        user_agent:
+          $ref: '#/components/schemas/UserAgent'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        device:
+          $ref: '#/components/schemas/Device'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        os:
+          $ref: '#/components/schemas/Os'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        os_version:
+          $ref: '#/components/schemas/OsVersion'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        client_referrer:
+          $ref: '#/components/schemas/ClientReferrer'
+          x-platforms:
+            - browser
+        browser_details:
+          $ref: '#/components/schemas/BrowserDetails'
+          x-platforms:
+            - browser
+        proximity:
+          $ref: '#/components/schemas/Proximity'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        active_call:
+          $ref: '#/components/schemas/ActiveCall'
+          x-platforms:
+            - android
+            - ios
+        bot:
+          $ref: '#/components/schemas/BotResult'
+          x-platforms:
+            - browser
+        bot_type:
+          $ref: '#/components/schemas/BotType'
+          x-platforms:
+            - browser
+        cloned_app:
+          $ref: '#/components/schemas/ClonedApp'
+          x-platforms:
+            - android
+        developer_tools:
+          $ref: '#/components/schemas/DeveloperTools'
+          x-platforms:
+            - browser
+            - android
+            - ios
+        emulator:
+          $ref: '#/components/schemas/Emulator'
+          x-platforms:
+            - android
+        factory_reset_timestamp:
+          $ref: '#/components/schemas/FactoryReset'
+          x-platforms:
+            - android
+            - ios
+        frida:
+          $ref: '#/components/schemas/Frida'
+          x-platforms:
+            - android
+            - ios
+        ip_blocklist:
+          $ref: '#/components/schemas/IPBlockList'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        proxy_ml_score:
+          $ref: '#/components/schemas/ProxyMLScore'
+          x-platforms:
+            - browser
+        incognito:
+          $ref: '#/components/schemas/Incognito'
+          x-platforms:
+            - browser
+        jailbroken:
+          $ref: '#/components/schemas/Jailbroken'
+          x-platforms:
+            - ios
+        location_spoofing:
+          $ref: '#/components/schemas/LocationSpoofing'
+          x-platforms:
+            - android
+            - ios
+        mitm_attack:
+          $ref: '#/components/schemas/MitMAttack'
+          x-platforms:
+            - android
+            - ios
+        privacy_settings:
+          $ref: '#/components/schemas/PrivacySettings'
+          x-platforms:
+            - browser
+        root_apps:
+          $ref: '#/components/schemas/RootApps'
+          x-platforms:
+            - android
+        rule_action:
+          $ref: '#/components/schemas/EventRuleAction'
+        simulator:
+          $ref: '#/components/schemas/Simulator'
+          x-platforms:
+            - ios
+        suspect_score:
+          $ref: '#/components/schemas/SuspectScore'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        tampering:
+          $ref: '#/components/schemas/Tampering'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        tampering_confidence:
+          $ref: '#/components/schemas/TamperingConfidence'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        tampering_ml_score:
+          $ref: '#/components/schemas/TamperingMlScore'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        tampering_details:
+          $ref: '#/components/schemas/TamperingDetails'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        velocity:
+          $ref: '#/components/schemas/Velocity'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        virtual_machine:
+          $ref: '#/components/schemas/VirtualMachine'
+          x-platforms:
+            - browser
+        virtual_machine_ml_score:
+          $ref: '#/components/schemas/VirtualMachineMLScore'
+          x-platforms:
+            - browser
+        vpn_ml_score:
+          $ref: '#/components/schemas/VpnMLScore'
+          x-platforms:
+            - browser
+        vpn_origin_timezone:
+          $ref: '#/components/schemas/VpnOriginTimezone'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        vpn_origin_country:
+          $ref: '#/components/schemas/VpnOriginCountry'
+          x-platforms:
+            - android
+            - ios
+        high_activity_device:
+          $ref: '#/components/schemas/HighActivity'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        rare_device:
+          $ref: '#/components/schemas/RareDevice'
+          x-platforms:
+            - browser
+        rare_device_percentile_bucket:
+          $ref: '#/components/schemas/RareDevicePercentileBucket'
+          x-platforms:
+            - browser
+        raw_device_attributes:
+          $ref: '#/components/schemas/RawDeviceAttributes'
+          x-platforms:
+            - browser
+            - ios
+            - android
+        labels:
+          $ref: '#/components/schemas/Labels'
+          x-platforms:
+            - browser
+            - ios
+            - android
+      required:
+        - event_id
+        - timestamp
+    EventUpdate:
+      type: object
+      required: []
+      properties:
+        linked_id:
+          type: string
+          examples:
+            - somelinkedId
+          description: Linked ID value to assign to the existing event
+        tags:
+          type: object
+          description: >-
+            A customer-provided value or an object that was sent with the
+            identification request or updated later.
+          additionalProperties: true
+          required: []
+        suspect:
+          type: boolean
+          description: Suspect flag indicating observed suspicious or fraudulent event
+          x-go-force-pointer: true
+    EventSearch:
+      type: object
+      description: >-
+        Contains a list of all identification events matching the specified
+        search criteria.
+      required:
+        - events
+      properties:
+        events:
+          type: array
+          items:
+            $ref: '#/components/schemas/Event'
+        pagination_key:
+          type: string
+          examples:
+            - >-
+              S9rgMMUb4z3X5t5pr_tSgoSZlmyF0O8X7kCV2m981-iY1LmRTjraa1rTk3L-hQExnDWCi0RA-zAIjaVSTNO2AN2eqQWgzT0RjbieMxRfSdkM-HmOhdOgdQvYfPG3vqU1DJKh4Q
+          description: >-
+            Use this value in the `pagination_key` parameter to request the next
+            page of search results.
+        total_hits:
+          type: integer
+          format: int64
+          examples:
+            - 100
+          description: >-
+            This value represents the total number of events matching the search
+            query, up to the limit provided in the `total_hits` query parameter.
+            Only present if the `total_hits` query parameter was provided.
+    SearchEventsBot:
+      type: string
+      enum:
+        - all
+        - good
+        - bad
+        - none
+      description: >
+        Filter events by the Bot Detection result, specifically:
+          `all` - events where any kind of bot was detected.
+          `good` - events where a good bot was detected.
+          `bad` - events where a bad bot was detected.
+          `none` - events where no bot was detected.
+        > Note: When using this parameter, only events with the `bot` property
+        set to a valid value are returned. Events without a `bot` Smart Signal
+        result are left out of the response.
+    SearchEventsBotInfo:
+      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, and no `bot_info` was present.
+    SearchEventsVpnConfidence:
+      type: string
+      enum:
+        - high
+        - medium
+        - low
+      description: >
+        Filter events by VPN Detection result confidence level.
+
+        `high` - events with high VPN Detection confidence.
+
+        `medium` - events with medium VPN Detection confidence.
+
+        `low` - events with low VPN Detection confidence.
+
+        > Note: When using this parameter, only events with the `vpn.confidence`
+        property set to a valid value are returned. Events without a `vpn` Smart
+        Signal result are left out of the response.
+    SearchEventsRareDevicePercentileBucket:
+      type: string
+      enum:
+        - <p95
+        - p95-p99
+        - p99-p99.5
+        - p99.5-p99.9
+        - p99.9+
+        - not_seen
+      description: >
+        Filter events by Device Rarity percentile bucket.
+
+        `<p95` - device configuration is in the bottom 95% (most common).
+
+        `p95-p99` - device is in the 95th to 99th percentile.
+
+        `p99-p99.5` - device is in the 99th to 99.5th percentile.
+
+        `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/).
+    SearchEventsSdkPlatform:
+      type: string
+      enum:
+        - js
+        - android
+        - ios
+      description: >
+        Filter events by the SDK Platform associated with the identification
+        event (`sdk.platform` property) .
+
+        `js` - Javascript agent (Web).
+
+        `ios` - Apple iOS based devices.
+
+        `android` - Android based devices.
+    SearchEventsIncrementalIdentificationStatus:
+      type: string
+      enum:
+        - partially_completed
+        - completed
+      description: >
+        Filter events by their incremental identification status
+        (`incremental_identification_status` property). Non incremental
+        identification events are left out of the response.
+    SearchEventsSource:
+      type: string
+      enum:
+        - edge

fingerprint-server-api-v4-normalized.yaml

Published URL: https://fingerprintjs.github.io/fingerprint-pro-server-api-openapi/schemas/fingerprint-server-api-v4-normalized.yaml
Summary: +3 added, -0 removed, ~2 modified

Added elements (3)
  • /components/schemas/EdgeRequest
  • /components/schemas/EventEdge
  • /paths/~1edge
Removed elements (0)

None

Modified elements (2)
  • /components/schemas/Event/description
  • /paths/~1events~1{event_id}/get/description
Changed lines patch
--- a/schemas/fingerprint-server-api-v4-normalized.yaml
+++ b/schemas/fingerprint-server-api-v4-normalized.yaml
@@ -35,23 +35,117 @@
   - url: https://ap.api.fpjs.io/v4
     description: Asia (Mumbai)
 security:
   - bearerAuth: []
 paths:
+  /edge:
+    post:
+      tags:
+        - Fingerprint
+      operationId: analyzeRequestForAutomationIntelligence
+      summary: Collect Automation Intelligence.
+      description: >
+        The Automation Intelligence API gives you the tools to determine whether
+        traffic is legitimate and should be accepted by your application.
+
+
+        This feature is currently in a Public Preview testing phase. All
+        feedback is welcome! If you encounter any issues, please [contact our
+        support team](https://fingerprint.com/support/).
+
+
+        The API detects automation tools like AI Agents, AI Assistants, AI
+        Browsers, and other bots. Additionally, it provides IP intelligence like
+        geolocation, residential proxy, VPN and data center detection.
+
+
+        Automation Intelligence is derived from HTTP request metadata that
+        reaches your server. It does not require the use of a JavaScript
+        client-side agent or mobile SDKs to collect device context.
+
+
+        The API is fast, with average response times of less than 30ms, making
+        it a great fit for edge, pre-origin or middleware contexts. The API is
+        platform-agnostic and can be used with different CDN providers, cloud
+        platforms, or any server backend.
+
+
+        Because this API doesn’t require the use of a client-side device
+        collection agent, it doesn’t support device identification via
+        `visitor_id` and a few Smart Signals derived from deep device telemetry.
+
+
+        ### Event Retrieval
+
+
+        Events created by the Automation Intelligence API can be fetched via the
+        [`/v4/events/{event_id}`](https://docs.fingerprint.com/reference/server-api-get-event)
+        API using the `event_id` present in the API response.
+
+
+        Fetch all Automation Intelligence API events via the
+        [`/v4/events?source=edge`](https://docs.fingerprint.com/reference/server-api-search-events#parameter-source)
+        API.
+      requestBody:
+        required: true
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/EdgeRequest'
+      responses:
+        '200':
+          description: OK.
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/EventEdge'
+        '400':
+          description: Bad request. The request payload is not valid.
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ErrorResponse'
+        '403':
+          description: Forbidden. Access to this API is denied.
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ErrorResponse'
+        '413':
+          description: Bad request. The request payload is too large.
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ErrorResponse'
+        '429':
+          description: Too Many Requests. The request is throttled.
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ErrorResponse'
+        '500':
+          description: Workspace error.
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ErrorResponse'
   /events/{event_id}:
     get:
       tags:
         - Fingerprint
       operationId: getEvent
       summary: Get an event by event ID
       description: >
-        Get a detailed analysis of an individual identification event, including
-        Smart Signals.
+        Get a detailed analysis of an individual event, including Smart Signals.
 
 
         Use `event_id` as the URL path parameter. This API method is scoped to a
         request, i.e. all returned information is by `event_id`.
+
+
+        Use `source` to tell identification events (`device`) from Automation
+        Intelligence events (`edge`).
       parameters:
         - name: event_id
           in: path
           required: true
           schema:
@@ -1175,10 +1269,142 @@
       description: >-
         A customer-provided value or an object that was sent with the
         identification request or updated later.
       additionalProperties: true
       required: []
+    EdgeRequest:
+      type: object
+      description: >-
+        HTTP request metadata (including the HTTP method, headers and IP
+        address) sent by you (your server) to the Fingerprint API for IP and bot
+        analysis. To improve accuracy, retain as much of the original semantics
+        of the HTTP request as possible. For example, preserve the order of the
+        request headers and their capitalization.
+
+        At least one of `ipv4_address` or `ipv6_address` must be provided; a
+        request with neither is rejected with a `400` error. If both IPv4 and
+        IPv6 are provided, IP intelligence will be provided for each address. If
+        an IPv4-mapped IPv6 address is provided in the `ipv6_address` request
+        property, the IP intelligence will be provided in the `ipv4_address`
+        property of the response.
+      example:
+        method: GET
+        url: https://example.com/login
+        ipv4_address: 34.162.244.71
+        headers:
+          - name: Host
+            value: example.com
+          - name: User-Agent
+            value: Mozilla/5.0
+          - name: Authorization
+            value: ''
+      required:
+        - headers
+        - method
+        - url
+      properties:
+        headers:
+          type: array
+          description: >
+            Ordered header entries from the request made to your server. Each
+            entry represents one header line. If one header name appears as
+            multiple lines, send each as a separate item in the array.
+
+
+            Headers that contain authentication or session data must still be
+            included, but with their value set to an empty string. This includes
+            headers like `Authorization` and `Cookie`, but may contain more
+            depending on your specific project, for instance
+            `Proxy-Authenticate` or `X-Api-Key`. Omitting the headers entirely
+            changes the shape of the request and can affect detection. Never
+            forward the real secret values.
+
+
+            Whenever possible, we recommend preserving header order and
+            capitalization to provide the best accuracy, however it’s not a
+            strict requirement if your runtime does not maintain http header
+            order or canonicalizes header names.
+          minItems: 1
+          items:
+            type: object
+            required:
+              - name
+              - value
+            properties:
+              name:
+                type: string
+                examples:
+                  - User-Agent
+                description: >-
+                  Header name as forwarded by your server. Headers must be valid
+                  according to RFC 7230 and will be canonicalized according to
+                  RFC 9112.
+              value:
+                type: string
+                examples:
+                  - Mozilla/5.0
+                description: >-
+                  Value of a single forwarded header entry. Be careful to
+                  preserve the original encoding and escaping. For example, do
+                  not double escape quotes.
+          examples:
+            - - name: Host
+                value: example.com
+              - name: User-Agent
+                value: Mozilla/5.0
+              - name: Accept-Language
+                value: en-US,en;q=0.9
+            - - name: Host
+                value: example.com
+              - name: User-Agent
+                value: Mozilla/5.0
+              - name: Accept-Encoding
+                value: gzip
+              - name: Accept-Encoding
+                value: deflate
+        method:
+          type: string
+          description: >-
+            The original HTTP method of the request. If supported in your
+            runtime, preserve the original casing.
+          examples:
+            - GET
+            - POST
+            - PUT
+            - PATCH
+            - DELETE
+        url:
+          type: string
+          description: >-
+            Absolute URL of the request, without a \#fragment suffix. Only HTTP
+            and HTTPS schemes are supported.
+          format: uri
+          examples:
+            - http://example.com
+            - https://example.com/checkout?method=card
+        ipv4_address:
+          type: string
+          description: Client IPv4 address observed by your server.
+          format: ipv4
+          examples:
+            - 34.162.244.71
+            - 3.208.0.3
+            - 173.56.0.4
+        ipv6_address:
+          type: string
+          description: Client IPv6 address observed by your server.
+          format: ipv6
+          examples:
+            - 2001:4860:4801:10::1
+            - 2600:1f42:abcd:5678:9876:fedc:1357:2468
+            - 2001:4868:85f:1a2b:3c4d:5e6f:7890:abcd
+            - ::ffff:22a2:f447
+            - ::ffff:34.162.244.71
+        linked_id:
+          $ref: '#/components/schemas/LinkedId'
+        tags:
+          $ref: '#/components/schemas/Tags'
     EventId:
       type: string
       examples:
         - 1708102555327.NLOjmg
       description: >
@@ -1188,23 +1414,10 @@
       description: Timestamp of the event with millisecond precision in Unix time.
       type: integer
       format: int64
       examples:
         - 1708102555327
-    EventSource:
-      type: string
-      description: >
-        Identifies how the event was generated.
-
-        - `device` - the event was generated by the JS agent or a mobile SDK
-        running on an end-user device.
-
-        - `edge` - the event was generated by the Automation Intelligence API
-        (`/edge` endpoint), analyzing a request intercepted at the edge.
-      enum:
-        - device
-        - edge
     Url:
       type: string
       examples:
         - https://www.example.com/login
       description: Page URL from which the request was sent.
@@ -1608,10 +1821,81 @@
           x-platforms:
             - browser
           description: >
             `true` if the request came from a device running a VPN, `false`
             otherwise.  
+    EventSource:
+      type: string
+      description: >
+        Identifies how the event was generated.
+
+        - `device` - the event was generated by the JS agent or a mobile SDK
+        running on an end-user device.
+
+        - `edge` - the event was generated by the Automation Intelligence API
+        (`/edge` endpoint), analyzing a request intercepted at the edge.
+      enum:
+        - device
+        - edge
+    EventEdge:
+      type: object
+      description: >
+        IP and bot analysis for an event generated by the Automation
+        Intelligence API (`/edge` endpoint). No client-side collection agent is
+        involved, so Identification (`visitor_id`) and device-telemetry-derived
+        Smart Signals are not available.
+      properties:
+        event_id:
+          $ref: '#/components/schemas/EventId'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        timestamp:
+          $ref: '#/components/schemas/Timestamp'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        linked_id:
+          $ref: '#/components/schemas/LinkedId'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        tags:
+          $ref: '#/components/schemas/Tags'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        url:
+          $ref: '#/components/schemas/Url'
+        bot_info:
+          $ref: '#/components/schemas/BotInfo'
+        ip_info:
+          $ref: '#/components/schemas/IPInfo'
+        proxy:
+          $ref: '#/components/schemas/Proxy'
+        proxy_confidence:
+          $ref: '#/components/schemas/ProxyConfidence'
+        proxy_details:
+          $ref: '#/components/schemas/ProxyDetails'
+        vpn:
+          $ref: '#/components/schemas/Vpn'
+        vpn_confidence:
+          $ref: '#/components/schemas/VpnConfidence'
+        vpn_methods:
+          $ref: '#/components/schemas/VpnMethods'
+        source:
+          $ref: '#/components/schemas/EventSource'
+          const: edge
+      required:
+        - event_id
+        - timestamp
+        - source
+        - ip_info
     ErrorCode:
       type: string
       enum:
         - request_cannot_be_parsed
         - request_read_timeout
@@ -3096,20 +3380,22 @@
         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: >-
-        Contains results from Fingerprint Identification and all active Smart
-        Signals. Some Smart Signals are only supported for certain device types,
-        these fields will be omitted for events not generated from the supported
-        devices. Consult the [Smart Signals
+      description: >
+        An identification event (`source: device`) or an Automation Intelligence
+        event (`source: edge`).
+
+
+        Use `source` to tell them apart. Device events include Identification
+        and device-derived Smart Signals. Edge events do not.
+
+
+        Consult the [Smart Signals
         reference](https://docs.fingerprint.com/docs/smart-signals-reference)
         for more details.
-      required:
-        - event_id
-        - timestamp
       properties:
         event_id:
           $ref: '#/components/schemas/EventId'
           x-platforms:
             - android
@@ -3119,26 +3405,82 @@
           $ref: '#/components/schemas/Timestamp'
           x-platforms:
             - android
             - ios
             - browser
-        source:
-          $ref: '#/components/schemas/EventSource'
+        linked_id:
+          $ref: '#/components/schemas/LinkedId'
           x-platforms:
             - android
             - ios
             - browser
-        incremental_identification_status:
-          $ref: '#/components/schemas/IncrementalIdentificationStatus'
+        tags:
+          $ref: '#/components/schemas/Tags'
           x-platforms:
+            - android
+            - ios
             - browser
-        linked_id:
-          $ref: '#/components/schemas/LinkedId'
+        url:
+          $ref: '#/components/schemas/Url'
+          x-platforms:
+            - browser
+        bot_info:
+          $ref: '#/components/schemas/BotInfo'
+          x-platforms:
+            - browser
+        ip_info:
+          $ref: '#/components/schemas/IPInfo'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        proxy:
+          $ref: '#/components/schemas/Proxy'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        proxy_confidence:
+          $ref: '#/components/schemas/ProxyConfidence'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        proxy_details:
+          $ref: '#/components/schemas/ProxyDetails'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        vpn:
+          $ref: '#/components/schemas/Vpn'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        vpn_confidence:
+          $ref: '#/components/schemas/VpnConfidence'
           x-platforms:
             - android
             - ios
             - browser
+        vpn_methods:
+          $ref: '#/components/schemas/VpnMethods'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        source:
+          $ref: '#/components/schemas/EventSource'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        incremental_identification_status:
+          $ref: '#/components/schemas/IncrementalIdentificationStatus'
+          x-platforms:
+            - browser
         environment_id:
           $ref: '#/components/schemas/EnvironmentId'
           x-platforms:
             - android
             - ios
@@ -3171,20 +3513,10 @@
           $ref: '#/components/schemas/SupplementaryIDHighRecall'
           x-platforms:
             - android
             - ios
             - browser
-        tags:
-          $ref: '#/components/schemas/Tags'
-          x-platforms:
-            - android
-            - ios
-            - browser
-        url:
-          $ref: '#/components/schemas/Url'
-          x-platforms:
-            - browser
         bundle_id:
           $ref: '#/components/schemas/BundleId'
           x-platforms:
             - ios
         package_name:
@@ -3246,14 +3578,10 @@
             - browser
         bot_type:
           $ref: '#/components/schemas/BotType'
           x-platforms:
             - browser
-        bot_info:
-          $ref: '#/components/schemas/BotInfo'
-          x-platforms:
-            - browser
         cloned_app:
           $ref: '#/components/schemas/ClonedApp'
           x-platforms:
             - android
         developer_tools:
@@ -3280,34 +3608,10 @@
           $ref: '#/components/schemas/IPBlockList'
           x-platforms:
             - android
             - ios
             - browser
-        ip_info:
-          $ref: '#/components/schemas/IPInfo'
-          x-platforms:
-            - android
-            - ios
-            - browser
-        proxy:
-          $ref: '#/components/schemas/Proxy'
-          x-platforms:
-            - android
-            - ios
-            - browser
-        proxy_confidence:
-          $ref: '#/components/schemas/ProxyConfidence'
-          x-platforms:
-            - android
-            - ios
-            - browser
-        proxy_details:
-          $ref: '#/components/schemas/ProxyDetails'
-          x-platforms:
-            - android
-            - ios
-            - browser
         proxy_ml_score:
           $ref: '#/components/schemas/ProxyMLScore'
           x-platforms:
             - browser
         incognito:
@@ -3384,22 +3688,10 @@
             - browser
         virtual_machine_ml_score:
           $ref: '#/components/schemas/VirtualMachineMLScore'
           x-platforms:
             - browser
-        vpn:
-          $ref: '#/components/schemas/Vpn'
-          x-platforms:
-            - android
-            - ios
-            - browser
-        vpn_confidence:
-          $ref: '#/components/schemas/VpnConfidence'
-          x-platforms:
-            - android
-            - ios
-            - browser
         vpn_ml_score:
           $ref: '#/components/schemas/VpnMLScore'
           x-platforms:
             - browser
         vpn_origin_timezone:
@@ -3411,16 +3703,10 @@
         vpn_origin_country:
           $ref: '#/components/schemas/VpnOriginCountry'
           x-platforms:
             - android
             - ios
-        vpn_methods:
-          $ref: '#/components/schemas/VpnMethods'
-          x-platforms:
-            - android
-            - ios
-            - browser
         high_activity_device:
           $ref: '#/components/schemas/HighActivity'
           x-platforms:
             - android
             - ios
@@ -3443,10 +3729,13 @@
           $ref: '#/components/schemas/Labels'
           x-platforms:
             - browser
             - ios
             - android
+      required:
+        - event_id
+        - timestamp
     EventUpdate:
       type: object
       required: []
       properties:
         linked_id:

fingerprint-server-api-v4-with-examples.yaml

Published URL: https://fingerprintjs.github.io/fingerprint-pro-server-api-openapi/schemas/fingerprint-server-api-v4-with-examples.yaml
Summary: +5 added, -4 removed, ~4 modified

Added elements (5)
  • /components/schemas/EdgeRequest/example
  • /components/schemas/Event/discriminator
  • /components/schemas/Event/oneOf
  • /components/schemas/EventDevice
  • /components/schemas/EventEdge
Removed elements (4)
  • /components/schemas/EdgeResponse
  • /components/schemas/Event/additionalProperties
  • /components/schemas/Event/properties
  • /components/schemas/Event/required
Modified elements (4)
  • /components/schemas/EdgeRequest/properties/headers/description
  • /components/schemas/Event/description
  • /paths/~1edge/post/responses/200/content/application~1json/schema/$ref
  • /paths/~1events~1{event_id}/get/description
Changed lines patch
--- a/schemas/fingerprint-server-api-v4-with-examples.yaml
+++ b/schemas/fingerprint-server-api-v4-with-examples.yaml
@@ -118,11 +118,11 @@
         '200':
           description: OK.
           content:
             application/json:
               schema:
-                $ref: '#/components/schemas/EdgeResponse'
+                $ref: '#/components/schemas/EventEdge'
               examples:
                 200-ok-bot-detected:
                   summary: Example response when a bot was detected.
                   value:
                     event_id: 1758130560902.8tRtrH
@@ -335,16 +335,19 @@
       tags:
         - Events
       operationId: getEvent
       summary: Get an event by event ID
       description: >
-        Get a detailed analysis of an individual identification event, including
-        Smart Signals.
+        Get a detailed analysis of an individual event, including Smart Signals.
 
 
         Use `event_id` as the URL path parameter. This API method is scoped to a
         request, i.e. all returned information is by `event_id`.
+
+
+        Use `source` to tell identification events (`device`) from Automation
+        Intelligence events (`edge`).
       parameters:
         - name: event_id
           in: path
           required: true
           schema:
@@ -2929,10 +2932,21 @@
         request with neither is rejected with a `400` error. If both IPv4 and
         IPv6 are provided, IP intelligence will be provided for each address. If
         an IPv4-mapped IPv6 address is provided in the `ipv6_address` request
         property, the IP intelligence will be provided in the `ipv4_address`
         property of the response.
+      example:
+        method: GET
+        url: https://example.com/login
+        ipv4_address: 34.162.244.71
+        headers:
+          - name: Host
+            value: example.com
+          - name: User-Agent
+            value: Mozilla/5.0
+          - name: Authorization
+            value: ''
       additionalProperties: false
       required:
         - headers
         - method
         - url
@@ -2944,13 +2958,13 @@
             entry represents one header line. If one header name appears as
             multiple lines, send each as a separate item in the array.
 
 
             Headers that contain authentication or session data must still be
-            included, but with with their value set to an empty string. This
-            includes headers like `Authorization` and `Cookie`, but may contain
-            more depending on your specific project, for instance
+            included, but with their value set to an empty string. This includes
+            headers like `Authorization` and `Cookie`, but may contain more
+            depending on your specific project, for instance
             `Proxy-Authenticate` or `X-Api-Key`. Omitting the headers entirely
             changes the shape of the request and can affect detection. Never
             forward the real secret values.
 
 
@@ -3050,23 +3064,10 @@
       description: Timestamp of the event with millisecond precision in Unix time.
       type: integer
       format: int64
       examples:
         - 1708102555327
-    EventSource:
-      type: string
-      description: >
-        Identifies how the event was generated.
-
-        - `device` - the event was generated by the JS agent or a mobile SDK
-        running on an end-user device.
-
-        - `edge` - the event was generated by the Automation Intelligence API
-        (`/edge` endpoint), analyzing a request intercepted at the edge.
-      enum:
-        - device
-        - edge
     Url:
       type: string
       examples:
         - https://www.example.com/login
       description: Page URL from which the request was sent.
@@ -3460,31 +3461,56 @@
           x-platforms:
             - browser
           description: >
             `true` if the request came from a device running a VPN, `false`
             otherwise.  
-    EdgeResponse:
+    EventSource:
+      type: string
+      description: >
+        Identifies how the event was generated.
+
+        - `device` - the event was generated by the JS agent or a mobile SDK
+        running on an end-user device.
+
+        - `edge` - the event was generated by the Automation Intelligence API
+        (`/edge` endpoint), analyzing a request intercepted at the edge.
+      enum:
+        - device
+        - edge
+    EventEdge:
       type: object
-      description: >-
-        IP and bot analysis for a request submitted through the Automation
-        Intelligence API.
+      description: >
+        IP and bot analysis for an event generated by the Automation
+        Intelligence API (`/edge` endpoint). No client-side collection agent is
+        involved, so Identification (`visitor_id`) and device-telemetry-derived
+        Smart Signals are not available.
       additionalProperties: false
-      required:
-        - event_id
-        - timestamp
-        - ip_info
       properties:
         event_id:
           $ref: '#/components/schemas/EventId'
+          x-platforms:
+            - android
+            - ios
+            - browser
         timestamp:
           $ref: '#/components/schemas/Timestamp'
-        source:
-          $ref: '#/components/schemas/EventSource'
+          x-platforms:
+            - android
+            - ios
+            - browser
         linked_id:
           $ref: '#/components/schemas/LinkedId'
+          x-platforms:
+            - android
+            - ios
+            - browser
         tags:
           $ref: '#/components/schemas/Tags'
+          x-platforms:
+            - android
+            - ios
+            - browser
         url:
           $ref: '#/components/schemas/Url'
         bot_info:
           $ref: '#/components/schemas/BotInfo'
         ip_info:
@@ -3499,10 +3525,18 @@
           $ref: '#/components/schemas/Vpn'
         vpn_confidence:
           $ref: '#/components/schemas/VpnConfidence'
         vpn_methods:
           $ref: '#/components/schemas/VpnMethods'
+        source:
+          $ref: '#/components/schemas/EventSource'
+          const: edge
+      required:
+        - event_id
+        - timestamp
+        - source
+        - ip_info
     ErrorCode:
       type: string
       enum:
         - request_cannot_be_parsed
         - request_read_timeout
@@ -5011,23 +5045,18 @@
         (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:
+    EventDevice:
       type: object
-      description: >-
-        Contains results from Fingerprint Identification and all active Smart
-        Signals. Some Smart Signals are only supported for certain device types,
-        these fields will be omitted for events not generated from the supported
-        devices. Consult the [Smart Signals
+      description: >
+        Contains results from Fingerprint Identification and Smart Signals
+        derived from client-side device telemetry. Consult the [Smart Signals
         reference](https://docs.fingerprint.com/docs/smart-signals-reference)
         for more details.
       additionalProperties: false
-      required:
-        - event_id
-        - timestamp
       properties:
         event_id:
           $ref: '#/components/schemas/EventId'
           x-platforms:
             - android
@@ -5037,26 +5066,83 @@
           $ref: '#/components/schemas/Timestamp'
           x-platforms:
             - android
             - ios
             - browser
-        source:
-          $ref: '#/components/schemas/EventSource'
+        linked_id:
+          $ref: '#/components/schemas/LinkedId'
           x-platforms:
             - android
             - ios
             - browser
-        incremental_identification_status:
-          $ref: '#/components/schemas/IncrementalIdentificationStatus'
+        tags:
+          $ref: '#/components/schemas/Tags'
           x-platforms:
+            - android
+            - ios
             - browser
-        linked_id:
-          $ref: '#/components/schemas/LinkedId'
+        url:
+          $ref: '#/components/schemas/Url'
+          x-platforms:
+            - browser
+        bot_info:
+          $ref: '#/components/schemas/BotInfo'
+          x-platforms:
+            - browser
+        ip_info:
+          $ref: '#/components/schemas/IPInfo'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        proxy:
+          $ref: '#/components/schemas/Proxy'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        proxy_confidence:
+          $ref: '#/components/schemas/ProxyConfidence'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        proxy_details:
+          $ref: '#/components/schemas/ProxyDetails'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        vpn:
+          $ref: '#/components/schemas/Vpn'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        vpn_confidence:
+          $ref: '#/components/schemas/VpnConfidence'
           x-platforms:
             - android
             - ios
             - browser
+        vpn_methods:
+          $ref: '#/components/schemas/VpnMethods'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        source:
+          $ref: '#/components/schemas/EventSource'
+          const: device
+          x-platforms:
+            - android
+            - ios
+            - browser
+        incremental_identification_status:
+          $ref: '#/components/schemas/IncrementalIdentificationStatus'
+          x-platforms:
+            - browser
         environment_id:
           $ref: '#/components/schemas/EnvironmentId'
           x-platforms:
             - android
             - ios
@@ -5089,20 +5175,10 @@
           $ref: '#/components/schemas/SupplementaryIDHighRecall'
           x-platforms:
             - android
             - ios
             - browser
-        tags:
-          $ref: '#/components/schemas/Tags'
-          x-platforms:
-            - android
-            - ios
-            - browser
-        url:
-          $ref: '#/components/schemas/Url'
-          x-platforms:
-            - browser
         bundle_id:
           $ref: '#/components/schemas/BundleId'
           x-platforms:
             - ios
         package_name:
@@ -5164,14 +5240,10 @@
             - browser
         bot_type:
           $ref: '#/components/schemas/BotType'
           x-platforms:
             - browser
-        bot_info:
-          $ref: '#/components/schemas/BotInfo'
-          x-platforms:
-            - browser
         cloned_app:
           $ref: '#/components/schemas/ClonedApp'
           x-platforms:
             - android
         developer_tools:
@@ -5198,34 +5270,10 @@
           $ref: '#/components/schemas/IPBlockList'
           x-platforms:
             - android
             - ios
             - browser
-        ip_info:
-          $ref: '#/components/schemas/IPInfo'
-          x-platforms:
-            - android
-            - ios
-            - browser
-        proxy:
-          $ref: '#/components/schemas/Proxy'
-          x-platforms:
-            - android
-            - ios
-            - browser
-        proxy_confidence:
-          $ref: '#/components/schemas/ProxyConfidence'
-          x-platforms:
-            - android
-            - ios
-            - browser
-        proxy_details:
-          $ref: '#/components/schemas/ProxyDetails'
-          x-platforms:
-            - android
-            - ios
-            - browser
         proxy_ml_score:
           $ref: '#/components/schemas/ProxyMLScore'
           x-platforms:
             - browser
         incognito:
@@ -5302,22 +5350,10 @@
             - browser
         virtual_machine_ml_score:
           $ref: '#/components/schemas/VirtualMachineMLScore'
           x-platforms:
             - browser
-        vpn:
-          $ref: '#/components/schemas/Vpn'
-          x-platforms:
-            - android
-            - ios
-            - browser
-        vpn_confidence:
-          $ref: '#/components/schemas/VpnConfidence'
-          x-platforms:
-            - android
-            - ios
-            - browser
         vpn_ml_score:
           $ref: '#/components/schemas/VpnMLScore'
           x-platforms:
             - browser
         vpn_origin_timezone:
@@ -5329,16 +5365,10 @@
         vpn_origin_country:
           $ref: '#/components/schemas/VpnOriginCountry'
           x-platforms:
             - android
             - ios
-        vpn_methods:
-          $ref: '#/components/schemas/VpnMethods'
-          x-platforms:
-            - android
-            - ios
-            - browser
         high_activity_device:
           $ref: '#/components/schemas/HighActivity'
           x-platforms:
             - android
             - ios
@@ -5361,10 +5391,36 @@
           $ref: '#/components/schemas/Labels'
           x-platforms:
             - browser
             - ios
             - android
+      required:
+        - event_id
+        - timestamp
+        - source
+    Event:
+      type: object
+      description: >
+        An identification event (`source: device`) or an Automation Intelligence
+        event (`source: edge`).
+
+
+        Use `source` to tell them apart. Device events include Identification
+        and device-derived Smart Signals. Edge events do not.
+
+
+        Consult the [Smart Signals
+        reference](https://docs.fingerprint.com/docs/smart-signals-reference)
+        for more details.
+      oneOf:
+        - $ref: '#/components/schemas/EventDevice'
+        - $ref: '#/components/schemas/EventEdge'
+      discriminator:
+        propertyName: source
+        mapping:
+          device: '#/components/schemas/EventDevice'
+          edge: '#/components/schemas/EventEdge'
     EventUpdate:
       type: object
       required: []
       properties:
         linked_id:

fingerprint-server-api-v4.yaml

Published URL: https://fingerprintjs.github.io/fingerprint-pro-server-api-openapi/schemas/fingerprint-server-api-v4.yaml
Summary: +6 added, -2 removed, ~2 modified

Added elements (6)
  • /components/schemas/EdgeRequest
  • /components/schemas/Event/discriminator
  • /components/schemas/Event/oneOf
  • /components/schemas/EventDevice
  • /components/schemas/EventEdge
  • /paths/~1edge
Removed elements (2)
  • /components/schemas/Event/properties
  • /components/schemas/Event/required
Modified elements (2)
  • /components/schemas/Event/description
  • /paths/~1events~1{event_id}/get/description
Changed lines patch
--- a/schemas/fingerprint-server-api-v4.yaml
+++ b/schemas/fingerprint-server-api-v4.yaml
@@ -35,23 +35,117 @@
   - url: https://ap.api.fpjs.io/v4
     description: Asia (Mumbai)
 security:
   - bearerAuth: []
 paths:
+  /edge:
+    post:
+      tags:
+        - Fingerprint
+      operationId: analyzeRequestForAutomationIntelligence
+      summary: Collect Automation Intelligence.
+      description: >
+        The Automation Intelligence API gives you the tools to determine whether
+        traffic is legitimate and should be accepted by your application.
+
+
+        This feature is currently in a Public Preview testing phase. All
+        feedback is welcome! If you encounter any issues, please [contact our
+        support team](https://fingerprint.com/support/).
+
+
+        The API detects automation tools like AI Agents, AI Assistants, AI
+        Browsers, and other bots. Additionally, it provides IP intelligence like
+        geolocation, residential proxy, VPN and data center detection.
+
+
+        Automation Intelligence is derived from HTTP request metadata that
+        reaches your server. It does not require the use of a JavaScript
+        client-side agent or mobile SDKs to collect device context.
+
+
+        The API is fast, with average response times of less than 30ms, making
+        it a great fit for edge, pre-origin or middleware contexts. The API is
+        platform-agnostic and can be used with different CDN providers, cloud
+        platforms, or any server backend.
+
+
+        Because this API doesn’t require the use of a client-side device
+        collection agent, it doesn’t support device identification via
+        `visitor_id` and a few Smart Signals derived from deep device telemetry.
+
+
+        ### Event Retrieval
+
+
+        Events created by the Automation Intelligence API can be fetched via the
+        [`/v4/events/{event_id}`](https://docs.fingerprint.com/reference/server-api-get-event)
+        API using the `event_id` present in the API response.
+
+
+        Fetch all Automation Intelligence API events via the
+        [`/v4/events?source=edge`](https://docs.fingerprint.com/reference/server-api-search-events#parameter-source)
+        API.
+      requestBody:
+        required: true
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/EdgeRequest'
+      responses:
+        '200':
+          description: OK.
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/EventEdge'
+        '400':
+          description: Bad request. The request payload is not valid.
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ErrorResponse'
+        '403':
+          description: Forbidden. Access to this API is denied.
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ErrorResponse'
+        '413':
+          description: Bad request. The request payload is too large.
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ErrorResponse'
+        '429':
+          description: Too Many Requests. The request is throttled.
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ErrorResponse'
+        '500':
+          description: Workspace error.
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ErrorResponse'
   /events/{event_id}:
     get:
       tags:
         - Fingerprint
       operationId: getEvent
       summary: Get an event by event ID
       description: >
-        Get a detailed analysis of an individual identification event, including
-        Smart Signals.
+        Get a detailed analysis of an individual event, including Smart Signals.
 
 
         Use `event_id` as the URL path parameter. This API method is scoped to a
         request, i.e. all returned information is by `event_id`.
+
+
+        Use `source` to tell identification events (`device`) from Automation
+        Intelligence events (`edge`).
       parameters:
         - name: event_id
           in: path
           required: true
           schema:
@@ -1161,10 +1255,142 @@
       description: >-
         A customer-provided value or an object that was sent with the
         identification request or updated later.
       additionalProperties: true
       required: []
+    EdgeRequest:
+      type: object
+      description: >-
+        HTTP request metadata (including the HTTP method, headers and IP
+        address) sent by you (your server) to the Fingerprint API for IP and bot
+        analysis. To improve accuracy, retain as much of the original semantics
+        of the HTTP request as possible. For example, preserve the order of the
+        request headers and their capitalization.
+
+        At least one of `ipv4_address` or `ipv6_address` must be provided; a
+        request with neither is rejected with a `400` error. If both IPv4 and
+        IPv6 are provided, IP intelligence will be provided for each address. If
+        an IPv4-mapped IPv6 address is provided in the `ipv6_address` request
+        property, the IP intelligence will be provided in the `ipv4_address`
+        property of the response.
+      example:
+        method: GET
+        url: https://example.com/login
+        ipv4_address: 34.162.244.71
+        headers:
+          - name: Host
+            value: example.com
+          - name: User-Agent
+            value: Mozilla/5.0
+          - name: Authorization
+            value: ''
+      required:
+        - headers
+        - method
+        - url
+      properties:
+        headers:
+          type: array
+          description: >
+            Ordered header entries from the request made to your server. Each
+            entry represents one header line. If one header name appears as
+            multiple lines, send each as a separate item in the array.
+
+
+            Headers that contain authentication or session data must still be
+            included, but with their value set to an empty string. This includes
+            headers like `Authorization` and `Cookie`, but may contain more
+            depending on your specific project, for instance
+            `Proxy-Authenticate` or `X-Api-Key`. Omitting the headers entirely
+            changes the shape of the request and can affect detection. Never
+            forward the real secret values.
+
+
+            Whenever possible, we recommend preserving header order and
+            capitalization to provide the best accuracy, however it’s not a
+            strict requirement if your runtime does not maintain http header
+            order or canonicalizes header names.
+          minItems: 1
+          items:
+            type: object
+            required:
+              - name
+              - value
+            properties:
+              name:
+                type: string
+                examples:
+                  - User-Agent
+                description: >-
+                  Header name as forwarded by your server. Headers must be valid
+                  according to RFC 7230 and will be canonicalized according to
+                  RFC 9112.
+              value:
+                type: string
+                examples:
+                  - Mozilla/5.0
+                description: >-
+                  Value of a single forwarded header entry. Be careful to
+                  preserve the original encoding and escaping. For example, do
+                  not double escape quotes.
+          examples:
+            - - name: Host
+                value: example.com
+              - name: User-Agent
+                value: Mozilla/5.0
+              - name: Accept-Language
+                value: en-US,en;q=0.9
+            - - name: Host
+                value: example.com
+              - name: User-Agent
+                value: Mozilla/5.0
+              - name: Accept-Encoding
+                value: gzip
+              - name: Accept-Encoding
+                value: deflate
+        method:
+          type: string
+          description: >-
+            The original HTTP method of the request. If supported in your
+            runtime, preserve the original casing.
+          examples:
+            - GET
+            - POST
+            - PUT
+            - PATCH
+            - DELETE
+        url:
+          type: string
+          description: >-
+            Absolute URL of the request, without a \#fragment suffix. Only HTTP
+            and HTTPS schemes are supported.
+          format: uri
+          examples:
+            - http://example.com
+            - https://example.com/checkout?method=card
+        ipv4_address:
+          type: string
+          description: Client IPv4 address observed by your server.
+          format: ipv4
+          examples:
+            - 34.162.244.71
+            - 3.208.0.3
+            - 173.56.0.4
+        ipv6_address:
+          type: string
+          description: Client IPv6 address observed by your server.
+          format: ipv6
+          examples:
+            - 2001:4860:4801:10::1
+            - 2600:1f42:abcd:5678:9876:fedc:1357:2468
+            - 2001:4868:85f:1a2b:3c4d:5e6f:7890:abcd
+            - ::ffff:22a2:f447
+            - ::ffff:34.162.244.71
+        linked_id:
+          $ref: '#/components/schemas/LinkedId'
+        tags:
+          $ref: '#/components/schemas/Tags'
     EventId:
       type: string
       examples:
         - 1708102555327.NLOjmg
       description: >
@@ -1174,23 +1400,10 @@
       description: Timestamp of the event with millisecond precision in Unix time.
       type: integer
       format: int64
       examples:
         - 1708102555327
-    EventSource:
-      type: string
-      description: >
-        Identifies how the event was generated.
-
-        - `device` - the event was generated by the JS agent or a mobile SDK
-        running on an end-user device.
-
-        - `edge` - the event was generated by the Automation Intelligence API
-        (`/edge` endpoint), analyzing a request intercepted at the edge.
-      enum:
-        - device
-        - edge
     Url:
       type: string
       examples:
         - https://www.example.com/login
       description: Page URL from which the request was sent.
@@ -1594,10 +1807,81 @@
           x-platforms:
             - browser
           description: >
             `true` if the request came from a device running a VPN, `false`
             otherwise.  
+    EventSource:
+      type: string
+      description: >
+        Identifies how the event was generated.
+
+        - `device` - the event was generated by the JS agent or a mobile SDK
+        running on an end-user device.
+
+        - `edge` - the event was generated by the Automation Intelligence API
+        (`/edge` endpoint), analyzing a request intercepted at the edge.
+      enum:
+        - device
+        - edge
+    EventEdge:
+      type: object
+      description: >
+        IP and bot analysis for an event generated by the Automation
+        Intelligence API (`/edge` endpoint). No client-side collection agent is
+        involved, so Identification (`visitor_id`) and device-telemetry-derived
+        Smart Signals are not available.
+      properties:
+        event_id:
+          $ref: '#/components/schemas/EventId'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        timestamp:
+          $ref: '#/components/schemas/Timestamp'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        linked_id:
+          $ref: '#/components/schemas/LinkedId'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        tags:
+          $ref: '#/components/schemas/Tags'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        url:
+          $ref: '#/components/schemas/Url'
+        bot_info:
+          $ref: '#/components/schemas/BotInfo'
+        ip_info:
+          $ref: '#/components/schemas/IPInfo'
+        proxy:
+          $ref: '#/components/schemas/Proxy'
+        proxy_confidence:
+          $ref: '#/components/schemas/ProxyConfidence'
+        proxy_details:
+          $ref: '#/components/schemas/ProxyDetails'
+        vpn:
+          $ref: '#/components/schemas/Vpn'
+        vpn_confidence:
+          $ref: '#/components/schemas/VpnConfidence'
+        vpn_methods:
+          $ref: '#/components/schemas/VpnMethods'
+        source:
+          $ref: '#/components/schemas/EventSource'
+          const: edge
+      required:
+        - event_id
+        - timestamp
+        - source
+        - ip_info
     ErrorCode:
       type: string
       enum:
         - request_cannot_be_parsed
         - request_read_timeout
@@ -3080,22 +3364,17 @@
         (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:
+    EventDevice:
       type: object
-      description: >-
-        Contains results from Fingerprint Identification and all active Smart
-        Signals. Some Smart Signals are only supported for certain device types,
-        these fields will be omitted for events not generated from the supported
-        devices. Consult the [Smart Signals
+      description: >
+        Contains results from Fingerprint Identification and Smart Signals
+        derived from client-side device telemetry. Consult the [Smart Signals
         reference](https://docs.fingerprint.com/docs/smart-signals-reference)
         for more details.
-      required:
-        - event_id
-        - timestamp
       properties:
         event_id:
           $ref: '#/components/schemas/EventId'
           x-platforms:
             - android
@@ -3105,26 +3384,83 @@
           $ref: '#/components/schemas/Timestamp'
           x-platforms:
             - android
             - ios
             - browser
-        source:
-          $ref: '#/components/schemas/EventSource'
+        linked_id:
+          $ref: '#/components/schemas/LinkedId'
           x-platforms:
             - android
             - ios
             - browser
-        incremental_identification_status:
-          $ref: '#/components/schemas/IncrementalIdentificationStatus'
+        tags:
+          $ref: '#/components/schemas/Tags'
           x-platforms:
+            - android
+            - ios
             - browser
-        linked_id:
-          $ref: '#/components/schemas/LinkedId'
+        url:
+          $ref: '#/components/schemas/Url'
+          x-platforms:
+            - browser
+        bot_info:
+          $ref: '#/components/schemas/BotInfo'
+          x-platforms:
+            - browser
+        ip_info:
+          $ref: '#/components/schemas/IPInfo'
           x-platforms:
             - android
             - ios
             - browser
+        proxy:
+          $ref: '#/components/schemas/Proxy'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        proxy_confidence:
+          $ref: '#/components/schemas/ProxyConfidence'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        proxy_details:
+          $ref: '#/components/schemas/ProxyDetails'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        vpn:
+          $ref: '#/components/schemas/Vpn'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        vpn_confidence:
+          $ref: '#/components/schemas/VpnConfidence'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        vpn_methods:
+          $ref: '#/components/schemas/VpnMethods'
+          x-platforms:
+            - android
+            - ios
+            - browser
+        source:
+          $ref: '#/components/schemas/EventSource'
+          const: device
+          x-platforms:
+            - android
+            - ios
+            - browser
+        incremental_identification_status:
+          $ref: '#/components/schemas/IncrementalIdentificationStatus'
+          x-platforms:
+            - browser
         environment_id:
           $ref: '#/components/schemas/EnvironmentId'
           x-platforms:
             - android
             - ios
@@ -3157,20 +3493,10 @@
           $ref: '#/components/schemas/SupplementaryIDHighRecall'
           x-platforms:
             - android
             - ios
             - browser
-        tags:
-          $ref: '#/components/schemas/Tags'
-          x-platforms:
-            - android
-            - ios
-            - browser
-        url:
-          $ref: '#/components/schemas/Url'
-          x-platforms:
-            - browser
         bundle_id:
           $ref: '#/components/schemas/BundleId'
           x-platforms:
             - ios
         package_name:
@@ -3232,14 +3558,10 @@
             - browser
         bot_type:
           $ref: '#/components/schemas/BotType'
           x-platforms:
             - browser
-        bot_info:
-          $ref: '#/components/schemas/BotInfo'
-          x-platforms:
-            - browser
         cloned_app:
           $ref: '#/components/schemas/ClonedApp'
           x-platforms:
             - android
         developer_tools:
@@ -3266,34 +3588,10 @@
           $ref: '#/components/schemas/IPBlockList'
           x-platforms:
             - android
             - ios
             - browser
-        ip_info:
-          $ref: '#/components/schemas/IPInfo'
-          x-platforms:
-            - android
-            - ios
-            - browser
-        proxy:
-          $ref: '#/components/schemas/Proxy'
-          x-platforms:
-            - android
-            - ios
-            - browser
-        proxy_confidence:
-          $ref: '#/components/schemas/ProxyConfidence'
-          x-platforms:
-            - android
-            - ios
-            - browser
-        proxy_details:
-          $ref: '#/components/schemas/ProxyDetails'
-          x-platforms:
-            - android
-            - ios
-            - browser
         proxy_ml_score:
           $ref: '#/components/schemas/ProxyMLScore'
           x-platforms:
             - browser
         incognito:
@@ -3370,22 +3668,10 @@
             - browser
         virtual_machine_ml_score:
           $ref: '#/components/schemas/VirtualMachineMLScore'
           x-platforms:
             - browser
-        vpn:
-          $ref: '#/components/schemas/Vpn'
-          x-platforms:
-            - android
-            - ios
-            - browser
-        vpn_confidence:
-          $ref: '#/components/schemas/VpnConfidence'
-          x-platforms:
-            - android
-            - ios
-            - browser
         vpn_ml_score:
           $ref: '#/components/schemas/VpnMLScore'
           x-platforms:
             - browser
         vpn_origin_timezone:
@@ -3397,16 +3683,10 @@
         vpn_origin_country:
           $ref: '#/components/schemas/VpnOriginCountry'
           x-platforms:
             - android
             - ios
-        vpn_methods:
-          $ref: '#/components/schemas/VpnMethods'
-          x-platforms:
-            - android
-            - ios
-            - browser
         high_activity_device:
           $ref: '#/components/schemas/HighActivity'
           x-platforms:
             - android
             - ios
@@ -3429,10 +3709,36 @@
           $ref: '#/components/schemas/Labels'
           x-platforms:
             - browser
             - ios
             - android
+      required:
+        - event_id
+        - timestamp
+        - source
+    Event:
+      type: object
+      description: >
+        An identification event (`source: device`) or an Automation Intelligence
+        event (`source: edge`).
+
+
+        Use `source` to tell them apart. Device events include Identification
+        and device-derived Smart Signals. Edge events do not.
+
+
+        Consult the [Smart Signals
+        reference](https://docs.fingerprint.com/docs/smart-signals-reference)
+        for more details.
+      oneOf:
+        - $ref: '#/components/schemas/EventDevice'
+        - $ref: '#/components/schemas/EventEdge'
+      discriminator:
+        propertyName: source
+        mapping:
+          device: '#/components/schemas/EventDevice'
+          edge: '#/components/schemas/EventEdge'
     EventUpdate:
       type: object
       required: []
       properties:
         linked_id:

Edge events have no sdk.platform. Device still annotates url and bot_info as browser.
EventEdge omits x-platforms. Flatten was taking the last variant and dropping Device annotations on shared fields.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Implements SPIKE “Option C” for INTER-2457 by splitting the v4 Event model into EventDevice and EventEdge (discriminated by source) for docs/Node output, while generating flattened Event variants for other SDK schemas and updating /edge to return EventEdge.

Changes:

  • Introduce EventDevice, EventEdge, and EventBase; redefine Event as a source-discriminated union and update docs text/examples accordingly
  • Add a targeted transformer to flatten only Event’s oneOf for selected SDK schema outputs, and preserve x-platforms annotations when variants omit them
  • Update build/workflow wiring to produce and sync a new fingerprint-server-api-v4-flat.yaml schema for Python/PHP, and adjust /edge response schema

Reviewed changes

Copilot reviewed 17 out of 17 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
vite.config.ts Adds a new flat v4 schema output and clarifies which SDKs consume each v4 output
utils/transformers/transformSchema.ts Introduces v4 “flat” transformer pipeline and integrates Event flattening into flat/normalized outputs
utils/transformers/transformSchema.spec.ts Updates v4 pipeline assertions to reflect Event union vs flattened variants and /edge retention
utils/transformers/flattenNamedSchemaOneOfTransformer.ts New transformer to flatten oneOf for a single named schema (used for Event)
utils/transformers/flattenNamedSchemaOneOfTransformer.spec.ts Adds coverage for the new transformer behavior (flattening + optional properties + x-platforms)
utils/replaceOneOf.ts Preserves x-platforms from earlier variants when later variants omit it during merge
utils/replaceOneOf.spec.ts Adds a unit test validating x-platforms retention behavior
schemas/paths/examples/webhook/webhook_event.json Adds source to the webhook event example payload
schemas/paths/event.yaml Updates GET /events/{event_id} description to explain EventDevice vs EventEdge return shape
schemas/paths/edge.yaml Switches POST /edge 200 response schema from EdgeResponse to EventEdge
schemas/components/schemas/EventEdge.yaml Adds new EventEdge schema definition for Automation Intelligence events
schemas/components/schemas/EventDevice.yaml Adds new EventDevice schema definition for identification + Smart Signals events
schemas/components/schemas/EventBase.yaml Adds new base schema for shared event identifiers/metadata
schemas/components/schemas/Event.yaml Redefines Event as a source-discriminated union of EventDevice and EventEdge
schemas/components/schemas/EdgeResponse.yaml Removes legacy EdgeResponse schema (replaced by EventEdge)
.github/workflows/sync-server-side-sdks-schema.yml Points Python/PHP schema sync to the new flat v4 schema output
.changeset/event-edge.md Adds a changeset describing the schema/model changes and /edge response update

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread utils/transformers/flattenNamedSchemaOneOfTransformer.spec.ts
@github-actions

Copy link
Copy Markdown
Contributor

🚀 Following releases will be created using changesets from this PR:

fingerprint-pro-server-api-openapi@3.8.0

Minor Changes

  • events: Replace EdgeResponse with EventEdge. Add EventDevice. Model Event as a source discriminated union of EventDevice and EventEdge in docs and the Node SDK schema. Other SDK schemas flatten Event and leave source optional. Get-event copy describes source without naming generated types. POST /edge returns EventEdge. (4ddcfef)

@JuroUhlar

Copy link
Copy Markdown
Contributor Author

@copilot review

Copilot AI commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

@copilot review

Reviewed the current state: tests (102/102), build, typecheck, and lintSchemaDist all pass cleanly with no new errors introduced. Spot-checked the generated outputs — fingerprint-server-api-v4-flat.yaml and fingerprint-server-api-v4-normalized.yaml both flatten Event correctly, /edge returns EventEdge, and x-platforms is preserved on shared properties after flattening. No issues found beyond the property-order discussion point already called out in the PR description.

Sibling const next to $ref is ignored by generators. Flatten still unwraps to an optional EventSource $ref.
Keep the same source form as EventRuleActionAllow. Bare oneOf parents now run the same normalizeRefSiblings pass on variants.
@JuroUhlar

Copy link
Copy Markdown
Contributor Author

This was a prototype done as part of a spike. Closing now, still usable as a reference during the production implementation.

@JuroUhlar JuroUhlar closed this Sep 14, 2026

This branch was successfully deployed

1 active deployment
test — 767520ff Deployed Sep 6, 2026 by JuroUhlar via Lint, build and test #1431
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants