{
  "openapi": "3.0.3",
  "info": {
    "title": "Server API v3 (deprecated)",
    "description": "> 🚧 Deprecation Notice\n>\n> This version of Server API is marked as deprecated starting on **Jan 7th 2026** according to our [API Deprecation Policy](https://docs.fingerprint.com/reference/api-deprecation-policy). If you still use this version, please follow our [migration guide](https://docs.fingerprint.com/reference/migrating-from-server-api-v3-to-v4) to migrate from this deprecated version to the new one.\n\nFingerprint Server API allows you to search, update, and delete identification events in a server environment. It can be used for data exports, decision-making, and data analysis scenarios.\nServer 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.\n",
    "version": "3",
    "contact": {
      "name": "Fingerprint Support",
      "email": "support@fingerprint.com"
    },
    "license": {
      "name": "MIT",
      "url": "https://github.com/fingerprintjs/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/v3/server-api"
      }
    }
  ],
  "servers": [
    {
      "url": "https://api.fpjs.io",
      "description": "Global"
    },
    {
      "url": "https://eu.api.fpjs.io",
      "description": "EU"
    },
    {
      "url": "https://ap.api.fpjs.io",
      "description": "Asia (Mumbai)"
    }
  ],
  "security": [
    {
      "ApiKeyHeader": []
    },
    {
      "ApiKeyQuery": []
    }
  ],
  "paths": {
    "/events/{request_id}": {
      "get": {
        "tags": [
          "Fingerprint"
        ],
        "operationId": "getEvent",
        "summary": "Get event by request ID",
        "description": "> 🚧 Deprecation Notice\n>\n> This version of Server API is marked as deprecated starting on **Jan 7th 2026** according to our [API Deprecation Policy](https://docs.fingerprint.com/reference/api-deprecation-policy). If you still use this version, please follow our [migration guide](https://docs.fingerprint.com/reference/migrating-from-server-api-v3-to-v4#migrating-get-/events) to migrate from this deprecated version to the new one.\n\nGet a detailed analysis of an individual identification event, including Smart Signals. \nPlease note that the response includes mobile signals (e.g. `rootApps`) even if the request originated from a non-mobile platform.\nIt is highly recommended that you **ignore** the mobile signals for such requests. \n\nUse `requestId` as the URL path parameter. This API method is scoped to a request, i.e. all returned information is by `requestId`.\n",
        "parameters": [
          {
            "name": "request_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The unique [identifier](https://docs.fingerprint.com/reference/v3/js-agent-get-function#requestid) of each identification request."
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EventsGetResponse"
                },
                "examples": {
                  "200-full": {
                    "summary": "Example response",
                    "value": {
                      "products": {
                        "identification": {
                          "data": {
                            "visitorId": "Ibk1527CUFmcnjLwIs4A9",
                            "requestId": "1708102555327.NLOjmg",
                            "incognito": true,
                            "linkedId": "somelinkedId",
                            "tag": {},
                            "time": "2019-05-21T16:40:13Z",
                            "timestamp": 1582299576512,
                            "url": "https://www.example.com/login?hope{this{works[!",
                            "ip": "61.127.217.15",
                            "ipLocation": {
                              "accuracyRadius": 10,
                              "latitude": 49.982,
                              "longitude": 36.2566,
                              "postalCode": "61202",
                              "timezone": "Europe/Dusseldorf",
                              "city": {
                                "name": "Dusseldorf"
                              },
                              "country": {
                                "code": "DE",
                                "name": "Germany"
                              },
                              "continent": {
                                "code": "EU",
                                "name": "Europe"
                              },
                              "subdivisions": [
                                {
                                  "isoCode": "63",
                                  "name": "North Rhine-Westphalia"
                                }
                              ]
                            },
                            "browserDetails": {
                              "browserName": "Chrome",
                              "browserMajorVersion": "74",
                              "browserFullVersion": "74.0.3729",
                              "os": "Windows",
                              "osVersion": "7",
                              "device": "Other",
                              "userAgent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) ...."
                            },
                            "confidence": {
                              "score": 0.97
                            },
                            "visitorFound": false,
                            "firstSeenAt": {
                              "global": "2022-03-16T11:26:45.362Z",
                              "subscription": "2022-03-16T11:31:01.101Z"
                            },
                            "lastSeenAt": {
                              "global": null,
                              "subscription": null
                            },
                            "sdk": {
                              "platform": "js",
                              "version": "3.11.10",
                              "integrations": [
                                {
                                  "name": "fingerprint-pro-react",
                                  "version": "3.11.10",
                                  "subintegration": {
                                    "name": "preact",
                                    "version": "10.21.0"
                                  }
                                }
                              ]
                            },
                            "replayed": false
                          }
                        },
                        "botd": {
                          "data": {
                            "bot": {
                              "result": "notDetected"
                            },
                            "url": "https://www.example.com/login?hope{this{works}[!",
                            "ip": "61.127.217.15",
                            "time": "2019-05-21T16:40:13.000Z",
                            "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 YaBrowser/24.1.0.0 Safari/537.36",
                            "requestId": "1708102555327.NLOjmg"
                          }
                        },
                        "rootApps": {
                          "data": {
                            "result": false
                          }
                        },
                        "emulator": {
                          "data": {
                            "result": false
                          }
                        },
                        "ipInfo": {
                          "data": {
                            "v4": {
                              "address": "94.142.239.124",
                              "geolocation": {
                                "accuracyRadius": 20,
                                "latitude": 50.05,
                                "longitude": 14.4,
                                "postalCode": "150 00",
                                "timezone": "Europe/Prague",
                                "city": {
                                  "name": "Prague"
                                },
                                "country": {
                                  "code": "CZ",
                                  "name": "Czechia"
                                },
                                "continent": {
                                  "code": "EU",
                                  "name": "Europe"
                                },
                                "subdivisions": [
                                  {
                                    "isoCode": "10",
                                    "name": "Hlavni mesto Praha"
                                  }
                                ]
                              },
                              "asn": {
                                "asn": "7922",
                                "name": "COMCAST-7922",
                                "network": "73.136.0.0/13",
                                "type": "isp"
                              },
                              "datacenter": {
                                "result": true,
                                "name": "DediPath"
                              }
                            },
                            "v6": {
                              "address": "2001:db8:3333:4444:5555:6666:7777:8888",
                              "geolocation": {
                                "accuracyRadius": 5,
                                "latitude": 49.982,
                                "longitude": 36.2566,
                                "postalCode": "10112",
                                "timezone": "Europe/Berlin",
                                "city": {
                                  "name": "Berlin"
                                },
                                "country": {
                                  "code": "DE",
                                  "name": "Germany"
                                },
                                "continent": {
                                  "code": "EU",
                                  "name": "Europe"
                                },
                                "subdivisions": [
                                  {
                                    "isoCode": "BE",
                                    "name": "Land Berlin"
                                  }
                                ]
                              },
                              "asn": {
                                "asn": "6805",
                                "name": "Telefonica Germany",
                                "network": "2a02:3100::/24",
                                "type": "isp"
                              },
                              "datacenter": {
                                "result": false,
                                "name": ""
                              }
                            }
                          }
                        },
                        "ipBlocklist": {
                          "data": {
                            "result": false,
                            "details": {
                              "emailSpam": false,
                              "attackSource": false
                            }
                          }
                        },
                        "tor": {
                          "data": {
                            "result": false
                          }
                        },
                        "vpn": {
                          "data": {
                            "result": false,
                            "confidence": "high",
                            "mlScore": 0.002,
                            "originTimezone": "Europe/Berlin",
                            "originCountry": "unknown",
                            "methods": {
                              "timezoneMismatch": false,
                              "publicVPN": false,
                              "auxiliaryMobile": false,
                              "osMismatch": false,
                              "relay": false,
                              "mlPrediction": false
                            }
                          }
                        },
                        "proxy": {
                          "data": {
                            "result": true,
                            "confidence": "high",
                            "mlScore": 0.99,
                            "details": {
                              "proxyType": "residential",
                              "lastSeenAt": "2025-08-12T13:00:00Z"
                            }
                          }
                        },
                        "incognito": {
                          "data": {
                            "result": false
                          }
                        },
                        "tampering": {
                          "data": {
                            "result": false,
                            "anomalyScore": 0.1955,
                            "antiDetectBrowser": false
                          }
                        },
                        "clonedApp": {
                          "data": {
                            "result": false
                          }
                        },
                        "factoryReset": {
                          "data": {
                            "time": "1970-01-01T00:00:00Z",
                            "timestamp": 0
                          }
                        },
                        "jailbroken": {
                          "data": {
                            "result": false
                          }
                        },
                        "frida": {
                          "data": {
                            "result": false
                          }
                        },
                        "privacySettings": {
                          "data": {
                            "result": false
                          }
                        },
                        "virtualMachine": {
                          "data": {
                            "result": true,
                            "mlScore": 0.2
                          }
                        },
                        "rawDeviceAttributes": {
                          "data": {
                            "architecture": {
                              "value": 127
                            },
                            "audio": {
                              "value": 35.73832903057337
                            },
                            "canvas": {
                              "value": {
                                "Winding": true,
                                "Geometry": "4dce9d6017c3e0c052a77252f29f2b1c",
                                "Text": "dd2474a56ff78c1de3e7a07070ba3b7d"
                              }
                            },
                            "colorDepth": {
                              "value": 30
                            },
                            "colorGamut": {
                              "value": "p3"
                            },
                            "contrast": {
                              "value": 0
                            },
                            "cookiesEnabled": {
                              "value": true
                            },
                            "cpuClass": {},
                            "fonts": {
                              "value": [
                                "Arial Unicode MS",
                                "Gill Sans",
                                "Helvetica Neue",
                                "Menlo"
                              ]
                            }
                          }
                        },
                        "highActivity": {
                          "data": {
                            "result": false
                          }
                        },
                        "locationSpoofing": {
                          "data": {
                            "result": false
                          }
                        },
                        "velocity": {
                          "data": {
                            "distinctIp": {
                              "intervals": {
                                "5m": 1,
                                "1h": 1,
                                "24h": 1
                              }
                            },
                            "distinctLinkedId": {},
                            "distinctCountry": {
                              "intervals": {
                                "5m": 1,
                                "1h": 2,
                                "24h": 2
                              }
                            },
                            "events": {
                              "intervals": {
                                "5m": 1,
                                "1h": 5,
                                "24h": 5
                              }
                            },
                            "ipEvents": {
                              "intervals": {
                                "5m": 1,
                                "1h": 5,
                                "24h": 5
                              }
                            },
                            "distinctIpByLinkedId": {
                              "intervals": {
                                "5m": 1,
                                "1h": 5,
                                "24h": 5
                              }
                            },
                            "distinctVisitorIdByLinkedId": {
                              "intervals": {
                                "5m": 1,
                                "1h": 5,
                                "24h": 5
                              }
                            }
                          }
                        },
                        "developerTools": {
                          "data": {
                            "result": false
                          }
                        },
                        "mitmAttack": {
                          "data": {
                            "result": false
                          }
                        },
                        "rareDevice": {
                          "data": {
                            "result": false,
                            "percentileBucket": "<p95"
                          }
                        },
                        "proximity": {
                          "data": {
                            "id": "w1aTfd4MCvl",
                            "precisionRadius": 10,
                            "confidence": 0.95
                          }
                        },
                        "labels": {
                          "data": [
                            {
                              "label": "fraud",
                              "prediction": false,
                              "mlScore": 0.01
                            }
                          ]
                        }
                      }
                    }
                  },
                  "200-all-errors": {
                    "summary": "All failed signals",
                    "value": {
                      "products": {
                        "identification": {
                          "error": {
                            "code": "Failed",
                            "message": "internal server error"
                          }
                        },
                        "botd": {
                          "error": {
                            "code": "Failed",
                            "message": "internal server error"
                          }
                        },
                        "ipInfo": {
                          "error": {
                            "code": "Failed",
                            "message": "internal server error"
                          }
                        },
                        "incognito": {
                          "error": {
                            "code": "Failed",
                            "message": "internal server error"
                          }
                        },
                        "rootApps": {
                          "error": {
                            "code": "Failed",
                            "message": "internal server error"
                          }
                        },
                        "clonedApp": {
                          "error": {
                            "code": "Failed",
                            "message": "internal server error"
                          }
                        },
                        "factoryReset": {
                          "error": {
                            "code": "Failed",
                            "message": "internal server error"
                          }
                        },
                        "jailbroken": {
                          "error": {
                            "code": "Failed",
                            "message": "internal server error"
                          }
                        },
                        "frida": {
                          "error": {
                            "code": "Failed",
                            "message": "internal server error"
                          }
                        },
                        "emulator": {
                          "error": {
                            "code": "Failed",
                            "message": "internal server error"
                          }
                        },
                        "ipBlocklist": {
                          "error": {
                            "code": "Failed",
                            "message": "internal server error"
                          }
                        },
                        "tor": {
                          "error": {
                            "code": "Failed",
                            "message": "internal server error"
                          }
                        },
                        "vpn": {
                          "error": {
                            "code": "Failed",
                            "message": "internal server error"
                          }
                        },
                        "proxy": {
                          "error": {
                            "code": "Failed",
                            "message": "internal server error"
                          }
                        },
                        "privacySettings": {
                          "error": {
                            "code": "Failed",
                            "message": "internal server error"
                          }
                        },
                        "virtualMachine": {
                          "error": {
                            "code": "Failed",
                            "message": "internal server error"
                          }
                        },
                        "tampering": {
                          "error": {
                            "code": "Failed",
                            "message": "internal server error"
                          }
                        },
                        "rawDeviceAttributes": {
                          "data": {
                            "audio": {
                              "error": {
                                "name": "Error",
                                "message": "internal server error"
                              }
                            },
                            "canvas": {
                              "error": {
                                "name": "Error",
                                "message": "internal server error"
                              }
                            }
                          }
                        },
                        "locationSpoofing": {
                          "error": {
                            "code": "Failed",
                            "message": "internal server error"
                          }
                        },
                        "highActivity": {
                          "error": {
                            "code": "Failed",
                            "message": "internal server error"
                          }
                        },
                        "suspectScore": {
                          "error": {
                            "code": "Failed",
                            "message": "internal server error"
                          }
                        },
                        "velocity": {
                          "error": {
                            "code": "Failed",
                            "message": "internal server error"
                          }
                        },
                        "developerTools": {
                          "error": {
                            "code": "Failed",
                            "message": "internal server error"
                          }
                        },
                        "mitmAttack": {
                          "error": {
                            "code": "Failed",
                            "message": "internal server error"
                          }
                        },
                        "rareDevice": {
                          "error": {
                            "code": "Failed",
                            "message": "internal server error"
                          }
                        },
                        "proximity": {
                          "error": {
                            "code": "Failed",
                            "message": "internal server error"
                          }
                        },
                        "labels": {
                          "error": {
                            "code": "Failed",
                            "message": "internal server error"
                          }
                        }
                      }
                    }
                  },
                  "200-identification-error": {
                    "summary": "Identification error",
                    "value": {
                      "products": {
                        "identification": {
                          "error": {
                            "code": "Failed",
                            "message": "internal server error"
                          }
                        },
                        "botd": {
                          "data": {
                            "bot": {
                              "result": "bad",
                              "type": "headlessChrome"
                            },
                            "url": "https://example.com/login",
                            "ip": "94.60.143.223",
                            "time": "2024-02-23T10:20:25.287Z",
                            "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/121.0.6167.57 Safari/537.36",
                            "requestId": "1708683625245.tuJ4nD"
                          }
                        }
                      }
                    }
                  },
                  "200-botd-error": {
                    "summary": "BotD error",
                    "value": {
                      "products": {
                        "identification": {
                          "data": {
                            "visitorId": "Ibk1527CUFmcnjLwIs4A9",
                            "requestId": "0KSh65EnVoB85JBmloQK",
                            "incognito": true,
                            "linkedId": "somelinkedId",
                            "time": "2019-05-21T16:40:13.000Z",
                            "tag": {},
                            "timestamp": 1582299576512,
                            "url": "https://www.example.com/login",
                            "ip": "61.127.217.15",
                            "ipLocation": {
                              "accuracyRadius": 10,
                              "latitude": 49.982,
                              "longitude": 36.2566,
                              "postalCode": "61202",
                              "timezone": "Europe/Dusseldorf",
                              "city": {
                                "name": "Dusseldorf"
                              },
                              "continent": {
                                "code": "EU",
                                "name": "Europe"
                              },
                              "country": {
                                "code": "DE",
                                "name": "Germany"
                              },
                              "subdivisions": [
                                {
                                  "isoCode": "63",
                                  "name": "North Rhine-Westphalia"
                                }
                              ]
                            },
                            "browserDetails": {
                              "browserName": "Chrome",
                              "browserMajorVersion": "74",
                              "browserFullVersion": "74.0.3729",
                              "os": "Windows",
                              "osVersion": "7",
                              "device": "Other",
                              "userAgent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) ...."
                            },
                            "confidence": {
                              "score": 0.97
                            },
                            "visitorFound": true,
                            "firstSeenAt": {
                              "global": "2022-03-16T11:26:45.362Z",
                              "subscription": "2022-03-16T11:31:01.101Z"
                            },
                            "lastSeenAt": {
                              "global": "2022-03-16T11:28:34.023Z",
                              "subscription": null
                            },
                            "replayed": false
                          }
                        },
                        "botd": {
                          "error": {
                            "code": "Failed",
                            "message": "internal server error"
                          }
                        }
                      }
                    }
                  },
                  "200-too-many-requests-error": {
                    "summary": "Too many requests error",
                    "value": {
                      "products": {
                        "identification": {
                          "error": {
                            "code": "429 Too Many Requests",
                            "message": "too many requests"
                          }
                        },
                        "botd": {
                          "error": {
                            "code": "TooManyRequests",
                            "message": "too many requests"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Forbidden. Access to this API is denied.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "403-token-required": {
                    "summary": "Error response when the secret API key was not provided.",
                    "value": {
                      "error": {
                        "code": "TokenRequired",
                        "message": "secret key is required"
                      }
                    }
                  },
                  "403-token-not-found": {
                    "summary": "Error response when the provided secret API key does not exist.",
                    "value": {
                      "error": {
                        "code": "TokenNotFound",
                        "message": "secret key is not found"
                      }
                    }
                  },
                  "403-wrong-region": {
                    "summary": "Error response when the API region is different from the region, the calling application is configured with.",
                    "value": {
                      "error": {
                        "code": "WrongRegion",
                        "message": "wrong region"
                      }
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not found. The request ID cannot be found in this application's data.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "404-request-not-found": {
                    "summary": "Error response when the provided request ID does not exist.",
                    "value": {
                      "error": {
                        "code": "RequestNotFound",
                        "message": "request id is not found"
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests. The request is throttled.\nTo 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.\n",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "429-too-many-requests": {
                    "summary": "Error response when the limit on the provided secret API key requests per second has been exceeded.",
                    "value": {
                      "error": {
                        "code": "TooManyRequests",
                        "message": "too many requests"
                      }
                    }
                  },
                  "429-too-many-search-requests": {
                    "summary": "Error response when search traffic is throttled to protect service stability during rare periods of extreme load, even if you are within your assigned rate limits.",
                    "value": {
                      "error": {
                        "code": "TooManyRequests",
                        "message": "too many search requests"
                      }
                    }
                  }
                }
              }
            }
          },
          "504": {
            "description": "Gateway Timeout. Search execution exceeded the allowed timeout window.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "504-search-timeout-exceeded": {
                    "summary": "Error response when search execution exceeds the allowed timeout window.",
                    "value": {
                      "error": {
                        "code": "Failed",
                        "message": "gateway timeout"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      },
      "put": {
        "tags": [
          "Fingerprint"
        ],
        "operationId": "updateEvent",
        "summary": "Update an event with a given request ID",
        "description": "> 🚧 Deprecation Notice\n>\n> This version of Server API is marked as deprecated starting on **Jan 7th 2026** according to our [API Deprecation Policy](https://docs.fingerprint.com/reference/api-deprecation-policy). If you still use this version, please follow our [migration guide](https://docs.fingerprint.com/reference/migrating-from-server-api-v3-to-v4#migrating-update-/events) to migrate from this deprecated version to the new one.\n\nChange information in existing events specified by `requestId` or *flag suspicious events*.\n\nWhen an event is created, it is assigned `linkedId` and `tag` submitted through the JS agent parameters. This information might not be available on the client so the Server API allows for updating the attributes after the fact.\n\n**Warning** It's not possible to update events older than 10 days.\n",
        "parameters": [
          {
            "name": "request_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The unique event [identifier](https://docs.fingerprint.com/reference/v3/js-agent-get-function#requestid)."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EventsUpdateRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK."
          },
          "400": {
            "description": "Bad request. The request payload is not valid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "example": {
                    "summary": "Error response when the specified request payload is not valid and cannot be parsed.",
                    "value": {
                      "error": {
                        "code": "RequestCannotBeParsed",
                        "message": "request body is not valid"
                      }
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Forbidden. Access to this API is denied.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "403-token-required": {
                    "summary": "Error response when the secret API key was not provided.",
                    "value": {
                      "error": {
                        "code": "TokenRequired",
                        "message": "secret key is required"
                      }
                    }
                  },
                  "403-token-not-found": {
                    "summary": "Error response when the provided secret API key does not exist.",
                    "value": {
                      "error": {
                        "code": "TokenNotFound",
                        "message": "secret key is not found"
                      }
                    }
                  },
                  "403-wrong-region": {
                    "summary": "Error response when the API region is different from the region, the calling application is configured with.",
                    "value": {
                      "error": {
                        "code": "WrongRegion",
                        "message": "wrong region"
                      }
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not found. The request ID cannot be found in this application's data.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "404-request-not-found": {
                    "summary": "Error response when the provided request ID does not exist.",
                    "value": {
                      "error": {
                        "code": "RequestNotFound",
                        "message": "request id is not found"
                      }
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "Conflict. The event is not mutable yet.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "example": {
                    "summary": "Error response when the event is not mutable yet.",
                    "value": {
                      "error": {
                        "code": "StateNotReady",
                        "message": "resource is not mutable yet, try again"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/events/search": {
      "get": {
        "tags": [
          "Fingerprint"
        ],
        "operationId": "searchEvents",
        "summary": "Get events via search",
        "description": "> 🚧 Deprecation Notice\n>\n> This version of Server API is marked as deprecated starting on **Jan 7th 2026** according to our [API Deprecation Policy](https://docs.fingerprint.com/reference/api-deprecation-policy). If you still use this version, please follow our [migration guide](https://docs.fingerprint.com/reference/migrating-from-server-api-v3-to-v4#migrating-get-/events/search) to migrate from this deprecated version to the new one.\n\nSearch for identification events, including Smart Signals, using multiple filtering criteria. If you don't provide `start` or `end` parameters, the default search range is the last 7 days.\n\nPlease note that events include mobile signals (e.g. `rootApps`) even if the request originated from a non-mobile platform. We recommend you **ignore** mobile signals for such requests.\n",
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32",
              "minimum": 1,
              "example": 10
            },
            "description": "Limit the number of events returned.\n"
          },
          {
            "name": "pagination_key",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Use `pagination_key` to get the next page of results.\n\nWhen more results are available (e.g., you requested up to 200 results for your search using `limit`, but there are more than 200 events total matching your request), the `paginationKey` top-level attribute is added to the response. The key corresponds to the `timestamp` of the last returned event. In the following request, use that value in the `pagination_key` parameter to get the next page of results:\n\n1. First request, returning most recent 200 events: `GET api-base-url/events/search?limit=200`\n2. Use `response.paginationKey` to get the next page of results: `GET api-base-url/events/search?limit=200&pagination_key=1740815825085`\n"
          },
          {
            "name": "visitor_id",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Unique [visitor identifier](https://docs.fingerprint.com/reference/v3/js-agent-get-function#visitorid) issued by Fingerprint Identification and all active Smart Signals.\nFilter for events matching this `visitor_id`.\n"
          },
          {
            "name": "bot",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "all",
                "good",
                "bad",
                "none"
              ]
            },
            "description": "Filter events by the Bot Detection result, specifically:\n  `all` - events where any kind of bot was detected.\n  `good` - events where a good bot was detected.\n  `bad` - events where a bad bot was detected.\n  `none` - events where no bot was detected.\n> Note: When using this parameter, only events with the `products.botd.data.bot.result` property set to a valid value are returned. Events without a `products.botd` Smart Signal result are left out of the response.\n"
          },
          {
            "name": "ip_address",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Filter events by IP address range. The range can be as specific as a single IP (/32 for IPv4 or /128 for IPv6)\nAll ip_address filters must use CIDR notation, for example, 10.0.0.0/24, 192.168.0.1/32\n"
          },
          {
            "name": "linked_id",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Filter events by your custom identifier.\n\nYou can use [linked IDs](https://docs.fingerprint.com/reference/v3/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.\n"
          },
          {
            "name": "start",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int64"
            },
            "description": "Filter events with a timestamp greater than the start time, in Unix time (milliseconds).\n"
          },
          {
            "name": "end",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int64"
            },
            "description": "Filter events with a timestamp smaller than the end time, in Unix time (milliseconds).\n"
          },
          {
            "name": "reverse",
            "in": "query",
            "schema": {
              "type": "boolean",
              "default": false
            },
            "description": "When `true`, sort events oldest first (ascending timestamp order). Default is newest first (descending timestamp order).\n"
          },
          {
            "name": "suspect",
            "in": "query",
            "schema": {
              "type": "boolean"
            },
            "description": "Filter events previously tagged as suspicious via the [Update API](https://docs.fingerprint.com/reference/v3/server-api-update-event).\n> 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.\n"
          },
          {
            "name": "vpn",
            "in": "query",
            "schema": {
              "type": "boolean"
            },
            "description": "Filter events by VPN Detection result.\n> Note: When using this parameter, only events with the `products.vpn.data.result` property set to `true` or `false` are returned. Events without a `products.vpn` Smart Signal result are left out of the response.\n"
          },
          {
            "name": "virtual_machine",
            "in": "query",
            "schema": {
              "type": "boolean"
            },
            "description": "Filter events by Virtual Machine Detection result.\n> Note: When using this parameter, only events with the `products.virtualMachine.data.result` property set to `true` or `false` are returned. Events without a `products.virtualMachine` Smart Signal result are left out of the response.\n"
          },
          {
            "name": "tampering",
            "in": "query",
            "schema": {
              "type": "boolean"
            },
            "description": "Filter events by Tampering Detection result.\n> Note: When using this parameter, only events with the `products.tampering.data.result` property set to `true` or `false` are returned. Events without a `products.tampering` Smart Signal result are left out of the response.\n"
          },
          {
            "name": "anti_detect_browser",
            "in": "query",
            "schema": {
              "type": "boolean"
            },
            "description": "Filter events by Anti-detect Browser Detection result.\n> Note: When using this parameter, only events with the `products.tampering.data.antiDetectBrowser` property set to `true` or `false` are returned. Events without a `products.tampering` Smart Signal result are left out of the response.\n"
          },
          {
            "name": "incognito",
            "in": "query",
            "schema": {
              "type": "boolean"
            },
            "description": "Filter events by Browser Incognito Detection result.\n> Note: When using this parameter, only events with the `products.incognito.data.result` property set to `true` or `false` are returned. Events without a `products.incognito` Smart Signal result are left out of the response.\n"
          },
          {
            "name": "privacy_settings",
            "in": "query",
            "schema": {
              "type": "boolean"
            },
            "description": "Filter events by Privacy Settings Detection result.\n> Note: When using this parameter, only events with the `products.privacySettings.data.result` property set to `true` or `false` are returned. Events without a `products.privacySettings` Smart Signal result are left out of the response.\n"
          },
          {
            "name": "jailbroken",
            "in": "query",
            "schema": {
              "type": "boolean"
            },
            "description": "Filter events by Jailbroken Device Detection result.\n> Note: When using this parameter, only events with the `products.jailbroken.data.result` property set to `true` or `false` are returned. Events without a `products.jailbroken` Smart Signal result are left out of the response.\n"
          },
          {
            "name": "frida",
            "in": "query",
            "schema": {
              "type": "boolean"
            },
            "description": "Filter events by Frida Detection result.\n> Note: When using this parameter, only events with the `products.frida.data.result` property set to `true` or `false` are returned. Events without a `products.frida` Smart Signal result are left out of the response.\n"
          },
          {
            "name": "factory_reset",
            "in": "query",
            "schema": {
              "type": "boolean"
            },
            "description": "Filter events by Factory Reset Detection result.\n> Note: When using this parameter, only events with the `products.factoryReset.data.result` property set to `true` or `false` are returned. Events without a `products.factoryReset` Smart Signal result are left out of the response.\n"
          },
          {
            "name": "cloned_app",
            "in": "query",
            "schema": {
              "type": "boolean"
            },
            "description": "Filter events by Cloned App Detection result.\n> Note: When using this parameter, only events with the `products.clonedApp.data.result` property set to `true` or `false` are returned. Events without a `products.clonedApp` Smart Signal result are left out of the response.\n"
          },
          {
            "name": "emulator",
            "in": "query",
            "schema": {
              "type": "boolean"
            },
            "description": "Filter events by Android Emulator Detection result.\n> Note: When using this parameter, only events with the `products.emulator.data.result` property set to `true` or `false` are returned. Events without a `products.emulator` Smart Signal result are left out of the response.\n"
          },
          {
            "name": "root_apps",
            "in": "query",
            "schema": {
              "type": "boolean"
            },
            "description": "Filter events by Rooted Device Detection result.\n> Note: When using this parameter, only events with the `products.rootApps.data.result` property set to `true` or `false` are returned. Events without a `products.rootApps` Smart Signal result are left out of the response.\n"
          },
          {
            "name": "vpn_confidence",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "high",
                "medium",
                "low"
              ]
            },
            "description": "Filter events by VPN Detection result confidence level.\n`high` - events with high VPN Detection confidence.\n`medium` - events with medium VPN Detection confidence.\n`low` - events with low VPN Detection confidence.\n> Note: When using this parameter, only events with the `products.vpn.data.confidence` property set to a valid value are returned. Events without a `products.vpn` Smart Signal result are left out of the response.\n"
          },
          {
            "name": "min_suspect_score",
            "in": "query",
            "schema": {
              "type": "number",
              "format": "float"
            },
            "description": "Filter events with Suspect Score result above a provided minimum threshold.\n> Note: When using this parameter, only events where the `products.suspectScore.data.result` property set to a value exceeding your threshold are returned. Events without a `products.suspectScore` Smart Signal result are left out of the response.\n"
          },
          {
            "name": "ip_blocklist",
            "in": "query",
            "schema": {
              "type": "boolean"
            },
            "description": "Filter events by IP Blocklist Detection result.\n> Note: When using this parameter, only events with the `products.ipBlocklist.data.result` property set to `true` or `false` are returned. Events without a `products.ipBlocklist` Smart Signal result are left out of the response.\n"
          },
          {
            "name": "datacenter",
            "in": "query",
            "schema": {
              "type": "boolean"
            },
            "description": "Filter events by Datacenter Detection result.\n> Note: When using this parameter, only events with the `products.ipInfo.data.v4.datacenter.result` or `products.ipInfo.data.v6.datacenter.result` property set to `true` or `false` are returned. Events without a `products.ipInfo` Smart Signal result are left out of the response.\n"
          },
          {
            "name": "developer_tools",
            "in": "query",
            "schema": {
              "type": "boolean"
            },
            "description": "Filter events by Developer Tools detection result.\n> Note: When using this parameter, only events with the `products.developerTools.data.result` property set to `true` or `false` are returned. Events without a `products.developerTools` Smart Signal result are left out of the response.\n"
          },
          {
            "name": "location_spoofing",
            "in": "query",
            "schema": {
              "type": "boolean"
            },
            "description": "Filter events by Location Spoofing detection result.\n> Note: When using this parameter, only events with the `products.locationSpoofing.data.result` property set to `true` or `false` are returned. Events without a `products.locationSpoofing` Smart Signal result are left out of the response.\n"
          },
          {
            "name": "mitm_attack",
            "in": "query",
            "schema": {
              "type": "boolean"
            },
            "description": "Filter events by MITM (Man-in-the-Middle) Attack detection result.\n> Note: When using this parameter, only events with the `products.mitmAttack.data.result` property set to `true` or `false` are returned. Events without a `products.mitmAttack` Smart Signal result are left out of the response.\n"
          },
          {
            "name": "rare_device",
            "in": "query",
            "schema": {
              "type": "boolean"
            },
            "description": "Filter events by Rare Device detection result.\n> Note: When using this parameter, only events with the `products.rareDevice.data.result` property set to `true` or `false` are returned. Events without a `products.rareDevice` Smart Signal result are left out of the response.\n"
          },
          {
            "name": "rare_device_percentile_bucket",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "<p95",
                "p95-p99",
                "p99-p99.5",
                "p99.5-p99.9",
                "p99.9+",
                "not_seen"
              ]
            },
            "description": "Filter events by Rare Device 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.\n"
          },
          {
            "name": "proxy",
            "in": "query",
            "schema": {
              "type": "boolean"
            },
            "description": "Filter events by Proxy detection result.\n> Note: When using this parameter, only events with the `products.proxy.data.result` property set to `true` or `false` are returned. Events without a `products.proxy` Smart Signal result are left out of the response.\n"
          },
          {
            "name": "sdk_version",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Filter events by a specific SDK version associated with the identification event. Example: `3.11.14`\n"
          },
          {
            "name": "sdk_platform",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "js",
                "android",
                "ios"
              ]
            },
            "description": "Filter events by the SDK Platform associated with the identification event.\n`js` - JavaScript agent (Web).\n`ios` - Apple iOS based devices.\n`android` - Android based devices.\n"
          },
          {
            "name": "environment",
            "in": "query",
            "description": "Filter for events by providing one or more environment IDs.\n",
            "required": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "style": "form",
            "explode": true
          },
          {
            "name": "proximity_id",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Filter events by the most precise Proximity ID provided by default.\n> Note: When using this parameter, only events with the `products.proximity.id` property matching the provided ID are returned. Events without a `products.proximity` result are left out of the response.\n"
          },
          {
            "name": "proximity_precision_radius",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32",
              "enum": [
                10,
                25,
                65,
                175,
                450,
                1200,
                3300,
                8500,
                22500
              ]
            },
            "description": "Filter events by Proximity Radius.\n> Note: When using this parameter, only events with the `products.proximity.precisionRadius` property set to a valid value are returned. Events without a `products.proximity` result are left out of the response.\n"
          }
        ],
        "responses": {
          "200": {
            "description": "Events matching the filter(s).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SearchEventsResponse"
                },
                "examples": {
                  "200-full": {
                    "summary": "Example search results",
                    "value": {
                      "events": [
                        {
                          "products": {
                            "identification": {
                              "data": {
                                "visitorId": "Ibk1527CUFmcnjLwIs4A9",
                                "requestId": "1708102555327.NLOjmg",
                                "incognito": true,
                                "linkedId": "somelinkedId",
                                "tag": {},
                                "time": "2019-05-21T16:40:13Z",
                                "timestamp": 1582299576512,
                                "url": "https://www.example.com/login?hope{this{works[!",
                                "ip": "61.127.217.15",
                                "ipLocation": {
                                  "accuracyRadius": 10,
                                  "latitude": 49.982,
                                  "longitude": 36.2566,
                                  "postalCode": "61202",
                                  "timezone": "Europe/Dusseldorf",
                                  "city": {
                                    "name": "Dusseldorf"
                                  },
                                  "country": {
                                    "code": "DE",
                                    "name": "Germany"
                                  },
                                  "continent": {
                                    "code": "EU",
                                    "name": "Europe"
                                  },
                                  "subdivisions": [
                                    {
                                      "isoCode": "63",
                                      "name": "North Rhine-Westphalia"
                                    }
                                  ]
                                },
                                "browserDetails": {
                                  "browserName": "Chrome",
                                  "browserMajorVersion": "74",
                                  "browserFullVersion": "74.0.3729",
                                  "os": "Windows",
                                  "osVersion": "7",
                                  "device": "Other",
                                  "userAgent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) ...."
                                },
                                "confidence": {
                                  "score": 0.97
                                },
                                "visitorFound": false,
                                "firstSeenAt": {
                                  "global": "2022-03-16T11:26:45.362Z",
                                  "subscription": "2022-03-16T11:31:01.101Z"
                                },
                                "lastSeenAt": {
                                  "global": null,
                                  "subscription": null
                                },
                                "replayed": false
                              }
                            },
                            "botd": {
                              "data": {
                                "bot": {
                                  "result": "notDetected"
                                },
                                "url": "https://www.example.com/login?hope{this{works}[!",
                                "ip": "61.127.217.15",
                                "time": "2019-05-21T16:40:13.000Z",
                                "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 YaBrowser/24.1.0.0 Safari/537.36",
                                "requestId": "1708102555327.NLOjmg"
                              }
                            },
                            "rootApps": {
                              "data": {
                                "result": false
                              }
                            },
                            "emulator": {
                              "data": {
                                "result": false
                              }
                            },
                            "ipInfo": {
                              "data": {
                                "v4": {
                                  "address": "94.142.239.124",
                                  "geolocation": {
                                    "accuracyRadius": 20,
                                    "latitude": 50.05,
                                    "longitude": 14.4,
                                    "postalCode": "150 00",
                                    "timezone": "Europe/Prague",
                                    "city": {
                                      "name": "Prague"
                                    },
                                    "country": {
                                      "code": "CZ",
                                      "name": "Czechia"
                                    },
                                    "continent": {
                                      "code": "EU",
                                      "name": "Europe"
                                    },
                                    "subdivisions": [
                                      {
                                        "isoCode": "10",
                                        "name": "Hlavni mesto Praha"
                                      }
                                    ]
                                  },
                                  "asn": {
                                    "asn": "7922",
                                    "name": "COMCAST-7922",
                                    "network": "73.136.0.0/13",
                                    "type": "isp"
                                  },
                                  "datacenter": {
                                    "result": true,
                                    "name": "DediPath"
                                  }
                                },
                                "v6": {
                                  "address": "2001:db8:3333:4444:5555:6666:7777:8888",
                                  "geolocation": {
                                    "accuracyRadius": 5,
                                    "latitude": 49.982,
                                    "longitude": 36.2566,
                                    "postalCode": "10112",
                                    "timezone": "Europe/Berlin",
                                    "city": {
                                      "name": "Berlin"
                                    },
                                    "country": {
                                      "code": "DE",
                                      "name": "Germany"
                                    },
                                    "continent": {
                                      "code": "EU",
                                      "name": "Europe"
                                    },
                                    "subdivisions": [
                                      {
                                        "isoCode": "BE",
                                        "name": "Land Berlin"
                                      }
                                    ]
                                  },
                                  "asn": {
                                    "asn": "6805",
                                    "name": "Telefonica Germany",
                                    "network": "2a02:3100::/24",
                                    "type": "isp"
                                  },
                                  "datacenter": {
                                    "result": false,
                                    "name": ""
                                  }
                                }
                              }
                            },
                            "ipBlocklist": {
                              "data": {
                                "result": false,
                                "details": {
                                  "emailSpam": false,
                                  "attackSource": false
                                }
                              }
                            },
                            "tor": {
                              "data": {
                                "result": false
                              }
                            },
                            "vpn": {
                              "data": {
                                "result": false,
                                "confidence": "high",
                                "mlScore": 0.002,
                                "originTimezone": "Europe/Berlin",
                                "originCountry": "unknown",
                                "methods": {
                                  "timezoneMismatch": false,
                                  "publicVPN": false,
                                  "auxiliaryMobile": false,
                                  "osMismatch": false,
                                  "relay": false,
                                  "mlPrediction": false
                                }
                              }
                            },
                            "proxy": {
                              "data": {
                                "result": false,
                                "confidence": "high",
                                "mlScore": 0.7,
                                "details": {
                                  "proxyType": "residential",
                                  "lastSeenAt": "2025-08-12T13:00:00Z"
                                }
                              }
                            },
                            "incognito": {
                              "data": {
                                "result": false
                              }
                            },
                            "tampering": {
                              "data": {
                                "result": false,
                                "anomalyScore": 0.1955,
                                "antiDetectBrowser": false
                              }
                            },
                            "clonedApp": {
                              "data": {
                                "result": false
                              }
                            },
                            "factoryReset": {
                              "data": {
                                "time": "1970-01-01T00:00:00Z",
                                "timestamp": 0
                              }
                            },
                            "jailbroken": {
                              "data": {
                                "result": false
                              }
                            },
                            "frida": {
                              "data": {
                                "result": false
                              }
                            },
                            "privacySettings": {
                              "data": {
                                "result": false
                              }
                            },
                            "virtualMachine": {
                              "data": {
                                "result": true,
                                "mlScore": 0.2
                              }
                            },
                            "rawDeviceAttributes": {
                              "data": {
                                "architecture": {
                                  "value": 127
                                },
                                "audio": {
                                  "value": 35.73832903057337
                                },
                                "canvas": {
                                  "value": {
                                    "Winding": true,
                                    "Geometry": "4dce9d6017c3e0c052a77252f29f2b1c",
                                    "Text": "dd2474a56ff78c1de3e7a07070ba3b7d"
                                  }
                                },
                                "colorDepth": {
                                  "value": 30
                                },
                                "colorGamut": {
                                  "value": "p3"
                                },
                                "contrast": {
                                  "value": 0
                                },
                                "cookiesEnabled": {
                                  "value": true
                                },
                                "cpuClass": {},
                                "fonts": {
                                  "value": [
                                    "Arial Unicode MS",
                                    "Gill Sans",
                                    "Helvetica Neue",
                                    "Menlo"
                                  ]
                                }
                              }
                            },
                            "highActivity": {
                              "data": {
                                "result": false
                              }
                            },
                            "locationSpoofing": {
                              "data": {
                                "result": false
                              }
                            },
                            "velocity": {
                              "data": {
                                "distinctIp": {
                                  "intervals": {
                                    "5m": 1,
                                    "1h": 1,
                                    "24h": 1
                                  }
                                },
                                "distinctLinkedId": {},
                                "distinctCountry": {
                                  "intervals": {
                                    "5m": 1,
                                    "1h": 2,
                                    "24h": 2
                                  }
                                },
                                "events": {
                                  "intervals": {
                                    "5m": 1,
                                    "1h": 5,
                                    "24h": 5
                                  }
                                },
                                "ipEvents": {
                                  "intervals": {
                                    "5m": 1,
                                    "1h": 5,
                                    "24h": 5
                                  }
                                },
                                "distinctIpByLinkedId": {
                                  "intervals": {
                                    "5m": 1,
                                    "1h": 5,
                                    "24h": 5
                                  }
                                },
                                "distinctVisitorIdByLinkedId": {
                                  "intervals": {
                                    "5m": 1,
                                    "1h": 5,
                                    "24h": 5
                                  }
                                }
                              }
                            },
                            "developerTools": {
                              "data": {
                                "result": false
                              }
                            },
                            "mitmAttack": {
                              "data": {
                                "result": false
                              }
                            },
                            "rareDevice": {
                              "data": {
                                "result": false,
                                "percentileBucket": "<p95"
                              }
                            },
                            "proximity": {
                              "data": {
                                "id": "w1aTfd4MCvl",
                                "precisionRadius": 10,
                                "confidence": 0.95
                              }
                            }
                          }
                        }
                      ],
                      "paginationKey": "1655373953086"
                    }
                  }
                }
              }
            }
          },
          "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"
                },
                "examples": {
                  "400-limit-invalid": {
                    "summary": "Error response when no limit is supplied, or is invalid.",
                    "value": {
                      "error": {
                        "code": "RequestCannotBeParsed",
                        "message": "invalid limit"
                      }
                    }
                  },
                  "400-ip-address-invalid": {
                    "summary": "Error response when an invalid IP address is supplied, or is not using CIDR notation.",
                    "value": {
                      "error": {
                        "code": "RequestCannotBeParsed",
                        "message": "invalid ip address"
                      }
                    }
                  },
                  "400-bot-type-invalid": {
                    "summary": "Error response when an invalid bot type is specified, must be one of `good`, `bad`, `all`, or `none`.",
                    "value": {
                      "error": {
                        "code": "RequestCannotBeParsed",
                        "message": "invalid bot type"
                      }
                    }
                  },
                  "400-reverse-invalid": {
                    "summary": "Error response when the reverse parameter is invalid.",
                    "value": {
                      "error": {
                        "code": "RequestCannotBeParsed",
                        "message": "invalid reverse param"
                      }
                    }
                  },
                  "400-start-time-invalid": {
                    "summary": "Error response when an invalid start time is supplied.",
                    "value": {
                      "error": {
                        "code": "RequestCannotBeParsed",
                        "message": "invalid start time"
                      }
                    }
                  },
                  "400-end-time-invalid": {
                    "summary": "Error response when an invalid end time is supplied.",
                    "value": {
                      "error": {
                        "code": "RequestCannotBeParsed",
                        "message": "invalid end time"
                      }
                    }
                  },
                  "400-visitor-id-invalid": {
                    "summary": "Error response when an invalid visitor ID is supplied.",
                    "value": {
                      "error": {
                        "code": "RequestCannotBeParsed",
                        "message": "invalid visitor id"
                      }
                    }
                  },
                  "400-linked-id-invalid": {
                    "summary": "Error response when an invalid (too large) linked ID is supplied.",
                    "value": {
                      "error": {
                        "code": "RequestCannotBeParsed",
                        "message": "linked_id can't be greater than 256 characters long"
                      }
                    }
                  },
                  "400-pagination-key-invalid": {
                    "summary": "Error response when an invalid pagination key is supplied.",
                    "value": {
                      "error": {
                        "code": "RequestCannotBeParsed",
                        "message": "invalid pagination key"
                      }
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Forbidden. Access to this API is denied.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "403-token-required": {
                    "summary": "Error response when the secret API key was not provided.",
                    "value": {
                      "error": {
                        "code": "TokenRequired",
                        "message": "secret key is required"
                      }
                    }
                  },
                  "403-token-not-found": {
                    "summary": "Error response when the provided secret API key does not exist.",
                    "value": {
                      "error": {
                        "code": "TokenNotFound",
                        "message": "secret key is not found"
                      }
                    }
                  },
                  "403-wrong-region": {
                    "summary": "Error response when the API region does not match the region of your Fingerprint workspace.",
                    "value": {
                      "error": {
                        "code": "WrongRegion",
                        "message": "wrong region"
                      }
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not found. The requested visitor does not exist in this application's data.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "404-visitor-not-found": {
                    "summary": "Error response when the provided visitor ID does not exist.",
                    "value": {
                      "error": {
                        "code": "VisitorNotFound",
                        "message": "visitor not found"
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests. The request is throttled.\nTo 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.\n",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "429-too-many-requests": {
                    "summary": "Error response when the limit on the provided secret API key requests per second has been exceeded.",
                    "value": {
                      "error": {
                        "code": "TooManyRequests",
                        "message": "too many requests"
                      }
                    }
                  },
                  "429-too-many-search-requests": {
                    "summary": "Error response when search traffic is throttled to protect service stability during rare periods of extreme load, even if you are within your assigned rate limits.",
                    "value": {
                      "error": {
                        "code": "TooManyRequests",
                        "message": "too many search requests"
                      }
                    }
                  }
                }
              }
            }
          },
          "504": {
            "description": "Gateway Timeout. Search execution exceeded the allowed timeout window.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "504-search-timeout-exceeded": {
                    "summary": "Error response when search execution exceeds the allowed timeout window.",
                    "value": {
                      "error": {
                        "code": "Failed",
                        "message": "gateway timeout"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/visitors/{visitor_id}": {
      "get": {
        "tags": [
          "Fingerprint"
        ],
        "operationId": "getVisits",
        "summary": "Get visits by visitor ID",
        "description": "> 🚧 Deprecation Notice\n>\n> This version of Server API is marked as deprecated starting on **Jan 7th 2026** according to our [API Deprecation Policy](https://docs.fingerprint.com/reference/api-deprecation-policy). If you still use this version, please follow our [migration guide](https://docs.fingerprint.com/reference/migrating-from-server-api-v3-to-v4#migrating-get-/visitors) to migrate from this deprecated version to the new one.\n\nThis endpoint is deprecated. Use `GET /events/search` to query visit history or filter across multiple events.\n\n`GET /visitors/{visitor_id}` currently returns at most one visit in `visits`, even when no filters are provided.\nOnly information from the _Identification_ product is returned.\n\n#### Headers\n\n* `Retry-After` — Present in case of `429 Too many requests`. Indicates how long you should wait before making a follow-up request. The value is non-negative decimal integer indicating the seconds to delay after the response is received.\n",
        "x-flatten-optional-params": true,
        "parameters": [
          {
            "name": "visitor_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Unique [visitor identifier](https://docs.fingerprint.com/reference/v3/js-agent-get-function#visitorid) issued by Fingerprint Identification and all active Smart Signals."
          },
          {
            "name": "request_id",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Filter visits by `requestId`.\n\nEvery identification request has a unique identifier associated with it called `requestId`. This identifier is returned to the client in the identification [result](https://docs.fingerprint.com/reference/v3/js-agent-get-function#requestid). When you filter visits by `requestId`, only one visit will be returned.\n",
            "x-go-skip-pointer": true
          },
          {
            "name": "linked_id",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Filter visits by your custom identifier.\n\nYou can use [`linkedId`](https://docs.fingerprint.com/reference/v3/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.\n",
            "x-go-skip-pointer": true
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32",
              "minimum": 0
            },
            "description": "Limit scanned results.\n\n`GET /visitors/{visitor_id}` currently returns at most one visit. Use `GET /events/search` for paginated multi-event queries.\n",
            "x-go-skip-pointer": true
          },
          {
            "name": "paginationKey",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Deprecated pagination parameter retained for backward compatibility.\n\n`GET /visitors/{visitor_id}` currently returns at most one visit, so pagination is not expected. Use `GET /events/search` for paginated results.\n",
            "x-go-skip-pointer": true
          },
          {
            "name": "before",
            "in": "query",
            "deprecated": true,
            "schema": {
              "type": "integer",
              "format": "int64",
              "minimum": 0
            },
            "description": "⚠️ Deprecated pagination method, please use `paginationKey` instead. Timestamp (in milliseconds since epoch) used to paginate results.\n`GET /visitors/{visitor_id}` currently returns at most one visit, so pagination is not expected.\n",
            "x-go-skip-pointer": true
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VisitorsGetResponse"
                },
                "examples": {
                  "200-limit-1": {
                    "summary": "Example response (single visit)",
                    "value": {
                      "visitorId": "AcxioeQKffpXF8iGQK3P",
                      "visits": [
                        {
                          "requestId": "1655373953086.DDlfmP",
                          "browserDetails": {
                            "browserName": "Chrome",
                            "browserMajorVersion": "102",
                            "browserFullVersion": "102.0.5005",
                            "os": "Mac OS X",
                            "osVersion": "10.15.7",
                            "device": "Other",
                            "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.61 Safari/537.36"
                          },
                          "incognito": false,
                          "ip": "82.118.30.68",
                          "ipLocation": {
                            "accuracyRadius": 1000,
                            "latitude": 50.0805,
                            "longitude": 14.467,
                            "postalCode": "130 00",
                            "timezone": "Europe/Prague",
                            "city": {
                              "name": "Prague"
                            },
                            "country": {
                              "code": "CZ",
                              "name": "Czechia"
                            },
                            "continent": {
                              "code": "EU",
                              "name": "Europe"
                            },
                            "subdivisions": [
                              {
                                "isoCode": "10",
                                "name": "Hlavni mesto Praha"
                              }
                            ]
                          },
                          "timestamp": 1655373953094,
                          "time": "2022-06-16T10:05:53Z",
                          "url": "https://dashboard.fingerprint.com/",
                          "tag": {},
                          "confidence": {
                            "score": 1
                          },
                          "visitorFound": true,
                          "firstSeenAt": {
                            "global": "2022-02-04T11:31:20.000Z",
                            "subscription": "2022-02-04T11:31:20.000Z"
                          },
                          "lastSeenAt": {
                            "global": "2022-06-16T10:03:00.912Z",
                            "subscription": "2022-06-16T10:03:00.912Z"
                          }
                        }
                      ],
                      "lastTimestamp": 1655373953086,
                      "paginationKey": "1655373953086.DDlfmP"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request. The visitor ID or query parameters are missing or in the wrong format.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorPlainResponse"
                },
                "examples": {
                  "400-bad-request": {
                    "summary": "Error response when the visitor ID or query parameters are missing or in the wrong format.",
                    "value": {
                      "error": "bad request"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Forbidden. Access to this API is denied.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorPlainResponse"
                },
                "examples": {
                  "403-forbidden": {
                    "summary": "Error response when the secret API Key is missing or incorrect.",
                    "value": {
                      "error": "Forbidden (HTTP 403)"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not found. The visitor ID cannot be found in this application's data.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorPlainResponse"
                },
                "examples": {
                  "404-not-found": {
                    "summary": "Error response when the provided visitor ID does not exist.",
                    "value": {
                      "error": "visitor not found"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests. The request is throttled.\nTo 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.\n",
            "headers": {
              "Retry-After": {
                "description": "Indicates how many seconds you should wait before attempting the next request.",
                "schema": {
                  "type": "integer",
                  "format": "int32",
                  "minimum": 0
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorPlainResponse"
                },
                "examples": {
                  "429-too-many-requests": {
                    "summary": "Error response when the limit on the provided secret API key requests per second has been exceeded.",
                    "value": {
                      "error": "too many requests"
                    }
                  },
                  "429-too-many-search-requests": {
                    "summary": "Error response when visitor search traffic is throttled to protect service stability during rare periods of extreme load, even if you are within your assigned rate limits.",
                    "value": {
                      "error": "too many search requests"
                    }
                  }
                }
              }
            }
          },
          "504": {
            "description": "Gateway Timeout. Search execution exceeded the allowed timeout window.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "504-search-timeout-exceeded": {
                    "summary": "Error response when search execution exceeds the allowed timeout window.",
                    "value": {
                      "error": {
                        "code": "Failed",
                        "message": "gateway timeout"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Fingerprint"
        ],
        "operationId": "deleteVisitorData",
        "summary": "Delete data by visitor ID",
        "description": "> 🚧 Deprecation Notice\n>\n> This version of Server API is marked as deprecated starting on **Jan 7th 2026** according to our [API Deprecation Policy](https://docs.fingerprint.com/reference/api-deprecation-policy). If you still use this version, please follow our [migration guide](https://docs.fingerprint.com/reference/migrating-from-server-api-v3-to-v4) to migrate from this deprecated version to the new one.\n\nRequest deleting all data associated with the specified visitor ID. This API is useful for compliance with privacy regulations.\n### Which data is deleted?\n- Browser (or device) properties\n- Identification requests made from this browser (or device)\n\n#### Browser (or device) properties\n- Represents the data that Fingerprint collected from this specific browser (or device) and everything inferred and derived from it.\n- Upon request to delete, this data is deleted asynchronously (typically within a few minutes) and it will no longer be used to identify this browser (or device) for your [Fingerprint Workspace](https://docs.fingerprint.com/docs/v3/glossary#fingerprint-workspace).\n\n#### Identification requests made from this browser (or device)\n- Fingerprint stores the identification requests made from a browser (or device) for up to 30 (or 90) days depending on your plan. To learn more, see [Data Retention](https://docs.fingerprint.com/docs/v3/regions#data-retention).\n- Upon request to delete, the identification requests that were made by this browser\n  - Within the past 10 days are deleted within 24 hrs.\n  - Outside of 10 days are allowed to purge as per your data retention period.\n\n### Corollary\nAfter requesting to delete a visitor ID,\n- If the same browser (or device) requests to identify, it will receive a different visitor ID.\n- If you request [`/events` API](https://docs.fingerprint.com/reference/v3/server-api-get-event) with a `request_id` that was made outside of the 10 days, you will still receive a valid response.\n- If you request [`/visitors` API](https://docs.fingerprint.com/reference/v3/server-api-get-visits) for the deleted visitor ID, the response will include identification requests that were made outside of those 10 days.\n\n### Interested?\nPlease [contact our support team](https://fingerprint.com/support/) to enable it for you. Otherwise, you will receive a 403.\n",
        "parameters": [
          {
            "name": "visitor_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The [visitor ID](https://docs.fingerprint.com/reference/v3/js-agent-get-function#visitorid) 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"
                },
                "examples": {
                  "400-visitor-id-required": {
                    "summary": "Error response when the request does not include a visitor ID.",
                    "value": {
                      "error": {
                        "code": "RequestCannotBeParsed",
                        "message": "visitor id is required"
                      }
                    }
                  },
                  "400-visitor-id-invalid": {
                    "summary": "Error response when the visitor ID is incorrectly formatted.",
                    "value": {
                      "error": {
                        "code": "RequestCannotBeParsed",
                        "message": "invalid visitor id"
                      }
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Forbidden. Access to this API is denied.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "403-token-required": {
                    "summary": "Error response when the secret API key was not provided.",
                    "value": {
                      "error": {
                        "code": "TokenRequired",
                        "message": "secret key is required"
                      }
                    }
                  },
                  "403-token-not-found": {
                    "summary": "Error response when the provided secret API key does not exist.",
                    "value": {
                      "error": {
                        "code": "TokenNotFound",
                        "message": "secret key is not found"
                      }
                    }
                  },
                  "403-wrong-region": {
                    "summary": "Error response when the API region is different from the region, the calling application is configured with.",
                    "value": {
                      "error": {
                        "code": "WrongRegion",
                        "message": "wrong region"
                      }
                    }
                  },
                  "403-subscription-not-active": {
                    "summary": "Error response when the subscription is not active.",
                    "value": {
                      "error": {
                        "code": "SubscriptionNotActive",
                        "message": "forbidden"
                      }
                    }
                  },
                  "403-feature-not-enabled": {
                    "summary": "Error response when this feature is not enabled for a subscription.",
                    "value": {
                      "error": {
                        "code": "FeatureNotEnabled",
                        "message": "feature not enabled"
                      }
                    }
                  },
                  "403-workspace-scoped-secret-key-required": {
                    "summary": "Error response when you use an environment-scoped secret key to delete visitors from the workspace.",
                    "value": {
                      "error": {
                        "code": "WorkspaceScopedSecretKeyRequired",
                        "message": "workspace-scoped secret key is required"
                      }
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not found. The visitor ID cannot be found in this application's data.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "404-visitor-not-found": {
                    "summary": "Error response when the visitor ID cannot be found in this application's data.",
                    "value": {
                      "error": {
                        "code": "VisitorNotFound",
                        "message": "visitor not found"
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests. The request is throttled.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "429-too-many-requests": {
                    "summary": "Error response when the limit on the provided secret API key requests per second has been exceeded.",
                    "value": {
                      "error": {
                        "code": "TooManyRequests",
                        "message": "too many requests"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/related-visitors": {
      "get": {
        "tags": [
          "Fingerprint"
        ],
        "operationId": "getRelatedVisitors",
        "summary": "Get Related Visitors",
        "description": "> 🚧 Deprecation Notice\n>\n> This version of Server API is marked as deprecated starting on **Jan 7th 2026** according to our [API Deprecation Policy](https://docs.fingerprint.com/reference/api-deprecation-policy).\n\nRelated visitors API lets you link web visits and in-app browser visits that originated from the same mobile device.\nIt searches the past 6 months of identification events to find the visitor IDs that belong to the same mobile device as the given visitor ID.\n\n⚠️ Please note that this API is not enabled by default and is billable separately. ⚠️\n\nIf you would like to use Related visitors API, please contact our [support team](https://fingerprint.com/support).\nTo learn more, see [Related visitors API reference](https://docs.fingerprint.com/reference/related-visitors-api).\n",
        "parameters": [
          {
            "name": "visitor_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The [visitor ID](https://docs.fingerprint.com/reference/v3/js-agent-get-function#visitorid) for which you want to find the other visitor IDs that originated from the same mobile device."
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RelatedVisitorsResponse"
                },
                "examples": {
                  "200-success-empty-response": {
                    "summary": "Success, empty response",
                    "value": {
                      "relatedVisitors": []
                    }
                  },
                  "200-success-response": {
                    "summary": "Success response",
                    "value": {
                      "relatedVisitors": [
                        {
                          "visitorId": "NtCUJGceWX9RpvSbhvOm"
                        },
                        {
                          "visitorId": "25ee02iZwGxeyT0jMNkZ"
                        }
                      ]
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request. The visitor ID parameter is missing or in the wrong format.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "400-visitor-id-required": {
                    "summary": "Error response when the request does not include a visitor ID.",
                    "value": {
                      "error": {
                        "code": "RequestCannotBeParsed",
                        "message": "visitor id is required"
                      }
                    }
                  },
                  "400-visitor-id-invalid": {
                    "summary": "Error response when the visitor ID is incorrectly formatted.",
                    "value": {
                      "error": {
                        "code": "RequestCannotBeParsed",
                        "message": "invalid visitor id"
                      }
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Forbidden. Access to this API is denied.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "403-token-required": {
                    "summary": "Error response when the secret API key was not provided.",
                    "value": {
                      "error": {
                        "code": "TokenRequired",
                        "message": "secret key is required"
                      }
                    }
                  },
                  "403-token-not-found": {
                    "summary": "Error response when the provided secret API key does not exist.",
                    "value": {
                      "error": {
                        "code": "TokenNotFound",
                        "message": "secret key is not found"
                      }
                    }
                  },
                  "403-wrong-region": {
                    "summary": "Error response when the API region is different from the region, the calling application is configured with.",
                    "value": {
                      "error": {
                        "code": "WrongRegion",
                        "message": "wrong region"
                      }
                    }
                  },
                  "403-subscription-not-active": {
                    "summary": "Error response when the subscription is not active.",
                    "value": {
                      "error": {
                        "code": "SubscriptionNotActive",
                        "message": "forbidden"
                      }
                    }
                  },
                  "403-feature-not-enabled": {
                    "summary": "Error response when this feature is not enabled for a subscription.",
                    "value": {
                      "error": {
                        "code": "FeatureNotEnabled",
                        "message": "feature not enabled"
                      }
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not found. The visitor ID cannot be found in this application's data.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "404-visitor-not-found": {
                    "summary": "Error response when the visitor ID cannot be found in this application's data.",
                    "value": {
                      "error": {
                        "code": "VisitorNotFound",
                        "message": "visitor not found"
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests. The request is throttled.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "429-too-many-requests": {
                    "summary": "Error response when the limit on the provided secret API key requests per second has been exceeded.",
                    "value": {
                      "error": {
                        "code": "TooManyRequests",
                        "message": "too many requests"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/webhook": {
      "trace": {
        "summary": "Dummy path to describe webhook format.",
        "tags": [
          "Fingerprint"
        ],
        "description": "Fake path to describe webhook format. More information about webhooks can be found in the [documentation](https://docs.fingerprint.com/docs/v3/webhooks)",
        "x-flatten-optional-params": true,
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Webhook"
              }
            }
          }
        },
        "responses": {
          "default": {
            "description": "Dummy for the schema"
          }
        },
        "callbacks": {
          "webhook": {
            "webhook": {
              "post": {
                "summary": "Webhook example",
                "description": "You can use HTTP basic authentication and set up credentials in your [Fingerprint account](https://dashboard.fingerprint.com/login)",
                "requestBody": {
                  "content": {
                    "application/json": {
                      "schema": {
                        "$ref": "#/components/schemas/Webhook"
                      },
                      "examples": {
                        "webhook-example": {
                          "summary": "Webhook example",
                          "value": {
                            "requestId": "Px6VxbRC6WBkA39yeNH3",
                            "url": "https://banking.example.com/signup",
                            "ip": "216.3.128.12",
                            "tag": {
                              "requestType": "signup",
                              "yourCustomId": 45321
                            },
                            "time": "2019-10-12T07:20:50.520Z",
                            "timestamp": 1554910997788,
                            "ipLocation": {
                              "accuracyRadius": 1,
                              "city": {
                                "name": "Bolingbrook"
                              },
                              "continent": {
                                "code": "NA",
                                "name": "North America"
                              },
                              "country": {
                                "code": "US",
                                "name": "United States"
                              },
                              "latitude": 41.12933,
                              "longitude": -88.9954,
                              "postalCode": "60547",
                              "subdivisions": [
                                {
                                  "isoCode": "IL",
                                  "name": "Illinois"
                                }
                              ],
                              "timezone": "America/Chicago"
                            },
                            "linkedId": "any-string",
                            "visitorId": "3HNey93AkBW6CRbxV6xP",
                            "visitorFound": true,
                            "confidence": {
                              "score": 0.97
                            },
                            "firstSeenAt": {
                              "global": "2022-03-16T11:26:45.362Z",
                              "subscription": "2022-03-16T11:31:01.101Z"
                            },
                            "lastSeenAt": {
                              "global": "2022-03-16T11:28:34.023Z",
                              "subscription": null
                            },
                            "browserDetails": {
                              "browserName": "Chrome",
                              "browserFullVersion": "73.0.3683.86",
                              "browserMajorVersion": "73",
                              "os": "Mac OS X",
                              "osVersion": "10.14.3",
                              "device": "Other",
                              "userAgent": "(Macintosh; Intel Mac OS X 10_14_3) Chrome/73.0.3683.86"
                            },
                            "incognito": false,
                            "clientReferrer": "https://google.com?search=banking+services",
                            "bot": {
                              "result": "bad",
                              "type": "selenium"
                            },
                            "userAgent": "(Macintosh; Intel Mac OS X 10_14_3) Chrome/73.0.3683.86",
                            "rootApps": {
                              "result": false
                            },
                            "emulator": {
                              "result": false
                            },
                            "ipInfo": {
                              "v4": {
                                "address": "94.142.239.124",
                                "geolocation": {
                                  "accuracyRadius": 20,
                                  "latitude": 50.05,
                                  "longitude": 14.4,
                                  "postalCode": "150 00",
                                  "timezone": "Europe/Prague",
                                  "city": {
                                    "name": "Prague"
                                  },
                                  "country": {
                                    "code": "CZ",
                                    "name": "Czechia"
                                  },
                                  "continent": {
                                    "code": "EU",
                                    "name": "Europe"
                                  },
                                  "subdivisions": [
                                    {
                                      "isoCode": "10",
                                      "name": "Hlavni mesto Praha"
                                    }
                                  ]
                                },
                                "asn": {
                                  "asn": "7922",
                                  "name": "COMCAST-7922",
                                  "network": "73.136.0.0/13",
                                  "type": "isp"
                                },
                                "datacenter": {
                                  "result": true,
                                  "name": "DediPath"
                                }
                              }
                            },
                            "ipBlocklist": {
                              "result": false,
                              "details": {
                                "emailSpam": false,
                                "attackSource": false
                              }
                            },
                            "tor": {
                              "result": false
                            },
                            "vpn": {
                              "result": false,
                              "confidence": "high",
                              "mlScore": 0.002,
                              "originTimezone": "Europe/Berlin",
                              "originCountry": "unknown",
                              "methods": {
                                "timezoneMismatch": false,
                                "publicVPN": false,
                                "auxiliaryMobile": false,
                                "osMismatch": false,
                                "relay": false,
                                "mlPrediction": false
                              }
                            },
                            "proxy": {
                              "result": true,
                              "confidence": "high",
                              "mlScore": 0.99,
                              "details": {
                                "proxyType": "residential",
                                "lastSeenAt": "2025-08-12T13:00:00Z"
                              }
                            },
                            "tampering": {
                              "result": false,
                              "anomalyScore": 0,
                              "antiDetectBrowser": false
                            },
                            "clonedApp": {
                              "result": false
                            },
                            "factoryReset": {
                              "time": "1970-01-01T00:00:00.000Z",
                              "timestamp": 0
                            },
                            "jailbroken": {
                              "result": false
                            },
                            "frida": {
                              "result": false
                            },
                            "privacySettings": {
                              "result": false
                            },
                            "virtualMachine": {
                              "result": false
                            },
                            "rawDeviceAttributes": {
                              "architecture": {
                                "value": 127
                              },
                              "audio": {
                                "value": 35.73832903057337
                              },
                              "canvas": {
                                "value": {
                                  "Winding": true,
                                  "Geometry": "4dce9d6017c3e0c052a77252f29f2b1c",
                                  "Text": "dd2474a56ff78c1de3e7a07070ba3b7d"
                                }
                              },
                              "colorDepth": {
                                "value": 30
                              },
                              "colorGamut": {
                                "value": "srgb"
                              },
                              "contrast": {
                                "value": 0
                              },
                              "cookiesEnabled": {
                                "value": true
                              }
                            },
                            "highActivity": {
                              "result": false
                            },
                            "locationSpoofing": {
                              "result": true
                            },
                            "suspectScore": {
                              "result": 0
                            },
                            "velocity": {
                              "distinctIp": {
                                "intervals": {
                                  "5m": 1,
                                  "1h": 1,
                                  "24h": 1
                                }
                              },
                              "distinctLinkedId": {},
                              "distinctCountry": {
                                "intervals": {
                                  "5m": 1,
                                  "1h": 2,
                                  "24h": 2
                                }
                              },
                              "events": {
                                "intervals": {
                                  "5m": 1,
                                  "1h": 5,
                                  "24h": 5
                                }
                              },
                              "ipEvents": {
                                "intervals": {
                                  "5m": 1,
                                  "1h": 5,
                                  "24h": 5
                                }
                              },
                              "distinctIpByLinkedId": {
                                "intervals": {
                                  "5m": 1,
                                  "1h": 5,
                                  "24h": 5
                                }
                              },
                              "distinctVisitorIdByLinkedId": {
                                "intervals": {
                                  "5m": 1,
                                  "1h": 5,
                                  "24h": 5
                                }
                              }
                            },
                            "developerTools": {
                              "result": false
                            },
                            "mitmAttack": {
                              "result": false
                            },
                            "rareDevice": {
                              "result": false,
                              "percentileBucket": "<p95"
                            },
                            "sdk": {
                              "platform": "js",
                              "version": "3.11.10",
                              "integrations": [
                                {
                                  "name": "fingerprint-pro-react",
                                  "version": "3.11.10",
                                  "subintegration": {
                                    "name": "preact",
                                    "version": "10.21.0"
                                  }
                                }
                              ]
                            },
                            "replayed": false,
                            "supplementaryIds": {
                              "standard": {
                                "visitorId": "3HNey93AkBW6CRbxV6xP",
                                "visitorFound": true,
                                "confidence": {
                                  "score": 0.97
                                },
                                "firstSeenAt": {
                                  "global": "2022-03-16T11:26:45.362Z",
                                  "subscription": "2022-03-16T11:31:01.101Z"
                                },
                                "lastSeenAt": {
                                  "global": "2022-03-16T11:28:34.023Z",
                                  "subscription": "2022-03-16T11:28:34.023Z"
                                }
                              },
                              "highRecall": {
                                "visitorId": "3HNey93AkBW6CRbxV6xP",
                                "visitorFound": true,
                                "confidence": {
                                  "score": 0.97
                                },
                                "firstSeenAt": {
                                  "global": "2022-03-16T11:26:45.362Z",
                                  "subscription": "2022-03-16T11:31:01.101Z"
                                },
                                "lastSeenAt": {
                                  "global": "2022-03-16T11:28:34.023Z",
                                  "subscription": "2022-03-16T11:28:34.023Z"
                                }
                              }
                            },
                            "proximity": {
                              "id": "w1aTfd4MCvl",
                              "precisionRadius": 10,
                              "confidence": 0.95
                            }
                          }
                        }
                      }
                    }
                  }
                },
                "responses": {
                  "default": {
                    "description": "The server doesn't validate the answer."
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "ApiKeyHeader": {
        "type": "apiKey",
        "in": "header",
        "name": "Auth-API-Key"
      },
      "ApiKeyQuery": {
        "type": "apiKey",
        "in": "query",
        "name": "api_key"
      }
    },
    "schemas": {
      "BrowserDetails": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "browserName",
          "browserFullVersion",
          "browserMajorVersion",
          "os",
          "osVersion",
          "device",
          "userAgent"
        ],
        "properties": {
          "browserName": {
            "type": "string"
          },
          "browserMajorVersion": {
            "type": "string"
          },
          "browserFullVersion": {
            "type": "string"
          },
          "os": {
            "type": "string"
          },
          "osVersion": {
            "type": "string"
          },
          "device": {
            "type": "string"
          },
          "userAgent": {
            "type": "string"
          }
        }
      },
      "GeolocationCity": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "name"
        ],
        "properties": {
          "name": {
            "type": "string"
          }
        }
      },
      "GeolocationCountry": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "code",
          "name"
        ],
        "properties": {
          "code": {
            "type": "string",
            "minLength": 2,
            "maxLength": 2
          },
          "name": {
            "type": "string"
          }
        }
      },
      "GeolocationContinent": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "code",
          "name"
        ],
        "properties": {
          "code": {
            "type": "string",
            "minLength": 2,
            "maxLength": 2
          },
          "name": {
            "type": "string"
          }
        }
      },
      "GeolocationSubdivision": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "isoCode",
          "name"
        ],
        "properties": {
          "isoCode": {
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        }
      },
      "GeolocationSubdivisions": {
        "type": "array",
        "items": {
          "$ref": "#/components/schemas/GeolocationSubdivision"
        }
      },
      "DeprecatedGeolocation": {
        "deprecated": true,
        "type": "object",
        "description": "This field is **deprecated** and will not return a result for **applications created after January 23rd, 2024**.  Please use the [IP Geolocation Smart signal](https://docs.fingerprint.com/docs/v3/smart-signals-reference#ip-geolocation) for geolocation information.",
        "additionalProperties": false,
        "properties": {
          "accuracyRadius": {
            "type": "integer",
            "minimum": 0,
            "description": "The IP address is likely to be within this radius (in km) of the specified location."
          },
          "latitude": {
            "type": "number",
            "format": "double",
            "minimum": -90,
            "maximum": 90
          },
          "longitude": {
            "type": "number",
            "format": "double",
            "minimum": -180,
            "maximum": 180
          },
          "postalCode": {
            "type": "string"
          },
          "timezone": {
            "type": "string",
            "format": "timezone"
          },
          "city": {
            "$ref": "#/components/schemas/GeolocationCity"
          },
          "country": {
            "$ref": "#/components/schemas/GeolocationCountry"
          },
          "continent": {
            "$ref": "#/components/schemas/GeolocationContinent"
          },
          "subdivisions": {
            "$ref": "#/components/schemas/GeolocationSubdivisions"
          }
        }
      },
      "Tag": {
        "type": "object",
        "description": "A customer-provided value or an object that was sent with identification request.",
        "additionalProperties": true
      },
      "IdentificationConfidence": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "score"
        ],
        "properties": {
          "score": {
            "type": "number",
            "format": "double",
            "minimum": 0,
            "maximum": 1,
            "description": "The confidence score is a floating-point number between 0 and 1 that represents the probability of accurate identification."
          },
          "revision": {
            "type": "string",
            "description": "The revision name of the method used to calculate the Confidence score. This field is only present for customers who opted in to an alternative calculation method."
          },
          "comment": {
            "type": "string"
          }
        }
      },
      "IdentificationSeenAt": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "global",
          "subscription"
        ],
        "properties": {
          "global": {
            "type": "string",
            "nullable": true,
            "format": "date-time",
            "x-ogen-time-format": "2006-01-02T15:04:05.000Z07:00"
          },
          "subscription": {
            "type": "string",
            "nullable": true,
            "format": "date-time",
            "x-ogen-time-format": "2006-01-02T15:04:05.000Z07:00"
          }
        }
      },
      "RawDeviceAttributeError": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "name": {
            "type": "string"
          },
          "message": {
            "type": "string"
          }
        }
      },
      "RawDeviceAttribute": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "value": {
            "title": "value"
          },
          "error": {
            "$ref": "#/components/schemas/RawDeviceAttributeError"
          }
        }
      },
      "RawDeviceAttributes": {
        "type": "object",
        "description": "It includes 35+ raw browser identification attributes to provide Fingerprint users with even more information than our standard visitor ID provides. This enables Fingerprint users to not have to run our open-source product in conjunction with Fingerprint Pro Plus and Enterprise to get those additional attributes.\nWarning: The raw signals data can change at any moment as we improve the product. We cannot guarantee the internal shape of raw device attributes to be stable, so typical semantic versioning rules do not apply here. Use this data with caution without assuming a specific structure beyond the generic type provided here.\n",
        "additionalProperties": {
          "$ref": "#/components/schemas/RawDeviceAttribute"
        }
      },
      "Integration": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "name": {
            "type": "string",
            "description": "The name of the specific integration, e.g. \"fingerprint-pro-react\"."
          },
          "version": {
            "type": "string",
            "description": "The version of the specific integration, e.g. \"3.11.10\"."
          },
          "subintegration": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "name": {
                "type": "string",
                "description": "The name of the specific subintegration, e.g. \"preact\"."
              },
              "version": {
                "type": "string",
                "description": "The version of the specific subintegration, e.g. \"10.21.0\"."
              }
            }
          }
        }
      },
      "SDK": {
        "type": "object",
        "description": "Contains information about the SDK used to perform the request.",
        "additionalProperties": false,
        "required": [
          "platform",
          "version"
        ],
        "properties": {
          "platform": {
            "type": "string",
            "description": "Platform of the SDK."
          },
          "version": {
            "type": "string",
            "description": "SDK version string."
          },
          "integrations": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Integration"
            }
          }
        }
      },
      "Identification": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "visitorId",
          "requestId",
          "browserDetails",
          "incognito",
          "ip",
          "timestamp",
          "time",
          "url",
          "tag",
          "visitorFound",
          "firstSeenAt",
          "lastSeenAt",
          "replayed"
        ],
        "properties": {
          "visitorId": {
            "type": "string",
            "description": "String of 20 characters that uniquely identifies the visitor's browser or mobile device."
          },
          "requestId": {
            "type": "string",
            "description": "Unique identifier of the user's request."
          },
          "browserDetails": {
            "$ref": "#/components/schemas/BrowserDetails"
          },
          "incognito": {
            "description": "Flag if user used incognito session.",
            "type": "boolean"
          },
          "ip": {
            "type": "string",
            "description": "IP address of the requesting browser or bot."
          },
          "ipLocation": {
            "$ref": "#/components/schemas/DeprecatedGeolocation"
          },
          "linkedId": {
            "type": "string",
            "description": "A customer-provided id that was sent with the request."
          },
          "suspect": {
            "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/v3/server-api-update-event).",
            "type": "boolean"
          },
          "timestamp": {
            "description": "Timestamp of the event with millisecond precision in Unix time.",
            "type": "integer",
            "format": "int64"
          },
          "time": {
            "type": "string",
            "format": "date-time",
            "x-ogen-time-format": "2006-01-02T15:04:05Z07:00",
            "description": "Time expressed according to ISO 8601 in UTC format, when the request from the JS agent was made. We recommend to treat requests that are older than 2 minutes as malicious. Otherwise, request replay attacks are possible."
          },
          "url": {
            "type": "string",
            "description": "Page URL from which the request was sent."
          },
          "tag": {
            "$ref": "#/components/schemas/Tag"
          },
          "confidence": {
            "$ref": "#/components/schemas/IdentificationConfidence"
          },
          "visitorFound": {
            "type": "boolean",
            "description": "Attribute represents if a visitor had been identified before."
          },
          "firstSeenAt": {
            "$ref": "#/components/schemas/IdentificationSeenAt"
          },
          "lastSeenAt": {
            "$ref": "#/components/schemas/IdentificationSeenAt"
          },
          "components": {
            "$ref": "#/components/schemas/RawDeviceAttributes"
          },
          "replayed": {
            "type": "boolean",
            "description": "`true` if we determined that this payload was replayed, `false` otherwise.\n"
          },
          "sdk": {
            "$ref": "#/components/schemas/SDK"
          },
          "environmentId": {
            "type": "string",
            "description": "Environment ID associated with the event"
          }
        }
      },
      "ErrorCode": {
        "type": "string",
        "enum": [
          "RequestCannotBeParsed",
          "RequestReadTimeout",
          "TokenRequired",
          "TokenNotFound",
          "SubscriptionNotActive",
          "WrongRegion",
          "FeatureNotEnabled",
          "WorkspaceScopedSecretKeyRequired",
          "RequestNotFound",
          "VisitorNotFound",
          "TooManyRequests",
          "429 Too Many Requests",
          "StateNotReady",
          "Failed"
        ],
        "description": "Error code:\n * `RequestCannotBeParsed` - the query parameters or JSON payload contains some errors \n          that prevented us from parsing it (wrong type/surpassed limits).\n * `RequestReadTimeout` - the request body could not be read before the connection timed out.\n * `TokenRequired` - `Auth-API-Key` header is missing or empty.\n * `TokenNotFound` - no Fingerprint application found for specified secret key.\n * `SubscriptionNotActive` - Fingerprint application is not active.\n * `WrongRegion` - server and application region differ.\n * `FeatureNotEnabled` - this feature (for example, Delete API) is not enabled for your application.\n * `WorkspaceScopedSecretKeyRequired` - The provided secret API key is scoped to an environment, but this operation requires a workspace-scoped secret API key.\n * `RequestNotFound` - the specified request ID was not found. It never existed, expired, or it has been deleted.\n * `VisitorNotFound` - The specified visitor ID was not found. It never existed or it may have already been deleted.\n * `TooManyRequests` - the limit on secret API key requests per second has been exceeded.\n * `429 Too Many Requests` - the limit on secret API key requests per second has been exceeded.\n * `StateNotReady` - The event specified with request id is\n          not ready for updates yet. Try again.\n          This error happens in rare cases when update API is called immediately\n          after receiving the request id on the client. In case you need to send\n          information right away, we recommend using the JS agent API instead.\n * `Failed` - internal server error.\n"
      },
      "Error": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "code",
          "message"
        ],
        "properties": {
          "code": {
            "$ref": "#/components/schemas/ErrorCode"
          },
          "message": {
            "type": "string"
          }
        }
      },
      "ProductIdentification": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/Identification"
          },
          "error": {
            "$ref": "#/components/schemas/Error"
          }
        }
      },
      "BotdBotResult": {
        "type": "string",
        "enum": [
          "notDetected",
          "good",
          "bad"
        ],
        "description": "Bot detection result:\n * `notDetected` - the visitor is not a bot\n * `good` - good bot detected, such as Google bot, Baidu Spider, AlexaBot and so on\n * `bad` - bad bot detected, such as Selenium, Puppeteer, Playwright, headless browsers, and so on\n"
      },
      "BotdBot": {
        "type": "object",
        "description": "Stores bot detection result",
        "additionalProperties": false,
        "required": [
          "result"
        ],
        "properties": {
          "result": {
            "$ref": "#/components/schemas/BotdBotResult"
          },
          "type": {
            "type": "string"
          }
        }
      },
      "Botd": {
        "type": "object",
        "description": "Contains all the information from Bot Detection product",
        "additionalProperties": false,
        "required": [
          "bot",
          "url",
          "ip",
          "time",
          "userAgent",
          "requestId"
        ],
        "properties": {
          "bot": {
            "$ref": "#/components/schemas/BotdBot"
          },
          "meta": {
            "$ref": "#/components/schemas/Tag"
          },
          "linkedId": {
            "type": "string",
            "description": "A customer-provided id that was sent with the request."
          },
          "url": {
            "type": "string",
            "description": "Page URL from which the request was sent."
          },
          "ip": {
            "type": "string",
            "description": "IP address of the requesting browser or bot."
          },
          "time": {
            "type": "string",
            "format": "date-time",
            "x-ogen-time-format": "2006-01-02T15:04:05.000Z07:00",
            "description": "Time in UTC when the request from the JS agent was made. We recommend to treat requests that are older than 2 minutes as malicious. Otherwise, request replay attacks are possible."
          },
          "userAgent": {
            "type": "string"
          },
          "requestId": {
            "type": "string",
            "description": "Unique identifier of the user's request."
          }
        }
      },
      "ProductBotd": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/Botd"
          },
          "error": {
            "$ref": "#/components/schemas/Error"
          }
        }
      },
      "RootApps": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "result"
        ],
        "properties": {
          "result": {
            "type": "boolean",
            "description": "Android specific root management apps detection. There are 2 values: \n  * `true` - Root Management Apps detected (e.g. Magisk).\n  * `false` - No Root Management Apps detected or the client isn't Android.\n"
          }
        }
      },
      "ProductRootApps": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/RootApps"
          },
          "error": {
            "$ref": "#/components/schemas/Error"
          }
        }
      },
      "Emulator": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "result"
        ],
        "properties": {
          "result": {
            "type": "boolean",
            "description": "Android specific emulator detection. There are 2 values: \n  * `true` - Emulated environment detected (e.g. launch inside of AVD). \n  * `false` - No signs of emulated environment detected or the client is not Android.\n"
          }
        }
      },
      "ProductEmulator": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/Emulator"
          },
          "error": {
            "$ref": "#/components/schemas/Error"
          }
        }
      },
      "Geolocation": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "accuracyRadius": {
            "type": "integer",
            "minimum": 0,
            "description": "The IP address is likely to be within this radius (in km) of the specified location."
          },
          "latitude": {
            "type": "number",
            "format": "double",
            "minimum": -90,
            "maximum": 90
          },
          "longitude": {
            "type": "number",
            "format": "double",
            "minimum": -180,
            "maximum": 180
          },
          "postalCode": {
            "type": "string"
          },
          "timezone": {
            "type": "string",
            "format": "timezone"
          },
          "city": {
            "$ref": "#/components/schemas/GeolocationCity"
          },
          "country": {
            "$ref": "#/components/schemas/GeolocationCountry"
          },
          "continent": {
            "$ref": "#/components/schemas/GeolocationContinent"
          },
          "subdivisions": {
            "$ref": "#/components/schemas/GeolocationSubdivisions"
          }
        }
      },
      "IPInfoASN": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "asn",
          "name",
          "network"
        ],
        "properties": {
          "asn": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "network": {
            "type": "string"
          },
          "type": {
            "type": "string"
          }
        }
      },
      "IPInfoDataCenter": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "result",
          "name"
        ],
        "properties": {
          "result": {
            "type": "boolean"
          },
          "name": {
            "type": "string"
          }
        }
      },
      "IPInfoV4": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "address",
          "geolocation"
        ],
        "properties": {
          "address": {
            "type": "string",
            "format": "ipv4"
          },
          "geolocation": {
            "$ref": "#/components/schemas/Geolocation"
          },
          "asn": {
            "$ref": "#/components/schemas/IPInfoASN"
          },
          "datacenter": {
            "$ref": "#/components/schemas/IPInfoDataCenter"
          }
        }
      },
      "IPInfoV6": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "address",
          "geolocation"
        ],
        "properties": {
          "address": {
            "type": "string",
            "format": "ipv6"
          },
          "geolocation": {
            "$ref": "#/components/schemas/Geolocation"
          },
          "asn": {
            "$ref": "#/components/schemas/IPInfoASN"
          },
          "datacenter": {
            "$ref": "#/components/schemas/IPInfoDataCenter"
          }
        }
      },
      "IPInfo": {
        "type": "object",
        "description": "Details about the request IP address. Has separate fields for v4 and v6 IP address versions.",
        "additionalProperties": false,
        "properties": {
          "v4": {
            "$ref": "#/components/schemas/IPInfoV4"
          },
          "v6": {
            "$ref": "#/components/schemas/IPInfoV6"
          }
        }
      },
      "ProductIPInfo": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/IPInfo"
          },
          "error": {
            "$ref": "#/components/schemas/Error"
          }
        }
      },
      "IPBlocklistDetails": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "emailSpam",
          "attackSource"
        ],
        "properties": {
          "emailSpam": {
            "type": "boolean",
            "description": "IP address was part of a known email spam attack (SMTP)."
          },
          "attackSource": {
            "type": "boolean",
            "description": "IP address was part of a known network attack (SSH/HTTPS)."
          }
        }
      },
      "IPBlocklist": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "result",
          "details"
        ],
        "properties": {
          "result": {
            "type": "boolean",
            "description": "`true` if request IP address is part of any database that we use to search for known malicious actors, `false` otherwise.\n"
          },
          "details": {
            "$ref": "#/components/schemas/IPBlocklistDetails"
          }
        }
      },
      "ProductIPBlocklist": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/IPBlocklist"
          },
          "error": {
            "$ref": "#/components/schemas/Error"
          }
        }
      },
      "Tor": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "result"
        ],
        "properties": {
          "result": {
            "type": "boolean",
            "description": "`true` if the request IP address is a known tor exit node, `false` otherwise.\n"
          }
        }
      },
      "ProductTor": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/Tor"
          },
          "error": {
            "$ref": "#/components/schemas/Error"
          }
        }
      },
      "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",
        "additionalProperties": false,
        "required": [
          "timezoneMismatch",
          "publicVPN",
          "auxiliaryMobile",
          "osMismatch",
          "relay"
        ],
        "properties": {
          "timezoneMismatch": {
            "type": "boolean",
            "description": "The browser timezone doesn't match the timezone inferred from the request IP address."
          },
          "publicVPN": {
            "type": "boolean",
            "description": "Request IP address is owned and used by a public VPN service provider."
          },
          "auxiliaryMobile": {
            "type": "boolean",
            "description": "This method applies to mobile devices only. Indicates the result of additional methods used to detect a VPN in mobile devices."
          },
          "osMismatch": {
            "type": "boolean",
            "description": "The browser runs on a different operating system than the operating system inferred from the request network signature."
          },
          "relay": {
            "type": "boolean",
            "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/). \n\n* Like VPNs, relay services anonymize the visitor's true IP address.\n* Unlike traditional VPNs, relay services don't let visitors spoof their location by choosing an exit node in a different country.\n\nThis field allows you to differentiate VPN users and relay service users in your fraud prevention logic.\n"
          },
          "mlPrediction": {
            "type": "boolean",
            "description": "`true` if the request came from a device running a VPN, `false` otherwise.\n"
          }
        }
      },
      "VPN": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "result",
          "confidence",
          "originTimezone",
          "originCountry",
          "methods"
        ],
        "properties": {
          "result": {
            "type": "boolean",
            "description": "VPN or other anonymizing service has been used when sending the request."
          },
          "confidence": {
            "$ref": "#/components/schemas/VPNConfidence"
          },
          "mlScore": {
            "type": "number",
            "format": "double",
            "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/).\n"
          },
          "originTimezone": {
            "type": "string",
            "description": "Local timezone which is used in timezoneMismatch method."
          },
          "originCountry": {
            "type": "string",
            "description": "Country of the request (only for Android SDK version >= 2.4.0, ISO 3166 format or unknown)."
          },
          "methods": {
            "$ref": "#/components/schemas/VPNMethods"
          }
        }
      },
      "ProductVPN": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/VPN"
          },
          "error": {
            "$ref": "#/components/schemas/Error"
          }
        }
      },
      "ProxyConfidence": {
        "type": "string",
        "enum": [
          "low",
          "medium",
          "high"
        ],
        "description": "Confidence level of the proxy detection.\nIf a proxy is not detected, confidence is \"high\".\nIf it's detected, can be \"low\", \"medium\", or \"high\".\n"
      },
      "ProxyDetails": {
        "type": "object",
        "nullable": true,
        "additionalProperties": false,
        "description": "Proxy detection details (present if proxy is detected)",
        "required": [
          "proxyType"
        ],
        "properties": {
          "proxyType": {
            "type": "string",
            "enum": [
              "residential",
              "data_center",
              "unknown"
            ],
            "description": "Proxy type:\n * `residential` - proxies that route through residential and telecom IP addresses to appear as legitimate traffic\n * `data_center` - proxies which route through data centers\n * `unknown` - reported when a proxy is detected solely by the ML model and the IP sources did not determine a specific type\n"
          },
          "lastSeenAt": {
            "type": "string",
            "format": "date-time",
            "x-ogen-time-format": "2006-01-02T15:00:00Z",
            "description": "ISO 8601 formatted timestamp in UTC with hourly resolution\nof when this IP was last seen as a proxy when available.\n"
          }
        }
      },
      "Proxy": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "result",
          "confidence"
        ],
        "properties": {
          "result": {
            "type": "boolean",
            "description": "IP address was used by a public proxy provider or belonged to a known recent residential proxy\n"
          },
          "confidence": {
            "$ref": "#/components/schemas/ProxyConfidence"
          },
          "details": {
            "$ref": "#/components/schemas/ProxyDetails"
          },
          "mlScore": {
            "type": "number",
            "format": "double",
            "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/).\n"
          }
        }
      },
      "ProductProxy": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/Proxy"
          },
          "error": {
            "$ref": "#/components/schemas/Error"
          }
        }
      },
      "Incognito": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "result"
        ],
        "properties": {
          "result": {
            "type": "boolean",
            "description": "`true` if we detected incognito mode used in the browser, `false` otherwise.\n"
          }
        }
      },
      "ProductIncognito": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/Incognito"
          },
          "error": {
            "$ref": "#/components/schemas/Error"
          }
        }
      },
      "Tampering": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "result",
          "confidence",
          "anomalyScore",
          "mlScore",
          "antiDetectBrowser"
        ],
        "properties": {
          "result": {
            "type": "boolean",
            "description": "Indicates if an identification request from a browser or an Android SDK has been tampered with. Not supported in the iOS SDK, is always `false` for iOS requests.\n  * `true` - If the request meets either of the following conditions:\n    * Contains anomalous browser or device attributes that could not have been legitimately produced by the JavaScript agent or the Android SDK (see `anomalyScore`).\n    * Originated from an anti-detect browser like Incognition (see `antiDetectBrowser`).\n  * `false` - If the request is considered genuine or was generated by the iOS SDK.\n"
          },
          "confidence": {
            "type": "string",
            "enum": [
              "low",
              "medium",
              "high"
            ],
            "description": "Confidence level of the tampering detection.\nIf a tampering is not detected, confidence is \"high\".\nIf it's detected, can be \"low\", \"medium\", or \"high\".\n"
          },
          "anomalyScore": {
            "type": "number",
            "format": "double",
            "minimum": 0,
            "maximum": 1,
            "description": "A score that indicates the extent of anomalous data in the request. This field applies to requests originating from **both** browsers and Android SDKs. \n  * Values above `0.5` indicate that the request has been tampered with.\n  * Values below `0.5` indicate that the request is genuine.\n"
          },
          "mlScore": {
            "type": "number",
            "format": "double",
            "minimum": 0,
            "maximum": 1,
            "description": "A score that indicates the models calculated probability that an event is coming from an anti detect browser.\n  * Values above `0.8` indicate that the request is an anti detect browser based on the ml model\n  * Values below `0.8` indicate that the request is not an anti detect browser based on the ml model\n"
          },
          "antiDetectBrowser": {
            "type": "boolean",
            "description": "Anti-detect browsers try to evade identification by masking or manipulating their fingerprint to imitate legitimate browser configurations. This field does not apply to requests originating from mobile SDKs.\n  * `true` - The browser resembles a known anti-detect browser, for example, Incognition.\n  * `false` - The browser does not resemble an anti-detect browser or the request originates from a mobile SDK.\n"
          }
        }
      },
      "ProductTampering": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/Tampering"
          },
          "error": {
            "$ref": "#/components/schemas/Error"
          }
        }
      },
      "ClonedApp": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "result"
        ],
        "properties": {
          "result": {
            "type": "boolean",
            "description": "Android specific cloned application detection. There are 2 values: \n  * `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).\n  * `false` - No signs of cloned application detected or the client is not Android.\n"
          }
        }
      },
      "ProductClonedApp": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/ClonedApp"
          },
          "error": {
            "$ref": "#/components/schemas/Error"
          }
        }
      },
      "FactoryReset": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "time",
          "timestamp"
        ],
        "properties": {
          "time": {
            "type": "string",
            "format": "date-time",
            "description": "Indicates the time (in UTC) of the most recent factory reset that happened on the **mobile device**. \nWhen 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).\nSee [Factory Reset Detection](https://docs.fingerprint.com/docs/v3/smart-signals-reference#factory-reset-detection) to learn more about this Smart Signal.\n"
          },
          "timestamp": {
            "type": "integer",
            "format": "int64",
            "description": "This field is just another representation of the value in the `time` field.\nThe time of the most recent factory reset that happened on the **mobile device** is expressed as Unix epoch time.\n"
          }
        }
      },
      "ProductFactoryReset": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/FactoryReset"
          },
          "error": {
            "$ref": "#/components/schemas/Error"
          }
        }
      },
      "Jailbroken": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "result"
        ],
        "properties": {
          "result": {
            "type": "boolean",
            "description": "iOS specific jailbreak detection. There are 2 values: \n  * `true` - Jailbreak detected.\n  * `false` - No signs of jailbreak or the client is not iOS.\n"
          }
        }
      },
      "ProductJailbroken": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/Jailbroken"
          },
          "error": {
            "$ref": "#/components/schemas/Error"
          }
        }
      },
      "Frida": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "result"
        ],
        "properties": {
          "result": {
            "type": "boolean",
            "description": "[Frida](https://frida.re/docs/) detection for Android and iOS devices. There are 2 values:\n  * `true` - Frida detected\n  * `false` - No signs of Frida or the client is not a mobile device.\n"
          }
        }
      },
      "ProductFrida": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/Frida"
          },
          "error": {
            "$ref": "#/components/schemas/Error"
          }
        }
      },
      "PrivacySettings": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "result"
        ],
        "properties": {
          "result": {
            "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`.\n"
          }
        }
      },
      "ProductPrivacySettings": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/PrivacySettings"
          },
          "error": {
            "$ref": "#/components/schemas/Error"
          }
        }
      },
      "VirtualMachine": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "result"
        ],
        "properties": {
          "result": {
            "type": "boolean",
            "description": "`true` if the request came from a browser running inside a virtual machine (e.g. VMWare), `false` otherwise.\n"
          },
          "mlScore": {
            "type": "number",
            "format": "double",
            "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\n"
          }
        }
      },
      "ProductVirtualMachine": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/VirtualMachine"
          },
          "error": {
            "$ref": "#/components/schemas/Error"
          }
        }
      },
      "ProductRawDeviceAttributes": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/RawDeviceAttributes"
          },
          "error": {
            "$ref": "#/components/schemas/Error"
          }
        }
      },
      "HighActivity": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "result"
        ],
        "properties": {
          "result": {
            "type": "boolean",
            "description": "Flag indicating if the request came from a high-activity visitor."
          },
          "dailyRequests": {
            "type": "integer",
            "format": "int64",
            "minimum": 1,
            "description": "Number of requests from the same visitor in the previous day."
          }
        }
      },
      "ProductHighActivity": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/HighActivity"
          },
          "error": {
            "$ref": "#/components/schemas/Error"
          }
        }
      },
      "RareDevice": {
        "type": "object",
        "additionalProperties": false,
        "description": "Rare device details (present if the device is considered rare)\n> 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/).\n",
        "properties": {
          "result": {
            "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`).\n"
          },
          "percentileBucket": {
            "type": "string",
            "description": "The rarity percentile bucket of the device, indicating how uncommon the device configuration is compared to all observed devices.\n",
            "enum": [
              "<p95",
              "p95-p99",
              "p99-p99.5",
              "p99.5-p99.9",
              "p99.9+",
              "not_seen"
            ]
          }
        }
      },
      "ProductRareDevice": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/RareDevice"
          },
          "error": {
            "$ref": "#/components/schemas/Error"
          }
        }
      },
      "LocationSpoofing": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "result"
        ],
        "properties": {
          "result": {
            "type": "boolean",
            "description": "Flag indicating whether the request came from a mobile device with location spoofing enabled."
          }
        }
      },
      "ProductLocationSpoofing": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/LocationSpoofing"
          },
          "error": {
            "$ref": "#/components/schemas/Error"
          }
        }
      },
      "SuspectScore": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "result"
        ],
        "properties": {
          "result": {
            "type": "integer",
            "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/v3/suspect-score\n"
          }
        }
      },
      "ProductSuspectScore": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/SuspectScore"
          },
          "error": {
            "$ref": "#/components/schemas/Error"
          }
        }
      },
      "RemoteControl": {
        "type": "object",
        "deprecated": true,
        "description": "This signal is deprecated.\n",
        "additionalProperties": false,
        "required": [
          "result"
        ],
        "properties": {
          "result": {
            "type": "boolean",
            "description": "`true` if the request came from a machine being remotely controlled (e.g. TeamViewer), `false` otherwise.\n"
          }
        }
      },
      "ProductRemoteControl": {
        "type": "object",
        "deprecated": true,
        "description": "This product is deprecated.\n",
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/RemoteControl"
          },
          "error": {
            "$ref": "#/components/schemas/Error"
          }
        }
      },
      "VelocityIntervals": {
        "type": "object",
        "description": "Is absent if the velocity data could not be generated for the visitor ID.\n",
        "additionalProperties": false,
        "required": [
          "5m",
          "1h"
        ],
        "properties": {
          "5m": {
            "type": "integer"
          },
          "1h": {
            "type": "integer"
          },
          "24h": {
            "type": "integer",
            "description": "The `24h` interval of `distinctIp`, `distinctLinkedId`, `distinctCountry`, `distinctIpByLinkedId` and `distinctVisitorIdByLinkedId` will be omitted if the number of `events`` for the visitor ID in the last 24 hours (`events.intervals.['24h']`) is higher than 20.000.\n"
          }
        }
      },
      "VelocityData": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "intervals": {
            "$ref": "#/components/schemas/VelocityIntervals"
          }
        }
      },
      "Velocity": {
        "type": "object",
        "description": "Sums key data points for a specific `visitorId`, `ipAddress` and `linkedId` at three distinct time\nintervals: 5 minutes, 1 hour, and 24 hours as follows: \n\n- Number of distinct IP addresses associated to the visitor ID.\n- Number of distinct linked IDs associated with the visitor ID.\n- Number of distinct countries associated with the visitor ID.\n- Number of identification events associated with the visitor ID.\n- Number of identification events associated with the detected IP address.\n- Number of distinct IP addresses associated with the provided linked ID.\n- Number of distinct visitor IDs associated with the provided linked ID.\n\nThe `24h` interval of `distinctIp`, `distinctLinkedId`, `distinctCountry`,\n`distinctIpByLinkedId` and `distinctVisitorIdByLinkedId` will be omitted \nif the number of `events` for the visitor ID in the last 24\nhours (`events.intervals.['24h']`) is higher than 20.000.\n",
        "additionalProperties": false,
        "required": [
          "distinctIp",
          "distinctLinkedId",
          "distinctCountry",
          "events",
          "ipEvents",
          "distinctIpByLinkedId",
          "distinctVisitorIdByLinkedId"
        ],
        "properties": {
          "distinctIp": {
            "$ref": "#/components/schemas/VelocityData"
          },
          "distinctLinkedId": {
            "$ref": "#/components/schemas/VelocityData"
          },
          "distinctCountry": {
            "$ref": "#/components/schemas/VelocityData"
          },
          "events": {
            "$ref": "#/components/schemas/VelocityData"
          },
          "ipEvents": {
            "$ref": "#/components/schemas/VelocityData"
          },
          "distinctIpByLinkedId": {
            "$ref": "#/components/schemas/VelocityData"
          },
          "distinctVisitorIdByLinkedId": {
            "$ref": "#/components/schemas/VelocityData"
          }
        }
      },
      "ProductVelocity": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/Velocity"
          },
          "error": {
            "$ref": "#/components/schemas/Error"
          }
        }
      },
      "DeveloperTools": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "result"
        ],
        "properties": {
          "result": {
            "type": "boolean",
            "description": "`true` if the browser has DevTools open (Chrome, Firefox) or the Android/iOS device has Developer Tools enabled, `false` otherwise.\n"
          }
        }
      },
      "ProductDeveloperTools": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/DeveloperTools"
          },
          "error": {
            "$ref": "#/components/schemas/Error"
          }
        }
      },
      "MitMAttack": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "result"
        ],
        "properties": {
          "result": {
            "type": "boolean",
            "description": "* `true` - When requests made from your users' mobile devices to Fingerprint servers have been intercepted and potentially modified. \n* `false` - Otherwise or when the request originated from a browser.\nSee [MitM Attack Detection](https://docs.fingerprint.com/docs/v3/smart-signals-reference#mitm-attack-detection) to learn more about this Smart Signal.\n"
          }
        }
      },
      "ProductMitMAttack": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/MitMAttack"
          },
          "error": {
            "$ref": "#/components/schemas/Error"
          }
        }
      },
      "Labels": {
        "type": "array",
        "items": {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "label"
          ],
          "properties": {
            "label": {
              "type": "string"
            },
            "prediction": {
              "type": "boolean"
            },
            "mlScore": {
              "type": "number",
              "format": "double",
              "minimum": 0,
              "maximum": 1
            }
          }
        },
        "description": "Each label returns a prediction (true or false) for a specific use case (label field) based on a machine learning score. The machine learning score is determined by a model trained on customer data for that use case. This field is in the beta phase and only available to select customers. If you are interested, please [contact our support team](https://fingerprint.com/support/).\n"
      },
      "ProductLabels": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/Labels"
          },
          "error": {
            "$ref": "#/components/schemas/Error"
          }
        }
      },
      "Proximity": {
        "type": "object",
        "description": "Proximity ID represents a fixed geographical zone in a discrete global grid within which the device is observed.\n",
        "additionalProperties": false,
        "required": [
          "id",
          "precisionRadius",
          "confidence"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "A stable privacy-preserving identifier for a given proximity zone.\n"
          },
          "precisionRadius": {
            "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.\n"
          },
          "confidence": {
            "type": "number",
            "format": "float",
            "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.\n  * Scores closer to `1` indicate high confidence that the location is inside the mapped proximity zone.\n  * Scores closer to `0` indicate lower confidence, suggesting the true location may fall in an adjacent zone.\n"
          }
        }
      },
      "ProductProximity": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/Proximity"
          },
          "error": {
            "$ref": "#/components/schemas/Error"
          }
        }
      },
      "Products": {
        "type": "object",
        "description": "Contains all information about the request identified by `requestId`, depending on the pricing plan (Pro, Pro Plus, Enterprise)",
        "additionalProperties": false,
        "properties": {
          "identification": {
            "$ref": "#/components/schemas/ProductIdentification"
          },
          "botd": {
            "$ref": "#/components/schemas/ProductBotd"
          },
          "rootApps": {
            "$ref": "#/components/schemas/ProductRootApps"
          },
          "emulator": {
            "$ref": "#/components/schemas/ProductEmulator"
          },
          "ipInfo": {
            "$ref": "#/components/schemas/ProductIPInfo"
          },
          "ipBlocklist": {
            "$ref": "#/components/schemas/ProductIPBlocklist"
          },
          "tor": {
            "$ref": "#/components/schemas/ProductTor"
          },
          "vpn": {
            "$ref": "#/components/schemas/ProductVPN"
          },
          "proxy": {
            "$ref": "#/components/schemas/ProductProxy"
          },
          "incognito": {
            "$ref": "#/components/schemas/ProductIncognito"
          },
          "tampering": {
            "$ref": "#/components/schemas/ProductTampering"
          },
          "clonedApp": {
            "$ref": "#/components/schemas/ProductClonedApp"
          },
          "factoryReset": {
            "$ref": "#/components/schemas/ProductFactoryReset"
          },
          "jailbroken": {
            "$ref": "#/components/schemas/ProductJailbroken"
          },
          "frida": {
            "$ref": "#/components/schemas/ProductFrida"
          },
          "privacySettings": {
            "$ref": "#/components/schemas/ProductPrivacySettings"
          },
          "virtualMachine": {
            "$ref": "#/components/schemas/ProductVirtualMachine"
          },
          "rawDeviceAttributes": {
            "$ref": "#/components/schemas/ProductRawDeviceAttributes"
          },
          "highActivity": {
            "$ref": "#/components/schemas/ProductHighActivity"
          },
          "locationSpoofing": {
            "$ref": "#/components/schemas/ProductLocationSpoofing"
          },
          "suspectScore": {
            "$ref": "#/components/schemas/ProductSuspectScore"
          },
          "remoteControl": {
            "$ref": "#/components/schemas/ProductRemoteControl"
          },
          "velocity": {
            "$ref": "#/components/schemas/ProductVelocity"
          },
          "developerTools": {
            "$ref": "#/components/schemas/ProductDeveloperTools"
          },
          "mitmAttack": {
            "$ref": "#/components/schemas/ProductMitMAttack"
          },
          "rareDevice": {
            "$ref": "#/components/schemas/ProductRareDevice"
          },
          "proximity": {
            "$ref": "#/components/schemas/ProductProximity"
          },
          "labels": {
            "$ref": "#/components/schemas/ProductLabels"
          }
        }
      },
      "EventsGetResponse": {
        "type": "object",
        "description": "Contains results from Fingerprint Identification and all active Smart Signals.",
        "additionalProperties": false,
        "required": [
          "products"
        ],
        "properties": {
          "products": {
            "$ref": "#/components/schemas/Products"
          }
        }
      },
      "ErrorResponse": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "error"
        ],
        "properties": {
          "error": {
            "$ref": "#/components/schemas/Error"
          }
        }
      },
      "EventsUpdateRequest": {
        "type": "object",
        "properties": {
          "linkedId": {
            "type": "string",
            "description": "LinkedID value to assign to the existing event"
          },
          "tag": {
            "$ref": "#/components/schemas/Tag"
          },
          "suspect": {
            "type": "boolean",
            "description": "Suspect flag indicating observed suspicious or fraudulent event",
            "x-go-force-pointer": true
          }
        }
      },
      "SearchEventsResponse": {
        "type": "object",
        "description": "Contains a list of all identification events matching the specified search criteria.",
        "additionalProperties": false,
        "properties": {
          "events": {
            "type": "array",
            "items": {
              "type": "object",
              "description": "Device intelligence results for the identification event.",
              "required": [
                "products"
              ],
              "properties": {
                "products": {
                  "$ref": "#/components/schemas/Products"
                }
              }
            }
          },
          "paginationKey": {
            "type": "string",
            "description": "Use this value in the `pagination_key` parameter to request the next page of search results."
          }
        }
      },
      "Visit": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "requestId",
          "browserDetails",
          "incognito",
          "ip",
          "timestamp",
          "time",
          "url",
          "tag",
          "visitorFound",
          "firstSeenAt",
          "lastSeenAt"
        ],
        "properties": {
          "requestId": {
            "type": "string",
            "description": "Unique identifier of the user's request."
          },
          "browserDetails": {
            "$ref": "#/components/schemas/BrowserDetails"
          },
          "incognito": {
            "type": "boolean",
            "description": "Flag if user used incognito session."
          },
          "ip": {
            "type": "string",
            "description": "IP address of the requesting browser or bot."
          },
          "ipLocation": {
            "$ref": "#/components/schemas/DeprecatedGeolocation"
          },
          "linkedId": {
            "type": "string",
            "description": "A customer-provided id that was sent with the request."
          },
          "timestamp": {
            "type": "integer",
            "format": "int64",
            "description": "Timestamp of the event with millisecond precision in Unix time."
          },
          "time": {
            "type": "string",
            "format": "date-time",
            "x-ogen-time-format": "2006-01-02T15:04:05Z07:00",
            "description": "Time expressed according to ISO 8601 in UTC format, when the request from the client agent was made. We recommend to treat requests that are older than 2 minutes as malicious. Otherwise, request replay attacks are possible."
          },
          "url": {
            "type": "string",
            "description": "Page URL from which the request was sent."
          },
          "tag": {
            "$ref": "#/components/schemas/Tag"
          },
          "confidence": {
            "$ref": "#/components/schemas/IdentificationConfidence"
          },
          "visitorFound": {
            "type": "boolean",
            "description": "Attribute represents if a visitor had been identified before."
          },
          "firstSeenAt": {
            "$ref": "#/components/schemas/IdentificationSeenAt"
          },
          "lastSeenAt": {
            "$ref": "#/components/schemas/IdentificationSeenAt"
          },
          "components": {
            "$ref": "#/components/schemas/RawDeviceAttributes"
          }
        }
      },
      "VisitorsGetResponse": {
        "type": "object",
        "description": "Deprecated response shape for `GET /visitors/{visitor_id}`. The `visits` array currently contains at most one item. Use `GET /events/search` for multi-event history and filtering.",
        "additionalProperties": false,
        "required": [
          "visitorId",
          "visits"
        ],
        "properties": {
          "visitorId": {
            "type": "string"
          },
          "visits": {
            "type": "array",
            "maxItems": 1,
            "items": {
              "$ref": "#/components/schemas/Visit"
            }
          },
          "lastTimestamp": {
            "deprecated": true,
            "type": "integer",
            "format": "int64",
            "description": "⚠️ Deprecated paging attribute, please use `paginationKey` instead. Timestamp of the last visit in the current page of results.\n"
          },
          "paginationKey": {
            "type": "string",
            "description": "Use this value in the following request as the `paginationKey` parameter to get the next result."
          }
        }
      },
      "ErrorPlainResponse": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "error"
        ],
        "properties": {
          "error": {
            "type": "string"
          }
        }
      },
      "RelatedVisitor": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "visitorId"
        ],
        "properties": {
          "visitorId": {
            "type": "string",
            "description": "Visitor ID of a browser that originates from the same mobile device as the input visitor ID."
          }
        }
      },
      "RelatedVisitorsResponse": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "relatedVisitors"
        ],
        "properties": {
          "relatedVisitors": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RelatedVisitor"
            }
          }
        }
      },
      "WebhookRootApps": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "result": {
            "type": "boolean",
            "description": "Android specific root management apps detection. There are 2 values: \n  * `true` - Root Management Apps detected (e.g. Magisk).\n  * `false` - No Root Management Apps detected or the client isn't Android.\n"
          }
        }
      },
      "WebhookEmulator": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "result": {
            "type": "boolean",
            "description": "Android specific emulator detection. There are 2 values: \n  * `true` - Emulated environment detected (e.g. launch inside of AVD). \n  * `false` - No signs of emulated environment detected or the client is not Android.\n"
          }
        }
      },
      "WebhookIPInfo": {
        "type": "object",
        "description": "Details about the request IP address. Has separate fields for v4 and v6 IP address versions.",
        "additionalProperties": false,
        "properties": {
          "v4": {
            "$ref": "#/components/schemas/IPInfoV4"
          },
          "v6": {
            "$ref": "#/components/schemas/IPInfoV6"
          }
        }
      },
      "WebhookIPBlocklist": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "result": {
            "type": "boolean",
            "description": "`true` if request IP address is part of any database that we use to search for known malicious actors, `false` otherwise.\n"
          },
          "details": {
            "$ref": "#/components/schemas/IPBlocklistDetails"
          }
        }
      },
      "WebhookTor": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "result": {
            "type": "boolean",
            "description": "`true` if the request IP address is a known tor exit node, `false` otherwise.\n"
          }
        }
      },
      "WebhookVPN": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "result": {
            "type": "boolean",
            "description": "VPN or other anonymizing service has been used when sending the request."
          },
          "confidence": {
            "$ref": "#/components/schemas/VPNConfidence"
          },
          "mlScore": {
            "type": "number",
            "format": "double",
            "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/).\n"
          },
          "originTimezone": {
            "type": "string",
            "description": "Local timezone which is used in timezoneMismatch method."
          },
          "originCountry": {
            "type": "string",
            "description": "Country of the request (only for Android SDK version >= 2.4.0, ISO 3166 format or unknown)."
          },
          "methods": {
            "$ref": "#/components/schemas/VPNMethods"
          }
        }
      },
      "WebhookProxy": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "result": {
            "type": "boolean",
            "description": "IP address was used by a public proxy provider or belonged to a known recent residential proxy\n"
          },
          "confidence": {
            "$ref": "#/components/schemas/ProxyConfidence"
          },
          "details": {
            "$ref": "#/components/schemas/ProxyDetails"
          },
          "mlScore": {
            "type": "number",
            "format": "double",
            "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/).\n"
          }
        }
      },
      "WebhookTampering": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "result": {
            "type": "boolean",
            "description": "Indicates if an identification request from a browser or an Android SDK has been tampered with. Not supported in the iOS SDK, is always `false` for iOS requests.\n  * `true` - If the request meets either of the following conditions:\n    * Contains anomalous browser or device attributes that could not have been legitimately produced by the JavaScript agent or the Android SDK (see `anomalyScore`).\n    * Originated from an anti-detect browser like Incognition (see `antiDetectBrowser`).\n  * `false` - If the request is considered genuine or was generated by the iOS SDK.\n"
          },
          "confidence": {
            "type": "string",
            "enum": [
              "low",
              "medium",
              "high"
            ],
            "description": "Confidence level of the tampering detection.\nIf a tampering is not detected, confidence is \"high\".\nIf it's detected, can be \"low\", \"medium\", or \"high\".\n"
          },
          "anomalyScore": {
            "type": "number",
            "format": "double",
            "minimum": 0,
            "maximum": 1,
            "description": "A score that indicates the extent of anomalous data in the request. This field applies to requests originating from **both** browsers and Android SDKs. \n  * Values above `0.5` indicate that the request has been tampered with.\n  * Values below `0.5` indicate that the request is genuine.\n"
          },
          "mlScore": {
            "type": "number",
            "format": "double",
            "minimum": 0,
            "maximum": 1,
            "description": "A score that indicates the models calculated probability that an event is coming from an anti detect browser.\n  * Values above `0.8` indicate that the request is an anti detect browser based on the ml model\n  * Values below `0.8` indicate that the request is not an anti detect browser based on the ml model\n"
          },
          "antiDetectBrowser": {
            "type": "boolean",
            "description": "Anti-detect browsers try to evade identification by masking or manipulating their fingerprint to imitate legitimate browser configurations. This field does not apply to requests originating from mobile SDKs.\n  * `true` - The browser resembles a known anti-detect browser, for example, Incognition.\n  * `false` - The browser does not resemble an anti-detect browser or the request originates from a mobile SDK.\n"
          }
        }
      },
      "WebhookClonedApp": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "result": {
            "type": "boolean",
            "description": "Android specific cloned application detection. There are 2 values: \n  * `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).\n  * `false` - No signs of cloned application detected or the client is not Android.\n"
          }
        }
      },
      "WebhookFactoryReset": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "time": {
            "type": "string",
            "format": "date-time",
            "description": "Indicates the time (in UTC) of the most recent factory reset that happened on the **mobile device**. \nWhen 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).\nSee [Factory Reset Detection](https://docs.fingerprint.com/docs/v3/smart-signals-reference#factory-reset-detection) to learn more about this Smart Signal.\n"
          },
          "timestamp": {
            "type": "integer",
            "format": "int64",
            "description": "This field is just another representation of the value in the `time` field.\nThe time of the most recent factory reset that happened on the **mobile device** is expressed as Unix epoch time.\n"
          }
        }
      },
      "WebhookJailbroken": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "result": {
            "type": "boolean",
            "description": "iOS specific jailbreak detection. There are 2 values:\n  * `true` - Jailbreak detected.\n  * `false` - No signs of jailbreak or the client is not iOS.\n"
          }
        }
      },
      "WebhookFrida": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "result": {
            "type": "boolean",
            "description": "[Frida](https://frida.re/docs/) detection for Android and iOS devices. There are 2 values:\n  * `true` - Frida detected\n  * `false` - No signs of Frida or the client is not a mobile device.\n"
          }
        }
      },
      "WebhookPrivacySettings": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "result": {
            "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`.\n"
          }
        }
      },
      "WebhookVirtualMachine": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "result": {
            "type": "boolean",
            "description": "`true` if the request came from a browser running inside a virtual machine (e.g. VMWare), `false` otherwise.\n"
          },
          "mlScore": {
            "type": "number",
            "format": "double",
            "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\n"
          }
        }
      },
      "WebhookRawDeviceAttributes": {
        "type": "object",
        "description": "It includes 35+ raw browser identification attributes to provide Fingerprint users with even more information than our standard visitor ID provides. This enables Fingerprint users to not have to run our open-source product in conjunction with Fingerprint Pro Plus and Enterprise to get those additional attributes.\nWarning: The raw signals data can change at any moment as we improve the product. We cannot guarantee the internal shape of raw device attributes to be stable, so typical semantic versioning rules do not apply here. Use this data with caution without assuming a specific structure beyond the generic type provided here.\n",
        "additionalProperties": {
          "$ref": "#/components/schemas/RawDeviceAttribute"
        }
      },
      "WebhookHighActivity": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "result"
        ],
        "properties": {
          "result": {
            "type": "boolean",
            "description": "Flag indicating if the request came from a high-activity visitor."
          },
          "dailyRequests": {
            "type": "integer",
            "format": "int64",
            "minimum": 1,
            "description": "Number of requests from the same visitor in the previous day."
          }
        }
      },
      "WebhookLocationSpoofing": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "result": {
            "type": "boolean",
            "description": "Flag indicating whether the request came from a mobile device with location spoofing enabled."
          }
        }
      },
      "WebhookSuspectScore": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "result": {
            "type": "integer",
            "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/v3/suspect-score\n"
          }
        }
      },
      "WebhookRemoteControl": {
        "type": "object",
        "deprecated": true,
        "description": "This signal is deprecated.\n",
        "additionalProperties": false,
        "properties": {
          "result": {
            "type": "boolean",
            "description": "`true` if the request came from a machine being remotely controlled (e.g. TeamViewer), `false` otherwise.\n"
          }
        }
      },
      "WebhookVelocity": {
        "type": "object",
        "description": "Sums key data points for a specific `visitorId`, `ipAddress` and `linkedId` at three distinct time\nintervals: 5 minutes, 1 hour, and 24 hours as follows: \n\n- Number of distinct IP addresses associated to the visitor ID.\n- Number of distinct linked IDs associated with the visitor ID.\n- Number of distinct countries associated with the visitor ID.\n- Number of identification events associated with the visitor ID.\n- Number of identification events associated with the detected IP address.\n- Number of distinct IP addresses associated with the provided linked ID.\n- Number of distinct visitor IDs associated with the provided linked ID.\n\nThe `24h` interval of `distinctIp`, `distinctLinkedId`, `distinctCountry`,\n`distinctIpByLinkedId` and `distinctVisitorIdByLinkedId` will be omitted \nif the number of `events` for the visitor ID in the last 24\nhours (`events.intervals.['24h']`) is higher than 20.000.\n",
        "additionalProperties": false,
        "properties": {
          "distinctIp": {
            "$ref": "#/components/schemas/VelocityData"
          },
          "distinctLinkedId": {
            "$ref": "#/components/schemas/VelocityData"
          },
          "distinctCountry": {
            "$ref": "#/components/schemas/VelocityData"
          },
          "events": {
            "$ref": "#/components/schemas/VelocityData"
          },
          "ipEvents": {
            "$ref": "#/components/schemas/VelocityData"
          },
          "distinctIpByLinkedId": {
            "$ref": "#/components/schemas/VelocityData"
          },
          "distinctVisitorIdByLinkedId": {
            "$ref": "#/components/schemas/VelocityData"
          }
        }
      },
      "WebhookDeveloperTools": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "result": {
            "type": "boolean",
            "description": "`true` if the browser has DevTools open (Chrome, Firefox) or the Android/iOS device has Developer Tools enabled, `false` otherwise.\n"
          }
        }
      },
      "WebhookMitMAttack": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "result": {
            "type": "boolean",
            "description": "* `true` - When requests made from your users' mobile devices to Fingerprint servers have been intercepted and potentially modified. \n* `false` - Otherwise or when the request originated from a browser.\nSee [MitM Attack Detection](https://docs.fingerprint.com/docs/v3/smart-signals-reference#mitm-attack-detection) to learn more about this Smart Signal.\n"
          }
        }
      },
      "WebhookRareDevice": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "result": {
            "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`).\n> 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/).\n"
          },
          "percentileBucket": {
            "type": "string",
            "description": "The rarity percentile bucket of the device, indicating how uncommon the device configuration is compared to all observed devices.\n",
            "enum": [
              "<p95",
              "p95-p99",
              "p99-p99.5",
              "p99.5-p99.9",
              "p99.9+",
              "not_seen"
            ]
          }
        }
      },
      "SupplementaryID": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "visitorId": {
            "type": "string",
            "description": "String of 20 characters that uniquely identifies the visitor's browser or mobile device."
          },
          "visitorFound": {
            "type": "boolean",
            "description": "Attribute represents if a visitor had been identified before."
          },
          "confidence": {
            "$ref": "#/components/schemas/IdentificationConfidence"
          },
          "firstSeenAt": {
            "$ref": "#/components/schemas/IdentificationSeenAt"
          },
          "lastSeenAt": {
            "$ref": "#/components/schemas/IdentificationSeenAt"
          }
        }
      },
      "WebhookSupplementaryIDs": {
        "type": "object",
        "description": "Other identities that have been established for a given Visitor.",
        "required": [
          "standard",
          "highRecall"
        ],
        "properties": {
          "standard": {
            "$ref": "#/components/schemas/SupplementaryID"
          },
          "highRecall": {
            "$ref": "#/components/schemas/SupplementaryID"
          }
        }
      },
      "WebhookProximity": {
        "type": "object",
        "description": "Proximity ID represents a fixed geographical zone in a discrete global grid within which the device is observed.\n",
        "additionalProperties": false,
        "required": [
          "id",
          "precisionRadius",
          "confidence"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "A stable privacy-preserving identifier for a given proximity zone.\n"
          },
          "precisionRadius": {
            "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.\n"
          },
          "confidence": {
            "type": "number",
            "format": "float",
            "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.\n  * Scores closer to `1` indicate high confidence that the location is inside the mapped proximity zone.\n  * Scores closer to `0` indicate lower confidence, suggesting the true location may fall in an adjacent zone.\n"
          }
        }
      },
      "Webhook": {
        "type": "object",
        "required": [
          "requestId",
          "url",
          "ip",
          "time",
          "timestamp",
          "sdk"
        ],
        "properties": {
          "requestId": {
            "type": "string",
            "description": "Unique identifier of the user's request."
          },
          "url": {
            "type": "string",
            "description": "Page URL from which the request was sent."
          },
          "ip": {
            "type": "string",
            "description": "IP address of the requesting browser or bot."
          },
          "environmentId": {
            "type": "string",
            "description": "Environment ID of the event."
          },
          "tag": {
            "$ref": "#/components/schemas/Tag"
          },
          "time": {
            "type": "string",
            "format": "date-time",
            "x-ogen-time-format": "2006-01-02T15:04:05.000Z07:00",
            "description": "Time expressed according to ISO 8601 in UTC format, when the request from the JS agent was made. We recommend to treat requests that are older than 2 minutes as malicious. Otherwise, request replay attacks are possible."
          },
          "timestamp": {
            "type": "integer",
            "format": "int64",
            "description": "Timestamp of the event with millisecond precision in Unix time."
          },
          "ipLocation": {
            "$ref": "#/components/schemas/DeprecatedGeolocation"
          },
          "linkedId": {
            "type": "string",
            "description": "A customer-provided id that was sent with the request."
          },
          "visitorId": {
            "type": "string",
            "description": "String of 20 characters that uniquely identifies the visitor's browser or mobile device."
          },
          "visitorFound": {
            "type": "boolean",
            "description": "Attribute represents if a visitor had been identified before."
          },
          "confidence": {
            "$ref": "#/components/schemas/IdentificationConfidence"
          },
          "firstSeenAt": {
            "$ref": "#/components/schemas/IdentificationSeenAt"
          },
          "lastSeenAt": {
            "$ref": "#/components/schemas/IdentificationSeenAt"
          },
          "browserDetails": {
            "$ref": "#/components/schemas/BrowserDetails"
          },
          "incognito": {
            "type": "boolean",
            "description": "Flag if user used incognito session."
          },
          "clientReferrer": {
            "type": "string"
          },
          "components": {
            "$ref": "#/components/schemas/RawDeviceAttributes"
          },
          "bot": {
            "$ref": "#/components/schemas/BotdBot"
          },
          "userAgent": {
            "type": "string"
          },
          "rootApps": {
            "$ref": "#/components/schemas/WebhookRootApps"
          },
          "emulator": {
            "$ref": "#/components/schemas/WebhookEmulator"
          },
          "ipInfo": {
            "$ref": "#/components/schemas/WebhookIPInfo"
          },
          "ipBlocklist": {
            "$ref": "#/components/schemas/WebhookIPBlocklist"
          },
          "tor": {
            "$ref": "#/components/schemas/WebhookTor"
          },
          "vpn": {
            "$ref": "#/components/schemas/WebhookVPN"
          },
          "proxy": {
            "$ref": "#/components/schemas/WebhookProxy"
          },
          "tampering": {
            "$ref": "#/components/schemas/WebhookTampering"
          },
          "clonedApp": {
            "$ref": "#/components/schemas/WebhookClonedApp"
          },
          "factoryReset": {
            "$ref": "#/components/schemas/WebhookFactoryReset"
          },
          "jailbroken": {
            "$ref": "#/components/schemas/WebhookJailbroken"
          },
          "frida": {
            "$ref": "#/components/schemas/WebhookFrida"
          },
          "privacySettings": {
            "$ref": "#/components/schemas/WebhookPrivacySettings"
          },
          "virtualMachine": {
            "$ref": "#/components/schemas/WebhookVirtualMachine"
          },
          "rawDeviceAttributes": {
            "$ref": "#/components/schemas/WebhookRawDeviceAttributes"
          },
          "highActivity": {
            "$ref": "#/components/schemas/WebhookHighActivity"
          },
          "locationSpoofing": {
            "$ref": "#/components/schemas/WebhookLocationSpoofing"
          },
          "suspectScore": {
            "$ref": "#/components/schemas/WebhookSuspectScore"
          },
          "remoteControl": {
            "$ref": "#/components/schemas/WebhookRemoteControl"
          },
          "velocity": {
            "$ref": "#/components/schemas/WebhookVelocity"
          },
          "developerTools": {
            "$ref": "#/components/schemas/WebhookDeveloperTools"
          },
          "mitmAttack": {
            "$ref": "#/components/schemas/WebhookMitMAttack"
          },
          "rareDevice": {
            "$ref": "#/components/schemas/WebhookRareDevice"
          },
          "replayed": {
            "type": "boolean",
            "description": "`true` if we determined that this payload was replayed, `false` otherwise.\n"
          },
          "sdk": {
            "$ref": "#/components/schemas/SDK"
          },
          "supplementaryIds": {
            "$ref": "#/components/schemas/WebhookSupplementaryIDs"
          },
          "proximity": {
            "$ref": "#/components/schemas/WebhookProximity"
          }
        }
      }
    }
  }
}
