diff --git a/CHANGES.MD b/CHANGES.MD
index c5ea4eb..11afa13 100644
--- a/CHANGES.MD
+++ b/CHANGES.MD
@@ -1,5 +1,12 @@
# CHANGES
+## 1.8.0 (2026-08-25)
+
+### Added
+- **`$nationality`**, **`$year_of_birth`** fields in `$create_account`, `$update_account` events
+- **`$kyc`** complex type in `$create_account`, `$update_account`, `$transaction`, `$create_order`, `$update_order`, `$verification` events
+- **`$geo`**, **`$bot_identification`** complex types in `$create_account`, `$update_account`, `$login`, `$transaction`, `$create_order`, `$update_order` events
+
## 1.7.0 (2025-12-03)
### Added
diff --git a/README.md b/README.md
index f5e2940..4055804 100644
--- a/README.md
+++ b/README.md
@@ -4,7 +4,7 @@
The official Sift .NET client, supporting .NET Standard 2.0+
-## Latest Release (v1.7.0)
+## Latest Release (v1.8.0)
See [CHANGES.MD](CHANGES.MD) for full release history.
diff --git a/Sift/Schema/ComplexTypes/bot_identification.json b/Sift/Schema/ComplexTypes/bot_identification.json
new file mode 100644
index 0000000..4f47d33
--- /dev/null
+++ b/Sift/Schema/ComplexTypes/bot_identification.json
@@ -0,0 +1,17 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema",
+ "title": "BotIdentification",
+ "type": "object",
+ "required": [
+ "$result",
+ "$provider"
+ ],
+ "properties": {
+ "$result": {
+ "type": [ "string", "null" ]
+ },
+ "$provider": {
+ "type": [ "string", "null" ]
+ }
+ }
+}
diff --git a/Sift/Schema/ComplexTypes/geo.json b/Sift/Schema/ComplexTypes/geo.json
new file mode 100644
index 0000000..8f6524c
--- /dev/null
+++ b/Sift/Schema/ComplexTypes/geo.json
@@ -0,0 +1,17 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema",
+ "title": "Geo",
+ "type": "object",
+ "required": [
+ "$uuid",
+ "$provider"
+ ],
+ "properties": {
+ "$uuid": {
+ "type": [ "string", "null" ]
+ },
+ "$provider": {
+ "type": [ "string", "null" ]
+ }
+ }
+}
diff --git a/Sift/Schema/ComplexTypes/kyc.json b/Sift/Schema/ComplexTypes/kyc.json
new file mode 100644
index 0000000..01a13ad
--- /dev/null
+++ b/Sift/Schema/ComplexTypes/kyc.json
@@ -0,0 +1,19 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema",
+ "title": "Kyc",
+ "type": "object",
+ "properties": {
+ "$names_match": {
+ "type": [ "boolean", "null" ]
+ },
+ "$kyc_level": {
+ "type": [ "string", "null" ]
+ },
+ "$bin_nationality_match": {
+ "type": [ "boolean", "null" ]
+ },
+ "$provider": {
+ "type": [ "string", "null" ]
+ }
+ }
+}
diff --git a/Sift/Schema/create_account.json b/Sift/Schema/create_account.json
index ebd1a4c..b092945 100644
--- a/Sift/Schema/create_account.json
+++ b/Sift/Schema/create_account.json
@@ -85,6 +85,30 @@
},
"$ip": {
"type": [ "string", "null" ]
+ },
+ "$nationality": {
+ "type": [ "string", "null" ]
+ },
+ "$year_of_birth": {
+ "type": [ "integer", "null" ]
+ },
+ "$kyc": {
+ "oneOf": [
+ { "$ref": "ComplexTypes/kyc.json" },
+ { "type": "null" }
+ ]
+ },
+ "$geo": {
+ "oneOf": [
+ { "$ref": "ComplexTypes/geo.json" },
+ { "type": "null" }
+ ]
+ },
+ "$bot_identification": {
+ "oneOf": [
+ { "$ref": "ComplexTypes/bot_identification.json" },
+ { "type": "null" }
+ ]
}
}
}
diff --git a/Sift/Schema/create_order.json b/Sift/Schema/create_order.json
index a971cc0..f982826 100644
--- a/Sift/Schema/create_order.json
+++ b/Sift/Schema/create_order.json
@@ -120,6 +120,24 @@
},
"$ip": {
"type": [ "string", "null" ]
+ },
+ "$kyc": {
+ "oneOf": [
+ { "$ref": "ComplexTypes/kyc.json" },
+ { "type": "null" }
+ ]
+ },
+ "$geo": {
+ "oneOf": [
+ { "$ref": "ComplexTypes/geo.json" },
+ { "type": "null" }
+ ]
+ },
+ "$bot_identification": {
+ "oneOf": [
+ { "$ref": "ComplexTypes/bot_identification.json" },
+ { "type": "null" }
+ ]
}
}
}
diff --git a/Sift/Schema/login.json b/Sift/Schema/login.json
index c982564..6fa109a 100644
--- a/Sift/Schema/login.json
+++ b/Sift/Schema/login.json
@@ -59,6 +59,18 @@
},
"$verification_phone_number": {
"type": [ "string", "null" ]
+ },
+ "$geo": {
+ "oneOf": [
+ { "$ref": "ComplexTypes/geo.json" },
+ { "type": "null" }
+ ]
+ },
+ "$bot_identification": {
+ "oneOf": [
+ { "$ref": "ComplexTypes/bot_identification.json" },
+ { "type": "null" }
+ ]
}
}
}
diff --git a/Sift/Schema/transaction.json b/Sift/Schema/transaction.json
index 8c9e9e7..63f37cc 100644
--- a/Sift/Schema/transaction.json
+++ b/Sift/Schema/transaction.json
@@ -162,6 +162,24 @@
"$new_balance": {
"type": [ "integer", "null" ],
"format": "long"
+ },
+ "$kyc": {
+ "oneOf": [
+ { "$ref": "ComplexTypes/kyc.json" },
+ { "type": "null" }
+ ]
+ },
+ "$geo": {
+ "oneOf": [
+ { "$ref": "ComplexTypes/geo.json" },
+ { "type": "null" }
+ ]
+ },
+ "$bot_identification": {
+ "oneOf": [
+ { "$ref": "ComplexTypes/bot_identification.json" },
+ { "type": "null" }
+ ]
}
}
}
diff --git a/Sift/Schema/update_account.json b/Sift/Schema/update_account.json
index 0c48edc..fb520fe 100644
--- a/Sift/Schema/update_account.json
+++ b/Sift/Schema/update_account.json
@@ -88,6 +88,30 @@
},
"$ip": {
"type": [ "string", "null" ]
+ },
+ "$nationality": {
+ "type": [ "string", "null" ]
+ },
+ "$year_of_birth": {
+ "type": [ "integer", "null" ]
+ },
+ "$kyc": {
+ "oneOf": [
+ { "$ref": "ComplexTypes/kyc.json" },
+ { "type": "null" }
+ ]
+ },
+ "$geo": {
+ "oneOf": [
+ { "$ref": "ComplexTypes/geo.json" },
+ { "type": "null" }
+ ]
+ },
+ "$bot_identification": {
+ "oneOf": [
+ { "$ref": "ComplexTypes/bot_identification.json" },
+ { "type": "null" }
+ ]
}
}
}
diff --git a/Sift/Schema/update_order.json b/Sift/Schema/update_order.json
index e4e133e..2ae8a7c 100644
--- a/Sift/Schema/update_order.json
+++ b/Sift/Schema/update_order.json
@@ -119,6 +119,24 @@
},
"$ip": {
"type": [ "string", "null" ]
+ },
+ "$kyc": {
+ "oneOf": [
+ { "$ref": "ComplexTypes/kyc.json" },
+ { "type": "null" }
+ ]
+ },
+ "$geo": {
+ "oneOf": [
+ { "$ref": "ComplexTypes/geo.json" },
+ { "type": "null" }
+ ]
+ },
+ "$bot_identification": {
+ "oneOf": [
+ { "$ref": "ComplexTypes/bot_identification.json" },
+ { "type": "null" }
+ ]
}
}
diff --git a/Sift/Schema/verification.json b/Sift/Schema/verification.json
index 6f9c1c9..9fea523 100644
--- a/Sift/Schema/verification.json
+++ b/Sift/Schema/verification.json
@@ -55,6 +55,12 @@
},
"$ip": {
"type": [ "string", "null" ]
+ },
+ "$kyc": {
+ "oneOf": [
+ { "$ref": "ComplexTypes/kyc.json" },
+ { "type": "null" }
+ ]
}
}
}
diff --git a/Sift/Sift.csproj b/Sift/Sift.csproj
index 76009fc..7dbe498 100644
--- a/Sift/Sift.csproj
+++ b/Sift/Sift.csproj
@@ -4,8 +4,8 @@
Sift
Sift
Sift
- 1.7.0
- Release 1.7.0
+ 1.8.0
+ Release 1.8.0
netstandard2.0
Sift
sift;siftscience;client;api;client;async
diff --git a/Test.Integration.Net/EventsAPI/Account.cs b/Test.Integration.Net/EventsAPI/Account.cs
index 2471004..4e7bceb 100644
--- a/Test.Integration.Net/EventsAPI/Account.cs
+++ b/Test.Integration.Net/EventsAPI/Account.cs
@@ -116,6 +116,25 @@ public void CreateAccount()
}
},
+ nationality = "US",
+ year_of_birth = 1985,
+ kyc = new Kyc
+ {
+ names_match = true,
+ kyc_level = "$basic",
+ bin_nationality_match = true,
+ provider = "lexisnexis"
+ },
+ geo = new Geo
+ {
+ uuid = "gc-abc-123",
+ provider = "geocomply"
+ },
+ bot_identification = new BotIdentification
+ {
+ result = "$human",
+ provider = "datadome"
+ },
ip = "1.2.3.4"
};
EventRequest eventRequest = new EventRequest()
diff --git a/Test.Integration.Net/EventsAPI/LoginLogout.cs b/Test.Integration.Net/EventsAPI/LoginLogout.cs
index 5ed1ad4..54e4e46 100644
--- a/Test.Integration.Net/EventsAPI/LoginLogout.cs
+++ b/Test.Integration.Net/EventsAPI/LoginLogout.cs
@@ -44,7 +44,17 @@ public void Login()
account_types = new ObservableCollection() { "merchant", "premium" },
brand_name = "sift",
site_domain = "sift.com",
- site_country = "US"
+ site_country = "US",
+ geo = new Geo
+ {
+ uuid = "gc-abc-123",
+ provider = "geocomply"
+ },
+ bot_identification = new BotIdentification
+ {
+ result = "$human",
+ provider = "datadome"
+ }
};
EventRequest eventRequest = new EventRequest()
{
diff --git a/Test.Integration.Net/EventsAPI/Order.cs b/Test.Integration.Net/EventsAPI/Order.cs
index a3898b8..38a39d9 100644
--- a/Test.Integration.Net/EventsAPI/Order.cs
+++ b/Test.Integration.Net/EventsAPI/Order.cs
@@ -175,6 +175,22 @@ private EventResponse CreateOrder(Client sift)
accept_language = "en-US",
content_language = "en-GB"
},
+ kyc = new Kyc
+ {
+ names_match = true,
+ kyc_level = "$basic",
+ provider = "lexisnexis"
+ },
+ geo = new Geo
+ {
+ uuid = "gc-abc-123",
+ provider = "geocomply"
+ },
+ bot_identification = new BotIdentification
+ {
+ result = "$human",
+ provider = "datadome"
+ },
ip = "1.2.3.4"
};
EventRequest eventRequest = new EventRequest()
@@ -299,6 +315,22 @@ private EventResponse UpdateOrder(Client sift)
accept_language = "en-US",
content_language = "en-GB"
},
+ kyc = new Kyc
+ {
+ names_match = true,
+ kyc_level = "$basic",
+ provider = "lexisnexis"
+ },
+ geo = new Geo
+ {
+ uuid = "gc-abc-123",
+ provider = "geocomply"
+ },
+ bot_identification = new BotIdentification
+ {
+ result = "$human",
+ provider = "datadome"
+ },
ip = "1.2.3.4"
};
EventRequest eventRequest = new EventRequest()
diff --git a/Test.Integration.Net/EventsAPI/Transactions.cs b/Test.Integration.Net/EventsAPI/Transactions.cs
index d02eb8b..a3bad8e 100644
--- a/Test.Integration.Net/EventsAPI/Transactions.cs
+++ b/Test.Integration.Net/EventsAPI/Transactions.cs
@@ -176,6 +176,22 @@ public void TransactionTest()
}
},
receiver_external_address = true,
+ kyc = new Kyc
+ {
+ names_match = true,
+ bin_nationality_match = true,
+ provider = "lexisnexis"
+ },
+ geo = new Geo
+ {
+ uuid = "gc-abc-123",
+ provider = "geocomply"
+ },
+ bot_identification = new BotIdentification
+ {
+ result = "$suspected",
+ provider = "human_security"
+ },
ip = "1.2.3.4"
};
EventRequest eventRequest = new EventRequest()
diff --git a/Test.Integration.Net/EventsAPI/Verifications.cs b/Test.Integration.Net/EventsAPI/Verifications.cs
index fe0d294..45b8593 100644
--- a/Test.Integration.Net/EventsAPI/Verifications.cs
+++ b/Test.Integration.Net/EventsAPI/Verifications.cs
@@ -42,6 +42,13 @@ public void VerificationTest()
brand_name = "sift",
site_domain = "sift.com",
site_country = "US",
+ kyc = new Kyc
+ {
+ names_match = true,
+ kyc_level = "$basic",
+ bin_nationality_match = false,
+ provider = "lexisnexis"
+ },
ip = "1.2.3.4"
};
EventRequest eventRequest = new EventRequest()
diff --git a/Test.Integration.NetFx48/EventsAPI/Account.cs b/Test.Integration.NetFx48/EventsAPI/Account.cs
index 691cf1d..bbafb80 100644
--- a/Test.Integration.NetFx48/EventsAPI/Account.cs
+++ b/Test.Integration.NetFx48/EventsAPI/Account.cs
@@ -123,6 +123,25 @@ public void CreateAccount()
zipcode = "03257"
}
+ },
+ nationality = "US",
+ year_of_birth = 1985,
+ kyc = new Kyc
+ {
+ names_match = true,
+ kyc_level = "$basic",
+ bin_nationality_match = true,
+ provider = "lexisnexis"
+ },
+ geo = new Geo
+ {
+ uuid = "gc-abc-123",
+ provider = "geocomply"
+ },
+ bot_identification = new BotIdentification
+ {
+ result = "$human",
+ provider = "datadome"
}
};
EventRequest eventRequest = new EventRequest()
@@ -231,6 +250,25 @@ public void UpdateAccount()
zipcode = "03257"
}
+ },
+ nationality = "US",
+ year_of_birth = 1985,
+ kyc = new Kyc
+ {
+ names_match = true,
+ kyc_level = "$full",
+ bin_nationality_match = true,
+ provider = "prove"
+ },
+ geo = new Geo
+ {
+ uuid = "gc-abc-123",
+ provider = "geocomply"
+ },
+ bot_identification = new BotIdentification
+ {
+ result = "$human",
+ provider = "datadome"
}
};
EventRequest eventRequest = new EventRequest()
diff --git a/Test.Integration.NetFx48/EventsAPI/LoginLogout.cs b/Test.Integration.NetFx48/EventsAPI/LoginLogout.cs
index 6312d66..8b7a557 100644
--- a/Test.Integration.NetFx48/EventsAPI/LoginLogout.cs
+++ b/Test.Integration.NetFx48/EventsAPI/LoginLogout.cs
@@ -42,7 +42,17 @@ public void Login()
account_types = new ObservableCollection() { "merchant", "premium" },
brand_name = "sift",
site_domain = "sift.com",
- site_country = "US"
+ site_country = "US",
+ geo = new Geo
+ {
+ uuid = "gc-abc-123",
+ provider = "geocomply"
+ },
+ bot_identification = new BotIdentification
+ {
+ result = "$human",
+ provider = "datadome"
+ }
};
EventRequest eventRequest = new EventRequest()
{
diff --git a/Test.Integration.NetFx48/EventsAPI/Order.cs b/Test.Integration.NetFx48/EventsAPI/Order.cs
index 2b7ef68..53270f4 100644
--- a/Test.Integration.NetFx48/EventsAPI/Order.cs
+++ b/Test.Integration.NetFx48/EventsAPI/Order.cs
@@ -158,6 +158,22 @@ public void CreateOrder()
user_agent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36",
accept_language = "en-US",
content_language = "en-GB"
+ },
+ kyc = new Kyc
+ {
+ names_match = true,
+ kyc_level = "$basic",
+ provider = "lexisnexis"
+ },
+ geo = new Geo
+ {
+ uuid = "gc-abc-123",
+ provider = "geocomply"
+ },
+ bot_identification = new BotIdentification
+ {
+ result = "$human",
+ provider = "datadome"
}
};
EventRequest eventRequest = new EventRequest()
@@ -283,6 +299,22 @@ public void UpdateOrder()
user_agent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36",
accept_language = "en-US",
content_language = "en-GB"
+ },
+ kyc = new Kyc
+ {
+ names_match = true,
+ kyc_level = "$basic",
+ provider = "lexisnexis"
+ },
+ geo = new Geo
+ {
+ uuid = "gc-abc-123",
+ provider = "geocomply"
+ },
+ bot_identification = new BotIdentification
+ {
+ result = "$human",
+ provider = "datadome"
}
};
EventRequest eventRequest = new EventRequest()
diff --git a/Test.Integration.NetFx48/EventsAPI/Transactions.cs b/Test.Integration.NetFx48/EventsAPI/Transactions.cs
index 19eca2a..c3336d3 100644
--- a/Test.Integration.NetFx48/EventsAPI/Transactions.cs
+++ b/Test.Integration.NetFx48/EventsAPI/Transactions.cs
@@ -171,7 +171,23 @@ public void TransactionTest()
digital_asset = "BTC"
}
},
- receiver_external_address = true
+ receiver_external_address = true,
+ kyc = new Kyc
+ {
+ names_match = true,
+ bin_nationality_match = true,
+ provider = "lexisnexis"
+ },
+ geo = new Geo
+ {
+ uuid = "gc-abc-123",
+ provider = "geocomply"
+ },
+ bot_identification = new BotIdentification
+ {
+ result = "$suspected",
+ provider = "human_security"
+ }
};
EventRequest eventRequest = new EventRequest()
{
diff --git a/Test.Integration.NetFx48/EventsAPI/Verifications.cs b/Test.Integration.NetFx48/EventsAPI/Verifications.cs
index a83a7ce..677a96c 100644
--- a/Test.Integration.NetFx48/EventsAPI/Verifications.cs
+++ b/Test.Integration.NetFx48/EventsAPI/Verifications.cs
@@ -39,7 +39,14 @@ public void VerificationTest()
reason = "$user_setting",
brand_name = "sift",
site_domain = "sift.com",
- site_country = "US"
+ site_country = "US",
+ kyc = new Kyc
+ {
+ names_match = true,
+ kyc_level = "$basic",
+ bin_nationality_match = false,
+ provider = "lexisnexis"
+ }
};
EventRequest eventRequest = new EventRequest()
{
diff --git a/Test/Test.cs b/Test/Test.cs
index 35648b2..cc738d8 100644
--- a/Test/Test.cs
+++ b/Test/Test.cs
@@ -313,6 +313,46 @@ public void TestTransactionEvent()
Uri.UnescapeDataString(eventRequest.Request.RequestUri!.ToString()));
}
+ [Fact]
+ public void TestTransactionStructuredFieldsEvent()
+ {
+ var transaction = new Transaction
+ {
+ user_id = "test_dotnet_transaction_structured_fields",
+ amount = 506790000,
+ currency_code = "USD",
+ kyc = new Kyc
+ {
+ names_match = true,
+ bin_nationality_match = true,
+ provider = "lexisnexis"
+ },
+ geo = new Geo
+ {
+ uuid = "gc-abc-123",
+ provider = "geocomply"
+ },
+ bot_identification = new BotIdentification
+ {
+ result = "$suspected",
+ provider = "human_security"
+ }
+ };
+
+ Assert.Equal("{\"$type\":\"$transaction\",\"$user_id\":\"test_dotnet_transaction_structured_fields\"," +
+ "\"$amount\":506790000,\"$currency_code\":\"USD\",\"$kyc\":{\"$names_match\":true," +
+ "\"$bin_nationality_match\":true,\"$provider\":\"lexisnexis\"},\"$geo\":{\"$uuid\":\"gc-abc-123\"," +
+ "\"$provider\":\"geocomply\"},\"$bot_identification\":{\"$result\":\"$suspected\",\"$provider\":\"human_security\"}}",
+ transaction.ToJson());
+
+ EventRequest eventRequest = new EventRequest
+ {
+ Event = transaction
+ };
+
+ Assert.Equal("https://api.sift.com/v205/events", eventRequest.Request.RequestUri!.ToString());
+ }
+
[Fact]
public void TestTransactionEventWithCryptoFields()
{
@@ -1209,6 +1249,46 @@ public void TestCreateAccountEvent()
Uri.UnescapeDataString(eventRequest.Request.RequestUri!.ToString()));
}
+ [Fact]
+ public void TestCreateAccountStructuredFieldsEvent()
+ {
+ var createAccount = new CreateAccount
+ {
+ user_id = "test_dotnet_create_account_structured_fields",
+ nationality = "US",
+ year_of_birth = 1985,
+ kyc = new Kyc
+ {
+ names_match = true,
+ kyc_level = "$basic",
+ provider = "lexisnexis"
+ },
+ geo = new Geo
+ {
+ uuid = "gc-abc-123",
+ provider = "geocomply"
+ },
+ bot_identification = new BotIdentification
+ {
+ result = "$human",
+ provider = "datadome"
+ }
+ };
+
+ Assert.Equal("{\"$type\":\"$create_account\",\"$user_id\":\"test_dotnet_create_account_structured_fields\"," +
+ "\"$nationality\":\"US\",\"$year_of_birth\":1985,\"$kyc\":{\"$names_match\":true,\"$kyc_level\":\"$basic\"," +
+ "\"$provider\":\"lexisnexis\"},\"$geo\":{\"$uuid\":\"gc-abc-123\",\"$provider\":\"geocomply\"}," +
+ "\"$bot_identification\":{\"$result\":\"$human\",\"$provider\":\"datadome\"}}",
+ createAccount.ToJson());
+
+ EventRequest eventRequest = new EventRequest
+ {
+ Event = createAccount
+ };
+
+ Assert.Equal("https://api.sift.com/v205/events", eventRequest.Request.RequestUri!.ToString());
+ }
+
[Fact]
public void TestUpdateAccountEvent()
{
@@ -1272,6 +1352,46 @@ public void TestUpdateAccountEvent()
Uri.UnescapeDataString(eventRequest.Request.RequestUri!.ToString()));
}
+ [Fact]
+ public void TestUpdateAccountStructuredFieldsEvent()
+ {
+ var updateAccount = new UpdateAccount
+ {
+ user_id = "test_dotnet_update_account_structured_fields",
+ nationality = "US",
+ year_of_birth = 1985,
+ kyc = new Kyc
+ {
+ names_match = true,
+ kyc_level = "$full",
+ provider = "prove"
+ },
+ geo = new Geo
+ {
+ uuid = "gc-abc-123",
+ provider = "geocomply"
+ },
+ bot_identification = new BotIdentification
+ {
+ result = "$human",
+ provider = "datadome"
+ }
+ };
+
+ Assert.Equal("{\"$type\":\"$update_account\",\"$user_id\":\"test_dotnet_update_account_structured_fields\"," +
+ "\"$nationality\":\"US\",\"$year_of_birth\":1985,\"$kyc\":{\"$names_match\":true,\"$kyc_level\":\"$full\"," +
+ "\"$provider\":\"prove\"},\"$geo\":{\"$uuid\":\"gc-abc-123\",\"$provider\":\"geocomply\"}," +
+ "\"$bot_identification\":{\"$result\":\"$human\",\"$provider\":\"datadome\"}}",
+ updateAccount.ToJson());
+
+ EventRequest eventRequest = new EventRequest
+ {
+ Event = updateAccount
+ };
+
+ Assert.Equal("https://api.sift.com/v205/events", eventRequest.Request.RequestUri!.ToString());
+ }
+
[Fact]
public void TestLoginEvent()
{
@@ -1325,6 +1445,38 @@ public void TestLoginEvent()
Uri.UnescapeDataString(eventRequest.Request.RequestUri!.ToString()));
}
+ [Fact]
+ public void TestLoginStructuredFieldsEvent()
+ {
+ var login = new Login
+ {
+ user_id = "test_dotnet_login_structured_fields",
+ login_status = "$success",
+ geo = new Geo
+ {
+ uuid = "gc-abc-123",
+ provider = "geocomply"
+ },
+ bot_identification = new BotIdentification
+ {
+ result = "$human",
+ provider = "datadome"
+ }
+ };
+
+ Assert.Equal("{\"$type\":\"$login\",\"$user_id\":\"test_dotnet_login_structured_fields\",\"$login_status\":\"$success\"," +
+ "\"$geo\":{\"$uuid\":\"gc-abc-123\",\"$provider\":\"geocomply\"}," +
+ "\"$bot_identification\":{\"$result\":\"$human\",\"$provider\":\"datadome\"}}",
+ login.ToJson());
+
+ EventRequest eventRequest = new EventRequest
+ {
+ Event = login
+ };
+
+ Assert.Equal("https://api.sift.com/v205/events", eventRequest.Request.RequestUri!.ToString());
+ }
+
[Fact]
public void TestScorePercentile()
{
@@ -2297,6 +2449,47 @@ public void TestCreateOrderEvent()
Uri.UnescapeDataString(eventRequest.Request.RequestUri!.ToString()));
}
+ [Fact]
+ public void TestCreateOrderStructuredFieldsEvent()
+ {
+ var createOrder = new CreateOrder
+ {
+ user_id = "test_dotnet_create_order_structured_fields",
+ order_id = "ORDER-NEB4778-001",
+ amount = 115940000,
+ currency_code = "USD",
+ kyc = new Kyc
+ {
+ names_match = true,
+ kyc_level = "$basic",
+ provider = "lexisnexis"
+ },
+ geo = new Geo
+ {
+ uuid = "gc-abc-123",
+ provider = "geocomply"
+ },
+ bot_identification = new BotIdentification
+ {
+ result = "$human",
+ provider = "datadome"
+ }
+ };
+ string createorderbody = "{\"$type\":\"$create_order\",\"$user_id\":\"test_dotnet_create_order_structured_fields\"," +
+ "\"$order_id\":\"ORDER-NEB4778-001\",\"$amount\":115940000,\"$currency_code\":\"USD\",\"$kyc\":{\"$names_match\":true," +
+ "\"$kyc_level\":\"$basic\",\"$provider\":\"lexisnexis\"},\"$geo\":{\"$uuid\":\"gc-abc-123\",\"$provider\":\"geocomply\"}," +
+ "\"$bot_identification\":{\"$result\":\"$human\",\"$provider\":\"datadome\"}}";
+
+ Assert.Equal(createorderbody, createOrder.ToJson());
+
+ EventRequest eventRequest = new EventRequest
+ {
+ Event = createOrder
+ };
+
+ Assert.Equal("https://api.sift.com/v205/events", eventRequest.Request.RequestUri!.ToString());
+ }
+
[Fact]
public void TestUpdateOrderEvent()
{
@@ -2455,6 +2648,46 @@ public void TestUpdateOrderEvent()
Uri.UnescapeDataString(eventRequest.Request.RequestUri!.ToString()));
}
+ [Fact]
+ public void TestUpdateOrderStructuredFieldsEvent()
+ {
+ var updateOrder = new UpdateOrder
+ {
+ user_id = "test_dotnet_update_order_structured_fields",
+ order_id = "ORDER-NEB4778-002",
+ amount = 115940000,
+ currency_code = "USD",
+ kyc = new Kyc
+ {
+ names_match = true,
+ kyc_level = "$basic",
+ provider = "lexisnexis"
+ },
+ geo = new Geo
+ {
+ uuid = "gc-abc-123",
+ provider = "geocomply"
+ },
+ bot_identification = new BotIdentification
+ {
+ result = "$human",
+ provider = "datadome"
+ }
+ };
+ string updateorderbody = "{\"$type\":\"$update_order\",\"$user_id\":\"test_dotnet_update_order_structured_fields\"," +
+ "\"$order_id\":\"ORDER-NEB4778-002\",\"$amount\":115940000,\"$currency_code\":\"USD\",\"$kyc\":{\"$names_match\":true," +
+ "\"$kyc_level\":\"$basic\",\"$provider\":\"lexisnexis\"},\"$geo\":{\"$uuid\":\"gc-abc-123\",\"$provider\":\"geocomply\"}," +
+ "\"$bot_identification\":{\"$result\":\"$human\",\"$provider\":\"datadome\"}}";
+
+ Assert.Equal(updateorderbody, updateOrder.ToJson());
+
+ EventRequest eventRequest = new EventRequest
+ {
+ Event = updateOrder
+ };
+
+ Assert.Equal("https://api.sift.com/v205/events", eventRequest.Request.RequestUri!.ToString());
+ }
[Fact]
public void TestCreateContentCommentEvent()
@@ -2565,6 +2798,36 @@ public void TestVerificationEvent()
Uri.UnescapeDataString(eventRequest.Request.RequestUri!.ToString()));
}
+ [Fact]
+ public void TestVerificationStructuredFieldsEvent()
+ {
+ var verification = new Verification
+ {
+ user_id = "test_dotnet_verification_structured_fields",
+ status = "$success",
+ verification_type = "$kyc",
+ kyc = new Kyc
+ {
+ names_match = true,
+ kyc_level = "$basic",
+ bin_nationality_match = false,
+ provider = "lexisnexis"
+ }
+ };
+
+ Assert.Equal("{\"$type\":\"$verification\",\"$user_id\":\"test_dotnet_verification_structured_fields\"," +
+ "\"$status\":\"$success\",\"$verification_type\":\"$kyc\",\"$kyc\":{\"$names_match\":true," +
+ "\"$kyc_level\":\"$basic\",\"$bin_nationality_match\":false,\"$provider\":\"lexisnexis\"}}",
+ verification.ToJson());
+
+ EventRequest eventRequest = new EventRequest
+ {
+ Event = verification
+ };
+
+ Assert.Equal("https://api.sift.com/v205/events", eventRequest.Request.RequestUri!.ToString());
+ }
+
[Fact]
public void TestUpdatePasswordEvent()
{