Server-Side Instructions

Overview

🚧

Verify API Field Changes

From time to time, Arkose will add additional fields to the Verify API . We will not either delete fields, or change their value specification (i.e. if field "foo" has been defined as having integer values between 0 and 100, we will not change "foo" so that it has, for example, a string value or integer values between -500 and 5000).

This means you must write your Verify data processing code so it handles unknown fields and their values. For example, suppose it encounters a field "bar" and does not have a defined way of handling "bar" and its value. It could just ignore "bar" as an unknown field and go on to the next field.

SUMMARY:

Arkose will not delete any fields from the Verify API .

Arkose will not change what values a Verify API field can have.

Arkose will add additional fields and their values to the Verify API over time.

Your Verify API data processing code must be able to deal with unknown to it fields and their values in its Verify data input.

📘

This document is for Server-Side processing using Arkose Labs Verify API Version 4. It applies to Arkose Detect and Arkose Protect.

The latest Verify API version (v4) includes integrated IP Intelligence and enriched Fingerprint information as a part of the Verify response. Please review the changes to the response schema before upgrading from a previous version or consult with your CSM.

📘

Additional Risk Score Feature Available

A session's Risk Score can be determined based on multiple signals collected throughout it. This feature is turned off by default. For more information, see the Risk Score page. To have it turned on, ask your Arkose Labs CSM.

📘

Additional IP Velocity Fields Available

As of April 2022, you can have optional IP velocity fields returned as part of the Verify v4 API response. To have these fields included, contact your CSM (Customer Success Manager).

There are two steps required to fully implement the Arkose Fraud Deterrence Platform (Arkose Platform):

  1. Client-side implementation that allows the Arkose Platform to collect data necessary to classify the traffic from the client, display an Enforcement Challenge (EC) if necessary, and provide a one-time use token.

  2. Server-side implementation that takes the token provided by the client-side and verifies it with the Verify API. The result is a response that contains information about the session.

This guide documents the steps required to implement the server-side verification.

Detailed information on implementing the Arkose Platform client-side processing can be found in Setting Up the Arkose Platform.

API Request Authentication

Arkose Labs authenticates your API requests using a private/public key pair that can be retrieved from the Key Settings page of the Arkose Labs Command Center. As shown below, go to the left menubar's Settings entry, and then to the Keys sub-entry. If you do not have access to the Command Center or do not have your private and public keys, contact your Sales Rep or Sales Engineer.

The private key is needed to authenticate when using the Verify API. This private key must not be published on a client facing website, and must only be used on your server-side implementation on the Verify API.

Verify API Request and Response Schemas

📘

Verify API Changing To Personalized URLs

As of February 2022, Arkose Labs is beginning to deprecate its previously used generic Verify API URL in favor of unique URLs personalized to our customers. If you have not already done so, please talk to your CSM about switching over to your own unique Verify URLs. Note that the generic URLs will continue to work until all customers are using their personalized URLs. This document now uses mock personalized URLs.

Information on the current Verify API request and response schema can be found at the following URLs. As mentioned above, Arkose is moving to giving each customer their own personalized Verify API URL, so please substitute your own URL for the descriptions and examples used in this document.

Request schema:
<company>-verify.arkoselabs.com/api/v4/verify/schema/request

Response schema:
<company>-verify.arkoselabs.com/api/v4/verify/schema/response

e.g.
https://acme-verify.arkoselabs.com/api/v4/verify/schema/request
https://acme-verify.arkoselabs.com/api/v4/verify/schema/response

📘

Generic Verify URLs

For reference for those still using our generic Verify URL, it is:

Request schema:

http://verify.arkoselabs.com/api/v4/verify/schema/request

Response schema:

http://verify.arkoselabs.com/api/v4/verify/schema/response

Here is an example of how to get the response schema using cURL:

curl https://<company>-verify.arkoselabs.com/api/v4/verify/schema/request

Calling the Verify API

Requests to the Verify API can either be sent via:

  • An application/json body (POST)

  • A URL with query parameters (GET)

  • An HTTP header.

POST and GET Request Parameters

This table shows the parameters that should be included within the GET or POST requests.

Parameter Name

Required / Optional

Description

private_key

Required

The private key issued by Arkose Labs along with the public key used for the client-side API.

session_token

Required

The token value contained within the token key of the client-side API response object. This object is provided within the client-side onComplete callback.

log_data

Optional

A freeform string that allows information to be passed to the Verify API. This can be used to pass basic information that you want stored by Arkose with the session data. This can be used internally by Arkose when performing manual traffic analysis.

GET request

Below is an example URL that includes the parameters from the above table as query parameters. Before actually using it, replace the ??? placeholders with the real values to be used, as well as replacing <company> with your company's personalized API URL name.

https://<company>-verify.arkoselabs.com/api/v4/verify/?private_key=???&session_token=???&log_data=???

POST request

The POST request requires the use of the request body. Below is an example of a JSON request body using the parameters from the table above.

{
  private_key: "_PRIVATE_KEY_HERE_",
  session_token: "_SESSION_TOKEN_HERE_",
  log_data: "_LOG_DATA_HERE_"
}

HTTP Header Request

📘

Requests using HTTP headers do not support log_data

In the instructions above, the private key and session token are passed via the URL query parameters (GET) or POST body. An alternative method of passing the private key and session token to the Verify API is via HTTP headers on the request. The table below shows the name of the headers that should be used.

Parameter Name

Required / Optional

Description

Arkose-Private-Key

Required

This is the private key issued by Arkose Labs along with the public key used for the client-side API

Arkose-Session-Token

Required

This is the token value contained within the token key of the client-side API response object. This object is provided within the client-side onComplete callback

Here is an example of providing the required data using the headers listed above in a simple Curl command.

curl -H "Content-Type: application/json" -H "Arkose-Private-Key: <your private key>" -H "Arkose-Session-Token: <value of verification-token>" https://<company>-verify.arkoselabs.com/api/v4/verify/

Processing the Verify API Response

The reason for performing the verification step is to ensure that the user cannot proceed with their action unless their session is valid. Each response.token provided by the client-side API can only be used once. This means that a solved session token cannot be reused to bypass Arkose Labs' challenges.

Once a response.token has been verified using the verify API, it cannot be used again.

❗️

Check the API response. Allow the user to continue ONLY if:

The value of the session_details.solved key within the response is true.

Any other value means that the user’s response was not valid.

Verify API JSON Response Details

The response from the new Verify API v4 includes

  • Session details
  • Fingerprints information broken into three categories
    • Browser characteristics
    • Device characteristics
    • User preferences
  • IP Intelligence

The following information is completely new to v4

  • game_number_limit_reached
  • telltale_list
  • user_language_shown
  • The Fingerprint section
  • IP Intelligence section

The table below shows the JSON response details. Unless otherwise noted, they appear in responses for both Arkose Detect and Arkose Protect.

🚧

session_risk Field Not Described Here

If the Risk Score function has been turned on, the Verify v4 response will always include a session_risk field. session_risk is not listed or described below. For a description of session_risk and what you need to know to process it, see the Risk Score page.

Field Name

Description

Example Values

Applicable Product

Session Characteristics

solved

When a session's risk level does not qualify it for transparent mode (no challenge) it is shown an interactive challenge. In that case, this field's value indicates if the challenge was successfully solved or not.

If it was in transparent mode, the field value is true.

true, false

Arkose Protect

session

A unique token for the Arkose Labs session. A session is the whole experience from solution load to verification.

A unique token, e.g.
3595d2c014d3c5f01.1116018803,
or null

Arkose Detect
Arkose Protect

session_created

An ISO 8601 UTC timestamp signifying the time the session was created

e.g.
2019-07-15T02:45:13+00:00,
or null

Arkose Detect
Arkose Protect

check_answer

An ISO 8601 UTC timestamp signifying the time that the Enforcement Challenge user supplied answered were evaluated

e.g.
2019-07-15T02:45:13+00:00,
or null

Arkose Protect

verified

An ISO 8601 UTC timestamp signifying the time that the request to the verify endpoint was made.

e.g.
``2019-07-15T02:45:13+00:00

Arkose Detect
Arkose Protect

attempted

Whether the user attempted to solve the Enforcement Challenge, or not.

true, false

Arkose Protect

security_level

A number that indicates the security level used for this session.

Be aware that security_level can have a null value - usually because the session was an audio mode session. Audio mode does not use security_level.

A security level, e.g. 20

Arkose Protect

session_is_legit

Indicates if Arkose Labs certifies there are no telltales of non-legitimate activity in the session.

true, false

Arkose Detect
Arkose Protect

previously_verified

Indicates if a session has already been verified

true, false

Arkose Detect
Arkose Protect

session_timed_out

Indicates if a session timed out before it was solved

true, false

Arkose Detect
Arkose Protect

suppress_limited

Indicates if the session qualified for low security, but failed verification. Low security is when a session has qualified to run in transparent mode, or use a no wrong answer enforcement challenge, such as the pick your favorite color challenge.

true, false

Arkose Protect

theme_arg_invalid

If the theme arg setting at verification matched the original theme arg passed in at session setup.

true, false

Arkose Protect

suppressed

Suppressed is the old name for transparent mode. This field shows if the the user was offered transparent mode.

true, false

Arkose Protect

punishable_actioned

Punishable is an attack mitigation tactic, which randomly fails verification attempts, even if the response was correct. This field indicates if punishable was activated.

true, false

Arkose Protect

telltale_user

UID for a combination of telltales that identify a particular bad user or organization.

A string such as 999b-fwh,
or null

Arkose Detect
Arkose Protect

failed_low_sec_validation

Indicates that the intention was to offer the user a lowsec session, but they failed to qualify for it when the verification was attempted.

true, false

Arkose Protect

lowsec_error

An identifier showing why a user was denied a lowsec session.

"user_credits", "rate_limit_local", "validation_checks", "rate_limit_global", or null

Arkose Detect
Arkose Protect

lowsec_level_denied

The lowsec level that was denied to the user.

A security level, e.g. 5

Arkose Detect
Arkose Protect

ua

The User Agent string for the user that interacted with the EC.

"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36“

Arkose Detect
Arkose Protect

ip_rep_list

An identifier which specifies which IP reputation database this IP address has been seen at.

"tor", "sfs_tor", "sfs", or null

Arkose Detect
Arkose Protect

optional

{"blob": "lHpwagBqx3JOI7t9Ka0KUdIeHZbIjAYPPB72k Du2Zb5BwNiC6qJx5gS0f5c3EzcZ9d"}, or null

Arkose Detect
Arkose Protect

game_number_limit_reached

Game number limit is an optional setting that restricts the number of attempts a user can have at solving the EC. This field can show if the user reached the number of attempts allowed.

true, false

Arkose Protect

user_language_shown

Shows the language code of the language in which the challenge was presented to the user.

A string such as “en“ or null

Arkose Protect

telltale_list

The list of telltales that were identified as possible candidates during a session.

A string e.g. "999b-fwh", or null

Arkose Detect
Arkose Protect

Fingerprint

Browser Characteristics

browser_name

The name of the browser the user was using.

A string, e.g. Chrome or null

Arkose Detect
Arkose Protect

browser_version

The version of the browser the user was using.

A version number, e.g. 92.0.4515.159 or null

Arkose Detect
Arkose Protect

color_depth

The color depth of the device used for the session.

A number, e.g. 24 or null

Arkose Detect
Arkose Protect

session_storage

Whether session storage was available or not.

true, false

Arkose Detect
Arkose Protect

indexed_database

true, false

Arkose Detect
Arkose Protect

canvas_fingerprint

The canvas fingerprint value of the browser.

e.g. 1652956012 or null

Arkose Detect
Arkose Protect

Device Characteristics

operating_system

The operating system used on the device.

e.g. Windows or null

Arkose Detect
Arkose Protect

operating_system_version

The version of the operating system used on the device.

e.g. XP or null

Arkose Detect
Arkose Protect

screen_resolution

The current screen resolution of the device.

e.g. [1920,1080] or null

Arkose Detect
Arkose Protect

max_resolution_supported

The maximum supported screen resolution of the device.

e.g. [1920,1080] or null

Arkose Detect
Arkose Protect

behavior

true, false

Arkose Detect
Arkose Protect

cpu_class

The CPU class identifier of the device.

e.g. X86 or null

Arkose Detect
Arkose Protect

platform

The platform the device belongs to.

e.g. MacIntel or null

Arkose Detect
Arkose Protect

touch_support

Whether the device has touch support or not.

true, false

Arkose Detect
Arkose Protect

hardware_concurrency

The hardware concurrency support of the device.

e.g. 8 or null

Arkose Detect
Arkose Protect

User Preferences

timezone_offset

The timezone offset from UTC.

e.g. 1000 or null

Arkose Detect
Arkose Protect

IP Intelligence

timezone

The timezone the session was originated from.

A string, e.g.
America/Los_Angeles or null

Arkose Detect
Arkose Protect

user_ip

The IP address of the device used for the session.

An IP address, e.g.
199.220.42.206, or null

Arkose Detect
Arkose Protect

is_tor

Indicates if the IP is suspected of being a TOR connection (either active or previously hosted TOR nodes and exist).

true, false

Arkose Detect
Arkose Protect

is_vpn

Indicates if the IP is suspected of being a VPN connection. For example, it has been on a VPN and can include data center ranges.

true, false

Arkose Detect
Arkose Protect

is_proxy

Indicates if this IP address suspected to be a proxy.

true, false

Arkose Detect
Arkose Protect

is_bot

Whether the session is bot-originated or not.

true, false

Arkose Detect
Arkose Protect

country

Country the User IP belongs to.

A string, e.g. US or null.

Arkose Detect
Arkose Protect

region

State/Region that the IP belongs to.

A string, e.g. California or null.

Arkose Detect
Arkose Protect

city

The city the IP belongs to.

A string, e.g. Fremont or null

Arkose Detect
Arkose Protect

isp

The Internet Service Provider name.

A string, e.g. AT&T U-verse or null

Arkose Detect
Arkose Protect

public_access_point

Whether the IP address belongs to education and research institutions, corporates, or public WiFi such as hotel lobby, coffee shop, etc.

true, false

Arkose Detect
Arkose Protect

connection_type

Whether the connection type belongs to one of the following categories: Residential, Corporate, Education, Mobile, Data Center

A string, e.g. Residential or null

Arkose Detect
Arkose Protect

latitude

The latitude coordinates of the device used for the session.

e.g. 37.52809906 or null

Arkose Detect
Arkose Protect

longitude

The longitude coordinates of the device used for the session.

e.g. -121.97319794 or null

Arkose Detect
Arkose Protect

For a more detailed information about the Verify API JSON response, please ask your CSM.

See Response Schema for the full schema.

Sample Verify API Responses

The following examples show different Verify API responses. They show the typical values in each field for each type of response.

{
    "session_details": {
        "solved": true,
        "session": "22612c147bb418c8.2570749403",
        "session_created": "2021-08-29T23:13:03+00:00",
        "check_answer": "2021-08-29T23:13:16+00:00",
        "verified": "2021-08-30T00:19:32+00:00",
        "attempted": true,
        "security_level": 30,
        "session_is_legit": false,
        "previously_verified": true,
        "session_timed_out": true,
        "suppress_limited": false,
        "theme_arg_invalid": false,
        "suppressed": false,
        "punishable_actioned": false,
        "telltale_user": "eng-1362-game3-py-0.",
        "failed_low_sec_validation": false,
        "lowsec_error": null,
        "lowsec_level_denied": null,
        "ua": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36",
        "ip_rep_list": null,
        "game_number_limit_reached": false,
        "user_language_shown": "en",
        "telltale_list": [
            "eng-1362",
            "eng-1362-game3-py-0."
        ],
        "optional": null
    },
    "fingerprint": {
        "browser_characteristics": {
            "browser_name": "Chrome",
            "browser_version": "92.0.4515.159",
            "color_depth": 24,
            "session_storage": false,
            "indexed_database": false,
            "canvas_fingerprint": 1652956012
        },
        "device_characteristics": {
            "operating_system": null,
            "operating_system_version": null,
            "screen_resolution": [
                1920,
                1080
            ],
            "max_resolution_supported": [
                1920,
                1057
            ],
            "behavior": false,
            "cpu_class": "unknown",
            "platform": "MacIntel",
            "touch_support": false,
            "hardware_concurrency": 8
        },
        "user_preferences": {
            "timezone_offset": -600
        }
    },
    "ip_intelligence": {
        "user_ip": "10.211.121.196",
        "is_tor": false,
        "is_vpn": true,
        "is_proxy": true,
        "is_bot": true,
        "country": "AU",
        "region": "New South Wales",
        "city": "Sydney",
        "isp": "Amazon.com",
        "public_access_point": false,
        "connection_type": "Data Center",
        "latitude": "-38.85120035",
        "longitude": "106.21220398",
        "timezone": "Australia/Sydney"
    }
}
{
    "session_details": {
        "solved": false,
        "session": "22612c147bb418c8.2570749403",
        "session_created": "2021-08-29T23:13:03+00:00",
        "check_answer": "2021-08-29T23:13:16+00:00",
        "verified": "2021-08-30T00:19:32+00:00",
        "attempted": true,
        "security_level": 30,
        "session_is_legit": false,
        "previously_verified": true,
        "session_timed_out": true,
        "suppress_limited": false,
        "theme_arg_invalid": false,
        "suppressed": false,
        "punishable_actioned": false,
        "telltale_user": "eng-1362-game3-py-0.",
        "failed_low_sec_validation": false,
        "lowsec_error": null,
        "lowsec_level_denied": null,
        "ua": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36",
        "ip_rep_list": null,
        "game_number_limit_reached": false,
        "user_language_shown": "en",
        "telltale_list": [
            "eng-1362",
            "eng-1362-game3-py-0."
        ],
        "optional": null
    },
    "fingerprint": {
        "browser_characteristics": {
            "browser_name": "Chrome",
            "browser_version": "92.0.4515.159",
            "color_depth": 24,
            "session_storage": false,
            "indexed_database": false,
            "canvas_fingerprint": 1652956012
        },
        "device_characteristics": {
            "operating_system": null,
            "operating_system_version": null,
            "screen_resolution": [
                1920,
                1080
            ],
            "max_resolution_supported": [
                1920,
                1057
            ],
            "behavior": false,
            "cpu_class": "unknown",
            "platform": "MacIntel",
            "touch_support": false,
            "hardware_concurrency": 8
        },
        "user_preferences": {
            "timezone_offset": -600
        }
    },
    "ip_intelligence": {
        "user_ip": "10.211.121.196",
        "is_tor": false,
        "is_vpn": true,
        "is_proxy": true,
        "is_bot": true,
        "country": "AU",
        "region": "New South Wales",
        "city": "Sydney",
        "isp": "Amazon.com",
        "public_access_point": false,
        "connection_type": "Data Center",
        "latitude": "-38.85120035",
        "longitude": "106.21220398",
        "timezone": "Australia/Sydney"
    }
}
{
    "error": "DENIED ACCESS",
    "verified": "2021-08-30T22:15:00+00:00"
}
{
    "session_details": {
        "solved": true,
        "session": "22612c147bb418c8.2570749403",
        "session_created": "2021-08-29T23:13:03+00:00",
        "check_answer": "2021-08-29T23:13:16+00:00",
        "verified": "2021-08-30T00:19:32+00:00",
        "attempted": true,
        "security_level": 30,
        "session_is_legit": false,
        "previously_verified": true,
        "session_timed_out": true,
        "suppress_limited": false,
        "theme_arg_invalid": false,
        "suppressed": false,
        "punishable_actioned": false,
        "telltale_user": "eng-1362-game3-py-0.",
        "failed_low_sec_validation": false,
        "lowsec_error": "user_credits",
        "lowsec_level_denied": null,
        "ua": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36",
        "ip_rep_list": null,
        "game_number_limit_reached": false,
        "user_language_shown": "en",
        "telltale_list": [
            "eng-1362",
            "eng-1362-game3-py-0."
        ],
        "optional": null
    },
    "fingerprint": {
        "browser_characteristics": {
            "browser_name": "Chrome",
            "browser_version": "92.0.4515.159",
            "color_depth": 24,
            "session_storage": false,
            "indexed_database": false,
            "canvas_fingerprint": 1652956012
        },
        "device_characteristics": {
            "operating_system": null,
            "operating_system_version": null,
            "screen_resolution": [
                1920,
                1080
            ],
            "max_resolution_supported": [
                1920,
                1057
            ],
            "behavior": false,
            "cpu_class": "unknown",
            "platform": "MacIntel",
            "touch_support": false,
            "hardware_concurrency": 8
        },
        "user_preferences": {
            "timezone_offset": -600
        }
    },
    "ip_intelligence": {
        "user_ip": "10.211.121.196",
        "is_tor": false,
        "is_vpn": true,
        "is_proxy": true,
        "is_bot": true,
        "country": "AU",
        "region": "New South Wales",
        "city": "Sydney",
        "isp": "Amazon.com",
        "public_access_point": false,
        "connection_type": "Data Center",
        "latitude": "-38.85120035",
        "longitude": "106.21220398",
        "timezone": "Australia/Sydney"
        }
}
{
    "session_details": {
        "solved": true,
        "session": "22612c147bb418c8.2570749403",
        "session_created": "2021-08-29T23:13:03+00:00",
        "check_answer": "2021-08-29T23:13:16+00:00",
        "verified": "2021-08-30T00:19:32+00:00",
        "attempted": true,
        "security_level": 30,
        "session_is_legit": false,
        "previously_verified": true,
        "session_timed_out": true,
        "suppress_limited": false,
        "theme_arg_invalid": false,
        "suppressed": false,
        "punishable_actioned": false,
        "telltale_user": "eng-1362-game3-py-0.",
        "failed_low_sec_validation": false,
        "lowsec_error": null,
        "lowsec_level_denied": null,
        "ua": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36",
        "ip_rep_list": null,
        "game_number_limit_reached": false,
        "user_language_shown": "en",
        "telltale_list": [
            "eng-1362",
            "eng-1362-game3-py-0."
        ],
        "optional": {
            "blob": "BbfYFeKzwEwnGCAU.fCWy85IOHQ2j2SomSW6bf6Mibfgdlqn7MWyoY8JbYkVskPsLbqBqryeAR0EVC1pi5XosVJjPfvWZ4H6EBQgC5XYnHVeKwQ=="
        },
    },
    "fingerprint": {
        "browser_characteristics": {
            "browser_name": "Chrome",
            "browser_version": "92.0.4515.159",
            "color_depth": 24,
            "session_storage": false,
            "indexed_database": false,
            "canvas_fingerprint": 1652956012
        },
        "device_characteristics": {
            "operating_system": null,
            "operating_system_version": null,
            "screen_resolution": [
                1920,
                1080
            ],
            "max_resolution_supported": [
                1920,
                1057
            ],
            "behavior": false,
            "cpu_class": "unknown",
            "platform": "MacIntel",
            "touch_support": false,
            "hardware_concurrency": 8
        },
        "user_preferences": {
            "timezone_offset": -600
        }
    },
    "ip_intelligence": {
        "user_ip": "10.211.121.196",
        "is_tor": false,
        "is_vpn": true,
        "is_proxy": true,
        "is_bot": true,
        "country": "AU",
        "region": "New South Wales",
        "city": "Sydney",
        "isp": "Amazon.com",
        "public_access_point": false,
        "connection_type": "Data Center",
        "latitude": "-38.85120035",
        "longitude": "106.21220398",
        "timezone": "Australia/Sydney"
    }
}

Request and Response Schemas

The request and response schemas follow the JSON Schema standard. For more information about the JSON Schema standard see JSON Schema.

{
    "type": "object",
    "properties": {
        "private_key": {
            "description": "The private key associated with EC that served this session",
            "type": "string"
        },
        "session_token": {
            "description": "The session token which identifies the session to verify",
            "type": "string"
        },
        "log_data": {
            "description": "A field to allow a free form piece of string data",
            "type": "string"
        }
    },
    "required": [
        "private_key",
        "session_token"
    ]
}
{
    "oneOf": [
        {
            "description": "error response",
            "type": "object",
            "properties": {
                "error": {
                    "type": "string"
                },
                "verified": {
                    "type": "string",
                    "format": "date-time"
                }
            },
            "required": [
                "error",
                "verified"
            ]
        },
        {
            "description": "simple mode",
            "type": "integer",
            "default": 0
        },
        {
            "type": "object",
            "properties": {
                "session_details": {
                    "type": "object",
                    "properties": {
                        "solved": {
                            "type": "boolean",
                            "default": false
                        },
                        "session": {
                            "type": ["string", "null"],
                            "pattern": "^[0-9A-Fa-f]+\\.[0-9]{10}$",
                            "default": null
                        },
                        "session_created": {
                            "type": ["string", "null"],
                            "format": "date-time",
                            "default": null
                        },
                        "check_answer": {
                            "type": ["string", "null"],
                            "format": "date-time",
                            "default": null
                        },
                        "verified": {
                            "type": "string",
                            "format": "date-time"
                        },
                        "attempted": {
                            "type": "boolean",
                            "default": false
                        },
                        "security_level": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 500,
                            "default": 0
                        },
                        "session_is_legit": {
                            "type": "boolean",
                            "default": false
                        },
                        "previously_verified": {
                            "type": "boolean",
                            "default": false
                        },
                        "session_timed_out": {
                            "type": "boolean",
                            "default": false
                        },
                        "suppress_limited": {
                            "type": "boolean",
                            "default": false
                        },
                        "theme_arg_invalid": {
                            "type": "boolean",
                            "default": false
                        },
                        "suppressed": {
                            "type": "boolean",
                            "default": false
                        },
                        "punishable_actioned": {
                            "type": "boolean",
                            "default": false
                        },
                        "telltale_user": {
                            "type": ["string", "null"],
                            "minLength": 0,
                            "maxLength": 128,
                            "default": null
                        },
                        "failed_low_sec_validation": {
                            "type": "boolean",
                            "default": false
                        },
                        "lowsec_error": {
                            "type": ["string", "null"],
                            "enum": ["user_credits", "rate_limit_local", "validation_checks", "rate_limit_global", null],
                            "default": null
                        },
                        "lowsec_level_denied": {
                            "type": ["integer", "null"],
                            "minimum": 0,
                            "maximum": 500,
                            "default": null
                        },
                        "ua": {
                            "type": ["string", "null"],
                            "default": null
                        },
                        "ip_rep_list": {
                            "type": ["string", "null"],
                            "enum": ["tor", "sfs_tor", "sfs", null],
                            "default": null
                        },
                        "optional": {
                            "type": ["object", "null"],
                            "default": null
                        },
                        "game_number_limit_reached": {
                            "description": "Whether the maximum number of game retries (if set) is reached",
                            "type": "boolean",
                            "default": false
                        },
                        "user_language_shown": {
                            "description": "Shows the language code of the language in which the challenge was presented to the user",
                            "type": ["string", "null"],
                            "minLength": 0,
                            "maxLength": 10,
                            "default": null
                        },
                        "telltale_list": {
                            "description": "The list of telltales that were identified as possible candidates during a session",
                            "type": ["array", "null"],
                            "items": {
                                "type": "string",
                                "minLength": 0,
                                "maxLength": 128
                            },
                            "default": null
                        }
                    },
                    "required": [
                        "solved",
                        "session",
                        "session_created",
                        "check_answer",
                        "verified",
                        "previously_verified",
                        "session_timed_out",
                        "suppress_limited",
                        "theme_arg_invalid",
                        "suppressed",
                        "attempted",
                        "punishable_actioned",
                        "telltale_user",
                        "session_is_legit",
                        "failed_low_sec_validation",
                        "lowsec_error",
                        "lowsec_level_denied",
                        "ip_rep_list",
                        "security_level",
                        "ua",
                        "optional",
                        "game_number_limit_reached",
                        "user_language",
                        "telltale_list"
                    ]
                },
                "fingerprint": {
                    "type": "object",
                    "properties": {
                        "browser_characteristics": {
                            "type": "object",
                            "properties": {
                                "browser_name": {
                                    "type": ["string", "null"],
                                    "default": null
                                },
                                "browser_version": {
                                    "type": ["string", "null"],
                                    "default": null
                                },
                                "color_depth": {
                                    "type": ["integer", "null"],
                                    "default": null
                                },
                                "session_storage": {
                                    "type": "boolean",
                                    "default": false
                                },
                                "indexed_database": {
                                    "type": "boolean",
                                    "default": false
                                },
                                "canvas_fingerprint": {
                                    "type": ["integer", "null"],
                                    "default": null
                                }
                            },
                            "required": [
                                "browser_name",
                                "browser_version",
                                "color_depth",
                                "session_storage",
                                "indexed_database",
                                "canvas_fingerprint"
                            ]
                        },
                        "device_characteristics": {
                            "type": "object",
                            "properties": {
                                "operating_system": {
                                    "type": ["string", "null"],
                                    "default": null,
                                    "examples": [
                                        "Windows",
                                        "OS X"
                                    ]
                                },
                                "operating_system_version": {
                                    "type": ["string", "null"],
                                    "default": null,
                                    "examples": [
                                        "10",
                                        "Mojave"
                                    ]
                                },
                                "screen_resolution": {
                                    "type": ["array", "null"],
                                    "items": {"type": "integer"},
                                    "default": null,
                                    "examples": [
                                        [1920, 1080]
                                    ]
                                },
                                "max_resolution_supported": {
                                    "type": ["array", "null"],
                                    "items": {"type": "integer"},
                                    "default": null,
                                    "examples": [
                                        [1280, 720]
                                    ]
                                },
                                "behavior": {
                                    "type": "boolean",
                                    "default": false
                                },
                                "cpu_class": {
                                    "type": ["string", "null"],
                                    "default": null,
                                    "examples": [
                                        "x86",
                                        "ARM"
                                    ]
                                },
                                "platform": {
                                    "type": ["string", "null"],
                                    "default": null,
                                    "examples": [
                                        "MacIntel",
                                        "Win32"
                                    ]
                                },
                                "touch_support": {
                                    "type": "boolean",
                                    "default": false
                                },
                                "hardware_concurrency": {
                                    "type": ["integer", "null"],
                                    "default": null
                                }
                            },
                            "required": [
                                "operating_system",
                                "operating_system_version",
                                "screen_resolution",
                                "max_resolution_supported",
                                "behavior",
                                "cpu_class",
                                "platform",
                                "touch_support",
                                "hardware_concurrency"
                            ]
                        },
                        "user_preferences": {
                            "type": "object",
                            "properties": {
                                "timezone_offset": {
                                    "type": ["integer", "null"],
                                    "default": null,
                                    "examples": [
                                        1000,
                                        -800,
                                        0
                                    ]
                                }
                            },
                            "required": [
                                "timezone_offset"
                            ]
                        }
                    },
                    "required": [
                        "browser_characteristics",
                        "device_characteristics",
                        "user_preferences"
                    ]
                },
                "ip_intelligence": {
                    "type": "object",
                    "properties": {
                        "user_ip": {
                            "oneOf": [
                              {"type": "string", "format": "ipv4"},
                              {"type": "string", "format": "ipv6"},
                              {"type": "null"}
                            ],
                            "default": null
                        },
                        "is_tor": {
                            "type": "boolean",
                            "default": false
                        },
                        "is_vpn": {
                            "type": "boolean",
                            "default": false
                        },
                        "is_proxy": {
                            "type": "boolean",
                            "default": false
                        },
                        "is_bot": {
                            "type": "boolean",
                            "default": false
                        },
                        "country": {
                            "type": ["string", "null"],
                            "default": null
                        },
                        "region": {
                            "type": ["string", "null"],
                            "default": null
                        },
                        "city": {
                            "type": ["string", "null"],
                            "default": null
                        },
                        "isp": {
                            "type": ["string", "null"],
                            "default": null
                        },
                        "public_access_point": {
                            "type": "boolean",
                            "default": false
                        },
                        "connection_type": {
                            "type": ["string", "null"],
                            "default": null
                        },
                        "latitude": {
                            "type": ["string", "null"],
                            "default": null
                        },
                        "longitude": {
                            "type": ["string", "null"],
                            "default": null
                        },
                        "timezone": {
                            "type": ["string", "null"],
                            "default": null
                        }
                    },
                    "required": [
                        "user_ip",
                        "is_tor",
                        "is_vpn",
                        "is_proxy",
                        "is_bot",
                        "country",
                        "region",
                        "city",
                        "isp",
                        "public_access_point",
                        "connection_type",
                        "latitude",
                        "longitude",
                        "timezone"
                    ]
                }
            },
            "required": [
                "session_details",
                "fingerprint",
                "ip_intelligence"
            ]
        }
    ]
}