diff --git a/HISTORY.rst b/HISTORY.rst index 35667f8..e555f2e 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -10,6 +10,9 @@ History ``phone_was_verification_successful``, and ``phone_verification_time`` inputs to the ``/billing`` request object. They describe the most recent verification of the billing phone number. +* Added the ``was_verification_successful`` and ``verification_time`` inputs + to the ``/email`` request object. They describe the most recent + verification of the email address. 3.3.0 (2026-07-21) ++++++++++++++++++ diff --git a/README.rst b/README.rst index bdecb28..452228b 100644 --- a/README.rst +++ b/README.rst @@ -169,7 +169,9 @@ Score, Insights and Factors Example >>> }, >>> 'email': { >>> 'address': '977577b140bfb7c516e4746204fbdb01', - >>> 'domain': 'maxmind.com' + >>> 'domain': 'maxmind.com', + >>> 'verification_time': '2026-10-01T14:25:00Z', + >>> 'was_verification_successful': True, >>> }, >>> 'billing': { >>> 'first_name': 'Jane', diff --git a/src/minfraud/validation.py b/src/minfraud/validation.py index 14d6006..0fde4a9 100644 --- a/src/minfraud/validation.py +++ b/src/minfraud/validation.py @@ -379,6 +379,8 @@ def _uri(s: str) -> str: "email": { "address": _email_or_md5, "domain": _hostname, + "verification_time": _rfc3339_datetime, + "was_verification_successful": bool, }, "event": { "party": _event_party, diff --git a/tests/data/full-transaction-request.json b/tests/data/full-transaction-request.json index 625713d..8072a7b 100644 --- a/tests/data/full-transaction-request.json +++ b/tests/data/full-transaction-request.json @@ -12,7 +12,9 @@ }, "email": { "address": "977577b140bfb7c516e4746204fbdb01", - "domain": "maxmind.com" + "domain": "maxmind.com", + "verification_time": "2026-10-01T14:25:00Z", + "was_verification_successful": true }, "billing": { "first_name": "First", diff --git a/tests/test_validation.py b/tests/test_validation.py index 22a9984..b54f2ed 100644 --- a/tests/test_validation.py +++ b/tests/test_validation.py @@ -339,6 +339,15 @@ def test_domain(self) -> None: for bad in ("bad ", " bad.com"): self.check_invalid_transaction({"email": {"domain": bad}}) + def test_was_verification_successful(self) -> None: + self.check_bool("email", "was_verification_successful") + + def test_verification_time(self) -> None: + for good in ("2015-05-08T16:07:56+00:00", "2015-05-08T16:07:56Z"): + self.check_transaction({"email": {"verification_time": good}}) + for bad in ("2015-05-08T16:07:56", "2015-05-08 16:07:56Z"): + self.check_invalid_transaction({"email": {"verification_time": bad}}) + class TestEvent(ValidationBase, unittest.TestCase): def test_party(self) -> None: