Bug: [FEATURE] Add Payments - List endpoint for v2



### Feature Description

This feature adds support for retrieving a filtered list of payments via a GET /v2/payments/list endpoint where multiple values can be provided for a single filter key (e.g. connector, etc.).

### Possible Implementation

Add PaymentListFilterConstraints and payments_list_by_filter endpoint for v2

### Have you spent some time checking if this feature request has been raised before?

- [x] I checked and didn't find a similar issue

### Have you read the Contributing Guidelines?

- [x] I have read the [Contributing Guidelines](https://github.com/juspay/hyperswitch/blob/main/docs/CONTRIBUTING.md)

### Are you willing to submit a PR?

Yes, I am willing to submit a PR!
diff --git a/crates/api_models/src/payments.rs b/crates/api_models/src/payments.rs
index 91886de2390..9090ab2b5e0 100644
--- a/crates/api_models/src/payments.rs
+++ b/crates/api_models/src/payments.rs
@@ -26,9 +26,39 @@ use common_utils::{
     pii::{self, Email},
     types::{MinorUnit, StringMajorUnit},
 };
-#[cfg(feature = "v2")]
-use deserialize_form_style_query_parameter::option_form_vec_deserialize;
 use error_stack::ResultExt;
+
+#[cfg(feature = "v2")]
+fn parse_comma_separated<'de, D, T>(v: D) -> Result<Option<Vec<T>>, D::Error>
+where
+    D: serde::Deserializer<'de>,
+    T: std::str::FromStr,
+    <T as std::str::FromStr>::Err: std::fmt::Debug + std::fmt::Display + std::error::Error,
+{
+    let opt_str: Option<String> = Option::deserialize(v)?;
+    match opt_str {
+        Some(s) if s.is_empty() => Ok(None),
+        Some(s) => {
+            // Estimate capacity based on comma count
+            let capacity = s.matches(',').count() + 1;
+            let mut result = Vec::with_capacity(capacity);
+
+            for item in s.split(',') {
+                let trimmed_item = item.trim();
+                if !trimmed_item.is_empty() {
+                    let parsed_item = trimmed_item.parse::<T>().map_err(|e| {
+                        <D::Error as serde::de::Error>::custom(format!(
+                            "Invalid value '{trimmed_item}': {e}"
+                        ))
+                    })?;
+                    result.push(parsed_item);
+                }
+            }
+            Ok(Some(result))
+        }
+        None => Ok(None),
+    }
+}
 use masking::{PeekInterface, Secret, WithType};
 use router_derive::Setter;
 #[cfg(feature = "v1")]
@@ -6259,26 +6289,33 @@ pub struct PaymentListConstraints {
     /// The end amount to filter list of transactions which are less than or equal to the end amount
     pub end_amount: Option<i64>,
     /// The connector to filter payments list
-    #[param(value_type = Option<Connector>)]
-    pub connector: Option<api_enums::Connector>,
+    #[param(value_type = Option<Vec<Connector>>)]
+    #[serde(deserialize_with = "parse_comma_separated", default)]
+    pub connector: Option<Vec<api_enums::Connector>>,
     /// The currency to filter payments list
-    #[param(value_type = Option<Currency>)]
-    pub currency: Option<enums::Currency>,
+    #[param(value_type = Option<Vec<Currency>>)]
+    #[serde(deserialize_with = "parse_comma_separated", default)]
+    pub currency: Option<Vec<enums::Currency>>,
     /// The payment status to filter payments list
-    #[param(value_type = Option<IntentStatus>)]
-    pub status: Option<enums::IntentStatus>,
+    #[param(value_type = Option<Vec<IntentStatus>>)]
+    #[serde(deserialize_with = "parse_comma_separated", default)]
+    pub status: Option<Vec<enums::IntentStatus>>,
     /// The payment method type to filter payments list
-    #[param(value_type = Option<PaymentMethod>)]
-    pub payment_method_type: Option<enums::PaymentMethod>,
+    #[param(value_type = Option<Vec<PaymentMethod>>)]
+    #[serde(deserialize_with = "parse_comma_separated", default)]
+    pub payment_method_type: Option<Vec<enums::PaymentMethod>>,
     /// The payment method subtype to filter payments list
-    #[param(value_type = Option<PaymentMethodType>)]
-    pub payment_method_subtype: Option<enums::PaymentMethodType>,
+    #[param(value_type = Option<Vec<PaymentMethodType>>)]
+    #[serde(deserialize_with = "parse_comma_separated", default)]
+    pub payment_method_subtype: Option<Vec<enums::PaymentMethodType>>,
     /// The authentication type to filter payments list
-    #[param(value_type = Option<AuthenticationType>)]
-    pub authentication_type: Option<enums::AuthenticationType>,
+    #[param(value_type = Option<Vec<AuthenticationType>>)]
+    #[serde(deserialize_with = "parse_comma_separated", default)]
+    pub authentication_type: Option<Vec<enums::AuthenticationType>>,
     /// The merchant connector id to filter payments list
-    #[param(value_type = Option<String>)]
-    pub merchant_connector_id: Option<id_type::MerchantConnectorAccountId>,
+    #[param(value_type = Option<Vec<String>>)]
+    #[serde(deserialize_with = "parse_comma_separated", default)]
+    pub merchant_connector_id: Option<Vec<id_type::MerchantConnectorAccountId>>,
     /// The field on which the payments list should be sorted
     #[serde(default)]
     pub order_on: SortOn,
@@ -6286,8 +6323,9 @@ pub struct PaymentListConstraints {
     #[serde(default)]
     pub order_by: SortBy,
     /// The card networks to filter payments list
-    #[param(value_type = Option<CardNetwork>)]
-    pub card_network: Option<enums::CardNetwork>,
+    #[param(value_type = Option<Vec<CardNetwork>>)]
+    #[serde(deserialize_with = "parse_comma_separated", default)]
+    pub card_network: Option<Vec<enums::CardNetwork>>,
     /// The identifier for merchant order reference id
     pub merchant_order_reference_id: Option<String>,
 }
@@ -7984,7 +8022,7 @@ pub struct ListMethodsForPaymentsRequest {
     pub client_secret: Option<String>,
 
     /// The two-letter ISO currency code
-    #[serde(deserialize_with = "option_form_vec_deserialize", default)]
+    #[serde(deserialize_with = "parse_comma_separated", default)]
     #[schema(value_type = Option<Vec<CountryAlpha2>>, example = json!(["US", "UK", "IN"]))]
     pub accepted_countries: Option<Vec<api_enums::CountryAlpha2>>,
 
@@ -7993,7 +8031,7 @@ pub struct ListMethodsForPaymentsRequest {
     pub amount: Option<MinorUnit>,
 
     /// The three-letter ISO currency code
-    #[serde(deserialize_with = "option_form_vec_deserialize", default)]
+    #[serde(deserialize_with = "parse_comma_separated", default)]
     #[schema(value_type = Option<Vec<Currency>>,example = json!(["USD", "EUR"]))]
     pub accepted_currencies: Option<Vec<api_enums::Currency>>,
 
@@ -8002,7 +8040,7 @@ pub struct ListMethodsForPaymentsRequest {
     pub recurring_enabled: Option<bool>,
 
     /// Indicates whether the payment method is eligible for card networks
-    #[serde(deserialize_with = "option_form_vec_deserialize", default)]
+    #[serde(deserialize_with = "parse_comma_separated", default)]
     #[schema(value_type = Option<Vec<CardNetwork>>, example = json!(["visa", "mastercard"]))]
     pub card_networks: Option<Vec<api_enums::CardNetwork>>,
 
diff --git a/crates/common_utils/src/id_type/merchant_connector_account.rs b/crates/common_utils/src/id_type/merchant_connector_account.rs
index f1bdb171b21..df8d1c3b3a4 100644
--- a/crates/common_utils/src/id_type/merchant_connector_account.rs
+++ b/crates/common_utils/src/id_type/merchant_connector_account.rs
@@ -1,3 +1,5 @@
+use std::str::FromStr;
+
 use crate::errors::{CustomResult, ValidationError};
 
 crate::id_type!(
@@ -21,3 +23,11 @@ impl MerchantConnectorAccountId {
         Self::try_from(std::borrow::Cow::from(merchant_connector_account_id))
     }
 }
+
+impl FromStr for MerchantConnectorAccountId {
+    type Err = std::fmt::Error;
+
+    fn from_str(s: &str) -> Result<Self, Self::Err> {
+        Self::try_from(std::borrow::Cow::Owned(s.to_string())).map_err(|_| std::fmt::Error)
+    }
+}
diff --git a/crates/diesel_models/src/query/payment_attempt.rs b/crates/diesel_models/src/query/payment_attempt.rs
index a7baf75f069..b1934ae5abc 100644
--- a/crates/diesel_models/src/query/payment_attempt.rs
+++ b/crates/diesel_models/src/query/payment_attempt.rs
@@ -437,12 +437,12 @@ impl PaymentAttempt {
         conn: &PgPooledConn,
         merchant_id: &common_utils::id_type::MerchantId,
         active_attempt_ids: &[String],
-        connector: Option<String>,
-        payment_method_type: Option<enums::PaymentMethod>,
-        payment_method_subtype: Option<enums::PaymentMethodType>,
-        authentication_type: Option<enums::AuthenticationType>,
-        merchant_connector_id: Option<common_utils::id_type::MerchantConnectorAccountId>,
-        card_network: Option<enums::CardNetwork>,
+        connector: Option<Vec<String>>,
+        payment_method_type: Option<Vec<enums::PaymentMethod>>,
+        payment_method_subtype: Option<Vec<enums::PaymentMethodType>>,
+        authentication_type: Option<Vec<enums::AuthenticationType>>,
+        merchant_connector_id: Option<Vec<common_utils::id_type::MerchantConnectorAccountId>>,
+        card_network: Option<Vec<enums::CardNetwork>>,
     ) -> StorageResult<i64> {
         let mut filter = <Self as HasTable>::table()
             .count()
@@ -450,24 +450,24 @@ impl PaymentAttempt {
             .filter(dsl::id.eq_any(active_attempt_ids.to_owned()))
             .into_boxed();
 
-        if let Some(connector) = connector {
-            filter = filter.filter(dsl::connector.eq(connector));
+        if let Some(connectors) = connector {
+            filter = filter.filter(dsl::connector.eq_any(connectors));
         }
 
-        if let Some(payment_method_type) = payment_method_type {
-            filter = filter.filter(dsl::payment_method_type_v2.eq(payment_method_type));
+        if let Some(payment_method_types) = payment_method_type {
+            filter = filter.filter(dsl::payment_method_type_v2.eq_any(payment_method_types));
         }
-        if let Some(payment_method_subtype) = payment_method_subtype {
-            filter = filter.filter(dsl::payment_method_subtype.eq(payment_method_subtype));
+        if let Some(payment_method_subtypes) = payment_method_subtype {
+            filter = filter.filter(dsl::payment_method_subtype.eq_any(payment_method_subtypes));
         }
-        if let Some(authentication_type) = authentication_type {
-            filter = filter.filter(dsl::authentication_type.eq(authentication_type));
+        if let Some(authentication_types) = authentication_type {
+            filter = filter.filter(dsl::authentication_type.eq_any(authentication_types));
         }
-        if let Some(merchant_connector_id) = merchant_connector_id {
-            filter = filter.filter(dsl::merchant_connector_id.eq(merchant_connector_id))
+        if let Some(merchant_connector_ids) = merchant_connector_id {
+            filter = filter.filter(dsl::merchant_connector_id.eq_any(merchant_connector_ids));
         }
-        if let Some(card_network) = card_network {
-            filter = filter.filter(dsl::card_network.eq(card_network))
+        if let Some(card_networks) = card_network {
+            filter = filter.filter(dsl::card_network.eq_any(card_networks));
         }
 
         router_env::logger::debug!(query = %debug_query::<Pg, _>(&filter).to_string());
diff --git a/crates/hyperswitch_domain_models/src/payments/payment_attempt.rs b/crates/hyperswitch_domain_models/src/payments/payment_attempt.rs
index a1ff44f5331..4449e19e089 100644
--- a/crates/hyperswitch_domain_models/src/payments/payment_attempt.rs
+++ b/crates/hyperswitch_domain_models/src/payments/payment_attempt.rs
@@ -235,12 +235,12 @@ pub trait PaymentAttemptInterface {
         &self,
         merchant_id: &id_type::MerchantId,
         active_attempt_ids: &[String],
-        connector: Option<api_models::enums::Connector>,
-        payment_method_type: Option<storage_enums::PaymentMethod>,
-        payment_method_subtype: Option<storage_enums::PaymentMethodType>,
-        authentication_type: Option<storage_enums::AuthenticationType>,
-        merchant_connector_id: Option<id_type::MerchantConnectorAccountId>,
-        card_network: Option<storage_enums::CardNetwork>,
+        connector: Option<Vec<api_models::enums::Connector>>,
+        payment_method_type: Option<Vec<storage_enums::PaymentMethod>>,
+        payment_method_subtype: Option<Vec<storage_enums::PaymentMethodType>>,
+        authentication_type: Option<Vec<storage_enums::AuthenticationType>>,
+        merchant_connector_id: Option<Vec<id_type::MerchantConnectorAccountId>>,
+        card_network: Option<Vec<storage_enums::CardNetwork>>,
         storage_scheme: storage_enums::MerchantStorageScheme,
     ) -> error_stack::Result<i64, Self::Error>;
 }
diff --git a/crates/hyperswitch_domain_models/src/payments/payment_intent.rs b/crates/hyperswitch_domain_models/src/payments/payment_intent.rs
index 60158ebdc12..c96209d2b4f 100644
--- a/crates/hyperswitch_domain_models/src/payments/payment_intent.rs
+++ b/crates/hyperswitch_domain_models/src/payments/payment_intent.rs
@@ -1340,20 +1340,14 @@ impl PaymentIntentFetchConstraints {
 
 #[cfg(feature = "v2")]
 pub enum PaymentIntentFetchConstraints {
-    Single {
-        payment_intent_id: id_type::GlobalPaymentId,
-    },
     List(Box<PaymentIntentListParams>),
 }
 
 #[cfg(feature = "v2")]
 impl PaymentIntentFetchConstraints {
     pub fn get_profile_id(&self) -> Option<id_type::ProfileId> {
-        if let Self::List(pi_list_params) = self {
-            pi_list_params.profile_id.clone()
-        } else {
-            None
-        }
+        let Self::List(pi_list_params) = self;
+        pi_list_params.profile_id.clone()
     }
 }
 
@@ -1387,21 +1381,22 @@ pub struct PaymentIntentListParams {
     pub starting_at: Option<PrimitiveDateTime>,
     pub ending_at: Option<PrimitiveDateTime>,
     pub amount_filter: Option<api_models::payments::AmountFilter>,
-    pub connector: Option<api_models::enums::Connector>,
-    pub currency: Option<common_enums::Currency>,
-    pub status: Option<common_enums::IntentStatus>,
-    pub payment_method_type: Option<common_enums::PaymentMethod>,
-    pub payment_method_subtype: Option<common_enums::PaymentMethodType>,
-    pub authentication_type: Option<common_enums::AuthenticationType>,
-    pub merchant_connector_id: Option<id_type::MerchantConnectorAccountId>,
+    pub connector: Option<Vec<api_models::enums::Connector>>,
+    pub currency: Option<Vec<common_enums::Currency>>,
+    pub status: Option<Vec<common_enums::IntentStatus>>,
+    pub payment_method_type: Option<Vec<common_enums::PaymentMethod>>,
+    pub payment_method_subtype: Option<Vec<common_enums::PaymentMethodType>>,
+    pub authentication_type: Option<Vec<common_enums::AuthenticationType>>,
+    pub merchant_connector_id: Option<Vec<id_type::MerchantConnectorAccountId>>,
     pub profile_id: Option<id_type::ProfileId>,
     pub customer_id: Option<id_type::GlobalCustomerId>,
     pub starting_after_id: Option<id_type::GlobalPaymentId>,
     pub ending_before_id: Option<id_type::GlobalPaymentId>,
     pub limit: Option<u32>,
     pub order: api_models::payments::Order,
-    pub card_network: Option<common_enums::CardNetwork>,
+    pub card_network: Option<Vec<common_enums::CardNetwork>>,
     pub merchant_order_reference_id: Option<String>,
+    pub payment_id: Option<id_type::GlobalPaymentId>,
 }
 
 #[cfg(feature = "v1")]
@@ -1473,39 +1468,36 @@ impl From<api_models::payments::PaymentListConstraints> for PaymentIntentFetchCo
             merchant_order_reference_id,
             offset,
         } = value;
-        if let Some(payment_intent_id) = payment_id {
-            Self::Single { payment_intent_id }
-        } else {
-            Self::List(Box::new(PaymentIntentListParams {
-                offset: offset.unwrap_or_default(),
-                starting_at: created_gte.or(created_gt).or(created),
-                ending_at: created_lte.or(created_lt).or(created),
-                amount_filter: (start_amount.is_some() || end_amount.is_some()).then_some({
-                    api_models::payments::AmountFilter {
-                        start_amount,
-                        end_amount,
-                    }
-                }),
-                connector,
-                currency,
-                status,
-                payment_method_type,
-                payment_method_subtype,
-                authentication_type,
-                merchant_connector_id,
-                profile_id,
-                customer_id,
-                starting_after_id: starting_after,
-                ending_before_id: ending_before,
-                limit: Some(std::cmp::min(limit, PAYMENTS_LIST_MAX_LIMIT_V1)),
-                order: api_models::payments::Order {
-                    on: order_on,
-                    by: order_by,
-                },
-                card_network,
-                merchant_order_reference_id,
-            }))
-        }
+        Self::List(Box::new(PaymentIntentListParams {
+            offset: offset.unwrap_or_default(),
+            starting_at: created_gte.or(created_gt).or(created),
+            ending_at: created_lte.or(created_lt).or(created),
+            amount_filter: (start_amount.is_some() || end_amount.is_some()).then_some({
+                api_models::payments::AmountFilter {
+                    start_amount,
+                    end_amount,
+                }
+            }),
+            connector,
+            currency,
+            status,
+            payment_method_type,
+            payment_method_subtype,
+            authentication_type,
+            merchant_connector_id,
+            profile_id,
+            customer_id,
+            starting_after_id: starting_after,
+            ending_before_id: ending_before,
+            limit: Some(std::cmp::min(limit, PAYMENTS_LIST_MAX_LIMIT_V1)),
+            order: api_models::payments::Order {
+                on: order_on,
+                by: order_by,
+            },
+            card_network,
+            merchant_order_reference_id,
+            payment_id,
+        }))
     }
 }
 
diff --git a/crates/router/src/db/kafka_store.rs b/crates/router/src/db/kafka_store.rs
index 43be476f68f..9eaef17b9c5 100644
--- a/crates/router/src/db/kafka_store.rs
+++ b/crates/router/src/db/kafka_store.rs
@@ -1827,12 +1827,12 @@ impl PaymentAttemptInterface for KafkaStore {
         &self,
         merchant_id: &id_type::MerchantId,
         active_attempt_ids: &[String],
-        connector: Option<api_models::enums::Connector>,
-        payment_method_type: Option<common_enums::PaymentMethod>,
-        payment_method_subtype: Option<common_enums::PaymentMethodType>,
-        authentication_type: Option<common_enums::AuthenticationType>,
-        merchant_connector_id: Option<id_type::MerchantConnectorAccountId>,
-        card_network: Option<common_enums::CardNetwork>,
+        connector: Option<Vec<api_models::enums::Connector>>,
+        payment_method_type: Option<Vec<common_enums::PaymentMethod>>,
+        payment_method_subtype: Option<Vec<common_enums::PaymentMethodType>>,
+        authentication_type: Option<Vec<common_enums::AuthenticationType>>,
+        merchant_connector_id: Option<Vec<id_type::MerchantConnectorAccountId>>,
+        card_network: Option<Vec<common_enums::CardNetwork>>,
         storage_scheme: MerchantStorageScheme,
     ) -> CustomResult<i64, errors::StorageError> {
         self.diesel_store
diff --git a/crates/storage_impl/src/mock_db/payment_attempt.rs b/crates/storage_impl/src/mock_db/payment_attempt.rs
index ec27f9bed65..0268bc93ac9 100644
--- a/crates/storage_impl/src/mock_db/payment_attempt.rs
+++ b/crates/storage_impl/src/mock_db/payment_attempt.rs
@@ -65,12 +65,12 @@ impl PaymentAttemptInterface for MockDb {
         &self,
         _merchant_id: &id_type::MerchantId,
         _active_attempt_ids: &[String],
-        _connector: Option<api_models::enums::Connector>,
-        _payment_method_type: Option<common_enums::PaymentMethod>,
-        _payment_method_subtype: Option<common_enums::PaymentMethodType>,
-        _authentication_type: Option<common_enums::AuthenticationType>,
-        _merchanat_connector_id: Option<id_type::MerchantConnectorAccountId>,
-        _card_network: Option<storage_enums::CardNetwork>,
+        _connector: Option<Vec<api_models::enums::Connector>>,
+        _payment_method_type: Option<Vec<common_enums::PaymentMethod>>,
+        _payment_method_subtype: Option<Vec<common_enums::PaymentMethodType>>,
+        _authentication_type: Option<Vec<common_enums::AuthenticationType>>,
+        _merchant_connector_id: Option<Vec<id_type::MerchantConnectorAccountId>>,
+        _card_network: Option<Vec<storage_enums::CardNetwork>>,
         _storage_scheme: storage_enums::MerchantStorageScheme,
     ) -> CustomResult<i64, StorageError> {
         Err(StorageError::MockDbError)?
diff --git a/crates/storage_impl/src/payments/payment_attempt.rs b/crates/storage_impl/src/payments/payment_attempt.rs
index 5ddf5d50182..5424ad964e3 100644
--- a/crates/storage_impl/src/payments/payment_attempt.rs
+++ b/crates/storage_impl/src/payments/payment_attempt.rs
@@ -546,12 +546,12 @@ impl<T: DatabaseStore> PaymentAttemptInterface for RouterStore<T> {
         &self,
         merchant_id: &common_utils::id_type::MerchantId,
         active_attempt_ids: &[String],
-        connector: Option<api_models::enums::Connector>,
-        payment_method_type: Option<common_enums::PaymentMethod>,
-        payment_method_subtype: Option<common_enums::PaymentMethodType>,
-        authentication_type: Option<common_enums::AuthenticationType>,
-        merchant_connector_id: Option<common_utils::id_type::MerchantConnectorAccountId>,
-        card_network: Option<common_enums::CardNetwork>,
+        connector: Option<Vec<api_models::enums::Connector>>,
+        payment_method_type: Option<Vec<common_enums::PaymentMethod>>,
+        payment_method_subtype: Option<Vec<common_enums::PaymentMethodType>>,
+        authentication_type: Option<Vec<common_enums::AuthenticationType>>,
+        merchant_connector_id: Option<Vec<common_utils::id_type::MerchantConnectorAccountId>>,
+        card_network: Option<Vec<common_enums::CardNetwork>>,
         _storage_scheme: MerchantStorageScheme,
     ) -> CustomResult<i64, errors::StorageError> {
         let conn = self
@@ -565,7 +565,9 @@ impl<T: DatabaseStore> PaymentAttemptInterface for RouterStore<T> {
             &conn,
             merchant_id,
             active_attempt_ids,
-            connector.map(|val| val.to_string()),
+            connector
+                .as_ref()
+                .map(|vals| vals.iter().map(|v| v.to_string()).collect()),
             payment_method_type,
             payment_method_subtype,
             authentication_type,
@@ -1713,12 +1715,12 @@ impl<T: DatabaseStore> PaymentAttemptInterface for KVRouterStore<T> {
         &self,
         merchant_id: &common_utils::id_type::MerchantId,
         active_attempt_ids: &[String],
-        connector: Option<api_models::enums::Connector>,
-        payment_method_type: Option<common_enums::PaymentMethod>,
-        payment_method_subtype: Option<common_enums::PaymentMethodType>,
-        authentication_type: Option<common_enums::AuthenticationType>,
-        merchant_connector_id: Option<common_utils::id_type::MerchantConnectorAccountId>,
-        card_network: Option<common_enums::CardNetwork>,
+        connector: Option<Vec<api_models::enums::Connector>>,
+        payment_method_type: Option<Vec<common_enums::PaymentMethod>>,
+        payment_method_subtype: Option<Vec<common_enums::PaymentMethodType>>,
+        authentication_type: Option<Vec<common_enums::AuthenticationType>>,
+        merchant_connector_id: Option<Vec<common_utils::id_type::MerchantConnectorAccountId>>,
+        card_network: Option<Vec<common_enums::CardNetwork>>,
         storage_scheme: MerchantStorageScheme,
     ) -> CustomResult<i64, errors::StorageError> {
         self.router_store
diff --git a/crates/storage_impl/src/payments/payment_intent.rs b/crates/storage_impl/src/payments/payment_intent.rs
index d054a4b1650..4eb3fad60a8 100644
--- a/crates/storage_impl/src/payments/payment_intent.rs
+++ b/crates/storage_impl/src/payments/payment_intent.rs
@@ -1361,9 +1361,6 @@ impl<T: DatabaseStore> PaymentIntentInterface for crate::RouterStore<T> {
             .into_boxed();
 
         query = match constraints {
-            PaymentIntentFetchConstraints::Single { payment_intent_id } => {
-                query.filter(pi_dsl::id.eq(payment_intent_id.to_owned()))
-            }
             PaymentIntentFetchConstraints::List(params) => {
                 query = match params.order {
                     Order {
@@ -1457,50 +1454,54 @@ impl<T: DatabaseStore> PaymentIntentInterface for crate::RouterStore<T> {
                 };
 
                 query = match &params.currency {
-                    Some(currency) => query.filter(pi_dsl::currency.eq(*currency)),
+                    Some(currency) => query.filter(pi_dsl::currency.eq_any(currency.clone())),
                     None => query,
                 };
 
                 query = match &params.connector {
-                    Some(connector) => query.filter(pa_dsl::connector.eq(*connector)),
+                    Some(connector) => query.filter(pa_dsl::connector.eq_any(connector.clone())),
                     None => query,
                 };
 
                 query = match &params.status {
-                    Some(status) => query.filter(pi_dsl::status.eq(*status)),
+                    Some(status) => query.filter(pi_dsl::status.eq_any(status.clone())),
                     None => query,
                 };
 
                 query = match &params.payment_method_type {
-                    Some(payment_method_type) => {
-                        query.filter(pa_dsl::payment_method_type_v2.eq(*payment_method_type))
-                    }
+                    Some(payment_method_type) => query
+                        .filter(pa_dsl::payment_method_type_v2.eq_any(payment_method_type.clone())),
                     None => query,
                 };
 
                 query = match &params.payment_method_subtype {
-                    Some(payment_method_subtype) => {
-                        query.filter(pa_dsl::payment_method_subtype.eq(*payment_method_subtype))
-                    }
+                    Some(payment_method_subtype) => query.filter(
+                        pa_dsl::payment_method_subtype.eq_any(payment_method_subtype.clone()),
+                    ),
                     None => query,
                 };
 
                 query = match &params.authentication_type {
-                    Some(authentication_type) => {
-                        query.filter(pa_dsl::authentication_type.eq(*authentication_type))
-                    }
+                    Some(authentication_type) => query
+                        .filter(pa_dsl::authentication_type.eq_any(authentication_type.clone())),
                     None => query,
                 };
 
                 query = match &params.merchant_connector_id {
-                    Some(merchant_connector_id) => query
-                        .filter(pa_dsl::merchant_connector_id.eq(merchant_connector_id.clone())),
+                    Some(merchant_connector_id) => query.filter(
+                        pa_dsl::merchant_connector_id.eq_any(merchant_connector_id.clone()),
+                    ),
                     None => query,
                 };
 
                 if let Some(card_network) = &params.card_network {
-                    query = query.filter(pa_dsl::card_network.eq(card_network.clone()));
+                    query = query.filter(pa_dsl::card_network.eq_any(card_network.clone()));
                 }
+
+                if let Some(payment_id) = &params.payment_id {
+                    query = query.filter(pi_dsl::id.eq(payment_id.clone()));
+                }
+
                 query
             }
         };
@@ -1561,9 +1562,6 @@ impl<T: DatabaseStore> PaymentIntentInterface for crate::RouterStore<T> {
             .into_boxed();
 
         query = match constraints {
-            PaymentIntentFetchConstraints::Single { payment_intent_id } => {
-                query.filter(pi_dsl::id.eq(payment_intent_id.to_owned()))
-            }
             PaymentIntentFetchConstraints::List(params) => {
                 if let Some(customer_id) = &params.customer_id {
                     query = query.filter(pi_dsl::customer_id.eq(customer_id.clone()));
@@ -1604,15 +1602,19 @@ impl<T: DatabaseStore> PaymentIntentInterface for crate::RouterStore<T> {
                 };
 
                 query = match &params.currency {
-                    Some(currency) => query.filter(pi_dsl::currency.eq(*currency)),
+                    Some(currency) => query.filter(pi_dsl::currency.eq_any(currency.clone())),
                     None => query,
                 };
 
                 query = match &params.status {
-                    Some(status) => query.filter(pi_dsl::status.eq(*status)),
+                    Some(status) => query.filter(pi_dsl::status.eq_any(status.clone())),
                     None => query,
                 };
 
+                if let Some(payment_id) = &params.payment_id {
+                    query = query.filter(pi_dsl::id.eq(payment_id.clone()));
+                }
+
                 query
             }
         };

## Type of Change
<!-- Put an `x` in the boxes that apply -->

- [ ] Bugfix
- [X] New feature
- [ ] Enhancement
- [ ] Refactoring
- [ ] Dependency updates
- [ ] Documentation
- [ ] CI/CD

## Description
<!-- Describe your changes in detail -->
**Enhanced Payment Listing API with Multi-Value Filtering**

This feature adds support for retrieving a filtered list of payments via a `GET /v2/payments/list` endpoint where multiple values can be provided for a single filter key (e.g. `status`, `currency`, `connector`, etc.).


### Additional Changes

- [X] This PR modifies the API contract
- [ ] This PR modifies the database schema
- [ ] This PR modifies application configuration/environment variables

<!--
Provide links to the files with corresponding changes.

Following are the paths where you can find config files:
1. `config`
2. `crates/router/src/configs`
3. `loadtest/config`
-->


## Motivation and Context
<!--
Why is this change required? What problem does it solve?
If it fixes an open issue, please link to the issue here.

If you don't have an issue, we'd recommend starting with one first so the PR
can focus on the implementation (unless it is an obvious bug or documentation fix
that will have little conversation).
-->


## How did you test it?
<!--
Did you write an integration/unit/API test to verify the code changes?
Or did you test this change manually (provide relevant screenshots)?
-->
GetRequest:
```
curl --location 'http://localhost:8080/v2/payments/list' \
--header 'api-key: dev_tP1IAK95c65hjO7NvF3dRliuiMuSIFhIeFjXBb1du3NZ1Ui6Av0XKyL3ONtB7tpy' \
--header 'Content-Type: application/json' \
--header 'x-profile-id: pro_G9buhoAY3Mpu9cFIeWoZ' \
--header 'Authorization: api-key=dev_tP1IAK95c65hjO7NvF3dRliuiMuSIFhIeFjXBb1du3NZ1Ui6Av0XKyL3ONtB7tpy' \
--data ''
```
GetResponse:
```
{
    "count": 4,
    "total_count": 4,
    "data": [
        {
            "id": "12345_pay_01987e212eac7b23986ab9afee1d4f3f",
            "merchant_id": "cloth_seller_qNqGZXs31yvrAlmFG1Jj",
            "profile_id": "pro_G9buhoAY3Mpu9cFIeWoZ",
            "customer_id": null,
            "payment_method_id": null,
            "status": "requires_payment_method",
            "amount": {
                "order_amount": 100,
                "currency": "USD",
                "shipping_cost": null,
                "order_tax_amount": null,
                "external_tax_calculation": "skip",
                "surcharge_calculation": "skip",
                "surcharge_amount": null,
                "tax_on_surcharge": null,
                "net_amount": 100,
                "amount_to_capture": null,
                "amount_capturable": 0,
                "amount_captured": null
            },
            "created": "2025-08-06T06:46:00.627Z",
            "payment_method_type": null,
            "payment_method_subtype": null,
            "connector": null,
            "merchant_connector_id": null,
            "customer": null,
            "merchant_reference_id": null,
            "connector_payment_id": null,
            "connector_response_reference_id": null,
            "metadata": null,
            "description": null,
            "authentication_type": "no_three_ds",
            "capture_method": "manual",
            "setup_future_usage": "on_session",
            "attempt_count": 0,
            "error": null,
            "cancellation_reason": null,
            "order_details": null,
            "return_url": null,
            "statement_descriptor": null,
            "allowed_payment_method_types": null,
            "authorization_count": 0,
            "modified_at": null
        },
        {
            "id": "12345_pay_01987e212d6f7af18f54d484b9afad2f",
            "merchant_id": "cloth_seller_qNqGZXs31yvrAlmFG1Jj",
            "profile_id": "pro_G9buhoAY3Mpu9cFIeWoZ",
            "customer_id": null,
            "payment_method_id": null,
            "status": "requires_payment_method",
            "amount": {
                "order_amount": 100,
                "currency": "USD",
                "shipping_cost": null,
                "order_tax_amount": null,
                "external_tax_calculation": "skip",
                "surcharge_calculation": "skip",
                "surcharge_amount": null,
                "tax_on_surcharge": null,
                "net_amount": 100,
                "amount_to_capture": null,
                "amount_capturable": 0,
                "amount_captured": null
            },
            "created": "2025-08-06T06:46:00.316Z",
            "payment_method_type": null,
            "payment_method_subtype": null,
            "connector": null,
            "merchant_connector_id": null,
            "customer": null,
            "merchant_reference_id": null,
            "connector_payment_id": null,
            "connector_response_reference_id": null,
            "metadata": null,
            "description": null,
            "authentication_type": "no_three_ds",
            "capture_method": "manual",
            "setup_future_usage": "on_session",
            "attempt_count": 0,
            "error": null,
            "cancellation_reason": null,
            "order_details": null,
            "return_url": null,
            "statement_descriptor": null,
            "allowed_payment_method_types": null,
            "authorization_count": 0,
            "modified_at": null
        },
        {
            "id": "12345_pay_01987e212b497a7394a404b857f156bf",
            "merchant_id": "cloth_seller_qNqGZXs31yvrAlmFG1Jj",
            "profile_id": "pro_G9buhoAY3Mpu9cFIeWoZ",
            "customer_id": null,
            "payment_method_id": null,
            "status": "requires_payment_method",
            "amount": {
                "order_amount": 100,
                "currency": "USD",
                "shipping_cost": null,
                "order_tax_amount": null,
                "external_tax_calculation": "skip",
                "surcharge_calculation": "skip",
                "surcharge_amount": null,
                "tax_on_surcharge": null,
                "net_amount": 100,
                "amount_to_capture": null,
                "amount_capturable": 0,
                "amount_captured": null
            },
            "created": "2025-08-06T06:45:59.767Z",
            "payment_method_type": null,
            "payment_method_subtype": null,
            "connector": null,
            "merchant_connector_id": null,
            "customer": null,
            "merchant_reference_id": null,
            "connector_payment_id": null,
            "connector_response_reference_id": null,
            "metadata": null,
            "description": null,
            "authentication_type": "no_three_ds",
            "capture_method": "manual",
            "setup_future_usage": "on_session",
            "attempt_count": 0,
            "error": null,
            "cancellation_reason": null,
            "order_details": null,
            "return_url": null,
            "statement_descriptor": null,
            "allowed_payment_method_types": null,
            "authorization_count": 0,
            "modified_at": null
        },
        {
            "id": "12345_pay_01987e1fa70c7bb18fea2a1667c32e5e",
            "merchant_id": "cloth_seller_qNqGZXs31yvrAlmFG1Jj",
            "profile_id": "pro_G9buhoAY3Mpu9cFIeWoZ",
            "customer_id": null,
            "payment_method_id": null,
            "status": "requires_payment_method",
            "amount": {
                "order_amount": 100,
                "currency": "USD",
                "shipping_cost": null,
                "order_tax_amount": null,
                "external_tax_calculation": "skip",
                "surcharge_calculation": "skip",
                "surcharge_amount": null,
                "tax_on_surcharge": null,
                "net_amount": 100,
                "amount_to_capture": null,
                "amount_capturable": 0,
                "amount_captured": null
            },
            "created": "2025-08-06T06:44:20.386Z",
            "payment_method_type": null,
            "payment_method_subtype": null,
            "connector": null,
            "merchant_connector_id": null,
            "customer": null,
            "merchant_reference_id": null,
            "connector_payment_id": null,
            "connector_response_reference_id": null,
            "metadata": null,
            "description": null,
            "authentication_type": "no_three_ds",
            "capture_method": "manual",
            "setup_future_usage": "on_session",
            "attempt_count": 0,
            "error": null,
            "cancellation_reason": null,
            "order_details": null,
            "return_url": null,
            "statement_descriptor": null,
            "allowed_payment_method_types": null,
            "authorization_count": 0,
            "modified_at": null
        }
    ]
}
```

GETRequestWithMultipleFilters:
```
curl --location 'http://localhost:8080/v2/payments/list?status=requires_payment_method%2Crequires_capture%2Csucceeded&currency=USD' \
--header 'api-key: dev_0M1HsoPENAKVcLprxBkqXvtLLA8myjdVHFUDvvknNykT1jlEdww31C8VNcj3emYL' \
--header 'Content-Type: application/json' \
--header 'x-profile-id: pro_qBIx1HzjxmvyeDgJmZLd' \
--header 'Authorization: api-key=dev_0M1HsoPENAKVcLprxBkqXvtLLA8myjdVHFUDvvknNykT1jlEdww31C8VNcj3emYL' \
--data ''
```
PostResponse:
```
{
    "count": 6,
    "total_count": 6,
    "data": [
        {
            "id": "12345_pay_019897db488f74b2ace8d4f34a1afd2e",
            "merchant_id": "cloth_seller_EWd2xVEKmKewu5gHgXMY",
            "profile_id": "pro_qBIx1HzjxmvyeDgJmZLd",
            "customer_id": null,
            "payment_method_id": null,
            "status": "succeeded",
            "amount": {
                "order_amount": 100,
                "currency": "USD",
                "shipping_cost": null,
                "order_tax_amount": null,
                "external_tax_calculation": "skip",
                "surcharge_calculation": "skip",
                "surcharge_amount": null,
                "tax_on_surcharge": null,
                "net_amount": 100,
                "amount_to_capture": null,
                "amount_capturable": 0,
                "amount_captured": 100
            },
            "created": "2025-08-11T06:39:47.356Z",
            "payment_method_type": "card",
            "payment_method_subtype": "credit",
            "connector": "authorizedotnet",
            "merchant_connector_id": "mca_t6Qa8RtV3MHmRAHlu1Zi",
            "customer": null,
            "merchant_reference_id": null,
            "connector_payment_id": "80043331424",
            "connector_response_reference_id": "80043331424",
            "metadata": null,
            "description": null,
            "authentication_type": "no_three_ds",
            "capture_method": "automatic",
            "setup_future_usage": "on_session",
            "attempt_count": 0,
            "error": null,
            "cancellation_reason": null,
            "order_details": null,
            "return_url": null,
            "statement_descriptor": null,
            "allowed_payment_method_types": null,
            "authorization_count": 0,
            "modified_at": "2025-08-11T06:39:50.721Z"
        },
        {
            "id": "12345_pay_019897db458a7650b52dc95d1d2cedc5",
            "merchant_id": "cloth_seller_EWd2xVEKmKewu5gHgXMY",
            "profile_id": "pro_qBIx1HzjxmvyeDgJmZLd",
            "customer_id": null,
            "payment_method_id": null,
            "status": "requires_payment_method",
            "amount": {
                "order_amount": 100,
                "currency": "USD",
                "shipping_cost": null,
                "order_tax_amount": null,
                "external_tax_calculation": "skip",
                "surcharge_calculation": "skip",
                "surcharge_amount": null,
                "tax_on_surcharge": null,
                "net_amount": 100,
                "amount_to_capture": null,
                "amount_capturable": 0,
                "amount_captured": null
            },
            "created": "2025-08-11T06:39:46.589Z",
            "payment_method_type": null,
            "payment_method_subtype": null,
            "connector": null,
            "merchant_connector_id": null,
            "customer": null,
            "merchant_reference_id": null,
            "connector_payment_id": null,
            "connector_response_reference_id": null,
            "metadata": null,
            "description": null,
            "authentication_type": "no_three_ds",
            "capture_method": "automatic",
            "setup_future_usage": "on_session",
            "attempt_count": 0,
            "error": null,
            "cancellation_reason": null,
            "order_details": null,
            "return_url": null,
            "statement_descriptor": null,
            "allowed_payment_method_types": null,
            "authorization_count": 0,
            "modified_at": null
        },
        {
            "id": "12345_pay_019897db02ff7e10b129a3df71b09aaf",
            "merchant_id": "cloth_seller_EWd2xVEKmKewu5gHgXMY",
            "profile_id": "pro_qBIx1HzjxmvyeDgJmZLd",
            "customer_id": null,
            "payment_method_id": null,
            "status": "requires_payment_method",
            "amount": {
                "order_amount": 100,
                "currency": "USD",
                "shipping_cost": null,
                "order_tax_amount": null,
                "external_tax_calculation": "skip",
                "surcharge_calculation": "skip",
                "surcharge_amount": null,
                "tax_on_surcharge": null,
                "net_amount": 100,
                "amount_to_capture": null,
                "amount_capturable": 0,
                "amount_captured": null
            },
            "created": "2025-08-11T06:39:29.562Z",
            "payment_method_type": null,
            "payment_method_subtype": null,
            "connector": null,
            "merchant_connector_id": null,
            "customer": null,
            "merchant_reference_id": null,
            "connector_payment_id": null,
            "connector_response_reference_id": null,
            "metadata": null,
            "description": null,
            "authentication_type": "no_three_ds",
            "capture_method": "automatic",
            "setup_future_usage": "on_session",
            "attempt_count": 0,
            "error": null,
            "cancellation_reason": null,
            "order_details": null,
            "return_url": null,
            "statement_descriptor": null,
            "allowed_payment_method_types": null,
            "authorization_count": 0,
            "modified_at": null
        },
        {
            "id": "12345_pay_019897db003876b1b5f57f8d4c27072d",
            "merchant_id": "cloth_seller_EWd2xVEKmKewu5gHgXMY",
            "profile_id": "pro_qBIx1HzjxmvyeDgJmZLd",
            "customer_id": null,
            "payment_method_id": null,
            "status": "requires_payment_method",
            "amount": {
                "order_amount": 100,
                "currency": "USD",
                "shipping_cost": null,
                "order_tax_amount": null,
                "external_tax_calculation": "skip",
                "surcharge_calculation": "skip",
                "surcharge_amount": null,
                "tax_on_surcharge": null,
                "net_amount": 100,
                "amount_to_capture": null,
                "amount_capturable": 0,
                "amount_captured": null
            },
            "created": "2025-08-11T06:39:28.839Z",
            "payment_method_type": null,
            "payment_method_subtype": null,
            "connector": null,
            "merchant_connector_id": null,
            "customer": null,
            "merchant_reference_id": null,
            "connector_payment_id": null,
            "connector_response_reference_id": null,
            "metadata": null,
            "description": null,
            "authentication_type": "no_three_ds",
            "capture_method": "automatic",
            "setup_future_usage": "on_session",
            "attempt_count": 0,
            "error": null,
            "cancellation_reason": null,
            "order_details": null,
            "return_url": null,
            "statement_descriptor": null,
            "allowed_payment_method_types": null,
            "authorization_count": 0,
            "modified_at": null
        },
        {
            "id": "12345_pay_019897dafd2070c1956d1af439088873",
            "merchant_id": "cloth_seller_EWd2xVEKmKewu5gHgXMY",
            "profile_id": "pro_qBIx1HzjxmvyeDgJmZLd",
            "customer_id": null,
            "payment_method_id": null,
            "status": "requires_payment_method",
            "amount": {
                "order_amount": 100,
                "currency": "USD",
                "shipping_cost": null,
                "order_tax_amount": null,
                "external_tax_calculation": "skip",
                "surcharge_calculation": "skip",
                "surcharge_amount": null,
                "tax_on_surcharge": null,
                "net_amount": 100,
                "amount_to_capture": null,
                "amount_capturable": 0,
                "amount_captured": null
            },
            "created": "2025-08-11T06:39:28.045Z",
            "payment_method_type": null,
            "payment_method_subtype": null,
            "connector": null,
            "merchant_connector_id": null,
            "customer": null,
            "merchant_reference_id": null,
            "connector_payment_id": null,
            "connector_response_reference_id": null,
            "metadata": null,
            "description": null,
            "authentication_type": "no_three_ds",
            "capture_method": "automatic",
            "setup_future_usage": "on_session",
            "attempt_count": 0,
            "error": null,
            "cancellation_reason": null,
            "order_details": null,
            "return_url": null,
            "statement_descriptor": null,
            "allowed_payment_method_types": null,
            "authorization_count": 0,
            "modified_at": null
        },
        {
            "id": "12345_pay_019897dae26871f2be542d43fc570b13",
            "merchant_id": "cloth_seller_EWd2xVEKmKewu5gHgXMY",
            "profile_id": "pro_qBIx1HzjxmvyeDgJmZLd",
            "customer_id": null,
            "payment_method_id": null,
            "status": "succeeded",
            "amount": {
                "order_amount": 100,
                "currency": "USD",
                "shipping_cost": null,
                "order_tax_amount": null,
                "external_tax_calculation": "skip",
                "surcharge_calculation": "skip",
                "surcharge_amount": null,
                "tax_on_surcharge": null,
                "net_amount": 100,
                "amount_to_capture": null,
                "amount_capturable": 0,
                "amount_captured": 100
            },
            "created": "2025-08-11T06:39:21.215Z",
            "payment_method_type": "card",
            "payment_method_subtype": "credit",
            "connector": "authorizedotnet",
            "merchant_connector_id": "mca_t6Qa8RtV3MHmRAHlu1Zi",
            "customer": null,
            "merchant_reference_id": null,
            "connector_payment_id": "80043331420",
            "connector_response_reference_id": "80043331420",
            "metadata": null,
            "description": null,
            "authentication_type": "no_three_ds",
            "capture_method": "automatic",
            "setup_future_usage": "on_session",
            "attempt_count": 0,
            "error": null,
            "cancellation_reason": null,
            "order_details": null,
            "return_url": null,
            "statement_descriptor": null,
            "allowed_payment_method_types": null,
            "authorization_count": 0,
            "modified_at": "2025-08-11T06:39:26.628Z"
        }
    ]
}
```
GetRequestWithTimeDuration:
```
curl --location 'http://localhost:8080/v2/payments/list?status=requires_payment_method%2Crequires_capture%2Csucceeded&currency=USD&created.gte=2025-08-01T00%3A00%3A00Z&created.lte=2025-08-09T23%3A59%3A59Z' \
--header 'api-key: dev_SfzD1JfNBMBwIxi6S55ku8kCXpt665huoFrJv1hnIFERGXNIUWldBQaOMJiHE0de' \
--header 'Content-Type: application/json' \
--header 'x-profile-id: pro_E7U8C0vjFGXvuaVEGH4M' \
--header 'Authorization: api-key=dev_SfzD1JfNBMBwIxi6S55ku8kCXpt665huoFrJv1hnIFERGXNIUWldBQaOMJiHE0de' \
--data ''
```
Response:
```
{
    "count": 0,
     "total_count": 0,
    "data": []
}
```
GetRequestWithTimeDuration:
```
curl --location 'http://localhost:8080/v2/payments/list?status=failed&currency=USD&created.gte=2025-08-01T00%3A00%3A00Z&created.lte=2025-08-31T23%3A59%3A59Z' \
--header 'api-key: dev_SfzD1JfNBMBwIxi6S55ku8kCXpt665huoFrJv1hnIFERGXNIUWldBQaOMJiHE0de' \
--header 'Content-Type: application/json' \
--header 'x-profile-id: pro_E7U8C0vjFGXvuaVEGH4M' \
--header 'Authorization: api-key=dev_SfzD1JfNBMBwIxi6S55ku8kCXpt665huoFrJv1hnIFERGXNIUWldBQaOMJiHE0de' \
--data ''
```
Response:
```
{
    "count": 1,
     "total_count": 1,
    "data": [
        {
            "id": "12345_pay_01989e70b0fc7e219eb6352105ccd06f",
            "merchant_id": "cloth_seller_bdCHKB6LXsvpWlKKcios",
            "profile_id": "pro_E7U8C0vjFGXvuaVEGH4M",
            "customer_id": "12345_cus_01989e7025b471c0ace0c31e46b83360",
            "payment_method_id": null,
            "status": "failed",
            "amount": {
                "order_amount": 10000,
                "currency": "USD",
                "shipping_cost": null,
                "order_tax_amount": null,
                "external_tax_calculation": "skip",
                "surcharge_calculation": "skip",
                "surcharge_amount": null,
                "tax_on_surcharge": null,
                "net_amount": 10000,
                "amount_to_capture": null,
                "amount_capturable": 0,
                "amount_captured": null
            },
            "created": "2025-08-12T13:20:42.244Z",
            "payment_method_type": "card",
            "payment_method_subtype": "credit",
            "connector": "trustpay",
            "merchant_connector_id": "mca_Z9a58zhABpHduskbCsf9",
            "customer": null,
            "merchant_reference_id": null,
            "connector_payment_id": null,
            "connector_response_reference_id": null,
            "metadata": null,
            "description": null,
            "authentication_type": "no_three_ds",
            "capture_method": "automatic",
            "setup_future_usage": "on_session",
            "attempt_count": 0,
            "error": {
                "code": "4",
                "message": "4",
                "unified_code": null,
                "unified_message": null,
                "network_advice_code": null,
                "network_decline_code": null,
                "network_error_message": null
            },
            "cancellation_reason": null,
            "order_details": null,
            "return_url": null,
            "statement_descriptor": null,
            "allowed_payment_method_types": null,
            "authorization_count": 0,
            "modified_at": "2025-08-12T13:20:47.624Z"
        }
    ]
}
```


Closes #8792 


## Checklist
<!-- Put an `x` in the boxes that apply -->

- [X] I formatted the code `cargo +nightly fmt --all`
- [X] I addressed lints thrown by `cargo clippy`
- [X] I reviewed the submitted code
- [ ] I added unit tests for my changes where possible
