Bug: [BUG] GlobalPay throws 501 for mandates



below function is the culprit:

```rs
fn get_payment_method_data(
    item: &PaymentsAuthorizeRouterData,
    brand_reference: Option<String>,
) -> Result<PaymentMethodData, Error> {
    match &item.request.payment_method_data {
        payment_method_data::PaymentMethodData::Card(ccard) => {
            Ok(PaymentMethodData::Card(requests::Card {
                number: ccard.card_number.clone(),
                expiry_month: ccard.card_exp_month.clone(),
                expiry_year: ccard.get_card_expiry_year_2_digit()?,
                cvv: ccard.card_cvc.clone(),
                account_type: None,
                authcode: None,
                avs_address: None,
                avs_postal_code: None,
                brand_reference,
                chip_condition: None,
                funding: None,
                pin_block: None,
                tag: None,
                track: None,
            }))
        }
        payment_method_data::PaymentMethodData::Wallet(wallet_data) => get_wallet_data(wallet_data),
        payment_method_data::PaymentMethodData::BankRedirect(bank_redirect) => {
            PaymentMethodData::try_from(bank_redirect)
        }
        _ => Err(errors::ConnectorError::NotImplemented(
            "Payment methods".to_string(),
        ))?,
    }
}
```

just because `MandatePayment` isn't covered, it falls back to the default case which throws `501`.


relevant docs:

- [Tokenization](https://developer.globalpay.com/api/payment-methods-tokenization#/Create/post-payment-method)
- [MIT](https://developer.globalpay.com/docs/MIT)
- [Recurring](https://developer.globalpay.com/docs/payments/recurring/credentials-on-file)
diff --git a/config/config.example.toml b/config/config.example.toml
index 9454b3f0adc..c6ae6f75ec5 100644
--- a/config/config.example.toml
+++ b/config/config.example.toml
@@ -467,6 +467,7 @@ square = { long_lived_token = false, payment_method = "card" }
 braintree = { long_lived_token = false, payment_method = "card" }
 gocardless = { long_lived_token = true, payment_method = "bank_debit" }
 billwerk = { long_lived_token = false, payment_method = "card" }
+globalpay = { long_lived_token = false, payment_method = "card", flow = "mandates" }
 
 [debit_routing_config]                                       # Debit Routing configs
 supported_currencies = "USD"                                 # Supported currencies for debit routing
diff --git a/config/deployments/integration_test.toml b/config/deployments/integration_test.toml
index ddff65fa9c0..426b3ba808a 100644
--- a/config/deployments/integration_test.toml
+++ b/config/deployments/integration_test.toml
@@ -748,6 +748,7 @@ square = { long_lived_token = false, payment_method = "card" }
 stax = { long_lived_token = true, payment_method = "card,bank_debit" }
 stripe = { long_lived_token = false, payment_method = "wallet", payment_method_type = { list = "google_pay", type = "disable_only" } }
 billwerk = {long_lived_token = false, payment_method = "card"}
+globalpay = { long_lived_token = false, payment_method = "card", flow = "mandates" }
 
 [webhooks]
 outgoing_enabled = true
diff --git a/config/deployments/production.toml b/config/deployments/production.toml
index 11d96d6269f..7c5cc65f2ca 100644
--- a/config/deployments/production.toml
+++ b/config/deployments/production.toml
@@ -758,6 +758,7 @@ square = { long_lived_token = false, payment_method = "card" }
 stax = { long_lived_token = true, payment_method = "card,bank_debit" }
 stripe = { long_lived_token = false, payment_method = "wallet", payment_method_type = { list = "google_pay", type = "disable_only" } }
 billwerk = {long_lived_token = false, payment_method = "card"}
+globalpay = { long_lived_token = false, payment_method = "card", flow = "mandates" }
 
 [webhooks]
 outgoing_enabled = true
diff --git a/config/deployments/sandbox.toml b/config/deployments/sandbox.toml
index a372c873c78..305210ecb64 100644
--- a/config/deployments/sandbox.toml
+++ b/config/deployments/sandbox.toml
@@ -764,6 +764,7 @@ square = { long_lived_token = false, payment_method = "card" }
 stax = { long_lived_token = true, payment_method = "card,bank_debit" }
 stripe = { long_lived_token = false, payment_method = "wallet", payment_method_type = { list = "google_pay", type = "disable_only" } }
 billwerk = {long_lived_token = false, payment_method = "card"}
+globalpay = { long_lived_token = false, payment_method = "card", flow = "mandates" }
 
 [webhooks]
 outgoing_enabled = true
diff --git a/config/development.toml b/config/development.toml
index 173d9363f2a..a3078b05089 100644
--- a/config/development.toml
+++ b/config/development.toml
@@ -895,6 +895,7 @@ braintree = { long_lived_token = false, payment_method = "card" }
 payme = { long_lived_token = false, payment_method = "card" }
 gocardless = { long_lived_token = true, payment_method = "bank_debit" }
 billwerk = { long_lived_token = false, payment_method = "card" }
+globalpay = { long_lived_token = false, payment_method = "card", flow = "mandates" }
 
 [temp_locker_enable_config]
 stripe = { payment_method = "bank_transfer" }
diff --git a/config/docker_compose.toml b/config/docker_compose.toml
index 01abf5e8137..621b437bd28 100644
--- a/config/docker_compose.toml
+++ b/config/docker_compose.toml
@@ -390,6 +390,7 @@ hipay = { long_lived_token = false, payment_method = "card" }
 braintree = { long_lived_token = false, payment_method = "card" }
 gocardless = { long_lived_token = true, payment_method = "bank_debit" }
 billwerk = { long_lived_token = false, payment_method = "card" }
+globalpay = { long_lived_token = false, payment_method = "card", flow = "mandates" }
 
 [temp_locker_enable_config]
 stripe = { payment_method = "bank_transfer" }
diff --git a/crates/hyperswitch_connectors/src/connectors/globalpay.rs b/crates/hyperswitch_connectors/src/connectors/globalpay.rs
index 7e9ad1aa820..215c8322dff 100644
--- a/crates/hyperswitch_connectors/src/connectors/globalpay.rs
+++ b/crates/hyperswitch_connectors/src/connectors/globalpay.rs
@@ -34,7 +34,7 @@ use hyperswitch_domain_models::{
     types::{
         PaymentsAuthorizeRouterData, PaymentsCancelRouterData, PaymentsCaptureRouterData,
         PaymentsCompleteAuthorizeRouterData, PaymentsSyncRouterData, RefundSyncRouterData,
-        RefundsRouterData,
+        RefundsRouterData, TokenizationRouterData,
     },
 };
 use hyperswitch_interfaces::{
@@ -49,7 +49,7 @@ use hyperswitch_interfaces::{
     types::{
         PaymentsAuthorizeType, PaymentsCaptureType, PaymentsCompleteAuthorizeType,
         PaymentsSyncType, PaymentsVoidType, RefreshTokenType, RefundExecuteType, RefundSyncType,
-        Response,
+        Response, TokenizationType,
     },
     webhooks::{IncomingWebhook, IncomingWebhookRequestDetails},
 };
@@ -61,6 +61,7 @@ use response::{
 use serde_json::Value;
 
 use crate::{
+    connectors::globalpay::response::GlobalpayPaymentMethodsResponse,
     constants::headers,
     types::{RefreshTokenRouterData, ResponseRouterData},
     utils::{
@@ -381,7 +382,79 @@ impl api::PaymentToken for Globalpay {}
 impl ConnectorIntegration<PaymentMethodToken, PaymentMethodTokenizationData, PaymentsResponseData>
     for Globalpay
 {
-    // Not Implemented (R)
+    fn get_headers(
+        &self,
+        req: &TokenizationRouterData,
+        connectors: &Connectors,
+    ) -> CustomResult<Vec<(String, masking::Maskable<String>)>, errors::ConnectorError> {
+        self.build_headers(req, connectors)
+    }
+
+    fn get_content_type(&self) -> &'static str {
+        self.common_get_content_type()
+    }
+    fn get_url(
+        &self,
+        _req: &TokenizationRouterData,
+        connectors: &Connectors,
+    ) -> CustomResult<String, errors::ConnectorError> {
+        Ok(format!("{}/payment-methods", self.base_url(connectors),))
+    }
+
+    fn build_request(
+        &self,
+        req: &TokenizationRouterData,
+        connectors: &Connectors,
+    ) -> CustomResult<Option<Request>, errors::ConnectorError> {
+        Ok(Some(
+            RequestBuilder::new()
+                .method(Method::Post)
+                .url(&TokenizationType::get_url(self, req, connectors)?)
+                .attach_default_headers()
+                .headers(TokenizationType::get_headers(self, req, connectors)?)
+                .set_body(TokenizationType::get_request_body(self, req, connectors)?)
+                .build(),
+        ))
+    }
+
+    fn get_request_body(
+        &self,
+        req: &TokenizationRouterData,
+        _connectors: &Connectors,
+    ) -> CustomResult<RequestContent, errors::ConnectorError> {
+        let connector_req = requests::GlobalPayPaymentMethodsRequest::try_from(req)?;
+        Ok(RequestContent::Json(Box::new(connector_req)))
+    }
+
+    fn handle_response(
+        &self,
+        data: &TokenizationRouterData,
+        event_builder: Option<&mut ConnectorEvent>,
+        res: Response,
+    ) -> CustomResult<TokenizationRouterData, errors::ConnectorError> {
+        let response: GlobalpayPaymentMethodsResponse = res
+            .response
+            .parse_struct("GlobalpayPaymentMethodsResponse")
+            .change_context(errors::ConnectorError::ResponseDeserializationFailed)?;
+
+        event_builder.map(|i| i.set_response_body(&response));
+        router_env::logger::info!(connector_response=?response);
+
+        RouterData::try_from(ResponseRouterData {
+            response,
+            data: data.clone(),
+            http_code: res.status_code,
+        })
+        .change_context(errors::ConnectorError::ResponseHandlingFailed)
+    }
+
+    fn get_error_response(
+        &self,
+        res: Response,
+        event_builder: Option<&mut ConnectorEvent>,
+    ) -> CustomResult<ErrorResponse, errors::ConnectorError> {
+        self.build_error_response(res, event_builder)
+    }
 }
 
 impl api::MandateSetup for Globalpay {}
diff --git a/crates/hyperswitch_connectors/src/connectors/globalpay/requests.rs b/crates/hyperswitch_connectors/src/connectors/globalpay/requests.rs
index 45749332081..056e546db20 100644
--- a/crates/hyperswitch_connectors/src/connectors/globalpay/requests.rs
+++ b/crates/hyperswitch_connectors/src/connectors/globalpay/requests.rs
@@ -16,78 +16,17 @@ pub struct GlobalpayCancelRouterData<T> {
 
 #[derive(Debug, Serialize)]
 pub struct GlobalpayPaymentsRequest {
-    /// A meaningful label for the merchant account set by Global Payments.
     pub account_name: Secret<String>,
-    /// The amount to transfer between Payer and Merchant for a SALE or a REFUND. It is always
-    /// represented in the lowest denomiation of the related currency.
     pub amount: Option<StringMinorUnit>,
-    /// Indicates if the merchant would accept an authorization for an amount less than the
-    /// requested amount. This is available for CP channel
-    /// only where the balance not authorized can be processed again using a different card.
-    pub authorization_mode: Option<AuthorizationMode>,
-    /// Indicates whether the transaction is to be captured automatically, later or later using
-    /// more than 1 partial capture.
+    pub currency: String,
+    pub reference: String,
+    pub country: api_models::enums::CountryAlpha2,
     pub capture_mode: Option<CaptureMode>,
-    /// The amount of the transaction that relates to cashback.It is always represented in the
-    /// lowest denomiation of the related currency.
-    pub cashback_amount: Option<StringMinorUnit>,
-    /// Describes whether the transaction was processed in a face to face(CP) scenario or a
-    /// Customer Not Present (CNP) scenario.
+    pub notifications: Option<Notifications>,
+    pub payment_method: GlobalPayPaymentMethodData,
     pub channel: Channel,
-    /// The amount that reflects the charge the merchant applied to the transaction for availing
-    /// of a more convenient purchase.It is always represented in the lowest denomiation of the
-    /// related currency.
-    pub convenience_amount: Option<StringMinorUnit>,
-    /// The country in ISO-3166-1(alpha-2 code) format.
-    pub country: api_models::enums::CountryAlpha2,
-    /// The currency of the amount in ISO-4217(alpha-3)
-    pub currency: String,
-
-    pub currency_conversion: Option<CurrencyConversion>,
-    /// Merchant defined field to describe the transaction.
-    pub description: Option<String>,
-
-    pub device: Option<Device>,
-    /// The amount of the gratuity for a transaction.It is always represented in the lowest
-    /// denomiation of the related currency.
-    pub gratuity_amount: Option<StringMinorUnit>,
-    /// Indicates whether the Merchant or the Payer initiated the creation of a transaction.
     pub initiator: Option<Initiator>,
-    /// Indicates the source IP Address of the system used to create the transaction.
-    pub ip_address: Option<Secret<String, common_utils::pii::IpAddress>>,
-    /// Indicates the language the transaction was executed in. In the format ISO-639-1 (alpha-2)
-    /// or ISO-639-1 (alpha-2)_ISO-3166(alpha-2)
-    pub language: Option<Language>,
-
-    pub lodging: Option<Lodging>,
-    /// Indicates to Global Payments where the merchant wants to receive notifications of certain
-    /// events that occur on the Global Payments system.
-    pub notifications: Option<Notifications>,
-
-    pub order: Option<Order>,
-    /// The merchant's payer reference for the transaction
-    pub payer_reference: Option<String>,
-    pub payment_method: PaymentMethod,
-    /// Merchant defined field to reference the transaction.
-    pub reference: String,
-    /// A merchant defined reference for the location that created the transaction.
-    pub site_reference: Option<String>,
-    /// Stored data information used to create a transaction.
     pub stored_credential: Option<StoredCredential>,
-    /// The amount that reflects the additional charge the merchant applied to the transaction
-    /// for using a specific payment method.It is always represented in the lowest denomiation of
-    /// the related currency.
-    pub surcharge_amount: Option<StringMinorUnit>,
-    /// Indicates the total or expected total of captures that will executed against a
-    /// transaction flagged as being captured multiple times.
-    pub total_capture_count: Option<i64>,
-    /// Describes whether the transaction is a SALE, that moves funds from Payer to Merchant, or
-    /// a REFUND where funds move from Merchant to Payer.
-    #[serde(rename = "type")]
-    pub globalpay_payments_request_type: Option<GlobalpayPaymentsRequestType>,
-    /// The merchant's user reference for the transaction. This represents the person who
-    /// processed the transaction on the merchant's behalf like a clerk or cashier reference.
-    pub user_reference: Option<String>,
 }
 
 #[derive(Debug, Serialize)]
@@ -98,256 +37,60 @@ pub struct GlobalpayRefreshTokenRequest {
     pub grant_type: String,
 }
 
-#[derive(Debug, Serialize, Deserialize)]
-pub struct CurrencyConversion {
-    /// A unique identifier generated by Global Payments to identify the currency conversion. It
-    /// can be used to reference a currency conversion when processing a sale or a refund
-    /// transaction.
-    pub id: Option<String>,
-}
-
-#[derive(Debug, Serialize, Deserialize)]
-pub struct Device {
-    pub capabilities: Option<Capabilities>,
-
-    pub entry_modes: Option<Vec<Vec<DeviceEntryMode>>>,
-    /// Describes whether a device prompts a payer for a gratuity when the payer is entering
-    /// their payment method details to the device.
-    pub gratuity_prompt_mode: Option<GratuityPromptMode>,
-    /// Describes the receipts a device prints when processing a transaction.
-    pub print_receipt_mode: Option<PrintReceiptMode>,
-    /// The sequence number from the device used to align with processing platform.
-    pub sequence_number: Option<Secret<String>>,
-    /// A unique identifier for the physical device. This value persists with the device even if
-    /// it is repurposed.
-    pub serial_number: Option<Secret<String>>,
-    /// The time from the device in ISO8601 format
-    pub time: Option<String>,
-}
-
-#[derive(Debug, Serialize, Deserialize)]
-pub struct Capabilities {
-    pub authorization_modes: Option<Vec<AuthorizationMode>>,
-    /// The number of lines that can be used to display information on the device.
-    pub display_line_count: Option<f64>,
-
-    pub enabled_response: Option<Vec<EnabledResponse>>,
-
-    pub entry_modes: Option<Vec<CapabilitiesEntryMode>>,
-
-    pub fraud: Option<Vec<AuthorizationMode>>,
-
-    pub mobile: Option<Vec<Mobile>>,
-
-    pub payer_verifications: Option<Vec<PayerVerification>>,
-}
-
-#[derive(Debug, Serialize, Deserialize)]
-pub struct Lodging {
-    /// A reference that identifies the booking reference for a lodging stay.
-    pub booking_reference: Option<String>,
-    /// The amount charged for one nights lodging.
-    pub daily_rate_amount: Option<StringMinorUnit>,
-    /// A reference that identifies the booking reference for a lodging stay.
-    pub date_checked_in: Option<String>,
-    /// The check out date for a lodging stay.
-    pub date_checked_out: Option<String>,
-    /// The total number of days of the lodging stay.
-    pub duration_days: Option<f64>,
-    #[serde(rename = "lodging.charge_items")]
-    pub lodging_charge_items: Option<Vec<LodgingChargeItem>>,
-}
-
-#[derive(Debug, Serialize, Deserialize)]
-pub struct LodgingChargeItem {
-    pub payment_method_program_codes: Option<Vec<PaymentMethodProgramCode>>,
-    /// A reference that identifies the charge item, such as a lodging folio number.
-    pub reference: Option<String>,
-    /// The total amount for the list of charge types for a charge item.
-    pub total_amount: Option<StringMinorUnit>,
-
-    pub types: Option<Vec<TypeElement>>,
-}
-
-/// Indicates to Global Payments where the merchant wants to receive notifications of certain
-/// events that occur on the Global Payments system.
 #[derive(Debug, Serialize, Deserialize, Default)]
 pub struct Notifications {
-    /// The merchant URL that will receive the notification when the customer has completed the
-    /// authentication.
-    pub challenge_return_url: Option<String>,
-    /// The merchant URL that will receive the notification when the customer has completed the
-    /// authentication when the authentication is decoupled and separate to the purchase.
-    pub decoupled_challenge_return_url: Option<String>,
-    /// The merchant URL to return the payer to, once the payer has completed payment using the
-    /// payment method. This returns control of the payer's payment experience to the merchant.
     pub return_url: Option<String>,
-    /// The merchant URL to notify the merchant of the latest status of the transaction.
     pub status_url: Option<String>,
-    /// The merchant URL that will receive the notification when the 3DS ACS successfully gathers
-    /// de ice informatiSon and tonotification_configurations.cordingly.
-    pub three_ds_method_return_url: Option<String>,
-    /// The URL on merchant's website to which the customer should be redirected in the event of
-    /// the customer canceling the transaction.
     pub cancel_url: Option<String>,
 }
 
-#[derive(Debug, Serialize, Deserialize)]
-pub struct Order {
-    /// Merchant defined field common to all transactions that are part of the same order.
-    pub reference: Option<String>,
-}
-
 #[derive(Debug, Serialize, Deserialize)]
 #[serde(rename_all = "snake_case")]
 pub enum PaymentMethodData {
     Card(Card),
     Apm(Apm),
-    BankTransfer(BankTransfer),
     DigitalWallet(DigitalWallet),
+    Token(TokenizationData),
 }
 
 #[derive(Debug, Serialize, Deserialize)]
-pub struct PaymentMethod {
+pub struct CommonPaymentMethodData {
     #[serde(flatten)]
     pub payment_method_data: PaymentMethodData,
-    pub authentication: Option<Authentication>,
-    pub encryption: Option<Encryption>,
-    /// Indicates how the payment method information was obtained by the Merchant for this
-    /// transaction.
     pub entry_mode: PaymentMethodEntryMode,
-    /// Indicates whether to execute the fingerprint signature functionality.
-    pub fingerprint_mode: Option<FingerprintMode>,
-    /// Specify the first name of the owner of the payment method.
-    pub first_name: Option<Secret<String>>,
-    /// Unique Global Payments generated id used to reference a stored payment method on the
-    /// Global Payments system. Often referred to as the payment method token. This value can be
-    /// used instead of payment method details such as a card number and expiry date.
-    pub id: Option<Secret<String>>,
-    /// Specify the surname of the owner of the payment method.
-    pub last_name: Option<Secret<String>>,
-    /// The full name of the owner of the payment method.
-    pub name: Option<Secret<String>>,
-    /// Contains the value a merchant wishes to appear on the payer's payment method statement
-    /// for this transaction
-    pub narrative: Option<String>,
-    /// Indicates whether to store the card as part of a transaction.
-    pub storage_mode: Option<CardStorageMode>,
-}
-
-#[derive(Debug, Serialize, Deserialize)]
-pub struct Apm {
-    /// A string used to identify the payment method provider being used to execute this
-    /// transaction.
-    pub provider: Option<ApmProvider>,
-}
-
-/// Information outlining the degree of authentication executed related to a transaction.
-#[derive(Debug, Serialize, Deserialize)]
-pub struct Authentication {
-    /// Information outlining the degree of 3D Secure authentication executed.
-    pub three_ds: Option<ThreeDs>,
-    /// A message authentication code that is used to confirm the security and integrity of the
-    /// messaging to Global Payments.
-    pub mac: Option<String>,
 }
 
-/// Information outlining the degree of 3D Secure authentication executed.
 #[derive(Debug, Serialize, Deserialize)]
-pub struct ThreeDs {
-    /// The reference created by the 3DSecure Directory Server to identify the specific
-    /// authentication attempt.
-    pub ds_trans_reference: Option<String>,
-    /// An indication of the degree of the authentication and liability shift obtained for this
-    /// transaction. It is determined during the 3D Secure process. 2 or 1  for Mastercard
-    /// indicates the merchant has a liability shift. 5 or 6  for Visa or Amex indicates the
-    /// merchant has a liability shift. However for Amex if the payer is not enrolled the eci may
-    /// still be 6 but liability shift has not bee achieved.
-    pub eci: Option<String>,
-    /// Indicates if any exemptions apply to this transaction.
-    pub exempt_status: Option<ExemptStatus>,
-    /// Indicates the version of 3DS
-    pub message_version: Option<String>,
-    /// The reference created by the 3DSecure provider to identify the specific authentication
-    /// attempt.
-    pub server_trans_reference: Option<String>,
-    /// The authentication value created as part of the 3D Secure process.
-    pub value: Option<String>,
+pub struct MandatePaymentMethodData {
+    pub entry_mode: PaymentMethodEntryMode,
+    pub id: Option<String>,
 }
 
 #[derive(Debug, Serialize, Deserialize)]
-pub struct BankTransfer {
-    /// The number or reference for the payer's bank account.
-    pub account_number: Option<Secret<String>>,
-
-    pub bank: Option<Bank>,
-    /// The number or reference for the check
-    pub check_reference: Option<Secret<String>>,
-    /// The type of bank account associated with the payer's bank account.
-    pub number_type: Option<NumberType>,
-    /// Indicates how the transaction was authorized by the merchant.
-    pub sec_code: Option<SecCode>,
-}
-#[derive(Debug, Serialize, Deserialize)]
-pub struct Bank {
-    pub address: Option<Address>,
-    /// The local identifier code for the bank.
-    pub code: Option<Secret<String>>,
-    /// The name of the bank.
-    pub name: Option<String>,
+#[serde(untagged)]
+pub enum GlobalPayPaymentMethodData {
+    Common(CommonPaymentMethodData),
+    Mandate(MandatePaymentMethodData),
 }
 
 #[derive(Debug, Serialize, Deserialize)]
-pub struct Address {
-    /// Merchant defined field common to all transactions that are part of the same order.
-    pub city: Option<Secret<String>>,
-    /// The country in ISO-3166-1(alpha-2 code) format.
-    pub country: Option<String>,
-    /// First line of the address.
-    pub line_1: Option<Secret<String>>,
-    /// Second line of the address.
-    pub line_2: Option<Secret<String>>,
-    /// Third  line of the address.
-    pub line_3: Option<Secret<String>>,
-    /// The city or town of the address.
-    pub postal_code: Option<Secret<String>>,
-    /// The state or region of the address. ISO 3166-2 minus the country code itself. For
-    /// example, US Illinois = IL, or in the case of GB counties Wiltshire = WI or Aberdeenshire
-    /// = ABD
-    pub state: Option<String>,
+pub struct Apm {
+    /// A string used to identify the payment method provider being used to execute this
+    /// transaction.
+    pub provider: Option<ApmProvider>,
 }
 
 #[derive(Debug, Default, Serialize, Deserialize)]
 pub struct Card {
-    /// The card providers description of their card product.
-    pub account_type: Option<String>,
-    /// Code generated when the card is successfully authorized.
-    pub authcode: Option<Secret<String>>,
-    /// First line of the address associated with the card.
-    pub avs_address: Option<String>,
-    /// Postal code of the address associated with the card.
-    pub avs_postal_code: Option<String>,
-    /// The unique reference created by the brands/schemes to uniquely identify the transaction.
-    pub brand_reference: Option<String>,
-    /// Indicates if a fallback mechanism was used to obtain the card information when EMV/chip
-    /// did not work as expected.
-    pub chip_condition: Option<ChipCondition>,
-    /// The numeric value printed on the physical card.
     pub cvv: Secret<String>,
-    /// The 2 digit expiry date month of the card.
     pub expiry_month: Secret<String>,
-    /// The 2 digit expiry date year of the card.
     pub expiry_year: Secret<String>,
-    /// Indicates whether the card is a debit or credit card.
-    pub funding: Option<Funding>,
-    /// The card account number used to authorize the transaction. Also known as PAN.
     pub number: cards::CardNumber,
-    /// Contains the pin block info, relating to the pin code the Payer entered.
-    pub pin_block: Option<Secret<String>>,
-    /// The full card tag data for an EMV/chip card transaction.
-    pub tag: Option<Secret<String>>,
-    /// Data from magnetic stripe of a card
-    pub track: Option<Secret<String>>,
+}
+
+#[derive(Debug, Default, Serialize, Deserialize)]
+pub struct TokenizationData {
+    pub brand_reference: Option<String>,
 }
 
 #[derive(Debug, Serialize, Deserialize)]
@@ -358,16 +101,6 @@ pub struct DigitalWallet {
     pub payment_token: Option<serde_json::Value>,
 }
 
-#[derive(Debug, Serialize, Deserialize)]
-pub struct Encryption {
-    /// The encryption info used when sending encrypted card data to Global Payments.
-    pub info: Option<Secret<String>>,
-    /// The encryption method used when sending encrypted card data to Global Payments.
-    pub method: Option<Method>,
-    /// The version of encryption being used.
-    pub version: Option<String>,
-}
-
 /// Stored data information used to create a transaction.
 #[derive(Debug, Serialize, Deserialize)]
 pub struct StoredCredential {
@@ -379,22 +112,6 @@ pub struct StoredCredential {
     pub sequence: Option<Sequence>,
 }
 
-/// Indicates if the merchant would accept an authorization for an amount less than the
-/// requested amount. This is available for CP channel
-/// only where the balance not authorized can be processed again using a different card.
-///
-/// Describes the instruction a device can indicate to the clerk in the case of fraud.
-#[derive(Debug, Serialize, Deserialize)]
-#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
-pub enum AuthorizationMode {
-    /// Indicates merchant would accept an authorization for an amount less than the
-    /// requested amount.
-    ///  pub example: PARTIAL
-    ///
-    /// Describes whether the device can process partial authorizations.
-    Partial,
-}
-
 /// Indicates whether the transaction is to be captured automatically, later or later using
 /// more than 1 partial capture.
 #[derive(Debug, Serialize, Deserialize)]
@@ -432,88 +149,6 @@ pub enum Channel {
     CustomerPresent,
 }
 
-/// Describes the data the device can handle when it receives a response for a card
-/// authorization.
-#[derive(Debug, Serialize, Deserialize)]
-#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
-pub enum EnabledResponse {
-    Avs,
-    BrandReference,
-    Cvv,
-    MaskedNumberLast4,
-}
-
-/// Describes the entry mode capabilities a device has.
-#[derive(Debug, Serialize, Deserialize)]
-#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
-pub enum CapabilitiesEntryMode {
-    Chip,
-    Contactless,
-    ContactlessSwipe,
-    Manual,
-    Swipe,
-}
-
-/// Describes the mobile features a device has
-#[derive(Debug, Serialize, Deserialize)]
-#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
-pub enum Mobile {
-    IntegratedCardReader,
-    SeparateCardReader,
-}
-
-/// Describes the capabilities a device has to verify a payer.
-#[derive(Debug, Serialize, Deserialize)]
-#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
-pub enum PayerVerification {
-    ContactlessSignature,
-    PayerDevice,
-    Pinpad,
-}
-
-/// Describes the allowed entry modes to obtain payment method information from the payer as
-/// part of a transaction request.
-#[derive(Debug, Serialize, Deserialize)]
-#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
-pub enum DeviceEntryMode {
-    Chip,
-    Contactless,
-    Manual,
-    Swipe,
-}
-
-/// Describes whether a device prompts a payer for a gratuity when the payer is entering
-/// their payment method details to the device.
-#[derive(Debug, Serialize, Deserialize)]
-#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
-pub enum GratuityPromptMode {
-    NotRequired,
-    Prompt,
-}
-
-/// Describes the receipts a device prints when processing a transaction.
-#[derive(Debug, Serialize, Deserialize)]
-#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
-pub enum PrintReceiptMode {
-    Both,
-    Merchant,
-    None,
-    Payer,
-}
-
-/// Describes whether the transaction is a SALE, that moves funds from Payer to Merchant, or
-/// a REFUND where funds move from Merchant to Payer.
-#[derive(Debug, Serialize, Deserialize)]
-#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
-pub enum GlobalpayPaymentsRequestType {
-    /// indicates the movement, or the attempt to move, funds from merchant to the
-    /// payer.
-    Refund,
-    /// indicates the movement, or the attempt to move, funds from payer to a
-    /// merchant.
-    Sale,
-}
-
 /// Indicates whether the Merchant or the Payer initiated the creation of a transaction.
 #[derive(Debug, Serialize, Deserialize)]
 #[serde(rename_all = "SCREAMING_SNAKE_CASE")]
@@ -525,45 +160,6 @@ pub enum Initiator {
     Payer,
 }
 
-/// Indicates the language the transaction was executed in. In the format ISO-639-1 (alpha-2)
-/// or ISO-639-1 (alpha-2)_ISO-3166(alpha-2)
-#[derive(Debug, Serialize, Deserialize)]
-pub enum Language {
-    #[serde(rename = "fr")]
-    Fr,
-    #[serde(rename = "fr_CA")]
-    FrCa,
-    #[serde(rename = "ISO-639(alpha-2)")]
-    Iso639Alpha2,
-    #[serde(rename = "ISO-639(alpha-2)_ISO-3166(alpha-2)")]
-    Iso639alpha2Iso3166alpha2,
-}
-
-/// Describes the payment method programs, typically run by card brands such as Amex, Visa
-/// and MC.
-#[derive(Debug, Serialize, Deserialize)]
-#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
-pub enum PaymentMethodProgramCode {
-    AssuredReservation,
-    CardDeposit,
-    Other,
-    Purchase,
-}
-
-/// Describes the types of charges associated with a transaction. This can be one or more
-/// than more charge type.
-#[derive(Debug, Serialize, Deserialize)]
-#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
-pub enum TypeElement {
-    GiftShop,
-    Laundry,
-    MiniBar,
-    NoShow,
-    Other,
-    Phone,
-    Restaurant,
-}
-
 /// A string used to identify the payment method provider being used to execute this
 /// transaction.
 #[derive(Debug, Serialize, Deserialize)]
@@ -577,87 +173,6 @@ pub enum ApmProvider {
     Testpay,
 }
 
-/// Indicates if any exemptions apply to this transaction.
-#[derive(Debug, Serialize, Deserialize)]
-#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
-pub enum ExemptStatus {
-    LowValue,
-    ScaDelegation,
-    SecureCorporatePayment,
-    TransactionRiskAnalysis,
-    TrustedMerchant,
-}
-
-/// The type of bank account associated with the payer's bank account.
-#[derive(Debug, Serialize, Deserialize)]
-#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
-pub enum NumberType {
-    Checking,
-    Savings,
-}
-
-/// Indicates how the transaction was authorized by the merchant.
-#[derive(Debug, Serialize, Deserialize)]
-#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
-pub enum SecCode {
-    /// Cash Concentration or Disbursement - Can be either a credit or debit application
-    /// where funds are wither distributed or consolidated between corporate entities.
-    #[serde(rename = "CCD")]
-    CashConcentrationOrDisbursement,
-
-    /// Point of Sale Entry - Point of sale debit applications non-shared (POS)
-    /// environment. These transactions are most often initiated by the consumer via a plastic
-    /// access card. This is only support for normal ACH transactions
-    #[serde(rename = "POP")]
-    PointOfSaleEntry,
-    /// Prearranged Payment and Deposits - used to credit or debit a consumer account.
-    /// Popularity used for payroll direct deposits and pre-authorized bill payments.
-    #[serde(rename = "PPD")]
-    PrearrangedPaymentAndDeposits,
-    /// Telephone-Initiated Entry - Used for the origination of a single entry debit
-    /// transaction to a consumer's account pursuant to a verbal authorization obtained from the
-    /// consumer via the telephone.
-    #[serde(rename = "TEL")]
-    TelephoneInitiatedEntry,
-    /// Internet (Web)-Initiated Entry - Used for the origination of debit entries
-    /// (either Single or Recurring Entry) to a consumer's account pursuant to a to an
-    /// authorization that is obtained from the Receiver via the Internet.
-    #[serde(rename = "WEB")]
-    WebInitiatedEntry,
-}
-
-/// Indicates if a fallback mechanism was used to obtain the card information when EMV/chip
-/// did not work as expected.
-#[derive(Debug, Serialize, Deserialize)]
-#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
-pub enum ChipCondition {
-    /// indicates the previous transaction with this card failed.
-    PrevFailed,
-    /// indicates the previous transaction with this card was a success.
-    PrevSuccess,
-}
-
-/// Indicates whether the card is a debit or credit card.
-#[derive(Debug, Serialize, Deserialize)]
-#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
-pub enum Funding {
-    /// indicates the card is an, Electronic Benefits Transfer, for cash
-    /// benefits.
-    CashBenefits,
-    /// indicates the card is a credit card where the funds may be available on credit
-    /// to the payer to fulfill the transaction amount.
-    Credit,
-    /// indicates the card is a debit card where the funds may be present in an account
-    /// to fulfill the transaction amount.
-    Debit,
-    /// indicates the card is an, Electronic Benefits Transfer, for food stamps.
-    FoodStamp,
-    /// indicates the card is a prepaid card where the funds are loaded to the card
-    /// account to fulfill the transaction amount. Unlike a debit card, a prepaid is not linked
-    /// to a bank account.
-    Prepaid,
-}
-
 /// Identifies who provides the digital wallet for the Payer.
 #[derive(Debug, Serialize, Deserialize)]
 #[serde(rename_all = "SCREAMING_SNAKE_CASE")]
@@ -666,27 +181,6 @@ pub enum DigitalWalletProvider {
     PayByGoogle,
 }
 
-/// Indicates if the actual card number or a token is being used to process the
-/// transaction.
-#[derive(Debug, Serialize, Deserialize)]
-#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
-pub enum TokenFormat {
-    /// The value in the digital wallet token field is a real card number
-    /// (PAN)
-    CardNumber,
-    /// The value in the digital wallet token field is a temporary token in the
-    /// format of a card number (PAN) but is not a real card number.
-    CardToken,
-}
-
-/// The encryption method used when sending encrypted card data to Global Payments.
-#[derive(Debug, Serialize, Deserialize)]
-#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
-pub enum Method {
-    Ksn,
-    Ktb,
-}
-
 /// Indicates how the payment method information was obtained by the Merchant for this
 /// transaction.
 #[derive(Debug, Default, Serialize, Deserialize)]
@@ -727,30 +221,6 @@ pub enum PaymentMethodEntryMode {
     Swipe,
 }
 
-/// Indicates whether to execute the fingerprint signature functionality.
-#[derive(Debug, Serialize, Deserialize)]
-#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
-pub enum FingerprintMode {
-    /// Always check and create the fingerprint value regardless of the result of the
-    /// card authorization.
-    Always,
-    /// Always check and create the fingerprint value when the card authorization
-    /// is successful.
-    OnSuccess,
-}
-
-/// Indicates whether to store the card as part of a transaction.
-#[derive(Debug, Serialize, Deserialize)]
-#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
-pub enum CardStorageMode {
-    /// ///  The card information is always stored irrespective of whether the payment
-    /// method authorization was successful or not.
-    Always,
-    /// The card information is only stored if the payment method authorization was
-    /// successful.
-    OnSuccess,
-}
-
 /// Indicates the transaction processing model being executed when using stored
 /// credentials.
 #[derive(Debug, Serialize, Deserialize)]
@@ -775,17 +245,6 @@ pub enum Model {
     Unscheduled,
 }
 
-/// The reason stored credentials are being used to create a transaction.
-#[derive(Debug, Serialize, Deserialize)]
-#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
-pub enum Reason {
-    Delayed,
-    Incremental,
-    NoShow,
-    Reauthorization,
-    Resubmission,
-}
-
 /// Indicates the order of this transaction in the sequence of a planned repeating
 /// transaction processing model.
 #[derive(Debug, Serialize, Deserialize)]
@@ -812,3 +271,34 @@ pub struct GlobalpayCaptureRequest {
 pub struct GlobalpayCancelRequest {
     pub amount: Option<StringMinorUnit>,
 }
+
+#[derive(Default, Debug, Serialize, Deserialize)]
+#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
+pub enum UsageMode {
+    /// This value must be used if using the Hosted Fields or the Drop-in UI integration types.
+    /// When creating the payment method token, this option ensures the payment method token is temporary and will be removed once a transaction is executed or after a short period of time.
+    #[default]
+    Single,
+    /// When creating the payment method token, this indicates it is permanent and can be used to create many transactions.
+    Multiple,
+    /// When using the payment method token to transaction process, this indicates to use the card number also known as the PAN or FPAN when both the card number and the network token are available.
+    UseCardNumber,
+    /// When using the payment method token to transaction process, this indicates to use the network token instead of the card number if both are available.
+    UseNetworkToken,
+}
+
+#[derive(Default, Debug, Serialize, Deserialize)]
+pub struct GlobalPayPayer {
+    /// Unique identifier for the Payer on the Global Payments system.
+    #[serde(rename = "id", skip_serializing_if = "Option::is_none")]
+    pub payer_id: Option<String>,
+}
+
+#[derive(Default, Debug, Serialize)]
+pub struct GlobalPayPaymentMethodsRequest {
+    pub reference: String,
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub usage_mode: Option<UsageMode>,
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub card: Option<Card>,
+}
diff --git a/crates/hyperswitch_connectors/src/connectors/globalpay/response.rs b/crates/hyperswitch_connectors/src/connectors/globalpay/response.rs
index 11bd9e1a047..daa629641e6 100644
--- a/crates/hyperswitch_connectors/src/connectors/globalpay/response.rs
+++ b/crates/hyperswitch_connectors/src/connectors/globalpay/response.rs
@@ -3,75 +3,17 @@ use common_utils::types::StringMinorUnit;
 use masking::Secret;
 use serde::{Deserialize, Serialize};
 
-use super::requests;
 use crate::utils::deserialize_optional_currency;
 
 #[derive(Debug, Serialize, Deserialize)]
 pub struct GlobalpayPaymentsResponse {
-    /// A unique identifier for the merchant account set by Global Payments.
-    pub account_id: Option<Secret<String>>,
-    /// A meaningful label for the merchant account set by Global Payments.
-    pub account_name: Option<Secret<String>>,
-    /// Information about the Action executed.
-    pub action: Option<Action>,
-    /// The amount to transfer between Payer and Merchant for a SALE or a REFUND. It is always
-    /// represented in the lowest denomiation of the related currency.
+    pub status: GlobalpayPaymentStatus,
+    pub payment_method: Option<PaymentMethod>,
+    pub id: String,
     pub amount: Option<StringMinorUnit>,
-    /// Indicates if the merchant would accept an authorization for an amount less than the
-    /// requested amount. This is available for CP channel
-    /// only where the balance not authorized can be processed again using a different card.
-    pub authorization_mode: Option<requests::AuthorizationMode>,
-    /// A Global Payments created reference that uniquely identifies the batch.
-    pub batch_id: Option<String>,
-    /// Indicates whether the transaction is to be captured automatically, later or later using
-    /// more than 1 partial capture.
-    pub capture_mode: Option<requests::CaptureMode>,
-    /// Describes whether the transaction was processed in a face to face(CP) scenario or a
-    /// Customer Not Present (CNP) scenario.
-    pub channel: Option<requests::Channel>,
-    /// The country in ISO-3166-1(alpha-2 code) format.
-    pub country: Option<String>,
-    /// The currency of the amount in ISO-4217(alpha-3)
     #[serde(deserialize_with = "deserialize_optional_currency")]
     pub currency: Option<Currency>,
-    /// Information relating to a currency conversion.
-    pub currency_conversion: Option<requests::CurrencyConversion>,
-    /// A unique identifier generated by Global Payments to identify the transaction.
-    pub id: String,
-    /// A unique identifier for the merchant set by Global Payments.
-    pub merchant_id: Option<String>,
-    /// A meaningful label for the merchant set by Global Payments.
-    pub merchant_name: Option<Secret<String>>,
-    pub payment_method: Option<PaymentMethod>,
-    /// Merchant defined field to reference the transaction.
     pub reference: Option<String>,
-    /// Indicates where a transaction is in its lifecycle.
-    pub status: GlobalpayPaymentStatus,
-    /// Global Payments time indicating when the object was created in ISO-8601 format.
-    pub time_created: Option<String>,
-    /// Describes whether the transaction is a SALE, that moves funds from Payer to Merchant, or
-    /// a REFUND where funds move from Merchant to Payer.
-    #[serde(rename = "type")]
-    pub globalpay_payments_response_type: Option<requests::GlobalpayPaymentsRequestType>,
-}
-
-/// Information about the Action executed.
-#[derive(Debug, Serialize, Deserialize)]
-pub struct Action {
-    /// The id of the app that was used to create the token.
-    pub app_id: Option<Secret<String>>,
-    /// The name of the app the user gave to the application.
-    pub app_name: Option<Secret<String>>,
-    /// A unique identifier for the object created by Global Payments. The first 3 characters
-    /// identifies the resource an id relates to.
-    pub id: Option<Secret<String>>,
-    /// The result of the action executed.
-    pub result_code: Option<ResultCode>,
-    /// Global Payments time indicating when the object was created in ISO-8601 format.
-    pub time_created: Option<String>,
-    /// Indicates the action taken.
-    #[serde(rename = "type")]
-    pub action_type: Option<ActionType>,
 }
 
 #[derive(Debug, Deserialize, Serialize)]
@@ -86,230 +28,25 @@ pub struct GlobalpayRefreshTokenErrorResponse {
     pub detailed_error_description: String,
 }
 
-/// Information relating to a currency conversion.
-#[derive(Debug, Serialize, Deserialize)]
-pub struct CurrencyConversion {
-    /// The percentage commission taken for providing the currency conversion.
-    pub commission_percentage: Option<String>,
-    /// The exchange rate used to convert one currency to another.
-    pub conversion_rate: Option<String>,
-    /// The source of the base exchange rate was obtained to execute the currency conversion.
-    pub exchange_rate_source: Option<String>,
-    /// The time the base exchange rate was obtained from the source.
-    pub exchange_source_time: Option<String>,
-    /// The exchange rate used to convert one currency to another.
-    pub margin_rate_percentage: Option<String>,
-    /// The amount that will affect the payer's account.
-    pub payer_amount: Option<StringMinorUnit>,
-    /// The currency of the amount that will affect the payer's account.
-    pub payer_currency: Option<String>,
-}
-
 #[derive(Debug, Serialize, Deserialize)]
 pub struct PaymentMethod {
-    /// Data associated with the response of an APM transaction.
     pub apm: Option<Apm>,
-    /// Information outlining the degree of authentication executed related to a transaction.
-    pub authentication: Option<Authentication>,
-    pub bank_transfer: Option<BankTransfer>,
     pub card: Option<Card>,
-    pub digital_wallet: Option<requests::DigitalWallet>,
-    /// Indicates how the payment method information was obtained by the Merchant for this
-    /// transaction.
-    pub entry_mode: Option<requests::PaymentMethodEntryMode>,
-    /// If enabled, this field contains the unique fingerprint signature for that payment method
-    /// for that merchant. If the payment method is seen again this same value is generated. For
-    /// cards the primary account number is checked only. The expiry date or the CVV is not used
-    /// for this check.
-    pub fingerprint: Option<Secret<String>>,
-    /// If enabled, this field indicates whether the payment method has been seen before or is
-    /// new.
-    /// * EXISTS -  Indicates that the payment method was seen on the platform before by this
-    ///   merchant.
-    /// * NEW - Indicates that the payment method was not seen on the platform before by this
-    ///   merchant.
-    pub fingerprint_presence_indicator: Option<String>,
-    /// Unique Global Payments generated id used to reference a stored payment method on the
-    /// Global Payments system. Often referred to as the payment method token. This value can be
-    /// used instead of payment method details such as a card number and expiry date.
     pub id: Option<Secret<String>>,
-    /// Result message from the payment method provider corresponding to the result code.
     pub message: Option<String>,
-    /// Result code from the payment method provider.
-    /// If a card authorization declines, the payment_method result and message include more detail from the Issuer on why it was declined.
-    /// For example, 51 - INSUFFICIENT FUNDS. This is generated by the issuing bank, who will provide decline codes in the response back to the authorization platform.
     pub result: Option<String>,
 }
 
 /// Data associated with the response of an APM transaction.
 #[derive(Debug, Serialize, Deserialize)]
 pub struct Apm {
-    pub bank: Option<Bank>,
-    /// A string generated by the payment method that represents to what degree the merchant is
-    /// funded for the transaction.
-    #[serde(skip_deserializing)]
-    pub fund_status: Option<FundStatus>,
-    pub mandate: Option<Mandate>,
-    /// A string used to identify the payment method provider being used to execute this
-    /// transaction.
-    pub provider: Option<ApmProvider>,
-    /// A name of the payer from the payment method system.
-    pub provider_payer_name: Option<Secret<String>>,
-    /// The time the payment method provider created the transaction at on their system.
-    pub provider_time_created: Option<String>,
-    /// The reference the payment method provider created for the transaction.
-    pub provider_transaction_reference: Option<String>,
-    /// URL to redirect the payer from the merchant's system to the payment method's system.
-    //1)paypal sends redirect_url as provider_redirect_url for require_customer_action
-    //2)bankredirects sends redirect_url as redirect_url for require_customer_action
-    //3)after completeauthorize in paypal it doesn't send redirect_url
-    //4)after customer action in bankredirects it sends empty string in redirect_url
     #[serde(alias = "provider_redirect_url")]
     pub redirect_url: Option<String>,
-    /// A string generated by the payment method to represent the session created on the payment
-    /// method's platform to facilitate the creation of a transaction.
-    pub session_token: Option<Secret<String>>,
-    pub payment_description: Option<String>,
-}
-
-#[derive(Debug, Serialize, Deserialize)]
-pub struct Bank {
-    /// The local identifier of the bank account.
-    pub account_number: Option<Secret<String>>,
-    /// The local identifier of the bank.
-    pub code: Option<Secret<String>>,
-    /// The international identifier of the bank account.
-    pub iban: Option<Secret<String>>,
-    /// The international identifier code for the bank.
-    pub identifier_code: Option<Secret<String>>,
-    /// The name associated with the bank account
-    pub name: Option<Secret<String>>,
-}
-
-#[derive(Debug, Serialize, Deserialize)]
-pub struct Mandate {
-    /// The reference to identify the mandate.
-    pub code: Option<Secret<String>>,
-}
-
-/// Information outlining the degree of authentication executed related to a transaction.
-#[derive(Debug, Serialize, Deserialize)]
-pub struct Authentication {
-    /// Information outlining the degree of 3D Secure authentication executed.
-    pub three_ds: Option<ThreeDs>,
-}
-
-/// Information outlining the degree of 3D Secure authentication executed.
-#[derive(Debug, Serialize, Deserialize)]
-pub struct ThreeDs {
-    /// The result of the three_ds value validation by the brands or issuing bank.
-    pub value_result: Option<String>,
-}
-
-#[derive(Debug, Serialize, Deserialize)]
-pub struct BankTransfer {
-    /// The last 4 characters of the local reference for a bank account number.
-    pub masked_number_last4: Option<String>,
-    /// The name of the bank.
-    pub name: Option<Secret<String>>,
-    /// The type of bank account associated with the payer's bank account.
-    pub number_type: Option<NumberType>,
 }
 
 #[derive(Debug, Serialize, Deserialize)]
 pub struct Card {
-    /// Code generated when the card is successfully authorized.
-    pub authcode: Option<Secret<String>>,
-    /// The recommended AVS action to be taken by the agent processing the card transaction.
-    pub avs_action: Option<String>,
-    /// The result of the AVS address check.
-    pub avs_address_result: Option<String>,
-    /// The result of the AVS postal code check.
-    pub avs_postal_code_result: Option<String>,
-    /// Indicates the card brand that issued the card.
-    pub brand: Option<Brand>,
-    /// The unique reference created by the brands/schemes to uniquely identify the transaction.
     pub brand_reference: Option<Secret<String>>,
-    /// The time returned by the card brand indicating when the transaction was processed on
-    /// their system.
-    pub brand_time_reference: Option<String>,
-    /// The result of the CVV check.
-    pub cvv_result: Option<String>,
-    /// Masked card number with last 4 digits showing.
-    pub masked_number_last4: Option<String>,
-    /// The result codes directly from the card issuer.
-    pub provider: Option<ProviderClass>,
-    /// The card EMV tag response data from the card issuer for a contactless or chip card
-    /// transaction.
-    pub tag_response: Option<Secret<String>>,
-}
-
-/// The result codes directly from the card issuer.
-#[derive(Debug, Serialize, Deserialize)]
-pub struct ProviderClass {
-    /// The result code of the AVS address check from the card issuer.
-    #[serde(rename = "card.provider.avs_address_result")]
-    pub card_provider_avs_address_result: Option<String>,
-    /// The result of the AVS postal code check from the card issuer..
-    #[serde(rename = "card.provider.avs_postal_code_result")]
-    pub card_provider_avs_postal_code_result: Option<String>,
-    /// The result code of the AVS check from the card issuer.
-    #[serde(rename = "card.provider.avs_result")]
-    pub card_provider_avs_result: Option<String>,
-    /// The result code of the CVV check from the card issuer.
-    #[serde(rename = "card.provider.cvv_result")]
-    pub card_provider_cvv_result: Option<String>,
-    /// Result code from the card issuer.
-    #[serde(rename = "card.provider.result")]
-    pub card_provider_result: Option<String>,
-}
-
-/// The result of the action executed.
-#[derive(Debug, Serialize, Deserialize)]
-#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
-pub enum ResultCode {
-    Declined,
-    Success,
-    Pending,
-    Error,
-}
-
-/// Indicates the specific action taken.
-#[derive(Debug, Serialize, Deserialize)]
-#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
-pub enum ActionType {
-    Adjust,
-    Authorize,
-    Capture,
-    Confirm,
-    Force,
-    Increment,
-    Initiate,
-    MultipleCapture,
-    Preauthorize,
-    PreauthorizeMultipleCapturere,
-    Authorization,
-    RedirectFrom,
-    RedirectTo,
-    Refund,
-    Hold,
-    Release,
-    Reverse,
-    Split,
-    StatusNotification,
-    TransactionList,
-    TransactionSingle,
-}
-
-/// A string generated by the payment method that represents to what degree the merchant is
-/// funded for the transaction.
-#[derive(Debug, Serialize, Deserialize)]
-#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
-pub enum FundStatus {
-    Missing,
-    NotExpected,
-    Received,
-    Waiting,
 }
 
 /// A string used to identify the payment method provider being used to execute this
@@ -325,49 +62,6 @@ pub enum ApmProvider {
     Testpay,
 }
 
-/// The type of bank account associated with the payer's bank account.
-#[derive(Debug, Serialize, Deserialize)]
-#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
-pub enum NumberType {
-    Checking,
-    Savings,
-}
-
-/// The recommended AVS action to be taken by the agent processing the card transaction.
-#[derive(Debug, Serialize, Deserialize)]
-#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
-pub enum AvsAction {
-    Accept,
-    Decline,
-    Prompt,
-}
-
-/// The result of the AVS address check.
-///
-/// The result of the AVS postal code check.
-///
-/// The result of the CVV check.
-#[derive(Debug, Serialize, Deserialize)]
-#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
-pub enum GlobalPayResult {
-    Matched,
-    NotChecked,
-    NotMatched,
-}
-
-/// Indicates the card brand that issued the card.
-#[derive(Debug, Serialize, Deserialize)]
-#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
-pub enum Brand {
-    Amex,
-    Cup,
-    Diners,
-    Discover,
-    Jcb,
-    Mastercard,
-    Visa,
-}
-
 /// Indicates where a transaction is in its lifecycle.
 #[derive(Clone, Copy, Debug, Serialize, Deserialize)]
 #[serde(rename_all = "SCREAMING_SNAKE_CASE")]
@@ -417,3 +111,22 @@ pub enum GlobalpayWebhookStatus {
     #[serde(other)]
     Unknown,
 }
+
+#[derive(Debug, Serialize, Deserialize)]
+#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
+pub enum GlobalpayPaymentMethodStatus {
+    /// The entity is ACTIVE and can be used.
+    Active,
+    /// The entity is INACTIVE and cannot be used.
+    Inactive,
+    /// The status is DELETED. Once returned in an action response for a resource.
+    /// The resource has been removed from the platform.
+    Delete,
+}
+
+#[derive(Debug, Serialize, Deserialize)]
+pub struct GlobalpayPaymentMethodsResponse {
+    #[serde(rename = "id")]
+    pub payment_method_token_id: Option<Secret<String>>,
+    pub card: Card,
+}
diff --git a/crates/hyperswitch_connectors/src/connectors/globalpay/transformers.rs b/crates/hyperswitch_connectors/src/connectors/globalpay/transformers.rs
index a7fd9abd2f8..e4239d28395 100644
--- a/crates/hyperswitch_connectors/src/connectors/globalpay/transformers.rs
+++ b/crates/hyperswitch_connectors/src/connectors/globalpay/transformers.rs
@@ -8,7 +8,7 @@ use common_utils::{
 use error_stack::ResultExt;
 use hyperswitch_domain_models::{
     payment_method_data,
-    router_data::{AccessToken, ConnectorAuthType, ErrorResponse, RouterData},
+    router_data::{AccessToken, ConnectorAuthType, ErrorResponse, PaymentMethodToken, RouterData},
     router_flow_types::{Execute, RSync},
     router_request_types::ResponseId,
     router_response_types::{
@@ -17,6 +17,7 @@ use hyperswitch_domain_models::{
     types::{
         PaymentsAuthorizeRouterData, PaymentsCancelRouterData, PaymentsCaptureRouterData,
         PaymentsSyncRouterData, RefreshTokenRouterData, RefundExecuteRouterData, RefundsRouterData,
+        TokenizationRouterData,
     },
 };
 use hyperswitch_interfaces::{
@@ -37,10 +38,14 @@ use super::{
     response::{GlobalpayPaymentStatus, GlobalpayPaymentsResponse, GlobalpayRefreshTokenResponse},
 };
 use crate::{
+    connectors::globalpay::{
+        requests::CommonPaymentMethodData, response::GlobalpayPaymentMethodsResponse,
+    },
     types::{PaymentsSyncResponseRouterData, RefundsResponseRouterData, ResponseRouterData},
     utils::{
         self, construct_captures_response_hashmap, CardData, ForeignTryFrom,
-        MultipleCaptureSyncResponse, PaymentsAuthorizeRequestData, RouterData as _, WalletData,
+        MultipleCaptureSyncResponse, PaymentMethodTokenizationRequestData,
+        PaymentsAuthorizeRequestData, RouterData as _, WalletData,
     },
 };
 
@@ -82,65 +87,115 @@ impl TryFrom<&Option<pii::SecretSerdeValue>> for GlobalPayMeta {
 
 impl TryFrom<&GlobalPayRouterData<&PaymentsAuthorizeRouterData>> for GlobalpayPaymentsRequest {
     type Error = Error;
+
     fn try_from(
         item: &GlobalPayRouterData<&PaymentsAuthorizeRouterData>,
     ) -> Result<Self, Self::Error> {
+        if item.router_data.is_three_ds() {
+            return Err(errors::ConnectorError::NotSupported {
+                message: "3DS flow".to_string(),
+                connector: "Globalpay",
+            }
+            .into());
+        }
+
         let metadata = GlobalPayMeta::try_from(&item.router_data.connector_meta_data)?;
         let account_name = metadata.account_name;
-        let (initiator, stored_credential, brand_reference) =
-            get_mandate_details(item.router_data)?;
-        let payment_method_data = get_payment_method_data(item.router_data, brand_reference)?;
+
+        let (initiator, stored_credential, connector_mandate_id) =
+            if item.router_data.request.is_mandate_payment() {
+                let connector_mandate_id =
+                    item.router_data
+                        .request
+                        .mandate_id
+                        .as_ref()
+                        .and_then(|mandate_ids| match &mandate_ids.mandate_reference_id {
+                            Some(api_models::payments::MandateReferenceId::ConnectorMandateId(
+                                connector_mandate_ids,
+                            )) => connector_mandate_ids.get_connector_mandate_id(),
+                            _ => None,
+                        });
+
+                let initiator = Some(match item.router_data.request.off_session {
+                    Some(true) => Initiator::Merchant,
+                    _ => Initiator::Payer,
+                });
+
+                let stored_credential = Some(StoredCredential {
+                    model: Some(if connector_mandate_id.is_some() {
+                        requests::Model::Recurring
+                    } else {
+                        requests::Model::Unscheduled
+                    }),
+                    sequence: Some(if connector_mandate_id.is_some() {
+                        Sequence::Subsequent
+                    } else {
+                        Sequence::First
+                    }),
+                });
+
+                (initiator, stored_credential, connector_mandate_id)
+            } else {
+                (None, None, None)
+            };
+
+        let payment_method = match &item.router_data.request.payment_method_data {
+            payment_method_data::PaymentMethodData::Card(ccard) => {
+                requests::GlobalPayPaymentMethodData::Common(CommonPaymentMethodData {
+                    payment_method_data: PaymentMethodData::Card(requests::Card {
+                        number: ccard.card_number.clone(),
+                        expiry_month: ccard.card_exp_month.clone(),
+                        expiry_year: ccard.get_card_expiry_year_2_digit()?,
+                        cvv: ccard.card_cvc.clone(),
+                    }),
+                    entry_mode: Default::default(),
+                })
+            }
+
+            payment_method_data::PaymentMethodData::Wallet(wallet_data) => {
+                requests::GlobalPayPaymentMethodData::Common(CommonPaymentMethodData {
+                    payment_method_data: get_wallet_data(wallet_data)?,
+                    entry_mode: Default::default(),
+                })
+            }
+
+            payment_method_data::PaymentMethodData::BankRedirect(bank_redirect) => {
+                requests::GlobalPayPaymentMethodData::Common(CommonPaymentMethodData {
+                    payment_method_data: PaymentMethodData::try_from(bank_redirect)?,
+                    entry_mode: Default::default(),
+                })
+            }
+
+            payment_method_data::PaymentMethodData::MandatePayment => {
+                requests::GlobalPayPaymentMethodData::Mandate(requests::MandatePaymentMethodData {
+                    entry_mode: Default::default(),
+                    id: connector_mandate_id,
+                })
+            }
+
+            _ => Err(errors::ConnectorError::NotImplemented(
+                "Payment methods".to_string(),
+            ))?,
+        };
+
         Ok(Self {
             account_name,
             amount: Some(item.amount.to_owned()),
             currency: item.router_data.request.currency.to_string(),
-
             reference: item.router_data.connector_request_reference_id.to_string(),
             country: item.router_data.get_billing_country()?,
             capture_mode: Some(requests::CaptureMode::from(
                 item.router_data.request.capture_method,
             )),
-            payment_method: requests::PaymentMethod {
-                payment_method_data,
-                authentication: None,
-                encryption: None,
-                entry_mode: Default::default(),
-                fingerprint_mode: None,
-                first_name: None,
-                id: None,
-                last_name: None,
-                name: None,
-                narrative: None,
-                storage_mode: None,
-            },
+            payment_method,
             notifications: Some(requests::Notifications {
                 return_url: get_return_url(item.router_data),
-                challenge_return_url: None,
-                decoupled_challenge_return_url: None,
                 status_url: item.router_data.request.webhook_url.clone(),
-                three_ds_method_return_url: None,
                 cancel_url: get_return_url(item.router_data),
             }),
-            authorization_mode: None,
-            cashback_amount: None,
+            stored_credential,
             channel: Default::default(),
-            convenience_amount: None,
-            currency_conversion: None,
-            description: None,
-            device: None,
-            gratuity_amount: None,
             initiator,
-            ip_address: None,
-            language: None,
-            lodging: None,
-            order: None,
-            payer_reference: None,
-            site_reference: None,
-            stored_credential,
-            surcharge_amount: None,
-            total_capture_count: None,
-            globalpay_payments_request_type: None,
-            user_reference: None,
         })
     }
 }
@@ -176,6 +231,32 @@ impl TryFrom<&GlobalPayRouterData<&PaymentsCaptureRouterData>>
     }
 }
 
+impl TryFrom<&TokenizationRouterData> for requests::GlobalPayPaymentMethodsRequest {
+    type Error = Error;
+    fn try_from(item: &TokenizationRouterData) -> Result<Self, Self::Error> {
+        if !item.request.is_mandate_payment() {
+            return Err(errors::ConnectorError::FlowNotSupported {
+                flow: "Tokenization apart from Mandates".to_string(),
+                connector: "Globalpay".to_string(),
+            }
+            .into());
+        }
+        Ok(Self {
+            reference: item.connector_request_reference_id.clone(),
+            usage_mode: Some(requests::UsageMode::Multiple),
+            card: match &item.request.payment_method_data {
+                payment_method_data::PaymentMethodData::Card(card_data) => Some(requests::Card {
+                    number: card_data.card_number.clone(),
+                    expiry_month: card_data.card_exp_month.clone(),
+                    expiry_year: card_data.get_card_expiry_year_2_digit()?,
+                    cvv: card_data.card_cvc.clone(),
+                }),
+                _ => None,
+            },
+        })
+    }
+}
+
 impl TryFrom<&GlobalpayCancelRouterData<&PaymentsCancelRouterData>>
     for requests::GlobalpayCancelRequest
 {
@@ -278,73 +359,18 @@ impl From<Option<common_enums::CaptureMethod>> for requests::CaptureMode {
     }
 }
 
-fn get_payment_response(
-    status: common_enums::AttemptStatus,
-    response: GlobalpayPaymentsResponse,
-    redirection_data: Option<RedirectForm>,
-    status_code: u16,
-) -> Result<PaymentsResponseData, Box<ErrorResponse>> {
-    let mandate_reference = response.payment_method.as_ref().and_then(|pm| {
-        pm.card
-            .as_ref()
-            .and_then(|card| card.brand_reference.to_owned())
-            .map(|id| MandateReference {
-                connector_mandate_id: Some(id.expose()),
-                payment_method_id: None,
-                mandate_metadata: None,
-                connector_mandate_request_reference_id: None,
-            })
-    });
-    match status {
-        common_enums::AttemptStatus::Failure => Err(Box::new(ErrorResponse {
-            message: response
-                .payment_method
-                .as_ref()
-                .and_then(|payment_method| payment_method.message.clone())
-                .unwrap_or_else(|| NO_ERROR_MESSAGE.to_string()),
-            code: response
-                .payment_method
-                .as_ref()
-                .and_then(|payment_method| payment_method.result.clone())
-                .unwrap_or_else(|| consts::NO_ERROR_CODE.to_string()),
-            reason: response
-                .payment_method
-                .as_ref()
-                .and_then(|payment_method| payment_method.message.clone()),
-            status_code,
-            attempt_status: Some(status),
-            connector_transaction_id: Some(response.id),
-            network_decline_code: response
-                .payment_method
-                .as_ref()
-                .and_then(|payment_method| payment_method.result.clone()),
-            network_advice_code: None,
-            network_error_message: response
-                .payment_method
-                .as_ref()
-                .and_then(|payment_method| payment_method.message.clone()),
-        })),
-        _ => Ok(PaymentsResponseData::TransactionResponse {
-            resource_id: ResponseId::ConnectorTransactionId(response.id.clone()),
-            redirection_data: Box::new(redirection_data),
-            mandate_reference: Box::new(mandate_reference),
-            connector_metadata: None,
-            network_txn_id: None,
-            connector_response_reference_id: response.reference,
-            incremental_authorization_allowed: None,
-            charges: None,
-        }),
-    }
-}
+// }
 
 impl<F, T> TryFrom<ResponseRouterData<F, GlobalpayPaymentsResponse, T, PaymentsResponseData>>
     for RouterData<F, T, PaymentsResponseData>
 {
     type Error = Error;
+
     fn try_from(
         item: ResponseRouterData<F, GlobalpayPaymentsResponse, T, PaymentsResponseData>,
     ) -> Result<Self, Self::Error> {
         let status = common_enums::AttemptStatus::from(item.response.status);
+
         let redirect_url = item
             .response
             .payment_method
@@ -360,12 +386,92 @@ impl<F, T> TryFrom<ResponseRouterData<F, GlobalpayPaymentsResponse, T, PaymentsR
                 Url::parse(url).change_context(errors::ConnectorError::FailedToObtainIntegrationUrl)
             })
             .transpose()?;
+
         let redirection_data = redirect_url.map(|url| RedirectForm::from((url, Method::Get)));
+        let payment_method_token = item.data.get_payment_method_token();
         let status_code = item.http_code;
+
+        let mandate_reference = payment_method_token.ok().and_then(|token| match token {
+            PaymentMethodToken::Token(token_string) => Some(MandateReference {
+                connector_mandate_id: Some(token_string.clone().expose()),
+                payment_method_id: None,
+                mandate_metadata: None,
+                connector_mandate_request_reference_id: None,
+            }),
+            _ => None,
+        });
+
+        let response = match status {
+            common_enums::AttemptStatus::Failure => Err(Box::new(ErrorResponse {
+                message: item
+                    .response
+                    .payment_method
+                    .as_ref()
+                    .and_then(|payment_method| payment_method.message.clone())
+                    .unwrap_or_else(|| NO_ERROR_MESSAGE.to_string()),
+                code: item
+                    .response
+                    .payment_method
+                    .as_ref()
+                    .and_then(|payment_method| payment_method.result.clone())
+                    .unwrap_or_else(|| consts::NO_ERROR_CODE.to_string()),
+                reason: item
+                    .response
+                    .payment_method
+                    .as_ref()
+                    .and_then(|payment_method| payment_method.message.clone()),
+                status_code,
+                attempt_status: Some(status),
+                connector_transaction_id: Some(item.response.id.clone()),
+                network_decline_code: item
+                    .response
+                    .payment_method
+                    .as_ref()
+                    .and_then(|payment_method| payment_method.result.clone()),
+                network_advice_code: None,
+                network_error_message: item
+                    .response
+                    .payment_method
+                    .as_ref()
+                    .and_then(|payment_method| payment_method.message.clone()),
+            })),
+            _ => Ok(PaymentsResponseData::TransactionResponse {
+                resource_id: ResponseId::ConnectorTransactionId(item.response.id.clone()),
+                redirection_data: Box::new(redirection_data),
+                mandate_reference: Box::new(mandate_reference),
+                connector_metadata: None,
+                network_txn_id: None,
+                connector_response_reference_id: item.response.reference.clone(),
+                incremental_authorization_allowed: None,
+                charges: None,
+            }),
+        };
+
         Ok(Self {
             status,
-            response: get_payment_response(status, item.response, redirection_data, status_code)
-                .map_err(|err| *err),
+            response: response.map_err(|err| *err),
+            ..item.data
+        })
+    }
+}
+
+impl<F, T> TryFrom<ResponseRouterData<F, GlobalpayPaymentMethodsResponse, T, PaymentsResponseData>>
+    for RouterData<F, T, PaymentsResponseData>
+{
+    type Error = Error;
+    fn try_from(
+        item: ResponseRouterData<F, GlobalpayPaymentMethodsResponse, T, PaymentsResponseData>,
+    ) -> Result<Self, Self::Error> {
+        let token = item
+            .response
+            .payment_method_token_id
+            .clone()
+            .unwrap_or_default();
+
+        Ok(Self {
+            response: Ok(PaymentsResponseData::TokenizationResponse {
+                token: token.expose(),
+            }),
             ..item.data
         })
     }
@@ -467,39 +573,6 @@ pub struct GlobalpayErrorResponse {
     pub detailed_error_description: String,
 }
 
-fn get_payment_method_data(
-    item: &PaymentsAuthorizeRouterData,
-    brand_reference: Option<String>,
-) -> Result<PaymentMethodData, Error> {
-    match &item.request.payment_method_data {
-        payment_method_data::PaymentMethodData::Card(ccard) => {
-            Ok(PaymentMethodData::Card(requests::Card {
-                number: ccard.card_number.clone(),
-                expiry_month: ccard.card_exp_month.clone(),
-                expiry_year: ccard.get_card_expiry_year_2_digit()?,
-                cvv: ccard.card_cvc.clone(),
-                account_type: None,
-                authcode: None,
-                avs_address: None,
-                avs_postal_code: None,
-                brand_reference,
-                chip_condition: None,
-                funding: None,
-                pin_block: None,
-                tag: None,
-                track: None,
-            }))
-        }
-        payment_method_data::PaymentMethodData::Wallet(wallet_data) => get_wallet_data(wallet_data),
-        payment_method_data::PaymentMethodData::BankRedirect(bank_redirect) => {
-            PaymentMethodData::try_from(bank_redirect)
-        }
-        _ => Err(errors::ConnectorError::NotImplemented(
-            "Payment methods".to_string(),
-        ))?,
-    }
-}
-
 fn get_return_url(item: &PaymentsAuthorizeRouterData) -> Option<String> {
     match item.request.payment_method_data.clone() {
         payment_method_data::PaymentMethodData::Wallet(
@@ -516,36 +589,6 @@ fn get_return_url(item: &PaymentsAuthorizeRouterData) -> Option<String> {
     }
 }
 
-type MandateDetails = (Option<Initiator>, Option<StoredCredential>, Option<String>);
-fn get_mandate_details(item: &PaymentsAuthorizeRouterData) -> Result<MandateDetails, Error> {
-    Ok(if item.request.is_mandate_payment() {
-        let connector_mandate_id = item.request.mandate_id.as_ref().and_then(|mandate_ids| {
-            match mandate_ids.mandate_reference_id.clone() {
-                Some(api_models::payments::MandateReferenceId::ConnectorMandateId(
-                    connector_mandate_ids,
-                )) => connector_mandate_ids.get_connector_mandate_id(),
-                _ => None,
-            }
-        });
-        (
-            Some(match item.request.off_session {
-                Some(true) => Initiator::Merchant,
-                _ => Initiator::Payer,
-            }),
-            Some(StoredCredential {
-                model: Some(requests::Model::Recurring),
-                sequence: Some(match connector_mandate_id.is_some() {
-                    true => Sequence::Subsequent,
-                    false => Sequence::First,
-                }),
-            }),
-            connector_mandate_id,
-        )
-    } else {
-        (None, None, None)
-    })
-}
-
 fn get_wallet_data(
     wallet_data: &payment_method_data::WalletData,
 ) -> Result<PaymentMethodData, Error> {
diff --git a/crates/hyperswitch_connectors/src/utils.rs b/crates/hyperswitch_connectors/src/utils.rs
index 143e7474dd3..09a56474c27 100644
--- a/crates/hyperswitch_connectors/src/utils.rs
+++ b/crates/hyperswitch_connectors/src/utils.rs
@@ -2190,6 +2190,7 @@ impl PaymentsSetupMandateRequestData for SetupMandateRequestData {
 
 pub trait PaymentMethodTokenizationRequestData {
     fn get_browser_info(&self) -> Result<BrowserInformation, Error>;
+    fn is_mandate_payment(&self) -> bool;
 }
 
 impl PaymentMethodTokenizationRequestData for PaymentMethodTokenizationData {
@@ -2198,6 +2199,15 @@ impl PaymentMethodTokenizationRequestData for PaymentMethodTokenizationData {
             .clone()
             .ok_or_else(missing_field_err("browser_info"))
     }
+    fn is_mandate_payment(&self) -> bool {
+        ((self.customer_acceptance.is_some() || self.setup_mandate_details.is_some())
+            && (self.setup_future_usage == Some(FutureUsage::OffSession)))
+            || self
+                .mandate_id
+                .as_ref()
+                .and_then(|mandate_ids| mandate_ids.mandate_reference_id.as_ref())
+                .is_some()
+    }
 }
 
 pub trait PaymentsCompleteAuthorizeRequestData {
diff --git a/crates/hyperswitch_domain_models/src/router_request_types.rs b/crates/hyperswitch_domain_models/src/router_request_types.rs
index b9e2e4a74a6..e919538ea5e 100644
--- a/crates/hyperswitch_domain_models/src/router_request_types.rs
+++ b/crates/hyperswitch_domain_models/src/router_request_types.rs
@@ -254,6 +254,10 @@ pub struct PaymentMethodTokenizationData {
     pub currency: storage_enums::Currency,
     pub amount: Option<i64>,
     pub split_payments: Option<common_types::payments::SplitPaymentsRequest>,
+    pub customer_acceptance: Option<common_payments_types::CustomerAcceptance>,
+    pub setup_future_usage: Option<storage_enums::FutureUsage>,
+    pub setup_mandate_details: Option<mandates::MandateData>,
+    pub mandate_id: Option<api_models::payments::MandateIds>,
 }
 
 impl TryFrom<SetupMandateRequestData> for PaymentMethodTokenizationData {
@@ -266,6 +270,10 @@ impl TryFrom<SetupMandateRequestData> for PaymentMethodTokenizationData {
             currency: data.currency,
             amount: data.amount,
             split_payments: None,
+            customer_acceptance: data.customer_acceptance,
+            setup_future_usage: data.setup_future_usage,
+            setup_mandate_details: data.setup_mandate_details,
+            mandate_id: data.mandate_id,
         })
     }
 }
@@ -281,6 +289,10 @@ impl<F> From<&RouterData<F, PaymentsAuthorizeData, response_types::PaymentsRespo
             currency: data.request.currency,
             amount: Some(data.request.amount),
             split_payments: data.request.split_payments.clone(),
+            customer_acceptance: data.request.customer_acceptance.clone(),
+            setup_future_usage: data.request.setup_future_usage,
+            setup_mandate_details: data.request.setup_mandate_details.clone(),
+            mandate_id: data.request.mandate_id.clone(),
         }
     }
 }
@@ -295,6 +307,10 @@ impl TryFrom<PaymentsAuthorizeData> for PaymentMethodTokenizationData {
             currency: data.currency,
             amount: Some(data.amount),
             split_payments: data.split_payments.clone(),
+            customer_acceptance: data.customer_acceptance,
+            setup_future_usage: data.setup_future_usage,
+            setup_mandate_details: data.setup_mandate_details,
+            mandate_id: data.mandate_id,
         })
     }
 }
@@ -314,6 +330,10 @@ impl TryFrom<CompleteAuthorizeData> for PaymentMethodTokenizationData {
             currency: data.currency,
             amount: Some(data.amount),
             split_payments: None,
+            customer_acceptance: data.customer_acceptance,
+            setup_future_usage: data.setup_future_usage,
+            setup_mandate_details: data.setup_mandate_details,
+            mandate_id: data.mandate_id,
         })
     }
 }
diff --git a/crates/router/src/configs/settings.rs b/crates/router/src/configs/settings.rs
index ae4c8a3cda0..f381712ddfc 100644
--- a/crates/router/src/configs/settings.rs
+++ b/crates/router/src/configs/settings.rs
@@ -620,6 +620,13 @@ pub struct PaymentMethodTokenFilter {
     pub payment_method_type: Option<PaymentMethodTypeTokenFilter>,
     pub long_lived_token: bool,
     pub apple_pay_pre_decrypt_flow: Option<ApplePayPreDecryptFlow>,
+    pub flow: Option<PaymentFlow>,
+}
+
+#[derive(Debug, Deserialize, Clone, PartialEq)]
+#[serde(deny_unknown_fields, rename_all = "snake_case")]
+pub enum PaymentFlow {
+    Mandates,
 }
 
 #[derive(Debug, Deserialize, Clone, Default)]
diff --git a/crates/router/src/core/payment_methods.rs b/crates/router/src/core/payment_methods.rs
index 4a23f04cda6..b9d17129249 100644
--- a/crates/router/src/core/payment_methods.rs
+++ b/crates/router/src/core/payment_methods.rs
@@ -3249,6 +3249,10 @@ async fn create_single_use_tokenization_flow(
         currency: api_models::enums::Currency::default(),
         amount: None,
         split_payments: None,
+        mandate_id: None,
+        setup_future_usage: None,
+        customer_acceptance: None,
+        setup_mandate_details: None,
     };
 
     let payment_method_session_address = types::PaymentAddress::new(
@@ -3317,12 +3321,12 @@ async fn create_single_use_tokenization_flow(
             is_payment_id_from_merchant: None,
         };
 
-    let payment_method_token_response = tokenization::add_token_for_payment_method(
+    let payment_method_token_response = Box::pin(tokenization::add_token_for_payment_method(
         &mut router_data,
         payment_method_data_request.clone(),
         state.clone(),
         &merchant_connector_account_details.clone(),
-    )
+    ))
     .await?;
 
     let token_response = payment_method_token_response.token.map_err(|err| {
diff --git a/crates/router/src/core/payments.rs b/crates/router/src/core/payments.rs
index cc6f3384a22..b5c04cfc927 100644
--- a/crates/router/src/core/payments.rs
+++ b/crates/router/src/core/payments.rs
@@ -106,7 +106,7 @@ use crate::core::routing::helpers as routing_helpers;
 #[cfg(all(feature = "v1", feature = "dynamic_routing"))]
 use crate::types::api::convert_connector_data_to_routable_connectors;
 use crate::{
-    configs::settings::{ApplePayPreDecryptFlow, PaymentMethodTypeTokenFilter},
+    configs::settings::{ApplePayPreDecryptFlow, PaymentFlow, PaymentMethodTypeTokenFilter},
     consts,
     core::{
         errors::{self, CustomResult, RouterResponse, RouterResult},
@@ -6153,6 +6153,7 @@ fn is_payment_method_tokenization_enabled_for_connector(
     payment_method: storage::enums::PaymentMethod,
     payment_method_type: Option<storage::enums::PaymentMethodType>,
     payment_method_token: Option<&PaymentMethodToken>,
+    mandate_flow_enabled: Option<storage_enums::FutureUsage>,
 ) -> RouterResult<bool> {
     let connector_tokenization_filter = state.conf.tokenization.0.get(connector_name);
 
@@ -6171,10 +6172,29 @@ fn is_payment_method_tokenization_enabled_for_connector(
                     payment_method_token,
                     connector_filter.apple_pay_pre_decrypt_flow.clone(),
                 )
+                && is_payment_flow_allowed_for_connector(
+                    mandate_flow_enabled,
+                    connector_filter.flow.clone(),
+                )
         })
         .unwrap_or(false))
 }
 
+fn is_payment_flow_allowed_for_connector(
+    mandate_flow_enabled: Option<storage_enums::FutureUsage>,
+    payment_flow: Option<PaymentFlow>,
+) -> bool {
+    if payment_flow.is_none() {
+        true
+    } else {
+        matches!(payment_flow, Some(PaymentFlow::Mandates))
+            && matches!(
+                mandate_flow_enabled,
+                Some(storage_enums::FutureUsage::OffSession)
+            )
+    }
+}
+
 fn is_apple_pay_pre_decrypt_type_connector_tokenization(
     payment_method_type: Option<storage::enums::PaymentMethodType>,
     payment_method_token: Option<&PaymentMethodToken>,
@@ -6500,6 +6520,10 @@ where
                 .get_required_value("payment_method")?;
             let payment_method_type = payment_data.get_payment_attempt().payment_method_type;
 
+            let mandate_flow_enabled = payment_data
+                .get_payment_attempt()
+                .setup_future_usage_applied;
+
             let is_connector_tokenization_enabled =
                 is_payment_method_tokenization_enabled_for_connector(
                     state,
@@ -6507,6 +6531,7 @@ where
                     payment_method,
                     payment_method_type,
                     payment_data.get_payment_method_token(),
+                    mandate_flow_enabled,
                 )?;
 
             let payment_method_action = decide_payment_method_tokenize_action(
@@ -8341,7 +8366,7 @@ where
         .change_context(errors::ApiErrorResponse::InternalServerError)
         .attach_printable("Failed to get the common mandate reference")?;
 
-    let connector_mandate_details = connector_common_mandate_details.payments;
+    let connector_mandate_details = connector_common_mandate_details.payments.clone();
 
     let mut connector_choice = None;
 
diff --git a/crates/router/src/core/payments/helpers.rs b/crates/router/src/core/payments/helpers.rs
index 4a023f7d8c4..0b1758990ab 100644
--- a/crates/router/src/core/payments/helpers.rs
+++ b/crates/router/src/core/payments/helpers.rs
@@ -2039,8 +2039,7 @@ pub fn decide_payment_method_retrieval_action(
 
 pub async fn is_ucs_enabled(state: &SessionState, config_key: &str) -> bool {
     let db = state.store.as_ref();
-    let is_enabled = db
-        .find_config_by_key_unwrap_or(config_key, Some("false".to_string()))
+    db.find_config_by_key_unwrap_or(config_key, Some("false".to_string()))
         .await
         .map_err(|error| {
             logger::error!(
@@ -2053,9 +2052,7 @@ pub async fn is_ucs_enabled(state: &SessionState, config_key: &str) -> bool {
                 logger::error!(?error, "Failed to parse `{config_key}` UCS enabled config");
             })
         })
-        .unwrap_or(false);
-
-    is_enabled
+        .unwrap_or(false)
 }
 
 pub async fn should_execute_based_on_rollout(
diff --git a/crates/router/tests/connectors/square.rs b/crates/router/tests/connectors/square.rs
index 81ea8112276..760e8ebdaea 100644
--- a/crates/router/tests/connectors/square.rs
+++ b/crates/router/tests/connectors/square.rs
@@ -68,6 +68,10 @@ fn token_details() -> Option<types::PaymentMethodTokenizationData> {
         amount: None,
         currency: enums::Currency::USD,
         split_payments: None,
+        mandate_id: None,
+        setup_future_usage: None,
+        customer_acceptance: None,
+        setup_mandate_details: None,
     })
 }
 
@@ -442,6 +446,10 @@ async fn should_fail_payment_for_incorrect_cvc() {
                 amount: None,
                 currency: enums::Currency::USD,
                 split_payments: None,
+                mandate_id: None,
+                setup_future_usage: None,
+                customer_acceptance: None,
+                setup_mandate_details: None,
             }),
             get_default_payment_info(None),
         )
@@ -474,6 +482,10 @@ async fn should_fail_payment_for_invalid_exp_month() {
                 amount: None,
                 currency: enums::Currency::USD,
                 split_payments: None,
+                mandate_id: None,
+                setup_future_usage: None,
+                customer_acceptance: None,
+                setup_mandate_details: None,
             }),
             get_default_payment_info(None),
         )
@@ -506,6 +518,10 @@ async fn should_fail_payment_for_incorrect_expiry_year() {
                 amount: None,
                 currency: enums::Currency::USD,
                 split_payments: None,
+                mandate_id: None,
+                setup_future_usage: None,
+                customer_acceptance: None,
+                setup_mandate_details: None,
             }),
             get_default_payment_info(None),
         )
diff --git a/crates/router/tests/connectors/stax.rs b/crates/router/tests/connectors/stax.rs
index 93c2394354b..89b1bc7f4b9 100644
--- a/crates/router/tests/connectors/stax.rs
+++ b/crates/router/tests/connectors/stax.rs
@@ -73,6 +73,10 @@ fn token_details() -> Option<types::PaymentMethodTokenizationData> {
         amount: None,
         currency: enums::Currency::USD,
         split_payments: None,
+        mandate_id: None,
+        setup_future_usage: None,
+        customer_acceptance: None,
+        setup_mandate_details: None,
     })
 }
 
@@ -484,6 +488,10 @@ async fn should_fail_payment_for_incorrect_cvc() {
                 amount: None,
                 currency: enums::Currency::USD,
                 split_payments: None,
+                mandate_id: None,
+                setup_future_usage: None,
+                customer_acceptance: None,
+                setup_mandate_details: None,
             }),
             get_default_payment_info(connector_customer_id, None),
         )
@@ -523,6 +531,10 @@ async fn should_fail_payment_for_invalid_exp_month() {
                 amount: None,
                 currency: enums::Currency::USD,
                 split_payments: None,
+                mandate_id: None,
+                setup_future_usage: None,
+                customer_acceptance: None,
+                setup_mandate_details: None,
             }),
             get_default_payment_info(connector_customer_id, None),
         )
@@ -562,6 +574,10 @@ async fn should_fail_payment_for_incorrect_expiry_year() {
                 amount: None,
                 currency: enums::Currency::USD,
                 split_payments: None,
+                mandate_id: None,
+                setup_future_usage: None,
+                customer_acceptance: None,
+                setup_mandate_details: None,
             }),
             get_default_payment_info(connector_customer_id, None),
         )
diff --git a/crates/router/tests/connectors/utils.rs b/crates/router/tests/connectors/utils.rs
index e3884894b33..a8676834040 100644
--- a/crates/router/tests/connectors/utils.rs
+++ b/crates/router/tests/connectors/utils.rs
@@ -1121,6 +1121,10 @@ impl Default for TokenType {
             amount: Some(100),
             currency: enums::Currency::USD,
             split_payments: None,
+            mandate_id: None,
+            setup_future_usage: None,
+            customer_acceptance: None,
+            setup_mandate_details: None,
         };
         Self(data)
     }
diff --git a/loadtest/config/development.toml b/loadtest/config/development.toml
index b0bc2e9ee1c..0d1e27961d4 100644
--- a/loadtest/config/development.toml
+++ b/loadtest/config/development.toml
@@ -591,6 +591,7 @@ mollie = { long_lived_token = false, payment_method = "card" }
 braintree = { long_lived_token = false, payment_method = "card" }
 gocardless = { long_lived_token = true, payment_method = "bank_debit" }
 billwerk = { long_lived_token = false, payment_method = "card" }
+globalpay = { long_lived_token = false, payment_method = "card", flow = "mandates" }
 
 [connector_customer]
 connector_list = "adyen,facilitapay,gocardless,hyperswitch_vault,stax,stripe"

## 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 -->
In One-off payments, we donot need to create the token. Just passing raw cards would be enough.
In CITs, we need to create a token and store it in `connector_mandate_id` for future MITs but while executing the CIT, raw cards need to be passed. 
In MITs, we need to use that previously stored token in CIT and no more need to hit the tokenization endpoint at connector.

### Additional Changes

- [ ] This PR modifies the API contract
- [ ] This PR modifies the database schema
- [x] 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)?
-->

1. Payments Create - One-off

cURL: 

```
curl --location 'http://localhost:8080/payments' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'api-key: dev_v5jp7Ow9W5g6tgWaDHs4UR385iFfpg9dXQGYQkxxRXQdHlcvR70WmjJRPWJt7Xe7' \
--header 'Cookie: PHPSESSID=0b47db9d7de94c37b6b272087a9f2fa7' \
--data-raw '{
    "currency":"USD",
    "amount": 300,
    "confirm": true,
    "amount_to_capture": 300,
    
    "capture_method": "automatic",
    "capture_on": "2022-09-10T10:11:12Z",
    "authentication_type": "no_three_ds",
    "return_url": "https://www.google.com",
    "email": "something@gmail.com",
    "name": "Joseph Doe",
    "phone": "999999999",
    "phone_country_code": "+65",
    "description": "Its my first payment request",
    "statement_descriptor_name": "Juspay",
    "statement_descriptor_suffix": "Router",
    "payment_method": "card",
    
    "payment_method_type": "credit",
    "payment_method_data": {
        "card": {
            "card_number": "4242424242424242",
            "card_exp_month": "03",
            "card_exp_year": "2030",
            "card_holder_name": "joseph Doe",
            "card_cvc": "737"
        }
    },
    "billing": {
        "address": {
            "line1": "1467",
            "line2": "CA",
            "line3": "Harrison Street",
            "city": "San Fransico",
            "state": "CA",
            "zip": "94122",
            "country": "US",
            "first_name": "joseph",
            "last_name": "Doe"
        },
        "phone": {
            "number": "8056594427",
            "country_code": "+91"
        }
    },
    "browser_info": {
        "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36",
        "accept_header": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
        "language": "nl-NL",
        "color_depth": 24,
        "screen_height": 723,
        "screen_width": 1536,
        "time_zone": 0,
        "java_enabled": true,
        "java_script_enabled": true,
        "ip_address": "109.71.40.0"
    },
    "metadata": {
        "order_category": "applepay"
    },
    "order_details": [
        {
            "product_name": "Apple iphone 15",
            "quantity": 1,
            "amount": 300,
            "account_name": "transaction_processing"
        }
    ]   
}'
```

Response: 

```
{
    "payment_id": "pay_j2mMaanCWkdCD2ytx5gg",
    "merchant_id": "merchant_1751871882",
    "status": "succeeded",
    "amount": 300,
    "net_amount": 300,
    "shipping_cost": null,
    "amount_capturable": 0,
    "amount_received": 300,
    "connector": "globalpay",
    "client_secret": "pay_j2mMaanCWkdCD2ytx5gg_secret_CqzsQEqF82ClZdEAoVF3",
    "created": "2025-07-07T11:03:44.204Z",
    "currency": "USD",
    "customer_id": null,
    "customer": {
        "id": null,
        "name": "Joseph Doe",
        "email": "something@gmail.com",
        "phone": "999999999",
        "phone_country_code": "+65"
    },
    "description": "Its my first payment request",
    "refunds": null,
    "disputes": null,
    "mandate_id": null,
    "mandate_data": null,
    "setup_future_usage": null,
    "off_session": null,
    "capture_on": null,
    "capture_method": "automatic",
    "payment_method": "card",
    "payment_method_data": {
        "card": {
            "last4": "4242",
            "card_type": null,
            "card_network": null,
            "card_issuer": null,
            "card_issuing_country": null,
            "card_isin": "424242",
            "card_extended_bin": null,
            "card_exp_month": "03",
            "card_exp_year": "2030",
            "card_holder_name": "joseph Doe",
            "payment_checks": null,
            "authentication_data": null
        },
        "billing": null
    },
    "payment_token": null,
    "shipping": null,
    "billing": {
        "address": {
            "city": "San Fransico",
            "country": "US",
            "line1": "1467",
            "line2": "CA",
            "line3": "Harrison Street",
            "zip": "94122",
            "state": "CA",
            "first_name": "joseph",
            "last_name": "Doe"
        },
        "phone": {
            "number": "8056594427",
            "country_code": "+91"
        },
        "email": null
    },
    "order_details": [
        {
            "brand": null,
            "amount": 300,
            "category": null,
            "quantity": 1,
            "tax_rate": null,
            "product_id": null,
            "product_name": "Apple iphone 15",
            "product_type": null,
            "sub_category": null,
            "product_img_link": null,
            "product_tax_code": null,
            "total_tax_amount": null,
            "requires_shipping": null
        }
    ],
    "email": null,
    "name": null,
    "phone": null,
    "return_url": "https://www.google.com/",
    "authentication_type": "no_three_ds",
    "statement_descriptor_name": "Juspay",
    "statement_descriptor_suffix": "Router",
    "next_action": null,
    "cancellation_reason": null,
    "error_code": null,
    "error_message": null,
    "unified_code": null,
    "unified_message": null,
    "payment_experience": null,
    "payment_method_type": "credit",
    "connector_label": null,
    "business_country": null,
    "business_label": "default",
    "business_sub_label": null,
    "allowed_payment_method_types": null,
    "ephemeral_key": null,
    "manual_retry_allowed": false,
    "connector_transaction_id": "TRN_IORyBbPseO4Qiy0L2v8YpZpgWA9auN_dCD2ytx5gg_1",
    "frm_message": null,
    "metadata": {
        "order_category": "applepay"
    },
    "connector_metadata": null,
    "feature_metadata": null,
    "reference_id": "pay_j2mMaanCWkdCD2ytx5gg_1",
    "payment_link": null,
    "profile_id": "pro_GIxd8tTl8PWNt9L2ynbr",
    "surcharge_details": null,
    "attempt_count": 1,
    "merchant_decision": null,
    "merchant_connector_id": "mca_ghTQYltef3iCpp4cdsVu",
    "incremental_authorization_allowed": null,
    "authorization_count": null,
    "incremental_authorizations": null,
    "external_authentication_details": null,
    "external_3ds_authentication_attempted": false,
    "expires_on": "2025-07-07T11:18:44.204Z",
    "fingerprint": null,
    "browser_info": {
        "language": "nl-NL",
        "time_zone": 0,
        "ip_address": "109.71.40.0",
        "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36",
        "color_depth": 24,
        "java_enabled": true,
        "screen_width": 1536,
        "accept_header": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
        "screen_height": 723,
        "java_script_enabled": true
    },
    "payment_method_id": null,
    "payment_method_status": null,
    "updated": "2025-07-07T11:03:46.731Z",
    "split_payments": null,
    "frm_metadata": null,
    "extended_authorization_applied": null,
    "capture_before": null,
    "merchant_order_reference_id": null,
    "order_tax_amount": null,
    "connector_mandate_id": null,
    "card_discovery": "manual",
    "force_3ds_challenge": false,
    "force_3ds_challenge_trigger": false,
    "issuer_error_code": null,
    "issuer_error_message": null,
    "is_iframe_redirection_enabled": null,
    "whole_connector_response": null
}
```

2. CIT using `mandate_id`

Request: 

```
curl --location 'http://localhost:8080/payments' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'api-key: dev_otcCi6DyRzeDWx38OH5BTLBjBK1WS7Jt1BbsMpPepSR2Rr5dIPgVgPMoeekaqoXL' \
--header 'Cookie: PHPSESSID=0b47db9d7de94c37b6b272087a9f2fa7' \
--data-raw '{
    "amount": 6000,
    "all_keys_required": true,
    "currency": "USD",
    "confirm": true,
    "capture_method": "automatic",
    "capture_on": "2022-09-10T10:11:12Z",
    "customer_id": "cus_LI9DQMmb1tHRjnfnkjwknjfXtonFkU",
    "email": "guest@example.com",
    "name": "John Doe",
    "phone": "999999999",
    "phone_country_code": "+65",
    "description": "Its my first payment request",
    "authentication_type": "no_three_ds",
    "return_url": "https://example.com",
    "payment_method": "card",
    "payment_method_type": "debit",
    "payment_method_data": {
        "card": {
            "card_number": "4111111111111111",
            "card_exp_month": "12",
            "card_exp_year": "2030",
            "card_holder_name": "joseph Doe",
            "card_cvc": "123"
        }
    },
    "setup_future_usage": "off_session",
    "customer_acceptance": {
        "acceptance_type": "offline",
        "accepted_at": "1963-05-03T04:07:52.723Z",
        "online": {
            "ip_address": "in sit",
            "user_agent": "amet irure esse"
        }
    },
    "mandate_data": {
        "customer_acceptance": {
            "acceptance_type": "offline",
            "accepted_at": "1963-05-03T04:07:52.723Z",
            "online": {
                "ip_address": "127.0.0.1",
                "user_agent": "amet irure esse"
            }
        },
        "mandate_type": {
            "single_use": {
                "amount": 8000,
                "currency": "USD"
            }
        }
    },
    "payment_type": "new_mandate",
    "billing": {
        "address": {
            "line1": "1467",
            "line2": "Harrison Street",
            "line3": "Harrison Street",
            "city": "San Fransico",
            "state": "California",
            "zip": "94122",
            "country": "US",
            "first_name": "john",
            "last_name": "Doe"
        }
    },
    "shipping": {
        "address": {
            "line1": "1467",
            "line2": "Harrison Street",
            "line3": "Harrison Street",
            "city": "San Fransico",
            "state": "California",
            "zip": "94122",
            "country": "US",
            "first_name": "john",
            "last_name": "Doe"
        }
    },
    "statement_descriptor_name": "joseph",
    "statement_descriptor_suffix": "JS",
    "metadata": {
        "udf1": "value1",
        "new_customer": "true",
        "login_date": "2019-09-10T10:11:12Z"
    },
    "browser_info": {
        "ip_address": "129.0.0.1",
        "user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
        "accept_header": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
        "language": "en-US",
        "color_depth": 32,
        "screen_height": 1117,
        "screen_width": 1728,
        "time_zone": -330,
        "java_enabled": true,
        "java_script_enabled": true
    }
}'
```

Response: 

```
{
    "payment_id": "pay_pgbcY6mXYI4IYk2Zt5kc",
    "merchant_id": "merchant_1753277415",
    "status": "succeeded",
    "amount": 6000,
    "net_amount": 6000,
    "shipping_cost": null,
    "amount_capturable": 0,
    "amount_received": 6000,
    "connector": "globalpay",
    "client_secret": "pay_pgbcY6mXYI4IYk2Zt5kc_secret_H0sK1auIjNZsIcfjVE1d",
    "created": "2025-07-23T17:30:07.918Z",
    "currency": "USD",
    "customer_id": "cus_LI9DQMmb1tHRjnfnkjwknjfXtonFkU",
    "customer": {
        "id": "cus_LI9DQMmb1tHRjnfnkjwknjfXtonFkU",
        "name": "John Doe",
        "email": "guest@example.com",
        "phone": "999999999",
        "phone_country_code": "+65"
    },
    "description": "Its my first payment request",
    "refunds": null,
    "disputes": null,
    "mandate_id": "man_bRinPSQhGM8Pky90uBNb",
    "mandate_data": {
        "update_mandate_id": null,
        "customer_acceptance": {
            "acceptance_type": "offline",
            "accepted_at": "1963-05-03T04:07:52.723Z",
            "online": {
                "ip_address": "127.0.0.1",
                "user_agent": "amet irure esse"
            }
        },
        "mandate_type": {
            "single_use": {
                "amount": 8000,
                "currency": "USD",
                "start_date": null,
                "end_date": null,
                "metadata": null
            }
        }
    },
    "setup_future_usage": "off_session",
    "off_session": null,
    "capture_on": null,
    "capture_method": "automatic",
    "payment_method": "card",
    "payment_method_data": {
        "card": {
            "last4": "1111",
            "card_type": null,
            "card_network": null,
            "card_issuer": null,
            "card_issuing_country": null,
            "card_isin": "411111",
            "card_extended_bin": null,
            "card_exp_month": "12",
            "card_exp_year": "2030",
            "card_holder_name": "joseph Doe",
            "payment_checks": null,
            "authentication_data": null
        },
        "billing": null
    },
    "payment_token": null,
    "shipping": {
        "address": {
            "city": "San Fransico",
            "country": "US",
            "line1": "1467",
            "line2": "Harrison Street",
            "line3": "Harrison Street",
            "zip": "94122",
            "state": "California",
            "first_name": "john",
            "last_name": "Doe"
        },
        "phone": null,
        "email": null
    },
    "billing": {
        "address": {
            "city": "San Fransico",
            "country": "US",
            "line1": "1467",
            "line2": "Harrison Street",
            "line3": "Harrison Street",
            "zip": "94122",
            "state": "California",
            "first_name": "john",
            "last_name": "Doe"
        },
        "phone": null,
        "email": null
    },
    "order_details": null,
    "email": "guest@example.com",
    "name": "John Doe",
    "phone": "999999999",
    "return_url": "https://example.com/",
    "authentication_type": "no_three_ds",
    "statement_descriptor_name": "joseph",
    "statement_descriptor_suffix": "JS",
    "next_action": null,
    "cancellation_reason": null,
    "error_code": null,
    "error_message": null,
    "unified_code": null,
    "unified_message": null,
    "payment_experience": null,
    "payment_method_type": "debit",
    "connector_label": null,
    "business_country": null,
    "business_label": "default",
    "business_sub_label": null,
    "allowed_payment_method_types": null,
    "ephemeral_key": {
        "customer_id": "cus_LI9DQMmb1tHRjnfnkjwknjfXtonFkU",
        "created_at": 1753291807,
        "expires": 1753295407,
        "secret": "epk_222a00737e6c47d181b899d8afc76813"
    },
    "manual_retry_allowed": false,
    "connector_transaction_id": "TRN_gBpefdKHlBxfmgVgFSlfPuCQXj86TT_4IYk2Zt5kc_1",
    "frm_message": null,
    "metadata": {
        "udf1": "value1",
        "login_date": "2019-09-10T10:11:12Z",
        "new_customer": "true"
    },
    "connector_metadata": null,
    "feature_metadata": null,
    "reference_id": "pay_pgbcY6mXYI4IYk2Zt5kc_1",
    "payment_link": null,
    "profile_id": "pro_roCz974ra9LQxsifUris",
    "surcharge_details": null,
    "attempt_count": 1,
    "merchant_decision": null,
    "merchant_connector_id": "mca_5Y545k7TI4upQYSbJJ9L",
    "incremental_authorization_allowed": null,
    "authorization_count": null,
    "incremental_authorizations": null,
    "external_authentication_details": null,
    "external_3ds_authentication_attempted": false,
    "expires_on": "2025-07-23T17:45:07.918Z",
    "fingerprint": null,
    "browser_info": {
        "language": "en-US",
        "time_zone": -330,
        "ip_address": "129.0.0.1",
        "user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
        "color_depth": 32,
        "java_enabled": true,
        "screen_width": 1728,
        "accept_header": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
        "screen_height": 1117,
        "java_script_enabled": true
    },
    "payment_method_id": "pm_uDtgQsunDERQMrEXxbcy",
    "payment_method_status": null,
    "updated": "2025-07-23T17:30:11.412Z",
    "split_payments": null,
    "frm_metadata": null,
    "extended_authorization_applied": null,
    "capture_before": null,
    "merchant_order_reference_id": null,
    "order_tax_amount": null,
    "connector_mandate_id": null,
    "card_discovery": "manual",
    "force_3ds_challenge": false,
    "force_3ds_challenge_trigger": false,
    "issuer_error_code": null,
    "issuer_error_message": null,
    "is_iframe_redirection_enabled": null,
    "whole_connector_response": "{\"id\":\"TRN_gBpefdKHlBxfmgVgFSlfPuCQXj86TT_4IYk2Zt5kc_1\",\"time_created\":\"2025-07-23T17:30:11.323Z\",\"type\":\"SALE\",\"status\":\"CAPTURED\",\"channel\":\"CNP\",\"capture_mode\":\"AUTO\",\"amount\":\"6000\",\"currency\":\"USD\",\"country\":\"US\",\"merchant_id\":\"MER_7e3e2c7df34f42819b3edee31022ee3f\",\"merchant_name\":\"Sandbox_merchant_3\",\"account_id\":\"TRA_c9967ad7d8ec4b46b6dd44a61cde9a91\",\"account_name\":\"transaction_processing\",\"reference\":\"pay_pgbcY6mXYI4IYk2Zt5kc_1\",\"payment_method\":{\"result\":\"00\",\"message\":\"(00)[ test system ] Authorised\",\"entry_mode\":\"ECOM\",\"card\":{\"brand\":\"VISA\",\"masked_number_last4\":\"XXXXXXXXXXXX1111\",\"authcode\":\"123456\",\"brand_reference\":\"R0LEZpZE51h4fEcD\",\"brand_time_created\":\"\",\"cvv_result\":\"MATCHED\",\"provider\":{\"result\":\"00\",\"cvv_result\":\"M\",\"avs_address_result\":\"M\",\"avs_postal_code_result\":\"M\"}}},\"risk_assessment\":[{\"mode\":\"ACTIVE\",\"result\":\"ACCEPTED\",\"rules\":[{\"reference\":\"0c93a6c9-7649-4822-b5ea-1efa356337fd\",\"description\":\"Cardholder Name Rule\",\"mode\":\"ACTIVE\",\"result\":\"ACCEPTED\"},{\"reference\":\"a539d51a-abc1-4fff-a38e-b34e00ad0cc3\",\"description\":\"CardNumber block\",\"mode\":\"ACTIVE\",\"result\":\"ACCEPTED\"},{\"reference\":\"d023a19e-6985-4fda-bb9b-5d4e0dedbb1e\",\"description\":\"Amount test\",\"mode\":\"ACTIVE\",\"result\":\"ACCEPTED\"}]}],\"batch_id\":\"BAT_1558804\",\"action\":{\"id\":\"ACT_gBpefdKHlBxfmgVgFSlfPuCQXj86TT\",\"type\":\"AUTHORIZE\",\"time_created\":\"2025-07-23T17:30:11.323Z\",\"result_code\":\"SUCCESS\",\"app_id\":\"OXKlGGm6ecZLIqMyRgPHRfMxdUAiEcp8\",\"app_name\":\"rotate_again\"}}"
}
```

3. MIT using `mandate_id`

Request: 

```
curl --location 'http://localhost:8080/payments' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'api-key: dev_otcCi6DyRzeDWx38OH5BTLBjBK1WS7Jt1BbsMpPepSR2Rr5dIPgVgPMoeekaqoXL' \
--header 'Cookie: PHPSESSID=0b47db9d7de94c37b6b272087a9f2fa7' \
--data '{
    "amount": 6000,
    "currency": "USD",
    "capture_method": "automatic",
    "off_session": true,
    "confirm": true,
    "description": "Initiated by merchant",
    "mandate_id": "man_bRinPSQhGM8Pky90uBNb",
    "customer_id": "cus_LI9DQMmb1tHRjnfnkjwknjfXtonFkU"
}'
```

Response: 

```
{
    "payment_id": "pay_RI5mPEtiRZOUPPBEckqZ",
    "merchant_id": "merchant_1753277415",
    "status": "succeeded",
    "amount": 6000,
    "net_amount": 6000,
    "shipping_cost": null,
    "amount_capturable": 0,
    "amount_received": 6000,
    "connector": "globalpay",
    "client_secret": "pay_RI5mPEtiRZOUPPBEckqZ_secret_Aj61vZbZEdJkamRrE2EK",
    "created": "2025-07-23T17:30:20.230Z",
    "currency": "USD",
    "customer_id": "cus_LI9DQMmb1tHRjnfnkjwknjfXtonFkU",
    "customer": {
        "id": "cus_LI9DQMmb1tHRjnfnkjwknjfXtonFkU",
        "name": "John Doe",
        "email": "guest@example.com",
        "phone": "999999999",
        "phone_country_code": "+65"
    },
    "description": "Initiated by merchant",
    "refunds": null,
    "disputes": null,
    "mandate_id": "man_bRinPSQhGM8Pky90uBNb",
    "mandate_data": null,
    "setup_future_usage": null,
    "off_session": true,
    "capture_on": null,
    "capture_method": "automatic",
    "payment_method": "card",
    "payment_method_data": {
        "card": {
            "last4": "1111",
            "card_type": null,
            "card_network": null,
            "card_issuer": null,
            "card_issuing_country": null,
            "card_isin": "411111",
            "card_extended_bin": null,
            "card_exp_month": "12",
            "card_exp_year": "2030",
            "card_holder_name": "joseph Doe",
            "payment_checks": null,
            "authentication_data": null
        },
        "billing": null
    },
    "payment_token": "23420a93-c0ad-435f-885f-2d57c30c14d9",
    "shipping": null,
    "billing": null,
    "order_details": null,
    "email": "guest@example.com",
    "name": "John Doe",
    "phone": "999999999",
    "return_url": null,
    "authentication_type": "no_three_ds",
    "statement_descriptor_name": null,
    "statement_descriptor_suffix": null,
    "next_action": null,
    "cancellation_reason": null,
    "error_code": null,
    "error_message": null,
    "unified_code": null,
    "unified_message": null,
    "payment_experience": null,
    "payment_method_type": "debit",
    "connector_label": null,
    "business_country": null,
    "business_label": "default",
    "business_sub_label": null,
    "allowed_payment_method_types": null,
    "ephemeral_key": {
        "customer_id": "cus_LI9DQMmb1tHRjnfnkjwknjfXtonFkU",
        "created_at": 1753291820,
        "expires": 1753295420,
        "secret": "epk_ceed93e4ac414b0ea6c2f454b9187067"
    },
    "manual_retry_allowed": false,
    "connector_transaction_id": "TRN_VlfWAjrCer1pEZaQ7BRJsxE9tqGHnn_OUPPBEckqZ_1",
    "frm_message": null,
    "metadata": null,
    "connector_metadata": null,
    "feature_metadata": null,
    "reference_id": "pay_RI5mPEtiRZOUPPBEckqZ_1",
    "payment_link": null,
    "profile_id": "pro_roCz974ra9LQxsifUris",
    "surcharge_details": null,
    "attempt_count": 1,
    "merchant_decision": null,
    "merchant_connector_id": "mca_5Y545k7TI4upQYSbJJ9L",
    "incremental_authorization_allowed": null,
    "authorization_count": null,
    "incremental_authorizations": null,
    "external_authentication_details": null,
    "external_3ds_authentication_attempted": false,
    "expires_on": "2025-07-23T17:45:20.230Z",
    "fingerprint": null,
    "browser_info": null,
    "payment_method_id": "pm_uDtgQsunDERQMrEXxbcy",
    "payment_method_status": "active",
    "updated": "2025-07-23T17:30:23.884Z",
    "split_payments": null,
    "frm_metadata": null,
    "extended_authorization_applied": null,
    "capture_before": null,
    "merchant_order_reference_id": null,
    "order_tax_amount": null,
    "connector_mandate_id": "PMT_9fd7c105-65f1-4b54-9b3f-d3f34c35100d",
    "card_discovery": "manual",
    "force_3ds_challenge": false,
    "force_3ds_challenge_trigger": false,
    "issuer_error_code": null,
    "issuer_error_message": null,
    "is_iframe_redirection_enabled": null,
    "whole_connector_response": null
}
```

4. CIT using `payment_method_id`

cURL: 

```
curl --location 'http://localhost:8080/payments' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'api-key: dev_otcCi6DyRzeDWx38OH5BTLBjBK1WS7Jt1BbsMpPepSR2Rr5dIPgVgPMoeekaqoXL' \
--header 'Cookie: PHPSESSID=0b47db9d7de94c37b6b272087a9f2fa7' \
--data-raw '{
    "amount": 1650,
    "currency": "USD",
    "connector": ["globalpay"],
    "confirm": true,
    "customer_id": "customer123ffffa",
    "setup_future_usage": "off_session",
    "payment_method_type": "debit",
    "payment_method": "card",
    "payment_method_data": {
        "card": {
            "card_number": "4111111111111111",
            "card_exp_month": "03",
            "card_exp_year": "30",
            "card_holder_name": "joseph Doe",
            "card_cvc": "737"
        }
    },
    "billing": {
        "address": {
            "first_name": "joseph",
            "last_name": "Doe",
            "country": "US"
        }
    },
    "email": "something@example.com",
    "customer_acceptance": {
        "acceptance_type": "offline"
    }
}'
```

Response: 

```
{
    "payment_id": "pay_CNM35m7O7JfdmH9qYyFq",
    "merchant_id": "merchant_1753277415",
    "status": "succeeded",
    "amount": 1650,
    "net_amount": 1650,
    "shipping_cost": null,
    "amount_capturable": 0,
    "amount_received": 1650,
    "connector": "globalpay",
    "client_secret": "pay_CNM35m7O7JfdmH9qYyFq_secret_uz67njQIBT8dhkSR2jcr",
    "created": "2025-07-23T17:29:50.150Z",
    "currency": "USD",
    "customer_id": "customer123ffffa",
    "customer": {
        "id": "customer123ffffa",
        "name": null,
        "email": "something@example.com",
        "phone": null,
        "phone_country_code": null
    },
    "description": null,
    "refunds": null,
    "disputes": null,
    "mandate_id": null,
    "mandate_data": null,
    "setup_future_usage": "off_session",
    "off_session": null,
    "capture_on": null,
    "capture_method": null,
    "payment_method": "card",
    "payment_method_data": {
        "card": {
            "last4": "1111",
            "card_type": null,
            "card_network": null,
            "card_issuer": null,
            "card_issuing_country": null,
            "card_isin": "411111",
            "card_extended_bin": null,
            "card_exp_month": "03",
            "card_exp_year": "30",
            "card_holder_name": "joseph Doe",
            "payment_checks": null,
            "authentication_data": null
        },
        "billing": null
    },
    "payment_token": null,
    "shipping": null,
    "billing": {
        "address": {
            "city": null,
            "country": "US",
            "line1": null,
            "line2": null,
            "line3": null,
            "zip": null,
            "state": null,
            "first_name": "joseph",
            "last_name": "Doe"
        },
        "phone": null,
        "email": null
    },
    "order_details": null,
    "email": "something@example.com",
    "name": null,
    "phone": null,
    "return_url": null,
    "authentication_type": "no_three_ds",
    "statement_descriptor_name": null,
    "statement_descriptor_suffix": null,
    "next_action": null,
    "cancellation_reason": null,
    "error_code": null,
    "error_message": null,
    "unified_code": null,
    "unified_message": null,
    "payment_experience": null,
    "payment_method_type": "debit",
    "connector_label": null,
    "business_country": null,
    "business_label": "default",
    "business_sub_label": null,
    "allowed_payment_method_types": null,
    "ephemeral_key": {
        "customer_id": "customer123ffffa",
        "created_at": 1753291790,
        "expires": 1753295390,
        "secret": "epk_b79f5365965648aea900af73ee98fc51"
    },
    "manual_retry_allowed": false,
    "connector_transaction_id": "TRN_hR9reO0fbf15HP7SDBznXeKNnhvb6u_fdmH9qYyFq_1",
    "frm_message": null,
    "metadata": null,
    "connector_metadata": null,
    "feature_metadata": null,
    "reference_id": "pay_CNM35m7O7JfdmH9qYyFq_1",
    "payment_link": null,
    "profile_id": "pro_roCz974ra9LQxsifUris",
    "surcharge_details": null,
    "attempt_count": 1,
    "merchant_decision": null,
    "merchant_connector_id": "mca_5Y545k7TI4upQYSbJJ9L",
    "incremental_authorization_allowed": null,
    "authorization_count": null,
    "incremental_authorizations": null,
    "external_authentication_details": null,
    "external_3ds_authentication_attempted": false,
    "expires_on": "2025-07-23T17:44:50.150Z",
    "fingerprint": null,
    "browser_info": null,
    "payment_method_id": "pm_P66KYq7rG0B7f7RENNf2",
    "payment_method_status": "active",
    "updated": "2025-07-23T17:29:53.258Z",
    "split_payments": null,
    "frm_metadata": null,
    "extended_authorization_applied": null,
    "capture_before": null,
    "merchant_order_reference_id": null,
    "order_tax_amount": null,
    "connector_mandate_id": "PMT_d6001c7b-6150-404d-92f3-56b217fb8a3d",
    "card_discovery": "manual",
    "force_3ds_challenge": false,
    "force_3ds_challenge_trigger": false,
    "issuer_error_code": null,
    "issuer_error_message": null,
    "is_iframe_redirection_enabled": null,
    "whole_connector_response": null
}
```

5. MIT using `payment_method_id`

cURL: 

```
curl --location 'http://localhost:8080/payments' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'api-key: dev_otcCi6DyRzeDWx38OH5BTLBjBK1WS7Jt1BbsMpPepSR2Rr5dIPgVgPMoeekaqoXL' \
--header 'Cookie: PHPSESSID=0b47db9d7de94c37b6b272087a9f2fa7' \
--data '{
    "amount": 179,
    "currency": "USD",
    "confirm": true,
    "customer_id": "customer123ffffa",
    "recurring_details": {
        "type": "payment_method_id",
        "data": "pm_P66KYq7rG0B7f7RENNf2"
    },
    "off_session": true
}'
```

Response: 

```
{
    "payment_id": "pay_6pONwGPfaI6X8zmyOPcS",
    "merchant_id": "merchant_1753277415",
    "status": "succeeded",
    "amount": 179,
    "net_amount": 179,
    "shipping_cost": null,
    "amount_capturable": 0,
    "amount_received": 179,
    "connector": "globalpay",
    "client_secret": "pay_6pONwGPfaI6X8zmyOPcS_secret_XRjvCntYf6esUICifOQg",
    "created": "2025-07-23T17:30:01.371Z",
    "currency": "USD",
    "customer_id": "customer123ffffa",
    "customer": {
        "id": "customer123ffffa",
        "name": null,
        "email": "something@example.com",
        "phone": null,
        "phone_country_code": null
    },
    "description": null,
    "refunds": null,
    "disputes": null,
    "mandate_id": null,
    "mandate_data": null,
    "setup_future_usage": null,
    "off_session": true,
    "capture_on": null,
    "capture_method": null,
    "payment_method": "card",
    "payment_method_data": {
        "card": {
            "last4": "1111",
            "card_type": null,
            "card_network": null,
            "card_issuer": null,
            "card_issuing_country": null,
            "card_isin": "411111",
            "card_extended_bin": null,
            "card_exp_month": "03",
            "card_exp_year": "30",
            "card_holder_name": "joseph Doe",
            "payment_checks": null,
            "authentication_data": null
        },
        "billing": null
    },
    "payment_token": null,
    "shipping": null,
    "billing": null,
    "order_details": null,
    "email": "something@example.com",
    "name": null,
    "phone": null,
    "return_url": null,
    "authentication_type": "no_three_ds",
    "statement_descriptor_name": null,
    "statement_descriptor_suffix": null,
    "next_action": null,
    "cancellation_reason": null,
    "error_code": null,
    "error_message": null,
    "unified_code": null,
    "unified_message": null,
    "payment_experience": null,
    "payment_method_type": "debit",
    "connector_label": null,
    "business_country": null,
    "business_label": "default",
    "business_sub_label": null,
    "allowed_payment_method_types": null,
    "ephemeral_key": {
        "customer_id": "customer123ffffa",
        "created_at": 1753291801,
        "expires": 1753295401,
        "secret": "epk_66d9de3b79db4ee3b35e9dd6db9c18e4"
    },
    "manual_retry_allowed": false,
    "connector_transaction_id": "TRN_xgxrFV1PkebYZKabeA2R4qN63rqTka_6X8zmyOPcS_1",
    "frm_message": null,
    "metadata": null,
    "connector_metadata": null,
    "feature_metadata": null,
    "reference_id": "pay_6pONwGPfaI6X8zmyOPcS_1",
    "payment_link": null,
    "profile_id": "pro_roCz974ra9LQxsifUris",
    "surcharge_details": null,
    "attempt_count": 1,
    "merchant_decision": null,
    "merchant_connector_id": "mca_5Y545k7TI4upQYSbJJ9L",
    "incremental_authorization_allowed": null,
    "authorization_count": null,
    "incremental_authorizations": null,
    "external_authentication_details": null,
    "external_3ds_authentication_attempted": false,
    "expires_on": "2025-07-23T17:45:01.371Z",
    "fingerprint": null,
    "browser_info": null,
    "payment_method_id": "pm_P66KYq7rG0B7f7RENNf2",
    "payment_method_status": "active",
    "updated": "2025-07-23T17:30:05.264Z",
    "split_payments": null,
    "frm_metadata": null,
    "extended_authorization_applied": null,
    "capture_before": null,
    "merchant_order_reference_id": null,
    "order_tax_amount": null,
    "connector_mandate_id": "PMT_d6001c7b-6150-404d-92f3-56b217fb8a3d",
    "card_discovery": "manual",
    "force_3ds_challenge": false,
    "force_3ds_challenge_trigger": false,
    "issuer_error_code": null,
    "issuer_error_message": null,
    "is_iframe_redirection_enabled": null,
    "whole_connector_response": null
}
```

## Cypress test

<details>
<summary> Globalpay </summary>

<img width="490" height="1088" alt="Screenshot 2025-07-15 at 7 31 52 PM" src="https://github.com/user-attachments/assets/fc412951-43e1-4be9-bd07-28c7980db3a4" />
</details>

## 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
