Fraud API
SEON's proprietary API combines our email, phone number, IP, BIN, and AML APIs with device fingerprinting so that you can request and receive our enriched data, rules, and scoring in a single API call.
Good to know
- The API is fully modular, meaning you can choose to enable or disable each sub-APIs (Email, Phone, IP, or AML) or the device fingerprinting tool. Use the
configobject to enable or disable modules. - You can use the
custom_fieldsobject to send almost any custom data point to SEON. Your team can also use custom fields in rules to create a completely custom ruleset. - All SEON API requests are case-sensitive. Please follow the formatting below to avoid errors.
- It's recommended to populate all user name related fields as much as possible (
user_fullname, user_firstname, user_middlename, user_lastname
For more context on how to begin your API integration check the Introduction section or our Integration Guide.
Request
Request Attributes | Type | Required | ||
|---|---|---|---|---|
config | object | no | ||
action_type | string | no | ||
ip | string | no | ||
transaction_id | string | no | ||
affiliate_id | string | no | ||
affiliate_name | string | no | ||
order_memo | string | no | ||
| string | no | |||
email_domain | string | no | ||
payment_id | string | no | ||
password_hash | string | no | ||
user_fullname | string | no | ||
user_name | string | no | ||
user_firstname | string | no | ||
user_middlename | string | no | ||
user_lastname | string | no | ||
user_pob | string | no | ||
id_value | ||||
user_photoid_number | string | no | ||
user_id | string | no | ||
user_created | integer | no | ||
user_category | string | no | ||
user_account_status | string | no | ||
user_bank_account | string | no | ||
user_bank_name | string | no | ||
user_bank_swift | string | no | ||
user_bank_country | string | no | ||
user_balance | float | no | ||
user_verification_level | string | no | ||
user_dob | date | no | ||
user_country | string | no | ||
user_city | string | no | ||
user_region | string | no | ||
user_zip | string | no | ||
user_street | string | no | ||
user_street2 | string | no | ||
session_id | string | no | ||
session | string | no | ||
device_id | string | no | ||
payment_mode | string | no | ||
payment_provider | string | no | ||
card_fullname | string | no | ||
card_bin | string | no | ||
card_hash | string | no | ||
card_expire | date | no | ||
card_last | string | no | ||
avs_result | string | no | ||
cvv_result | boolean | no | ||
status_3d | string | no | ||
sca_method | string | no | ||
phone_number | string | no | ||
transaction_type | string | no | ||
transaction_amount | float | no | ||
transaction_currency | string | no | ||
transaction_long_text | string | no | ||
items | array of objects | no | ||
shipping_country | string | no | ||
shipping_city | string | no | ||
shipping_region | string | no | ||
shipping_zip | string | no | ||
shipping_street | string | no | ||
shipping_street2 | string | no | ||
shipping_phone | string | no | ||
shipping_fullname | string | no | ||
shipping_method | string | no | ||
billing_country | string | no | ||
billing_city | string | no | ||
billing_region | string | no | ||
billing_zip | string | no | ||
billing_street | string | no | ||
billing_street2 | string | no | ||
billing_phone | string | no | ||
pos_lat | float | no | ||
pos_long | float | no | ||
custom_lat | float | no | ||
custom_long | float | no | ||
discount_code | string | no | ||
gift | boolean | no | ||
gift_message | boolean | no | ||
merchant_category | string | no | ||
merchant_id | string | no | ||
merchant_name | string | no | ||
merchant_created_at | integer | no | ||
merchant_country | string | no | ||
receiver_fullname | string | no | ||
receiver_firstname | string | no | ||
receiver_middlename | string | no | ||
receiver_lastname | string | no | ||
receiver_dob | string | no | ||
receiver_pob | string | no | ||
receiver_id | string | no | ||
receiver_country | string | no | ||
receiver_photoid_number | string | no | ||
receiver_bank_account | string | no | ||
receiver_bank_swift | string | no | ||
receiver_bank_name | string | no | ||
receiver_bank_country | string | no | ||
details_url | string | no | ||
regulation | string | no | ||
bonus_campaign_id | string | no | ||
brand_id | string | no | ||
custom_fields | object | no | ||
HTTP Endpoint
Response
The endpoint returns JSON structured response.
JSON Attributes | Type | ||
|---|---|---|---|
id | string | ||
state | string | ||
fraud_score | number | ||
blackbox_score | number | ||
ip_details | object | ||
email_details | object | ||
bin_details | object | ||
phone_details | object | ||
aml_details | object | ||
version | string | ||
applied_rules | array of objects | ||
device_details | object | ||
geolocation_details | object | ||
calculation_time | integer | ||
seon_id | integer | ||
rule_category_details | array of objects | ||
string_analyses | array of objects | ||
ekyc_result | string | ||
ekyc_data | Object | ||
Response
JavaScript Agent v6
You can integrate our device fingerprinting module directly into a web app, by using our JavaScript agent. Please, use our CDN hosted script to ensure you always load the latest available version.
Visit the SEON Web SDK GitHub page to see the latest version and its changelog.
- Include the JavaScript Agent for example inside the
<head>tags of your website or web app. You can also lazy-load it or execute it upon specific actions (e.g. clicking on Login, Payment, and Registration buttons, before calling the API). In this case, you must ensure that the module has been loaded successfully before invoking its methods. - Call the
seon.init()function on page load to get more data points for bot detection, behavioral analysis and more accurate intelligence signals. - Call the
seon.getSession(config)function to generate the encrypted device intelligence session. - Send the returned session payload string to your backend and add to the
sessionproperty in your Fraud API request. The Fraud API call should be still executed if thesessionis missing, due to a non-executed JS snippet. Tip: Add timeout to JS and utilize Fraud API call after.
All the device fingerprinting data will be available in the response of the Fraud API, and accessible on the Admin Panel of the Transactions Details page.
Configuration parameters
To configure the JavaScript module, you need to create a config object and call the seon.getSession(config) function
JSON Attributes | Required | |
|---|---|---|
geolocation | no | |
behavioralDataCollection | no | |
networkTimeoutMs | no | |
dnsResolverDomain | no | |
silentMode | no | |
referrer | no | |
windowLocation | no | |
region | no | |
fieldTimeoutMs | no | |
throwOn | no | |
Integration
Device Intelligence signals can be triggered by the seon.Session() function. After collecting all the available information, the function returns an encrypted base64 encoded payload. If you would like to use your custom configuration, please include the config object in the function.
Without using the seon.init() on page load you will still receive valid device intelligence signals with most of the functions but it will not contain the behavioral signals. Additionally, the bot detection and browser hash may be less precise.
If your website uses Content Security Policy (CSP) headers, ensure that the following sources are allowed for full functionality, depending on your host configuration:
connect-src *.seondnsresolve.com(depending on the resolver domain used)worker-src blob:(required for running fields in webworkers)img-src data:http://127.0.0.1:*(http://127.0.0.1:*[only needed if silentMode is disabled])
Behavioral features
Calling the seon.init() method will enable behavioral analysis. The user behavior collection is started on the seon.init() call and ends when seon.getSession() is called (behavioral data will be automatically included in the generated session string). Thus the recommended integration pattern is calling init on the form load, and calling getSession on form submit to analyze user behavior during a form fillout. Suspicious behavior is flagged in the suspicious_flags response field, which can contain the following values:
suspicious_keypress_characteristicssuspicious_mouse_movementsuspicious_form_filloutpaste_usedautofill_usedpotential_remote_interactionpotential_remote_control
By default, user interaction is analyzed on the whole page. If you want to target specific input fields or forms for behavior analysis, you can customize it using the behavioralDataCollection init configuration option:
The targeted elements MUST exist at the time of the init call. Elements that match the selector, but added to the DOM after the init call will NOT be part of the evaluation.
To disable behavioral data collection by the SDK altogether, you must specify an empty string for the targets option:
Payload
SEON JavaScript library collects device information and prepares an encrypted payload to use in Fraud API. The information on client side is not readable, we’ll reveal in the Fraud API response and on the Admin Panel. Some fields can be null, if the actual browser does not support or return data for that specific data point. In every other case, data types are preserved. Find a sample payload on the right side.
Common issues
- The
sessionis provided in the Fraud API request, but thedevice_detailsisnullin the response and there is no device information on the Transaction details page. This means the encrypted payload is corrupted. Please look into your integration and check again. - If you use CSP (Content Security Policy) headers on your site, you must allow the following domains in
connect-srcdirective for full functionality based on your host configuration.
Default:*.seondnsresolve.com
deviceinf.com:*.deviceinfresolver.com
seonintelligence.com:*.seonintelligenceresolver.com
Alternatively you integrate the SDK through NPM. With this method you will have to keep the package updated yourself to include our latest features and bugfixes.
NPM integration
npm install @seontechnologies/seon-javascript-sdk
# or
yarn add @seontechnologies/seon-javascript-sdk
Response
JSON Attributes | Type | |
|---|---|---|
os | string | |
vpn | boolean | |
type | string | |
proxy | boolean | |
webgl | object | |
dns_ip | string | |
locale | string | |
source | string | |
adblock | boolean | |
battery | object | |
browser | string | |
plugins | object | |
private | boolean | |
platform | string | |
referrer | string | |
timezone | string | |
device_ip | string | |
font_hash | string | |
font_list | array | |
has_focus | boolean | |
languages | array | |
math_hash | string | |
audio_hash | string | |
dns_ip_isp | string | |
extensions | array | |
font_count | integer | |
font_noise | boolean | |
session_id | string | |
user_agent | string | |
webrtc_ips | array | |
canvas_hash | string | |
cookie_hash | string | |
device_hash | string | |
device_type | string | |
mouse_moved | boolean | |
permissions | object | |
price_range | string | |
screen_data | object | |
browser_hash | string | |
do_not_track | boolean | |
java_enabled | boolean | |
webrtc_count | integer | |
device_ip_isp | string | |
device_memory | integer | |
dns_ip_region | string | |
flash_enabled | boolean | |
media_devices | object | |
spoofing_hash | string | |
touch_support | boolean | |
cookie_enabled | boolean | |
dns_ip_country | string | |
mobile_details | array | |
browser_version | string | |
device_location | object | |
drm_key_systems | array | |
mime_types_hash | string | |
timezone_offset | string | |
user_agent_data | object | |
window_location | string | |
device_ip_region | string | |
max_touch_points | integer | |
suspicious_flags | array | |
timezone_country | string | |
webrtc_activated | boolean | |
device_ip_country | string | |
system_colors_hash | string | |
browser_version_age | integer | |
hardware_concurrency | integer | |
keyboard_layout_hash | string | |
keyboard_layout_name | string | |
unpopular_user_agent | boolean | |
unpopular_device_resolution | boolean | |
true_device_id | string | |
<html>
<head>
...
<script src="[source_url]"></script>
</head>
<body>
...
</body>
</html>
You can use the following script source URLs ([source_url]):
- https://cdn.dfsdk.com/js/v6/agent.umd.js
- https://cdn.deviceinf.com/js/v6/agent.umd.js
- https://cdn.seonintelligence.com/js/v6/agent.umd.js
// On page load:
seon.init();
const config = {
geolocation: {
canPrompt: false,
},
networkTimeoutMs: 2000,
fieldTimeoutMs: 2000,
region: 'eu',
silentMode: true,
};
const session = await seon.getSession(config);
// 'session' variable holds the encrypted device fingerprint that should be sent to SEONCheck out our integration examples:
- https://stackblitz.com/@dfseon/collections/seon-web-sdk-v6-demos
// On load
seon.init({
behavioralDataCollection: {
targets: 'input[type="text"], .behavior', // querySelector string
formFilloutDurationTargetId: "myForm", // select form with id 'myForm'
}
});
// On form submit
await seon.getSession();
// Disabling behavioral analysis
seon.init({
behavioralDataCollection: {
targets: '', // pass an emtpy string for targets
}
});Response
iOS SDK
You can integrate our device fingerprinting module directly into iOS mobile apps, by using our SDK found on GitHub. It will collect information based on the user’s software and hardware configuration.
- The SDK returns an encrypted, base64 encoded string to add in the
sessionproperty in the Fraud API request. It isn’t permitted to access or modify the payload on the clients. - JSON structured device details will be returned in the Fraud API response.
- Check out the latest version and changelog on the SEON iOS SDK GitHub page.
Behaviour Monitoring (Optional)
behaviour Monitoring allows the SEON SDK to be able to detect potentially suspicious user behaviour on the device. The SDK collects data during the session, which is then analyzed to identify potentially fraudulent environments and actions. This feature enhances the SDK’s ability to prevent fraud by detecting various forms of automated or suspicious activity, such as bot usage or device farms.
The monitoring should be started with calling startBehaviourMonitoring wherever you would like to detect suspicious activity in your application and should be stopped with stopBehaviourMonitoring whenever it's reasonable. The returned session string should be then used in a Fraud API request as usual.
Possible suspicious_flags values:
"possible_automation": Suggests that automation tools or scripts may be controlling the device."possible_device_farm": Suggests that the device might be part of a device farm used for fraudulent activities."possible_vishing": Flags possible vishing (voice phishing) activity, where the user might be coerced into providing sensitive information.
To be continuously improved and extended with new signals
Response
JSON Attributes | Type | |
|---|---|---|
type | string | |
source | string | |
session_id | string | |
accessories_count | integer | |
audio_mute_status | boolean | |
audio_volume_current | integer | |
battery_charging | boolean | |
battery_level | integer | |
can_send_mail | boolean | |
can_send_text | boolean | |
cpu_count | integer | |
cpu_type | string | |
device_adid | string | |
device_hash | string | |
device_name | string | |
device_orientation | string | |
device_udid | string | |
icloud_ubiquity_token | string | |
ios_device_name | string | |
ios_version | string | |
is_biometrics_enabled | boolean | |
is_emulator | boolean | |
is_ios_app_on_mac | boolean | |
is_jailbroken | boolean | |
is_on_call | boolean | |
is_passcode_enabled | boolean | |
is_screen_captured | boolean | |
kernel_arch | string | |
kernel_name | string | |
kernel_version | string | |
network_config | string | |
pasteboard_hash | string | |
physical_memory | unsigned long | |
region_country | string | |
region_language | string | |
region_timezone | string | |
screen_brightness | integer | |
screen_height | integer | |
screen_width | integer | |
system_uptime | integer | |
timezone_identifier | string | |
wifi_mac_address | string | |
wifi_ssid | string | |
proxy_address | string | |
proxy_state | string | |
vpn_state | string | |
system_integrity | string | |
dns_ip | string | |
dns_ip_country | string | |
dns_ip_isp | string | |
device_ip_address | string | |
device_ip_country | string | |
device_ip_isp | string | |
device_location | object | |
suspicious_flags | array | |
true_device_id | string | |
Response
Android SDK
You can integrate our device fingerprinting module directly into Android mobile apps, by using our SDK found on GitHub. In the repo you will also find more details about the integration like requirements and samples. It will collect information based on the user’s software and hardware configuration.
- The SDK returns an encrypted, base64 encoded string to add in the
sessionproperty in the Fraud API request. It isn’t permitted to access or modify the payload on the clients. - JSON structured device details will be revealed in the Fraud API response.
- Check out the latest version and changelog on the SEON Android SDK GitHub page.
Behaviour Monitoring (Optional)
Behaviour Monitoring allows the SEON SDK to be able to detect potentially suspicious user behaviour on the device. The SDK collects data during the session, which is then analyzed to identify potentially fraudulent environments and actions. This feature enhances the SDK’s ability to prevent fraud by detecting various forms of automated or suspicious activity, such as bot usage or device farms.
The monitoring must be started with calling startBehaviourMonitoring wherever you would like to detect suspicious activity in your application and should be stopped with stopBehaviourMonitoring whenever it's reasonable. The returned session string should be then used in a Fraud API request as usual. Note: If you call stopBehaviourMonitoring without startBehaviourMonitoring called previously, the method will exit with BehaviouralMonitoringException thrown.
Possible suspicious_flags values:
"possible_automation": Suggests that automation tools or scripts may be controlling the device."possible_device_farm": Suggests that the device might be part of a device farm used for fraudulent activities."possible_vishing": Flags possible vishing (voice phishing) activity, where the user might be coerced into providing sensitive information."possible_ongoing_call": Flags possible ongoing phone call, which could be useful information in case the READ_PHONE_STATE permission wasn't granted foris_on_callfield to work. This behaviour based flag does not need any permissions to work, but it's only a best-effort metric.- To be continously improved and extended with new signals
Response
JSON Attributes | Type | |
|---|---|---|
type | string | |
source | string | |
session_id | string | |
android_id | string | |
android_version | string | |
app_guid | string | |
audio_mute_status | boolean | |
audio_volume_current | integer | |
battery_charging | boolean | |
battery_health | string | |
battery_level | integer | |
battery_temperature | float | |
battery_voltage | integer | |
biometric_status | string | |
bootloader_state | string | |
build_device | string | |
build_id | string | |
build_manufacturer | string | |
build_model | string | |
build_number | string | |
build_time | integer | |
carrier_country | string | |
carrier_name | string | |
cpu_count | integer | |
cpu_hash | string | |
cpu_speed | double | |
cpu_type | string | |
developer_options_state | string | |
device_hash | string | |
device_cellular_id | string | |
device_name | string | |
device_orientation | string | |
esim_capabilities | object | |
free_storage | integer | |
gsf_id | string | |
has_proximity_sensor | boolean | |
interfering_apps | array of string | |
is_click_automator_installed | boolean | |
is_emulator | boolean | |
is_keyguard_secure | boolean | |
is_nfc_available | boolean | |
is_nfc_enabled | boolean | |
is_on_call | boolean | |
is_remote_control_connected | boolean | |
is_rooted | boolean | |
is_screen_being_mirrored | boolean | |
kernel_arch | string | |
kernel_name | string | |
kernel_version | string | |
last_boot_time | integer | |
network_config | string | |
pasteboard_hash | string | |
physical_memory | integer | |
region_country | string | |
region_language | string | |
region_timezone | string | |
remote_control_provider | string | |
screen_brightness | integer | |
screen_height | integer | |
screen_scale | integer | |
screen_width | integer | |
sensor_hash | string | |
system_uptime | integer | |
timezone_identifier | string | |
total_storage | integer | |
usb_cable_state | string | |
usb_debugging_state | string | |
wifi_mac_address | string | |
wifi_ssid | string | |
dns_ip | string | |
dns_ip_country | string | |
dns_ip_isp | string | |
device_ip_address | string | |
device_ip_country | string | |
device_ip_isp | string | |
device_location | object | |
vpn_state | string | |
proxy_state | string | |
proxy_address | string | |
first_api_level | int | |
power_source | string | |
suspicious_flags | array | |
is_app_cloned | boolean | |
system_integrity | string | |
true_device_id | string | |
Response
ekyc endpoints payload examples
eKYC checks return one of the following standardized status values.
| Status Value | Definition |
| SUCCESS | The source returned a result (for ID-only endpoints), or all provided parameters were matched. |
| PARTIAL_SUCCESS | The source returned a result, but not all provided parameters matched. |
| REVIEW | The source returned an inconclusive verdict, indicating that the data falls into a gray area, requires manual intervention, or triggered non-critical warnings. |
| NO_MATCH | The source successfully executed the search, but no record was found for the core identity data (e.g., only general fields like date of birth or gender matched). |
| FAILED | The source explicitly returned a negative verdict, indicating that the identity data actively contradicted their records, or severe negative signals (e.g., fraud) were detected. |
| FAILED_PROCESSING | The source could not complete the verification due to a technical error, outage, or invalid input data that prevented the check from running. |
JSON Attributes | Type | |
|---|---|---|
success | boolean | |
error | object | |
data | object | |
data.person | object | |
data.matches | object | |
data.additionalData | object | |
data.additionalMatches | object | |
AML payload examples
This section demonstrates different AML screening use cases, including customer screening and payment screening. The examples show recommended configurations and best practices for using search profiles, monitoring, and entity classification.
1. AML Customer Screening (Discouraged for New Implementations)
You can screen a user against sanctions lists, PEPs, crime watchlists and adverse media by configuring data sources and fuzzy-matching settings directly in the API request.
The example request below uses default source and fuzzy settings. All detailed configuration options can be defined via the API.
Recommendation
Although configuration via API is supported, we strongly recommend setting up source, monitoring and fuzzy-matching settings in the Admin UI and referencing them by name in the API request. This approach simplifies maintenance and reduces the risk of misconfiguration.
Example:
{
"config": {
"aml": {
"type": "PERSON",
"version": "v1",
"monitoring_required": false,
"monitoring_schedule": null,
"sources": {
"sanction_enabled": true,
"pep_enabled": true,
"watchlist_enabled": true,
"crimelist_enabled": true,
"adversemedia_enabled": false,
"local_aml_sources": {
"brazil_spa": false,
"bolsa_familia": false,
"cpf_based_pep": false,
"cpf_based_ppe": false,
"cpf_based_ppn": false,
"seguro_defeso": false,
"garantia_safra": false,
"auxilio_emergencial": false,
"brazil_bpc": false
}
},
"fuzzy_enabled": true,
"fuzzy_config": {
"phonetic_search_enabled": false,
"edit_distance_enabled": true,
"scoring": {
"allow_designator_translation": true,
"edit_distance_1_threshold": 7,
"edit_distance_2_threshold": 13,
"enable_lastname_detection": false,
"filter_mismatching_country": false,
"filter_mismatching_country_designator": false,
"filter_mismatching_dob": true,
"filter_missing_country": false,
"filter_missing_dob": false,
"glued_words_splitting": "off",
"allow_ocr_spellcheck": false,
"min_nr_token_match": 67,
"result_limit": 30,
"score_threshold": 0.585,
"adverse_media_scores": {
"fuzziness": 0.5,
"exact_match": false,
"force_dob_filter": true,
"force_country_filter": true
}
}
}
},
"ip_api": false,
"email_api": false,
"phone_api": false,
"aml_api": true,
"response_fields": "aml_details",
"device_fingerprinting": false
},
"user_fullname": "John Doe",
"user_firstname": "",
"user_middlename": "",
"user_lastname": "",
"user_dob": "",
"user_pob": "",
"user_photoid_number": "match",
"user_id": "aml-deprecated",
"user_country": ""
}2. AML Customer Screening (Recommended)
In this approach, source selection, monitoring, and fuzzy-matching settings are configured in the Admin UI and referenced by name "search_profile_id": "name of the search profile" in the API request.
This allows you to:
- Update monitoring rules without resending screening requests
- Maintain consistent screening behavior across integrations
Best Practices
- Always specify the subject type (person or entity) to reduce false positives.
- If the type is set to unknown, the system will automatically determine whether the subject is a person or an entity using AI-based classification.
Example
{
"config": {
"aml": {
"type": "PERSON", #or ENTITY or UNKNOWN
"version": "v1",
"monitoring_required": false,
"monitoring_schedule": null,
"search_profile_id": "sysdefault"
},
"ip_api": false,
"email_api": false,
"phone_api": false,
"aml_api": true,
"response_fields": "aml_details",
"device_fingerprinting": false
},
"user_fullname": "ACME Limited",
"user_firstname": "",
"user_middlename": "",
"user_lastname": "",
"user_dob": "",
"user_pob": "",
"user_photoid_number": "match",
"user_id": "aml-entity",
"user_country": ""
}3. Payment Screening
By including a receiver object, you can screen both parties in a transaction (sender and receiver) in a single API call.
Payment screening allows you to:
- Screen the sender and the counterparty simultaneously
- Use separate search profiles for each party if needed
Note
- Payment screening does not include ongoing monitoring.
- If monitoring is required, use AML Customer Screening instead.
Example
{
"config": {
"aml": {
"version": "v1",
"payment_screening": {
"sender_config": {
"type": "UNKNOWN",
"search_profile_id": "sysdefault"
},
"receiver_config": {
"type": "UNKNOWN",
"search_profile_id": "sysdefault"
}
}
},
"aml_api": true,
"aml_bank_screening_api": false,
"response_fields": "aml_details"
},
"user_fullname": "John Doe",
"user_firstname": "",
"user_middlename": "",
"user_lastname": "",
"user_dob": "",
"user_pob": "",
"user_photoid_number": "match",
"user_id": "",
"user_country": "",
"receiver_fullname": "Jane Doe",
"receiver_firstname": "",
"receiver_middlename": "",
"receiver_lastname": "",
"receiver_dob": "",
"receiver_pob": "",
"receiver_photoid_number": "match",
"receiver_id": "",
"receiver_country": ""
}Payment Screening with Bank Details
You can extend payment screening to include bank-level sanctions checks by enabling bank detail screening flags in the API request.
This ensures that transactions are not initiated toward sanctioned banks or financial institutions.
Supported Bank Checks
- Bank name screening
- Bank account screening /crypto wallet
- SWIFT/BIC screening
Example
{
"config": {
"aml_bank_screening": {
"bank_name_check": true,
"bank_account_check": true,
"bank_swift_check": true,
"match_mode": "OR",
"partial_match_threshold": 0.8,
"result_limit": 10,
"filter_mismatching_country": false,
"filter_missing_country": false
},
"aml": {
"version": "v1",
"payment_screening": {
"sender_config": {
"type": "UNKNOWN",
"search_profile_id": "sysdefault"
},
"receiver_config": {
"type": "UNKNOWN",
"search_profile_id": "sysdefault"
}
}
},
"aml_api": true,
"aml_bank_screening_api": true,
"response_fields": "aml_details,aml_bank_screening_details"
},
"user_bank_name": "User Bank",
"user_bank_account": "User Bank Account",
"user_bank_swift": "User Bank SWIFT",
"user_bank_country": "country code",
"user_fullname": "John Doe",
"user_firstname": "",
"user_middlename": "",
"user_lastname": "",
"user_dob": "",
"user_pob": "",
"user_photoid_number": "match",
"user_id": "",
"user_country": "",
"receiver_bank_name": "Receiver Bank",
"receiver_bank_account": "Receiver Bank Account",
"receiver_bank_swift": "Receiver Bank SWIFT",
"receiver_bank_country": "country code",
"receiver_fullname": "Jane Doe",
"receiver_firstname": "",
"receiver_middlename": "",
"receiver_lastname": "",
"receiver_dob": "",
"receiver_pob": "",
"receiver_photoid_number": "match",
"receiver_id": "",
"receiver_country": ""
}Address Intelligence
The Address Intelligence API turns raw user, billing, and shipping addresses into verified, standardized, fraud-relevant signals inside a single Fraud API v2 call. Each verified address is parsed against postal-authority data, standardized to deliverable form, and converted into a pair of canonical identifiers; US addresses receive additional USPS-level fraud signals. Results are returned inline in address_details and flow into the Scoring Engine, Network Detection, and the Addresses widget.
Good to know
- No new integration surface. Address Intelligence is part of the Fraud API — there is no separate endpoint, license key, base URL, or rate limit. An existing integration keeps working; you can enable it in the
configobject. - Not enabled by default. Address Intelligence must be switched on for your organization before the
configflags take effect. Contact your SEON account manager or support@seon.io to request access. address_apiis the master switch. It must betruefor any address verification to run. When absent orfalse, nothing is verified and nothing is billed.- Enable per address type.
verify_user_address,verify_billing_address, andverify_shipping_addresseach default tofalse. Only the types set totrueare verified. countryandstreetare mandatory for an address to be verified. An address with nocountryis not sent to the verification engine — no result is returned for that type and no charge is incurred.- Maximum length is 100 characters per address field. Exceeding it rejects the request with a
400error. address_detailsmust be listed inresponse_fieldsto receive results in the response. If it is omitted, verification still runs and results appear in the Addresses widget in SEON Admin, but theaddress_detailsobject is not returned in the API response.response_fieldsis an allow-list. When set, only the listed objects are returned — list every object you want alongsideaddress_details(e.g.fraud_score,applied_rules,ip_details,email_details,phone_details).
- Billing is per verified address, split into US and International counters on the API Stats page. You are not billed when:
address_apiisfalseor allverify_*_addressflags arefalse; an address is missing a mandatory input; or verification returns no result (service unavailable / full timeout). PARTIALandNOT_FOUNDaddresses do not return canonical IDs. Use theexist/not_existoperators in rules and null-check in code.- Non-US addresses return
status,precision, canonical IDs, andaddress_componentsonly —region_specific_detailsandgeocodingarenull.
Request
Existing Fraud API integrations do not change the request body. The same six fields per address type are the input; the only addition is a small block in the config object that opts each address type into verification.
Example:
{
"config": {
"address_api": true,
"address": {
"verify_user_address": true,
"verify_billing_address": true,
"verify_shipping_address": true
},
"response_fields": "address_details"
},
"user_country": "US",
"user_city": "Austin",
"user_region": "TX",
"user_zip": "78702",
"user_street": "310 Comal Street, 2nd Floor",
"user_street2": "",
"shipping_country": "US",
"shipping_city": "Austin",
"shipping_region": "TX",
"shipping_zip": "78702",
"shipping_street": "310 COMAL ST FL 2",
"shipping_street2": "",
"billing_country": "HU",
"billing_city": "Budapest",
"billing_region": "",
"billing_zip": "1072",
"billing_street": "Rákóczi út 42",
"billing_street2": "7. emelet",
"billing_phone": ""
}Response
When address verification is enabled, the response gains an address_details object inside data. Each address-type slot (user_address, billing_address, shipping_address) contains either a full result object or null when that type's verify_*_address flag was not set.
Response Attributes | Type | ||
|---|---|---|---|
status | string | ||
precision | string | ||
canonical_full_id | string | ||
canonical_base_id | string | ||
address_components | object | ||
geocoding | object | ||
region_specific_details | object | ||
Response
User Session Monitoring
SEON Session Monitoring connects a user’s full digital journey to fraud decisions. It uses a lightweight client-side SDK to collect session behavior and generates a stream_id. The customer backend sends this stream_id in the Fraud API request, so SEON can link the session to a login, registration, checkout, money movement, account recovery, or other sensitive action.
What problem it solves
Most fraud decisions use point-in-time data such as IP, email, phone, device fingerprint, transaction amount, and account history. These signals are important, but they do not show how the user behaved during the session.
- Session-level behavior can reveal risks that static checks may miss, including:
- Information was entered by copying and pasting it into form fields.
- An active phone call occurred during account recovery or payment.
- Remote access or screen-sharing software was used during the session.
- Forms were completed unusually quickly or in a bot-like manner.
- The IP address, VPN, proxy, locale, browser, or device context changed mid-session.
- Repeated off-screen activity occurred while personal or payment information was being entered.
- Signs of automation appeared progressively throughout the flow.
- Behavior appeared unnatural or inconsistent with normal session activity.
- Signs of automation, remote access, or real-time voice coaching were present.
- Specific screens and forms were interacted with before the transaction was completed.
Traditional analytics or replay tools may show what happened, but they are often separate from fraud decisioning. Session Monitoring is fraud-native: it connects session behavior directly to Fraud API decisions, Scoring Engine rules, and analyst review.
Integration Overview
The integration has two parts.
1. Client-side SDK
The SEON Stream SDK starts session data collection, generates a unique stream_id, and streams behavioral events to SEON in the background.
The SDK can be started on page load, app open, login, registration, checkout, account recovery, or another sensitive entry point.
2. Server-side Fraud API linkage
The customer backend sends the stream_id in the Fraud API request. SEON then links the behavioral session to the transaction.
When linked, SEON can return session-based risk flags in the Fraud API response, make those flags available in the Scoring Engine, and show the full session journey in SEON Admin.
Architecture and data flow
- The client application initializes the SEON Stream SDK.
- The application starts a session at the chosen entry point.
- The SDK generates a unique stream_id.
- The SDK streams session events to SEON.
- The customer backend receives or retrieves the stream_id from the client.
- The backend sends the stream_id in the Fraud API request.
- SEON links the session to the transaction.
- Fraud API returns session context and risk flags when available.
- SEON Admin displays the session summary, timeline, form interactions, and linked transactions.
Important: Initial processing may take a few seconds after a session starts. If the Fraud API request is sent immediately after startStream(), early session signals may be incomplete.
SDK integration guide
Web SDK
Supports single-page and multi-page applications with Vanilla JS and React framework.https://github.com/seontechnologies/seon-web-stream-sdk-public
Android SDK
The Android Stream SDK collects events from native Android applications. https://github.com/seontechnologies/seon-android-stream-sdk-public
iOS SDK
The iOS Stream SDK collects events from native iOS applications.
https://github.com/seontechnologies/seon-ios-stream-sdk-public
Authentication
The SDK authenticates with a short lived, server issued token that you need to get separately:
- Your backend requests auth data from SEON's auth endpoint (server to server with your own SEON API key).
- Your app passes that blob to the SDK via the
authDataconfig property before starting a stream. - The SDK decodes it into a JWT and the ingest domains.
Since the token is short lived, fetch a fresh one before every stream start using the endpoint for your account's region:
- EU (Ireland)
https://api.seon.io/session-monitoring-api/v1/auth - US (N. Virginia)
https://api.us-east-1-main.seon.io/session-monitoring-api/v1/auth
Example flow:
# 1. Your backend serves /auth for the client to call SEON's auth API.
curl -X POST https://api.seon.io/session-monitoring-api/v1/auth \
-H "X-API-KEY: YOUR_SEON_API_KEY"
// 2. Your client fetches auth data from your backend.
const authData = await fetch("/auth", { method: "POST" }).then((res) =>
res.text(),
);
// 3. Pass it to the SDK via the constructor…
const seonStream = new SeonStream({ authData });
// …or apply it to an existing instance.
seonStream.setConfig({ authData });
Request configuration
Existing Fraud API integrations continue to send the usual transaction, user, device, and risk fields. The required addition for Session Monitoring linkage is the stream_id generated by the SDK.
{
"config": {
"session_monitoring_api":true,
"response_fields": "session_monitoring_details"
},
"stream_id": "01HX7M2K9F8Q4YB6T2N4ZP3A1C"
}When stream_id is present, SEON attempts to match the Fraud API transaction to the streamed session.
When stream_id is missing:
- No session context is attached.
- No session risk flags are returned.
- The transaction appears as a standalone event.
- The Session Monitoring widget is not populated for that transaction.
Response
JSON Attributes | Type | |
|---|---|---|
sdk_platform | string | |
sdk_version | string | |
metadata | object | |
session_risk | object | |
Risk levels
| Level | Meaning | Recommended handling |
| High | Strong fraud-relevant signal. | Mark for review review, use in high scored decline rules depending on business risk appetite. |
| Medium | Meaningful signal, best combined with other risk indicators. | Use for score increase or multi-signal rules. |
| Low | Weak or contextual signal. | Use for analyst context, soft scoring, or combined rules. |
Session risk flags
Automation risk
| Flag | Meaning |
| ui_automation | Strong signs of scripted or programmatic UI interaction. |
| device_farm | Session may come from device-farm or coordinated automation infrastructure. |
| suspicious_form_fillout | Abnormal form completion speed or unrealistic interaction patterns. |
| non_human_typing | Typing metrics appears unlikely for a human. |
Location risk
| Flag | Meaning |
| ip_change | IP address changed during the session. |
| vpn | Session used a detected VPN provider. |
| proxy | IP is associated with detected proxy services. |
| locale_change | Device language or locale changed during the session. |
Contextual risk
| Flag | Meaning |
| off_screen | App or browser became inactive during the session. |
| window_resize | Browser window size changed. |
| unusual_device_orientation | Irregular device rotation during the session. |
| extended_inactivity | Idle periods were longer than expected. |
Remote access risk
| Flag | Meaning |
| remote_access | Signs of remote control or screen-sharing activity. |
| active_call | Active phone call during the session. |
| potential_vishing | Behavior is consistent with real-time voice coaching or social engineering. |
Privacy
Session Monitoring is designed to collect metadata, not sensitive values.
| The SDK does not capture | The SDK can capture: |
|
|
This helps fraud teams detect suspicious behavior without capturing or storing sensitive data.
SDK and platform support
| Platform | Requirements |
| iOS | iOS 13.0 or higher, Xcode 15 or higher, Swift 5.9 or higher. |
| Android | Android 7.0 or higher, API level 24 or higher. |
| Web | ES2023 and native BigInt support. Chrome 67+, Firefox 68+, Safari 14+, Edge 79+. Vanilla JS and React are currently supported. |