diff --git a/CHANGELOG.md b/CHANGELOG.md
index 19be64c73..64cb212a0 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,8 @@
## Unreleased
+- fix: parse SMS trusted phone numbers from Apple's `bridgeInitiateData` payload
+
## 1.32.2 (2025-09-01)
- fix: HTTP response content not captured for authentication and non-streaming requests [#1240](https://github.com/icloud-photos-downloader/icloud_photos_downloader/issues/1240)
diff --git a/src/pyicloud_ipd/sms.py b/src/pyicloud_ipd/sms.py
index 0a78e2b4f..cb1d8ad24 100644
--- a/src/pyicloud_ipd/sms.py
+++ b/src/pyicloud_ipd/sms.py
@@ -65,9 +65,10 @@ def parse_trusted_phone_numbers_payload(content: str) -> Sequence[TrustedDevice]
parser = _SMSParser()
parser.feed(content)
parser.close()
+ two_sv = parser.sms_data.get("direct", {}).get("twoSV", {})
numbers: Sequence[Mapping[str, Any]] = (
- parser.sms_data.get("direct", {})
- .get("twoSV", {})
+ two_sv.get("phoneNumberVerification", {}).get("trustedPhoneNumbers", [])
+ or two_sv.get("bridgeInitiateData", {})
.get("phoneNumberVerification", {})
.get("trustedPhoneNumbers", [])
)
diff --git a/tests/test_authentication.py b/tests/test_authentication.py
index 02cf211b2..ee8d71303 100644
--- a/tests/test_authentication.py
+++ b/tests/test_authentication.py
@@ -202,6 +202,13 @@ def test_parse_trusted_phone_numbers_payload_minimal(self) -> None:
self.assertEqual(1, len(result), "number of numbers parsed")
self.assertEqual(expected, result[0], "parsed number")
+ def test_parse_trusted_phone_numbers_payload_bridge_initiate_data(self) -> None:
+ html = '' # noqa: E501
+ expected = _TrustedDevice(id=1, obfuscated_number="(***) ***-**81")
+ result = parse_trusted_phone_numbers_payload(html)
+ self.assertEqual(1, len(result), "number of numbers parsed")
+ self.assertEqual(expected, result[0], "parsed number")
+
def test_parse_trusted_phone_numbers_payload_missing_node0(self) -> None:
html = '' # noqa: E501
result = parse_trusted_phone_numbers_payload(html)