Bug: FEATURE(connector): [Facilitapay] Add support for Pix Bank transfer



Documentation: https://sandbox-portal.facilitapay.com/#/docs
diff --git a/api-reference-v2/openapi_spec.json b/api-reference-v2/openapi_spec.json
index 10682866ab7..c758e0fbb8a 100644
--- a/api-reference-v2/openapi_spec.json
+++ b/api-reference-v2/openapi_spec.json
@@ -6230,6 +6230,18 @@
                     "description": "CNPJ is a Brazilian company tax identification number",
                     "example": "74469027417312",
                     "nullable": true
+                  },
+                  "source_bank_account_id": {
+                    "type": "string",
+                    "description": "Source bank account number",
+                    "example": "8b2812f0-d6c8-4073-97bb-9fa964d08bc5",
+                    "nullable": true
+                  },
+                  "destination_bank_account_id": {
+                    "type": "string",
+                    "description": "Destination bank account number",
+                    "example": "9b95f84e-de61-460b-a14b-f23b4e71c97b",
+                    "nullable": true
                   }
                 }
               }
@@ -7776,6 +7788,7 @@
           "dlocal",
           "ebanx",
           "elavon",
+          "facilitapay",
           "fiserv",
           "fiservemea",
           "fiuu",
@@ -10443,6 +10456,18 @@
               "user_bank_account_number"
             ]
           },
+          {
+            "type": "string",
+            "enum": [
+              "user_source_bank_account_id"
+            ]
+          },
+          {
+            "type": "string",
+            "enum": [
+              "user_destination_bank_account_id"
+            ]
+          },
           {
             "type": "string",
             "enum": [
@@ -19428,6 +19453,18 @@
             "description": "Partially masked CNPJ - CNPJ is a Brazilian company tax identification number",
             "example": "**** 417312",
             "nullable": true
+          },
+          "source_bank_account_id": {
+            "type": "string",
+            "description": "Partially masked source bank account number",
+            "example": "********-****-4073-****-9fa964d08bc5",
+            "nullable": true
+          },
+          "destination_bank_account_id": {
+            "type": "string",
+            "description": "Partially masked destination bank account number",
+            "example": "********-****-460b-****-f23b4e71c97b",
+            "nullable": true
           }
         }
       },
@@ -21082,6 +21119,7 @@
           "dlocal",
           "ebanx",
           "elavon",
+          "facilitapay",
           "fiserv",
           "fiservemea",
           "fiuu",
diff --git a/config/config.example.toml b/config/config.example.toml
index 15b9dd2fc4d..63c7c89b039 100644
--- a/config/config.example.toml
+++ b/config/config.example.toml
@@ -331,7 +331,7 @@ cards = [
   "datatrans",
   "deutschebank",
     "digitalvirgo",
-    "facilitapay",
+  "facilitapay",
   "globalpay",
   "globepay",
   "gocardless",
@@ -647,6 +647,9 @@ credit = { country = "FR", currency = "CAD, AUD, EUR, USD" }
 [pm_filters.digitalvirgo]
 direct_carrier_billing = {country = "MA, CM, ZA, EG, SN, DZ, TN, ML, GN, GH, LY, GA, CG, MG, BW, SD, NG, ID, SG, AZ, TR, FR, ES, PL, GB, PT, DE, IT, BE, IE, SK, GR, NL, CH, BR, MX, AR, CL, AE, IQ, KW, BH, SA, QA, PS, JO, OM, RU" , currency = "MAD, XOF, XAF, ZAR, EGP, DZD, TND, GNF, GHS, LYD, XAF, CDF, MGA, BWP, SDG, NGN, IDR, SGD, RUB, AZN, TRY, EUR, PLN, GBP, CHF, BRL, MXN, ARS, CLP, AED, IQD, KWD, BHD, SAR, QAR, ILS, JOD, OMR" }
 
+[pm_filters.facilitapay]
+pix = { country = "BR", currency = "BRL" }
+
 [pm_filters.helcim]
 credit = { country = "US, CA", currency = "USD, CAD" }
 debit = { country = "US, CA", currency = "USD, CAD" }
@@ -745,7 +748,7 @@ credit = { country = "AD,AE,AF,AG,AI,AL,AM,AO,AQ,AR,AS,AT,AU,AW,AX,AZ,BA,BB,BD,B
 debit = { country = "AD,AE,AF,AG,AI,AL,AM,AO,AQ,AR,AS,AT,AU,AW,AX,AZ,BA,BB,BD,BE,BF,BG,BH,BI,BJ,BL,BM,BN,BO,BQ,BR,BS,BT,BV,BW,BY,BZ,CA,CC,CD,CF,CG,CH,CI,CK,CL,CM,CN,CO,CR,CU,CV,CW,CX,CY,CZ,DE,DJ,DK,DM,DO,DZ,EC,EE,EG,EH,ER,ES,ET,FI,FJ,FK,FM,FO,FR,GA,GB,GD,GE,GF,GG,GH,GI,GL,GM,GN,GP,GQ,GR,GT,GU,GW,GY,HK,HM,HN,HR,HT,HU,ID,IE,IL,IM,IN,IO,IQ,IR,IS,IT,JE,JM,JO,JP,KE,KG,KH,KI,KM,KN,KP,KR,KW,KY,KZ,LA,LB,LC,LI,LK,LR,LS,LT,LU,LV,LY,MA,MC,MD,ME,MF,MG,MH,MK,ML,MM,MN,MO,MP,MQ,MR,MS,MT,MU,MV,MW,MX,MY,MZ,NA,NC,NE,NF,NG,NI,NL,NO,NP,NR,NU,NZ,OM,PA,PE,PF,PG,PH,PK,PL,PM,PN,PR,PS,PT,PW,PY,QA,RE,RO,RS,RU,RW,SA,SB,SC,SD,SE,SG,SH,SI,SJ,SK,SL,SM,SN,SO,SR,SS,ST,SV,SX,SY,SZ,TC,TD,TF,TG,TH,TJ,TL,TM,TN,TO,TR,TT,TV,TW,TZ,UA,UG,UM,US,UY,UZ,VA,VC,VE,VG,VI,VN,VU,WF,WS,YE,YT,ZA,ZM,ZW", currency = "AED,AFN,ALL,AMD,ANG,AOA,ARS,AUD,AWG,AZN,BAM,BBD,BDT,BGN,BHD,BIF,BMD,BND,BOB,BRL,BSD,BTN,BWP,BYN,BZD,CAD,CDF,CHF,CLP,CNY,COP,CRC,CUP,CVE,CZK,DJF,DKK,DOP,DZD,EGP,ERN,ETB,EUR,FJD,FKP,GBP,GEL,GHS,GIP,GMD,GNF,GTQ,GYD,HKD,HNL,HRK,HTG,HUF,IDR,ILS,INR,IQD,IRR,ISK,JMD,JOD,JPY,KES,KGS,KHR,KMF,KPW,KRW,KWD,KYD,KZT,LAK,LBP,LKR,LRD,LSL,LYD,MAD,MDL,MGA,MKD,MMK,MNT,MOP,MRU,MUR,MVR,MWK,MXN,MYR,MZN,NAD,NGN,NIO,NOK,NPR,NZD,OMR,PAB,PEN,PGK,PHP,PKR,PLN,PYG,QAR,RON,RSD,RUB,RWF,SAR,SBD,SCR,SDG,SEK,SGD,SHP,SLL,SOS,SRD,SSP,SVC,SYP,SZL,THB,TJS,TMT,TND,TOP,TRY,TTD,TWD,TZS,UAH,UGX,USD,UYU,UZS,VND,VUV,WST,XAF,XCD,XOF,XPF,YER,ZAR,ZMW,ZWL" }
 
 [connector_customer]
-connector_list = "gocardless,stax,stripe"
+connector_list = "gocardless,stax,stripe,facilitapay"
 payout_connector_list = "nomupay,stripe,wise"
 
 [bank_config.online_banking_fpx]
diff --git a/config/deployments/integration_test.toml b/config/deployments/integration_test.toml
index 802af333f8b..0b4c0967e14 100644
--- a/config/deployments/integration_test.toml
+++ b/config/deployments/integration_test.toml
@@ -166,7 +166,7 @@ force_cookies = true
 enabled = true
 
 [connector_customer]
-connector_list = "gocardless,stax,stripe"
+connector_list = "gocardless,stax,stripe,facilitapay"
 payout_connector_list = "nomupay,stripe,wise"
 
 [delayed_session_response]
@@ -359,6 +359,9 @@ paypal.currency = "AUD,BRL,CAD,CNY,CZK,DKK,EUR,HKD,HUF,ILS,JPY,MYR,MXN,TWD,NZD,N
 credit.currency = "USD"
 debit.currency = "USD"
 
+[pm_filters.facilitapay]
+pix = { country = "BR", currency = "BRL" }
+
 [pm_filters.helcim]
 credit = { country = "US, CA", currency = "USD, CAD" }
 debit = { country = "US, CA", currency = "USD, CAD" }
diff --git a/config/deployments/production.toml b/config/deployments/production.toml
index 3cc5b8c0f8a..563941cf9d0 100644
--- a/config/deployments/production.toml
+++ b/config/deployments/production.toml
@@ -15,7 +15,7 @@ open_banking_uk.adyen.banks = "aib,bank_of_scotland,danske_bank,first_direct,fir
 przelewy24.stripe.banks = "alior_bank,bank_millennium,bank_nowy_bfg_sa,bank_pekao_sa,banki_spbdzielcze,blik,bnp_paribas,boz,citi,credit_agricole,e_transfer_pocztowy24,getin_bank,idea_bank,inteligo,mbank_mtransfer,nest_przelew,noble_pay,pbac_z_ipko,plus_bank,santander_przelew24,toyota_bank,volkswagen_bank"
 
 [connector_customer]
-connector_list = "stax,stripe,gocardless"
+connector_list = "stax,stripe,gocardless,facilitapay"
 payout_connector_list = "nomupay,stripe,wise"
 
 # Connector configuration, provided attributes will be used to fulfill API requests.
@@ -409,6 +409,9 @@ paypal.currency = "AUD,BRL,CAD,CNY,CZK,DKK,EUR,HKD,HUF,ILS,JPY,MYR,MXN,TWD,NZD,N
 credit.currency = "USD"
 debit.currency = "USD"
 
+[pm_filters.facilitapay]
+pix = { country = "BR", currency = "BRL" }
+
 [pm_filters.helcim]
 credit = { country = "US, CA", currency = "USD, CAD" }
 debit = { country = "US, CA", currency = "USD, CAD" }
diff --git a/config/deployments/sandbox.toml b/config/deployments/sandbox.toml
index c3555f7ea05..c861ade9aab 100644
--- a/config/deployments/sandbox.toml
+++ b/config/deployments/sandbox.toml
@@ -15,7 +15,7 @@ open_banking_uk.adyen.banks = "aib,bank_of_scotland,danske_bank,first_direct,fir
 przelewy24.stripe.banks = "alior_bank,bank_millennium,bank_nowy_bfg_sa,bank_pekao_sa,banki_spbdzielcze,blik,bnp_paribas,boz,citi,credit_agricole,e_transfer_pocztowy24,getin_bank,idea_bank,inteligo,mbank_mtransfer,nest_przelew,noble_pay,pbac_z_ipko,plus_bank,santander_przelew24,toyota_bank,volkswagen_bank"
 
 [connector_customer]
-connector_list = "stax,stripe,gocardless"
+connector_list = "stax,stripe,gocardless,facilitapay"
 payout_connector_list = "nomupay,stripe,wise"
 
 # Connector configuration, provided attributes will be used to fulfill API requests.
@@ -411,6 +411,9 @@ paypal.currency = "AUD,BRL,CAD,CNY,CZK,DKK,EUR,HKD,HUF,ILS,JPY,MYR,MXN,TWD,NZD,N
 credit.currency = "USD"
 debit.currency = "USD"
 
+[pm_filters.facilitapay]
+pix = { country = "BR", currency = "BRL" }
+
 [pm_filters.helcim]
 credit = { country = "US, CA", currency = "USD, CAD" }
 debit = { country = "US, CA", currency = "USD, CAD" }
diff --git a/config/development.toml b/config/development.toml
index 37c496efbae..f271f70fcac 100644
--- a/config/development.toml
+++ b/config/development.toml
@@ -574,6 +574,9 @@ paypal = { country = "AD,AE,AL,AM,AR,AT,AU,AZ,BA,BB,BD,BE,BG,BH,BI,BM,BN,BO,BR,B
 [pm_filters.braintree]
 paypal = { currency = "AUD,BRL,CAD,CNY,CZK,DKK,EUR,HKD,HUF,ILS,JPY,MYR,MXN,TWD,NZD,NOK,PHP,PLN,GBP,RUB,SGD,SEK,CHF,THB,USD" }
 
+[pm_filters.facilitapay]
+pix = { country = "BR", currency = "BRL" }
+
 [pm_filters.helcim]
 credit = { country = "US, CA", currency = "USD, CAD" }
 debit = { country = "US, CA", currency = "USD, CAD" }
@@ -751,7 +754,7 @@ nexixpay = { payment_method = "card" }
 redsys = { payment_method = "card" }
 
 [connector_customer]
-connector_list = "gocardless,stax,stripe"
+connector_list = "gocardless,stax,stripe,facilitapay"
 payout_connector_list = "nomupay,stripe,wise"
 
 [dummy_connector]
diff --git a/config/docker_compose.toml b/config/docker_compose.toml
index 4b0214b8f1b..d8f2d4bd34d 100644
--- a/config/docker_compose.toml
+++ b/config/docker_compose.toml
@@ -575,6 +575,9 @@ apple_pay = { country = "AD,AE,AL,AM,AR,AT,AU,AZ,BA,BB,BD,BE,BG,BH,BI,BM,BN,BO,B
 google_pay = { country = "AD,AE,AL,AM,AR,AT,AU,AZ,BA,BB,BD,BE,BG,BH,BI,BM,BN,BO,BR,BS,BW,BY,BZ,CA,CD,CH,CL,CN,CO,CR,CU,CY,CZ,DE,DJ,DK,DO,DZ,EE,EG,ET,ES,FI,FJ,FR,GB,GE,GH,GI,GM,GR,GT,GY,HK,HN,HR,HU,ID,IE,IL,IN,IS,IT,JM,JO,JP,KE,KH,KR,KW,KY,KZ,LB,LK,LT,LV,LY,MA,MC,MD,ME,MG,MK,MN,MO,MT,MV,MW,MX,MY,NG,NI,NO,NP,NL,NZ,OM,PA,PE,PG,PH,PK,PL,PT,PY,QA,RO,RS,RU,RW,SA,SB,SC,SE,SG,SH,SI,SK,SL,SO,SM,SR,ST,SV,SY,TH,TJ,TN,TO,TR,TW,TZ,UA,UG,US,UY,UZ,VE,VA,VN,VU,WS,CF,AG,DM,GD,KN,LC,VC,YE,ZA,ZM", currency = "AED,ALL,AMD,ARS,AUD,AZN,BAM,BBD,BDT,BGN,BHD,BIF,BMD,BND,BOB,BRL,BSD,BWP,BYN,BZD,CAD,CDF,CHF,CLP,CNY,COP,CRC,CUP,CZK,DJF,DKK,DOP,DZD,EGP,ETB,EUR,FJD,GBP,GEL,GHS,GIP,GMD,GTQ,GYD,HKD,HNL,HRK,HUF,IDR,ILS,INR,ISK,JMD,JOD,JPY,KES,KHR,KRW,KWD,KYD,KZT,LBP,LKR,LYD,MAD,MDL,MGA,MKD,MNT,MOP,MVR,MWK,MXN,MYR,NGN,NIO,NOK,NPR,NZD,OMR,PAB,PEN,PGK,PHP,PKR,PLN,PYG,QAR,RON,RSD,RUB,RWF,SAR,SBD,SCR,SEK,SGD,SHP,SLL,SOS,SRD,STN,SVC,SYP,THB,TJS,TND,TOP,TRY,TWD,TZS,UAH,UGX,USD,UYU,UZS,VES,VND,VUV,WST,XAF,XCD,YER,ZAR,ZMW"}
 paypal = { country = "AD,AE,AL,AM,AR,AT,AU,AZ,BA,BB,BD,BE,BG,BH,BI,BM,BN,BO,BR,BS,BW,BY,BZ,CA,CD,CH,CL,CN,CO,CR,CU,CY,CZ,DE,DJ,DK,DO,DZ,EE,EG,ET,ES,FI,FJ,FR,GB,GE,GH,GI,GM,GR,GT,GY,HK,HN,HR,HU,ID,IE,IL,IN,IS,IT,JM,JO,JP,KE,KH,KR,KW,KY,KZ,LB,LK,LT,LV,LY,MA,MC,MD,ME,MG,MK,MN,MO,MT,MV,MW,MX,MY,NG,NI,NO,NP,NL,NZ,OM,PA,PE,PG,PH,PK,PL,PT,PY,QA,RO,RS,RU,RW,SA,SB,SC,SE,SG,SH,SI,SK,SL,SO,SM,SR,ST,SV,SY,TH,TJ,TN,TO,TR,TW,TZ,UA,UG,US,UY,UZ,VE,VA,VN,VU,WS,CF,AG,DM,GD,KN,LC,VC,YE,ZA,ZM", currency = "AED,ALL,AMD,ARS,AUD,AZN,BAM,BBD,BDT,BGN,BHD,BIF,BMD,BND,BOB,BRL,BSD,BWP,BYN,BZD,CAD,CDF,CHF,CLP,CNY,COP,CRC,CUP,CZK,DJF,DKK,DOP,DZD,EGP,ETB,EUR,FJD,GBP,GEL,GHS,GIP,GMD,GTQ,GYD,HKD,HNL,HRK,HUF,IDR,ILS,INR,ISK,JMD,JOD,JPY,KES,KHR,KRW,KWD,KYD,KZT,LBP,LKR,LYD,MAD,MDL,MGA,MKD,MNT,MOP,MVR,MWK,MXN,MYR,NGN,NIO,NOK,NPR,NZD,OMR,PAB,PEN,PGK,PHP,PKR,PLN,PYG,QAR,RON,RSD,RUB,RWF,SAR,SBD,SCR,SEK,SGD,SHP,SLL,SOS,SRD,STN,SVC,SYP,THB,TJS,TND,TOP,TRY,TWD,TZS,UAH,UGX,USD,UYU,UZS,VES,VND,VUV,WST,XAF,XCD,YER,ZAR,ZMW"}
 
+[pm_filters.facilitapay]
+pix = { country = "BR", currency = "BRL" }
+
 [pm_filters.helcim]
 credit = { country = "US, CA", currency = "USD, CAD" }
 debit = { country = "US, CA", currency = "USD, CAD" }
@@ -713,7 +716,7 @@ card.debit = { connector_list = "cybersource" }
 connector_list = "adyen,cybersource,novalnet,stripe,worldpay"
 
 [connector_customer]
-connector_list = "gocardless,stax,stripe"
+connector_list = "gocardless,stax,stripe,facilitapay"
 payout_connector_list = "nomupay,stripe,wise"
 
 
diff --git a/crates/api_models/src/enums.rs b/crates/api_models/src/enums.rs
index 212504baaa3..55857ec4412 100644
--- a/crates/api_models/src/enums.rs
+++ b/crates/api_models/src/enums.rs
@@ -237,6 +237,8 @@ pub enum FieldType {
     UserBlikCode,
     UserBank,
     UserBankAccountNumber,
+    UserSourceBankAccountId,
+    UserDestinationBankAccountId,
     Text,
     DropDown { options: Vec<String> },
     UserDateOfBirth,
diff --git a/crates/api_models/src/payments.rs b/crates/api_models/src/payments.rs
index 011fd7e4431..1f7b40de7e0 100644
--- a/crates/api_models/src/payments.rs
+++ b/crates/api_models/src/payments.rs
@@ -19,6 +19,7 @@ use common_utils::{
     ext_traits::{ConfigExt, Encode, ValueExt},
     hashing::HashedString,
     id_type,
+    new_type::MaskedBankAccount,
     pii::{self, Email},
     types::{MinorUnit, StringMajorUnit},
 };
@@ -3413,6 +3414,14 @@ pub enum BankTransferData {
         /// CNPJ is a Brazilian company tax identification number
         #[schema(value_type = Option<String>, example = "74469027417312")]
         cnpj: Option<Secret<String>>,
+
+        /// Source bank account number
+        #[schema(value_type = Option<String>, example = "8b2812f0-d6c8-4073-97bb-9fa964d08bc5")]
+        source_bank_account_id: Option<MaskedBankAccount>,
+
+        /// Destination bank account number
+        #[schema(value_type = Option<String>, example = "9b95f84e-de61-460b-a14b-f23b4e71c97b")]
+        destination_bank_account_id: Option<MaskedBankAccount>,
     },
     Pse {},
     LocalBankTransfer {
diff --git a/crates/api_models/src/payments/additional_info.rs b/crates/api_models/src/payments/additional_info.rs
index 33297e2b342..371bebe5982 100644
--- a/crates/api_models/src/payments/additional_info.rs
+++ b/crates/api_models/src/payments/additional_info.rs
@@ -167,6 +167,14 @@ pub struct PixBankTransferAdditionalData {
     /// Partially masked CNPJ - CNPJ is a Brazilian company tax identification number
     #[schema(value_type = Option<String>, example = "**** 417312")]
     pub cnpj: Option<MaskedBankAccount>,
+
+    /// Partially masked source bank account number
+    #[schema(value_type = Option<String>, example = "********-****-4073-****-9fa964d08bc5")]
+    pub source_bank_account_id: Option<MaskedBankAccount>,
+
+    /// Partially masked destination bank account number
+    #[schema(value_type = Option<String>, example = "********-****-460b-****-f23b4e71c97b")]
+    pub destination_bank_account_id: Option<MaskedBankAccount>,
 }
 
 #[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize, ToSchema)]
diff --git a/crates/common_enums/src/connector_enums.rs b/crates/common_enums/src/connector_enums.rs
index 70efd457a97..0b831d63c2d 100644
--- a/crates/common_enums/src/connector_enums.rs
+++ b/crates/common_enums/src/connector_enums.rs
@@ -80,7 +80,7 @@ pub enum RoutableConnectors {
     Dlocal,
     Ebanx,
     Elavon,
-    // Facilitapay,
+    Facilitapay,
     Fiserv,
     Fiservemea,
     Fiuu,
@@ -225,7 +225,7 @@ pub enum Connector {
     Dlocal,
     Ebanx,
     Elavon,
-    // Facilitapay,
+    Facilitapay,
     Fiserv,
     Fiservemea,
     Fiuu,
@@ -344,6 +344,7 @@ impl Connector {
                 | (Self::Iatapay, _)
                 | (Self::Volt, _)
                 | (Self::Itaubank, _)
+                | (Self::Facilitapay, _)
         )
     }
     pub fn supports_file_storage_module(self) -> bool {
@@ -387,7 +388,7 @@ impl Connector {
             | Self::Dlocal
             | Self::Ebanx
             | Self::Elavon
-            // | Self::Facilitapay
+            | Self::Facilitapay
             | Self::Fiserv
             | Self::Fiservemea
             | Self::Fiuu
@@ -537,7 +538,7 @@ impl From<RoutableConnectors> for Connector {
             RoutableConnectors::Dlocal => Self::Dlocal,
             RoutableConnectors::Ebanx => Self::Ebanx,
             RoutableConnectors::Elavon => Self::Elavon,
-            // RoutableConnectors::Facilitapay => Self::Facilitapay,
+            RoutableConnectors::Facilitapay => Self::Facilitapay,
             RoutableConnectors::Fiserv => Self::Fiserv,
             RoutableConnectors::Fiservemea => Self::Fiservemea,
             RoutableConnectors::Fiuu => Self::Fiuu,
@@ -646,7 +647,7 @@ impl TryFrom<Connector> for RoutableConnectors {
             Connector::Dlocal => Ok(Self::Dlocal),
             Connector::Ebanx => Ok(Self::Ebanx),
             Connector::Elavon => Ok(Self::Elavon),
-            // Connector::Facilitapay => Ok(Self::Facilitapay),
+            Connector::Facilitapay => Ok(Self::Facilitapay),
             Connector::Fiserv => Ok(Self::Fiserv),
             Connector::Fiservemea => Ok(Self::Fiservemea),
             Connector::Fiuu => Ok(Self::Fiuu),
diff --git a/crates/common_enums/src/enums.rs b/crates/common_enums/src/enums.rs
index 87c64747c69..48aa9eafd8f 100644
--- a/crates/common_enums/src/enums.rs
+++ b/crates/common_enums/src/enums.rs
@@ -6607,6 +6607,66 @@ pub enum RomaniaStatesAbbreviation {
     ValceaCounty,
 }
 
+#[derive(
+    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, strum::Display, strum::EnumString,
+)]
+pub enum BrazilStatesAbbreviation {
+    #[strum(serialize = "AC")]
+    Acre,
+    #[strum(serialize = "AL")]
+    Alagoas,
+    #[strum(serialize = "AP")]
+    Amapá,
+    #[strum(serialize = "AM")]
+    Amazonas,
+    #[strum(serialize = "BA")]
+    Bahia,
+    #[strum(serialize = "CE")]
+    Ceará,
+    #[strum(serialize = "DF")]
+    DistritoFederal,
+    #[strum(serialize = "ES")]
+    EspíritoSanto,
+    #[strum(serialize = "GO")]
+    Goiás,
+    #[strum(serialize = "MA")]
+    Maranhão,
+    #[strum(serialize = "MT")]
+    MatoGrosso,
+    #[strum(serialize = "MS")]
+    MatoGrossoDoSul,
+    #[strum(serialize = "MG")]
+    MinasGerais,
+    #[strum(serialize = "PA")]
+    Pará,
+    #[strum(serialize = "PB")]
+    Paraíba,
+    #[strum(serialize = "PR")]
+    Paraná,
+    #[strum(serialize = "PE")]
+    Pernambuco,
+    #[strum(serialize = "PI")]
+    Piauí,
+    #[strum(serialize = "RJ")]
+    RioDeJaneiro,
+    #[strum(serialize = "RN")]
+    RioGrandeDoNorte,
+    #[strum(serialize = "RS")]
+    RioGrandeDoSul,
+    #[strum(serialize = "RO")]
+    Rondônia,
+    #[strum(serialize = "RR")]
+    Roraima,
+    #[strum(serialize = "SC")]
+    SantaCatarina,
+    #[strum(serialize = "SP")]
+    SãoPaulo,
+    #[strum(serialize = "SE")]
+    Sergipe,
+    #[strum(serialize = "TO")]
+    Tocantins,
+}
+
 #[derive(
     Clone,
     Copy,
diff --git a/crates/connector_configs/src/connector.rs b/crates/connector_configs/src/connector.rs
index 782ca4cb711..70bfe9befac 100644
--- a/crates/connector_configs/src/connector.rs
+++ b/crates/connector_configs/src/connector.rs
@@ -196,7 +196,7 @@ pub struct ConnectorConfig {
     pub dlocal: Option<ConnectorTomlConfig>,
     pub ebanx_payout: Option<ConnectorTomlConfig>,
     pub elavon: Option<ConnectorTomlConfig>,
-    // pub facilitapay: Option<ConnectorTomlConfig>,
+    pub facilitapay: Option<ConnectorTomlConfig>,
     pub fiserv: Option<ConnectorTomlConfig>,
     pub fiservemea: Option<ConnectorTomlConfig>,
     pub fiuu: Option<ConnectorTomlConfig>,
@@ -373,7 +373,7 @@ impl ConnectorConfig {
             Connector::Dlocal => Ok(connector_data.dlocal),
             Connector::Ebanx => Ok(connector_data.ebanx_payout),
             Connector::Elavon => Ok(connector_data.elavon),
-            // Connector::Facilitapay => Ok(connector_data.facilitapay),
+            Connector::Facilitapay => Ok(connector_data.facilitapay),
             Connector::Fiserv => Ok(connector_data.fiserv),
             Connector::Fiservemea => Ok(connector_data.fiservemea),
             Connector::Fiuu => Ok(connector_data.fiuu),
diff --git a/crates/connector_configs/toml/development.toml b/crates/connector_configs/toml/development.toml
index 5675ad1d766..9ba3e86cac8 100644
--- a/crates/connector_configs/toml/development.toml
+++ b/crates/connector_configs/toml/development.toml
@@ -5828,3 +5828,10 @@ type="Text"
 api_key="Merchant ID"
 key1="Terminal ID"
 api_secret="Secret Key"
+
+[facilitapay]
+[[facilitapay.bank_transfer]]
+  payment_method_type = "pix"
+[facilitapay.connector_auth.Bodykey]
+  api_key="Password"
+  key1="Username"
diff --git a/crates/connector_configs/toml/production.toml b/crates/connector_configs/toml/production.toml
index efc797a5a1e..da0fd93f70f 100644
--- a/crates/connector_configs/toml/production.toml
+++ b/crates/connector_configs/toml/production.toml
@@ -4353,3 +4353,10 @@ payment_method_type = "UnionPay"
 api_key = "Merchant ID"
 key1 = "Terminal ID"
 api_secret = "Secret Key"
+
+[facilitapay]
+[[facilitapay.bank_transfer]]
+  payment_method_type = "pix"
+[facilitapay.connector_auth.Bodykey]
+  api_key="Password"
+  key1="Username"
diff --git a/crates/connector_configs/toml/sandbox.toml b/crates/connector_configs/toml/sandbox.toml
index 4aa34446cbd..a2bdf1863bb 100644
--- a/crates/connector_configs/toml/sandbox.toml
+++ b/crates/connector_configs/toml/sandbox.toml
@@ -5800,3 +5800,10 @@ payment_method_type = "UnionPay"
 api_key = "Merchant ID"
 key1 = "Terminal ID"
 api_secret = "Secret Key"
+
+[facilitapay]
+[[facilitapay.bank_transfer]]
+  payment_method_type = "pix"
+[facilitapay.connector_auth.Bodykey]
+  api_key="Password"
+  key1="Username"
diff --git a/crates/hyperswitch_connectors/src/connectors/facilitapay.rs b/crates/hyperswitch_connectors/src/connectors/facilitapay.rs
index 7f0ed1a2f09..9b1a6486df4 100644
--- a/crates/hyperswitch_connectors/src/connectors/facilitapay.rs
+++ b/crates/hyperswitch_connectors/src/connectors/facilitapay.rs
@@ -1,28 +1,37 @@
+mod requests;
+mod responses;
 pub mod transformers;
 
+use common_enums::enums;
 use common_utils::{
     errors::CustomResult,
     ext_traits::BytesExt,
     request::{Method, Request, RequestBuilder, RequestContent},
-    types::{AmountConvertor, StringMinorUnit, StringMinorUnitForConnector},
+    types::{AmountConvertor, StringMajorUnit, StringMajorUnitForConnector},
 };
 use error_stack::{report, ResultExt};
 use hyperswitch_domain_models::{
-    router_data::{AccessToken, ConnectorAuthType, ErrorResponse, RouterData},
+    router_data::{AccessToken, ErrorResponse, RouterData},
     router_flow_types::{
         access_token_auth::AccessTokenAuth,
-        payments::{Authorize, Capture, PSync, PaymentMethodToken, Session, SetupMandate, Void},
+        payments::{
+            Authorize, Capture, CreateConnectorCustomer, PSync, PaymentMethodToken, Session,
+            SetupMandate, Void,
+        },
         refunds::{Execute, RSync},
     },
     router_request_types::{
-        AccessTokenRequestData, PaymentMethodTokenizationData, PaymentsAuthorizeData,
-        PaymentsCancelData, PaymentsCaptureData, PaymentsSessionData, PaymentsSyncData,
-        RefundsData, SetupMandateRequestData,
+        AccessTokenRequestData, ConnectorCustomerData, PaymentMethodTokenizationData,
+        PaymentsAuthorizeData, PaymentsCancelData, PaymentsCaptureData, PaymentsSessionData,
+        PaymentsSyncData, RefundsData, SetupMandateRequestData,
+    },
+    router_response_types::{
+        ConnectorInfo, PaymentMethodDetails, PaymentsResponseData, RefundsResponseData,
+        SupportedPaymentMethods, SupportedPaymentMethodsExt,
     },
-    router_response_types::{PaymentsResponseData, RefundsResponseData},
     types::{
-        PaymentsAuthorizeRouterData, PaymentsCaptureRouterData, PaymentsSyncRouterData,
-        RefundSyncRouterData, RefundsRouterData,
+        ConnectorCustomerRouterData, PaymentsAuthorizeRouterData, PaymentsCaptureRouterData,
+        PaymentsSyncRouterData, RefundSyncRouterData, RefundsRouterData,
     },
 };
 use hyperswitch_interfaces::{
@@ -33,27 +42,41 @@ use hyperswitch_interfaces::{
     configs::Connectors,
     errors,
     events::connector_api_logs::ConnectorEvent,
-    types::{self, Response},
+    types::{self, RefreshTokenType, Response},
     webhooks,
 };
-use masking::{ExposeInterface, Mask};
-use transformers as facilitapay;
+use lazy_static::lazy_static;
+use masking::{Mask, PeekInterface};
+use requests::{
+    FacilitapayAuthRequest, FacilitapayCustomerRequest, FacilitapayPaymentsRequest,
+    FacilitapayRefundRequest, FacilitapayRouterData,
+};
+use responses::{
+    FacilitapayAuthResponse, FacilitapayCustomerResponse, FacilitapayPaymentsResponse,
+    FacilitapayRefundResponse,
+};
+use transformers::parse_facilitapay_error_response;
 
-use crate::{constants::headers, types::ResponseRouterData, utils};
+use crate::{
+    constants::headers,
+    types::{RefreshTokenRouterData, ResponseRouterData},
+    utils::{self, RefundsRequestData},
+};
 
 #[derive(Clone)]
 pub struct Facilitapay {
-    amount_converter: &'static (dyn AmountConvertor<Output = StringMinorUnit> + Sync),
+    amount_converter: &'static (dyn AmountConvertor<Output = StringMajorUnit> + Sync),
 }
 
 impl Facilitapay {
     pub fn new() -> &'static Self {
         &Self {
-            amount_converter: &StringMinorUnitForConnector,
+            amount_converter: &StringMajorUnitForConnector,
         }
     }
 }
 
+impl api::ConnectorCustomer for Facilitapay {}
 impl api::Payment for Facilitapay {}
 impl api::PaymentSession for Facilitapay {}
 impl api::ConnectorAccessToken for Facilitapay {}
@@ -82,13 +105,23 @@ where
         req: &RouterData<Flow, Request, Response>,
         _connectors: &Connectors,
     ) -> CustomResult<Vec<(String, masking::Maskable<String>)>, errors::ConnectorError> {
-        let mut header = vec![(
-            headers::CONTENT_TYPE.to_string(),
-            self.get_content_type().to_string().into(),
-        )];
-        let mut api_key = self.get_auth_header(&req.connector_auth_type)?;
-        header.append(&mut api_key);
-        Ok(header)
+        let access_token = req
+            .access_token
+            .clone()
+            .ok_or(errors::ConnectorError::FailedToObtainAuthType)?;
+
+        let headers = vec![
+            (
+                headers::CONTENT_TYPE.to_string(),
+                self.get_content_type().to_string().into(),
+            ),
+            (
+                headers::AUTHORIZATION.to_string(),
+                format!("Bearer {}", access_token.token.clone().peek()).into_masked(),
+            ),
+        ];
+
+        Ok(headers)
     }
 }
 
@@ -99,9 +132,6 @@ impl ConnectorCommon for Facilitapay {
 
     fn get_currency_unit(&self) -> api::CurrencyUnit {
         api::CurrencyUnit::Base
-        //    TODO! Check connector documentation, on which unit they are processing the currency.
-        //    If the connector accepts amount in lower unit ( i.e cents for USD) then return api::CurrencyUnit::Minor,
-        //    if connector accepts amount in base unit (i.e dollars for USD) then return api::CurrencyUnit::Base
     }
 
     fn common_get_content_type(&self) -> &'static str {
@@ -112,58 +142,201 @@ impl ConnectorCommon for Facilitapay {
         connectors.facilitapay.base_url.as_ref()
     }
 
-    fn get_auth_header(
+    fn build_error_response(
+        &self,
+        res: Response,
+        event_builder: Option<&mut ConnectorEvent>,
+    ) -> CustomResult<ErrorResponse, errors::ConnectorError> {
+        parse_facilitapay_error_response(res, event_builder)
+    }
+}
+
+impl ConnectorIntegration<CreateConnectorCustomer, ConnectorCustomerData, PaymentsResponseData>
+    for Facilitapay
+{
+    fn get_headers(
         &self,
-        auth_type: &ConnectorAuthType,
+        req: &ConnectorCustomerRouterData,
+        connectors: &Connectors,
     ) -> CustomResult<Vec<(String, masking::Maskable<String>)>, errors::ConnectorError> {
-        let auth = facilitapay::FacilitapayAuthType::try_from(auth_type)
-            .change_context(errors::ConnectorError::FailedToObtainAuthType)?;
-        Ok(vec![(
-            headers::AUTHORIZATION.to_string(),
-            auth.api_key.expose().into_masked(),
-        )])
+        self.build_headers(req, connectors)
     }
 
-    fn build_error_response(
+    fn get_content_type(&self) -> &'static str {
+        self.common_get_content_type()
+    }
+
+    fn get_url(
         &self,
-        res: Response,
+        _req: &ConnectorCustomerRouterData,
+        connectors: &Connectors,
+    ) -> CustomResult<String, errors::ConnectorError> {
+        Ok(format!("{}/subject/people", self.base_url(connectors)))
+    }
+
+    fn get_request_body(
+        &self,
+        req: &ConnectorCustomerRouterData,
+        _connectors: &Connectors,
+    ) -> CustomResult<RequestContent, errors::ConnectorError> {
+        let connector_req = FacilitapayCustomerRequest::try_from(req)?;
+        Ok(RequestContent::Json(Box::new(connector_req)))
+    }
+
+    fn build_request(
+        &self,
+        req: &ConnectorCustomerRouterData,
+        connectors: &Connectors,
+    ) -> CustomResult<Option<Request>, errors::ConnectorError> {
+        Ok(Some(
+            RequestBuilder::new()
+                .method(Method::Post)
+                .url(&types::ConnectorCustomerType::get_url(
+                    self, req, connectors,
+                )?)
+                .attach_default_headers()
+                .headers(types::ConnectorCustomerType::get_headers(
+                    self, req, connectors,
+                )?)
+                .set_body(types::ConnectorCustomerType::get_request_body(
+                    self, req, connectors,
+                )?)
+                .build(),
+        ))
+    }
+
+    fn handle_response(
+        &self,
+        data: &ConnectorCustomerRouterData,
         event_builder: Option<&mut ConnectorEvent>,
-    ) -> CustomResult<ErrorResponse, errors::ConnectorError> {
-        let response: facilitapay::FacilitapayErrorResponse = res
+        res: Response,
+    ) -> CustomResult<ConnectorCustomerRouterData, errors::ConnectorError>
+    where
+        ConnectorCustomerRouterData: Clone,
+    {
+        let response: FacilitapayCustomerResponse = res
             .response
-            .parse_struct("FacilitapayErrorResponse")
+            .parse_struct("FacilitapayCustomerResponse")
             .change_context(errors::ConnectorError::ResponseDeserializationFailed)?;
 
         event_builder.map(|i| i.set_response_body(&response));
         router_env::logger::info!(connector_response=?response);
 
-        Ok(ErrorResponse {
-            status_code: res.status_code,
-            code: response.code,
-            message: response.message,
-            reason: response.reason,
-            attempt_status: None,
-            connector_transaction_id: None,
-            network_advice_code: None,
-            network_decline_code: None,
-            network_error_message: None,
+        RouterData::try_from(ResponseRouterData {
+            response,
+            data: data.clone(),
+            http_code: res.status_code,
         })
     }
-}
 
-impl ConnectorValidation for Facilitapay {
-    //TODO: implement functions when support enabled
+    fn get_error_response(
+        &self,
+        res: Response,
+        event_builder: Option<&mut ConnectorEvent>,
+    ) -> CustomResult<ErrorResponse, errors::ConnectorError> {
+        self.build_error_response(res, event_builder)
+    }
 }
 
+impl ConnectorValidation for Facilitapay {}
+
 impl ConnectorIntegration<Session, PaymentsSessionData, PaymentsResponseData> for Facilitapay {
     //TODO: implement sessions flow
 }
 
-impl ConnectorIntegration<AccessTokenAuth, AccessTokenRequestData, AccessToken> for Facilitapay {}
+impl ConnectorIntegration<AccessTokenAuth, AccessTokenRequestData, AccessToken> for Facilitapay {
+    fn get_headers(
+        &self,
+        _req: &RefreshTokenRouterData,
+        _connectors: &Connectors,
+    ) -> CustomResult<Vec<(String, masking::Maskable<String>)>, errors::ConnectorError> {
+        Ok(vec![(
+            headers::CONTENT_TYPE.to_string(),
+            self.common_get_content_type().to_string().into(),
+        )])
+    }
+
+    fn get_content_type(&self) -> &'static str {
+        self.common_get_content_type()
+    }
+
+    fn get_url(
+        &self,
+        _req: &RefreshTokenRouterData,
+        connectors: &Connectors,
+    ) -> CustomResult<String, errors::ConnectorError> {
+        Ok(format!("{}/sign_in", self.base_url(connectors)))
+    }
+
+    fn get_request_body(
+        &self,
+        req: &RefreshTokenRouterData,
+        _connectors: &Connectors,
+    ) -> CustomResult<RequestContent, errors::ConnectorError> {
+        let connector_req = FacilitapayAuthRequest::try_from(req)?;
+        Ok(RequestContent::Json(Box::new(connector_req)))
+    }
+
+    fn build_request(
+        &self,
+        req: &RefreshTokenRouterData,
+        connectors: &Connectors,
+    ) -> CustomResult<Option<Request>, errors::ConnectorError> {
+        Ok(Some(
+            RequestBuilder::new()
+                .method(Method::Post)
+                .attach_default_headers()
+                .headers(RefreshTokenType::get_headers(self, req, connectors)?)
+                .url(&RefreshTokenType::get_url(self, req, connectors)?)
+                .set_body(RefreshTokenType::get_request_body(self, req, connectors)?)
+                .build(),
+        ))
+    }
+
+    fn handle_response(
+        &self,
+        data: &RefreshTokenRouterData,
+        event_builder: Option<&mut ConnectorEvent>,
+        res: Response,
+    ) -> CustomResult<RefreshTokenRouterData, errors::ConnectorError> {
+        let response: FacilitapayAuthResponse = res
+            .response
+            .parse_struct("FacilitapayAuthResponse")
+            .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 ConnectorIntegration<SetupMandate, SetupMandateRequestData, PaymentsResponseData>
     for Facilitapay
 {
+    fn build_request(
+        &self,
+        _req: &RouterData<SetupMandate, SetupMandateRequestData, PaymentsResponseData>,
+        _connectors: &Connectors,
+    ) -> CustomResult<Option<Request>, errors::ConnectorError> {
+        Err(errors::ConnectorError::NotImplemented(
+            "Setup Mandate flow for Facilitapay".to_string(),
+        )
+        .into())
+    }
 }
 
 impl ConnectorIntegration<Authorize, PaymentsAuthorizeData, PaymentsResponseData> for Facilitapay {
@@ -182,9 +355,9 @@ impl ConnectorIntegration<Authorize, PaymentsAuthorizeData, PaymentsResponseData
     fn get_url(
         &self,
         _req: &PaymentsAuthorizeRouterData,
-        _connectors: &Connectors,
+        connectors: &Connectors,
     ) -> CustomResult<String, errors::ConnectorError> {
-        Err(errors::ConnectorError::NotImplemented("get_url method".to_string()).into())
+        Ok(format!("{}/transactions", self.base_url(connectors)))
     }
 
     fn get_request_body(
@@ -198,9 +371,9 @@ impl ConnectorIntegration<Authorize, PaymentsAuthorizeData, PaymentsResponseData
             req.request.currency,
         )?;
 
-        let connector_router_data = facilitapay::FacilitapayRouterData::from((amount, req));
-        let connector_req =
-            facilitapay::FacilitapayPaymentsRequest::try_from(&connector_router_data)?;
+        let connector_router_data = FacilitapayRouterData::from((amount, req));
+        let connector_req = FacilitapayPaymentsRequest::try_from(&connector_router_data)?;
+
         Ok(RequestContent::Json(Box::new(connector_req)))
     }
 
@@ -232,12 +405,14 @@ impl ConnectorIntegration<Authorize, PaymentsAuthorizeData, PaymentsResponseData
         event_builder: Option<&mut ConnectorEvent>,
         res: Response,
     ) -> CustomResult<PaymentsAuthorizeRouterData, errors::ConnectorError> {
-        let response: facilitapay::FacilitapayPaymentsResponse = res
+        let response: FacilitapayPaymentsResponse = res
             .response
-            .parse_struct("Facilitapay PaymentsAuthorizeResponse")
+            .parse_struct("FacilitapayPaymentsAuthorizeResponse")
             .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(),
@@ -269,10 +444,19 @@ impl ConnectorIntegration<PSync, PaymentsSyncData, PaymentsResponseData> for Fac
 
     fn get_url(
         &self,
-        _req: &PaymentsSyncRouterData,
-        _connectors: &Connectors,
+        req: &PaymentsSyncRouterData,
+        connectors: &Connectors,
     ) -> CustomResult<String, errors::ConnectorError> {
-        Err(errors::ConnectorError::NotImplemented("get_url method".to_string()).into())
+        let connector_transaction_id = req
+            .request
+            .connector_transaction_id
+            .get_connector_transaction_id()
+            .change_context(errors::ConnectorError::MissingConnectorTransactionID)?;
+        Ok(format!(
+            "{}/transactions/{}",
+            self.base_url(connectors),
+            connector_transaction_id
+        ))
     }
 
     fn build_request(
@@ -296,12 +480,14 @@ impl ConnectorIntegration<PSync, PaymentsSyncData, PaymentsResponseData> for Fac
         event_builder: Option<&mut ConnectorEvent>,
         res: Response,
     ) -> CustomResult<PaymentsSyncRouterData, errors::ConnectorError> {
-        let response: facilitapay::FacilitapayPaymentsResponse = res
+        let response: FacilitapayPaymentsResponse = res
             .response
-            .parse_struct("facilitapay PaymentsSyncResponse")
+            .parse_struct("FacilitapayPaymentsSyncResponse")
             .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(),
@@ -373,9 +559,9 @@ impl ConnectorIntegration<Capture, PaymentsCaptureData, PaymentsResponseData> fo
         event_builder: Option<&mut ConnectorEvent>,
         res: Response,
     ) -> CustomResult<PaymentsCaptureRouterData, errors::ConnectorError> {
-        let response: facilitapay::FacilitapayPaymentsResponse = res
+        let response: FacilitapayPaymentsResponse = res
             .response
-            .parse_struct("Facilitapay PaymentsCaptureResponse")
+            .parse_struct("FacilitapayPaymentsCaptureResponse")
             .change_context(errors::ConnectorError::ResponseDeserializationFailed)?;
         event_builder.map(|i| i.set_response_body(&response));
         router_env::logger::info!(connector_response=?response);
@@ -412,10 +598,14 @@ impl ConnectorIntegration<Execute, RefundsData, RefundsResponseData> for Facilit
 
     fn get_url(
         &self,
-        _req: &RefundsRouterData<Execute>,
-        _connectors: &Connectors,
+        req: &RefundsRouterData<Execute>,
+        connectors: &Connectors,
     ) -> CustomResult<String, errors::ConnectorError> {
-        Err(errors::ConnectorError::NotImplemented("get_url method".to_string()).into())
+        Ok(format!(
+            "{}/transactions/{}/refund_received_transaction",
+            self.base_url(connectors),
+            req.request.connector_transaction_id
+        ))
     }
 
     fn get_request_body(
@@ -429,9 +619,8 @@ impl ConnectorIntegration<Execute, RefundsData, RefundsResponseData> for Facilit
             req.request.currency,
         )?;
 
-        let connector_router_data = facilitapay::FacilitapayRouterData::from((refund_amount, req));
-        let connector_req =
-            facilitapay::FacilitapayRefundRequest::try_from(&connector_router_data)?;
+        let connector_router_data = FacilitapayRouterData::from((refund_amount, req));
+        let connector_req = FacilitapayRefundRequest::try_from(&connector_router_data)?;
         Ok(RequestContent::Json(Box::new(connector_req)))
     }
 
@@ -460,9 +649,9 @@ impl ConnectorIntegration<Execute, RefundsData, RefundsResponseData> for Facilit
         event_builder: Option<&mut ConnectorEvent>,
         res: Response,
     ) -> CustomResult<RefundsRouterData<Execute>, errors::ConnectorError> {
-        let response: facilitapay::RefundResponse = res
+        let response: FacilitapayRefundResponse = res
             .response
-            .parse_struct("facilitapay RefundResponse")
+            .parse_struct("FacilitapayRefundResponse")
             .change_context(errors::ConnectorError::ResponseDeserializationFailed)?;
         event_builder.map(|i| i.set_response_body(&response));
         router_env::logger::info!(connector_response=?response);
@@ -497,10 +686,16 @@ impl ConnectorIntegration<RSync, RefundsData, RefundsResponseData> for Facilitap
 
     fn get_url(
         &self,
-        _req: &RefundSyncRouterData,
-        _connectors: &Connectors,
+        req: &RefundSyncRouterData,
+        connectors: &Connectors,
     ) -> CustomResult<String, errors::ConnectorError> {
-        Err(errors::ConnectorError::NotImplemented("get_url method".to_string()).into())
+        let refund_id = req.request.get_connector_refund_id()?;
+        Ok(format!(
+            "{}/transactions/{}/refund_received_transaction/{}",
+            self.base_url(connectors),
+            req.request.connector_transaction_id,
+            refund_id
+        ))
     }
 
     fn build_request(
@@ -514,9 +709,6 @@ impl ConnectorIntegration<RSync, RefundsData, RefundsResponseData> for Facilitap
                 .url(&types::RefundSyncType::get_url(self, req, connectors)?)
                 .attach_default_headers()
                 .headers(types::RefundSyncType::get_headers(self, req, connectors)?)
-                .set_body(types::RefundSyncType::get_request_body(
-                    self, req, connectors,
-                )?)
                 .build(),
         ))
     }
@@ -527,9 +719,9 @@ impl ConnectorIntegration<RSync, RefundsData, RefundsResponseData> for Facilitap
         event_builder: Option<&mut ConnectorEvent>,
         res: Response,
     ) -> CustomResult<RefundSyncRouterData, errors::ConnectorError> {
-        let response: facilitapay::RefundResponse = res
+        let response: FacilitapayRefundResponse = res
             .response
-            .parse_struct("facilitapay RefundSyncResponse")
+            .parse_struct("FacilitapayRefundSyncResponse")
             .change_context(errors::ConnectorError::ResponseDeserializationFailed)?;
         event_builder.map(|i| i.set_response_body(&response));
         router_env::logger::info!(connector_response=?response);
@@ -573,4 +765,48 @@ impl webhooks::IncomingWebhook for Facilitapay {
     }
 }
 
-impl ConnectorSpecifications for Facilitapay {}
+lazy_static! {
+    static ref FACILITAPAY_CONNECTOR_INFO: ConnectorInfo = ConnectorInfo {
+        display_name:
+            "Facilitapay",
+        description:
+            "FacilitaPay, the best and most reliable payment provider for your international business.",
+        connector_type: enums::PaymentConnectorCategory::PaymentGateway,
+    };
+    static ref FACILITAPAY_SUPPORTED_PAYMENT_METHODS: SupportedPaymentMethods = {
+        let facilitapay_supported_capture_methods = vec![
+            enums::CaptureMethod::Automatic,
+            enums::CaptureMethod::SequentialAutomatic,
+        ];
+
+        let mut facilitapay_supported_payment_methods = SupportedPaymentMethods::new();
+
+        facilitapay_supported_payment_methods.add(
+            enums::PaymentMethod::BankTransfer,
+            enums::PaymentMethodType::Pix,
+            PaymentMethodDetails {
+                mandates: common_enums::FeatureStatus::NotSupported,
+                refunds: common_enums::FeatureStatus::Supported,
+                supported_capture_methods: facilitapay_supported_capture_methods.clone(),
+                specific_features: None,
+            },
+        );
+
+        facilitapay_supported_payment_methods
+    };
+    static ref FACILITAPAY_SUPPORTED_WEBHOOK_FLOWS: Vec<enums::EventClass> = Vec::new();
+}
+
+impl ConnectorSpecifications for Facilitapay {
+    fn get_connector_about(&self) -> Option<&'static ConnectorInfo> {
+        Some(&*FACILITAPAY_CONNECTOR_INFO)
+    }
+
+    fn get_supported_payment_methods(&self) -> Option<&'static SupportedPaymentMethods> {
+        Some(&*FACILITAPAY_SUPPORTED_PAYMENT_METHODS)
+    }
+
+    fn get_supported_webhook_flows(&self) -> Option<&'static [enums::EventClass]> {
+        Some(&*FACILITAPAY_SUPPORTED_WEBHOOK_FLOWS)
+    }
+}
diff --git a/crates/hyperswitch_connectors/src/connectors/facilitapay/requests.rs b/crates/hyperswitch_connectors/src/connectors/facilitapay/requests.rs
new file mode 100644
index 00000000000..29c2f34f332
--- /dev/null
+++ b/crates/hyperswitch_connectors/src/connectors/facilitapay/requests.rs
@@ -0,0 +1,150 @@
+use common_enums::CountryAlpha2;
+use common_utils::{new_type::MaskedBankAccount, pii, types::StringMajorUnit};
+use masking::Secret;
+use serde::{Deserialize, Serialize};
+use time::PrimitiveDateTime;
+
+pub struct FacilitapayRouterData<T> {
+    pub amount: StringMajorUnit,
+    pub router_data: T,
+}
+
+#[derive(Debug, Serialize)]
+pub struct FacilitapayAuthRequest {
+    pub user: FacilitapayCredentials,
+}
+
+#[derive(Debug, Serialize)]
+pub struct FacilitapayCredentials {
+    pub username: Secret<String>, // email_id
+    pub password: Secret<String>,
+}
+
+#[derive(Debug, Serialize, PartialEq)]
+pub struct FacilitapayCardDetails {
+    #[serde(rename = "card_number")]
+    pub number: cards::CardNumber,
+    #[serde(rename = "card_expiration_date")]
+    pub expiry_date: Secret<String>, // Format: "MM/YYYY"
+    #[serde(rename = "card_security_code")]
+    pub cvc: Secret<String>,
+    #[serde(rename = "card_brand")]
+    pub brand: String,
+    pub fullname: Secret<String>,
+}
+
+#[derive(Debug, Serialize, PartialEq)]
+pub struct CardTransactionRequest {
+    pub currency: api_models::enums::Currency,
+    pub exchange_currency: api_models::enums::Currency,
+    pub value: StringMajorUnit,
+    pub from_credit_card: FacilitapayCardDetails,
+    pub to_bank_account_id: Secret<String>, // UUID
+    pub subject_id: String,                 // UUID
+}
+
+#[derive(Debug, Serialize, PartialEq)]
+pub struct PixTransactionRequest {
+    pub subject_id: Secret<String>,              // Customer ID (UUID)
+    pub from_bank_account_id: MaskedBankAccount, // UUID
+    pub to_bank_account_id: MaskedBankAccount,   // UUID
+    pub currency: api_models::enums::Currency,
+    pub exchange_currency: api_models::enums::Currency,
+    pub value: StringMajorUnit,
+    pub use_dynamic_pix: bool,
+    #[serde(default, with = "common_utils::custom_serde::iso8601")]
+    pub dynamic_pix_expires_at: PrimitiveDateTime,
+}
+
+#[derive(Debug, Serialize, PartialEq)]
+#[serde(untagged)]
+pub enum FacilitapayTransactionRequest {
+    #[allow(dead_code)]
+    Card(CardTransactionRequest),
+    Pix(PixTransactionRequest),
+}
+
+#[derive(Debug, Serialize, PartialEq)]
+pub struct FacilitapayPaymentsRequest {
+    pub transaction: FacilitapayTransactionRequest,
+}
+
+// Type definition for RefundRequest
+#[derive(Default, Debug, Serialize)]
+pub struct FacilitapayRefundRequest {
+    pub amount: StringMajorUnit,
+}
+
+#[derive(Debug, Serialize, PartialEq)]
+#[serde(rename_all = "snake_case")]
+pub struct FacilitapayCustomerRequest {
+    pub person: FacilitapayPerson,
+}
+
+#[derive(Debug, Serialize, Clone, Deserialize, PartialEq, Eq)]
+#[serde(rename_all = "snake_case")]
+pub enum DocumentType {
+    /// CC is the Cedula de Ciudadania, is a 10-digit number, which is the national identity card for Colombian citizens.
+    /// It is used for citizen identification purposes.
+    #[serde(rename = "cc")]
+    CedulaDeCiudadania,
+    /// CNPJ stands for Cadastro Nacional da Pessoa Jurídica, is a 14-digit number,
+    /// which is the national registry of legal entities in Brazil used as a unique identifier for Brazilian companies.
+    #[serde(rename = "cnpj")]
+    CadastroNacionaldaPessoaJurídica,
+    /// CPF stands for Cadastro de Pessoas Físicas, is a 11-digit number,
+    /// which is the national registry of natural persons in Brazil used as a unique identifier for Brazilian citizens.
+    #[serde(rename = "cpf")]
+    CadastrodePessoasFísicas,
+    /// CURP stands for Clave Única de Registro de Población,is a 18-digit number used as a unique identifier for Mexican citizens.
+    /// It is used to track tax information and other identification purposes by the government.
+    #[serde(rename = "curp")]
+    ClaveÚnicadeRegistrodePoblación,
+    /// NIT is the Número de Identificación Tributaria, is a 10-digit number, which is the tax identification number in Colombia. Used for companies.
+    #[serde(rename = "nit")]
+    NúmerodeIdentificaciónTributaria,
+    /// Passport is the travel document usually issued by a country's government
+    Passport,
+    /// RFC stands for Registro Federal de Contribuyentes, is a 13-digit number used as a unique identifier for Mexican companies.
+    #[serde(rename = "rfc")]
+    RegistroFederaldeContribuyentes,
+    /// RUT stands for Rol Unico Tributario, is a 9-digit number used as a unique identifier for Chilean citizens and companies.
+    #[serde(rename = "rut")]
+    RolUnicoTributario,
+    /// A Taxpayer Identification Number is an identifying number used for tax purposes
+    TaxId,
+}
+
+#[derive(Debug, Serialize, PartialEq)]
+#[serde(rename_all = "snake_case")]
+pub struct FacilitapayPerson {
+    pub document_number: Secret<String>,
+    pub document_type: DocumentType,
+    pub social_name: Secret<String>,
+    pub fiscal_country: CountryAlpha2,
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub email: Option<pii::Email>,
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub birth_date: Option<time::Date>,
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub phone_country_code: Option<Secret<String>>,
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub phone_area_code: Option<Secret<String>>,
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub phone_number: Option<Secret<String>>,
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub address_city: Option<String>,
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub address_state: Option<String>,
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub address_complement: Option<Secret<String>>,
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub address_country: Option<String>,
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub address_number: Option<Secret<String>>,
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub address_postal_code: Option<Secret<String>>,
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub address_street: Option<Secret<String>>,
+    pub net_monthly_average_income: Option<StringMajorUnit>,
+}
diff --git a/crates/hyperswitch_connectors/src/connectors/facilitapay/responses.rs b/crates/hyperswitch_connectors/src/connectors/facilitapay/responses.rs
new file mode 100644
index 00000000000..dfa01402ce9
--- /dev/null
+++ b/crates/hyperswitch_connectors/src/connectors/facilitapay/responses.rs
@@ -0,0 +1,217 @@
+use common_utils::{pii, types::StringMajorUnit};
+use masking::Secret;
+use serde::{Deserialize, Serialize};
+
+use super::requests::DocumentType;
+
+// Response body for POST /sign_in
+#[derive(Debug, Deserialize, Serialize)]
+pub struct FacilitapayAuthResponse {
+    username: Secret<String>,
+    name: Secret<String>,
+    pub jwt: Secret<String>,
+}
+
+#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq)]
+#[serde(rename_all = "snake_case")]
+pub enum SubjectKycStatus {
+    // Customer is able to send/receive money through the platform. No action is needed on your side.
+    Approved,
+
+    // Customer is required to upload documents or uploaded documents have been rejected by KYC.
+    Reproved,
+
+    // Customer has uploaded KYC documents but awaiting analysis from the backoffice. No action is needed on your side.
+    WaitingApproval,
+}
+
+#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
+#[serde(rename_all = "snake_case")]
+pub struct FacilitapaySubject {
+    pub social_name: Secret<String>,
+    pub document_type: DocumentType,
+    pub document_number: Secret<String>,
+    // In documentation, both CountryAlpha2 and String are used. We cannot rely on CountryAlpha2.
+    pub fiscal_country: String,
+    pub updated_at: Option<String>,
+    pub status: SubjectKycStatus,
+    #[serde(rename = "id")]
+    pub customer_id: Secret<String>,
+    pub birth_date: Option<time::Date>,
+    pub email: Option<pii::Email>,
+    pub phone_country_code: Option<Secret<String>>,
+    pub phone_area_code: Option<Secret<String>>,
+    pub phone_number: Option<Secret<String>>,
+    pub address_street: Option<Secret<String>>,
+    pub address_number: Option<Secret<String>>,
+    pub address_complement: Option<Secret<String>>,
+    pub address_city: Option<String>,
+    pub address_state: Option<String>,
+    pub address_postal_code: Option<Secret<String>>,
+    pub address_country: Option<String>,
+    pub address_neighborhood: Option<Secret<String>>,
+    pub net_monthly_average_income: Option<StringMajorUnit>,
+    pub clearance_level: Option<i32>,
+    pub required_clearance_level: Option<i32>,
+    pub inserted_at: Option<String>,
+    pub references: Option<Vec<serde_json::Value>>,
+    pub rfc_pf: Option<Secret<String>>, // 13-digit RFC, specific to Mexico users
+    pub documents: Option<Vec<serde_json::Value>>,
+}
+
+#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
+#[serde(rename_all = "snake_case")]
+pub struct FacilitapayCustomerResponse {
+    pub data: FacilitapaySubject,
+}
+
+#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
+pub struct PixInfo {
+    #[serde(rename = "type")]
+    pub key_type: String,
+    pub key: Secret<String>,
+}
+
+#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
+pub struct CreditCardResponseInfo {
+    pub id: String,
+    pub status: Option<String>,
+    pub document_type: String,
+    pub document_number: Secret<String>,
+    pub birthdate: Option<String>,
+    pub phone_country_code: Option<String>,
+    pub phone_area_code: Option<String>,
+    pub phone_number: Option<Secret<String>>,
+    pub inserted_at: Option<String>,
+}
+
+// PaymentsResponse
+#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)]
+#[serde(rename_all = "snake_case")]
+#[derive(strum::Display)]
+pub enum FacilitapayPaymentStatus {
+    /// Transaction has been created but it is waiting for an incoming TED/Wire.
+    /// This is the first recorded status in production mode.
+    #[default]
+    Pending,
+    /// Incoming TED/Wire has been identified into Facilita´s bank account.
+    /// When it is a deposit into an internal bank account and there is no
+    /// conversion involved (BRL to BRL for instance), that is the final state.
+    Identified,
+    /// The conversion rate has been closed and therefore the exchanged value
+    /// is defined - when it is a deposit into an internal bank account, that is the final state.
+    Exchanged,
+    /// The exchanged value has been wired to its destination (a real bank account) - that is also a final state.
+    Wired,
+    /// When for any reason the transaction cannot be concluded or need to be reversed, it is canceled.
+    #[serde(rename = "canceled")]
+    Cancelled,
+}
+
+#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
+pub struct FacilitapayPaymentsResponse {
+    pub data: TransactionData,
+}
+
+#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
+pub struct OwnerCompany {
+    pub social_name: Option<Secret<String>>,
+    #[serde(rename = "id")]
+    pub company_id: Option<String>,
+    pub document_type: DocumentType,
+    pub document_number: Secret<String>,
+}
+
+#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
+pub struct BankInfo {
+    pub swift: Option<Secret<String>>,
+    pub name: Option<String>,
+    #[serde(rename = "id")]
+    pub bank_id: Secret<String>,
+    pub code: Option<Secret<String>>,
+}
+
+#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
+pub struct BankAccountDetail {
+    pub routing_number: Option<Secret<String>>,
+    pub pix_info: Option<PixInfo>,
+    pub owner_name: Option<Secret<String>>,
+    pub owner_document_number: Option<Secret<String>>,
+    pub owner_company: Option<OwnerCompany>,
+    pub internal: Option<bool>,
+    pub intermediary_bank_account: Option<Secret<String>>,
+    pub intermediary_bank_account_id: Option<Secret<String>>,
+    #[serde(rename = "id")]
+    pub bank_account_id: Secret<String>,
+    pub iban: Option<Secret<String>>,
+    pub flow_type: Option<String>,
+    pub currency: api_models::enums::Currency,
+    pub branch_number: Option<Secret<String>>,
+    pub branch_country: Option<String>,
+    pub bank: Option<BankInfo>,
+    pub account_type: Option<String>,
+    pub account_number: Option<Secret<String>>,
+    pub aba: Option<String>,
+}
+
+#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
+pub struct TransactionData {
+    #[serde(rename = "id")]
+    pub transaction_id: String,
+    pub value: StringMajorUnit,
+    pub status: FacilitapayPaymentStatus,
+    pub currency: api_models::enums::Currency,
+    pub exchange_currency: api_models::enums::Currency,
+
+    // Details about the destination account (Required)
+    pub to_bank_account: BankAccountDetail,
+
+    // Details about the source - mutually exclusive
+    pub from_credit_card: Option<CreditCardResponseInfo>,
+    pub from_bank_account: Option<BankAccountDetail>, // Populated for PIX
+
+    // Subject information (customer)
+    pub subject_id: String,
+    pub subject: Option<FacilitapaySubject>,
+    pub subject_is_receiver: Option<bool>,
+
+    // Source identification (potentially redundant with subject or card/bank info)
+    pub source_name: Secret<String>,
+    pub source_document_type: DocumentType,
+    pub source_document_number: Secret<String>,
+
+    // Timestamps and flags
+    pub inserted_at: Option<String>,
+    pub for_exchange: Option<bool>,
+    pub exchange_under_request: Option<bool>,
+    pub estimated_value_until_exchange: Option<bool>,
+    pub cleared: Option<bool>,
+
+    // PIX specific field
+    pub dynamic_pix_code: Option<String>, // QR code string for PIX
+
+    // Exchange details
+    pub exchanged_value: Option<StringMajorUnit>,
+
+    // Cancelation details
+    #[serde(rename = "canceled_reason")]
+    pub cancelled_reason: Option<String>,
+    #[serde(rename = "canceled_at")]
+    pub cancelled_at: Option<String>,
+
+    // Other fields
+    pub bank_transaction: Option<Secret<serde_json::Value>>,
+    pub meta: Option<serde_json::Value>,
+}
+
+#[derive(Debug, Clone, Serialize, Deserialize)]
+pub struct RefundData {
+    #[serde(rename = "id")]
+    pub refund_id: String,
+    pub status: FacilitapayPaymentStatus,
+}
+
+#[derive(Debug, Clone, Serialize, Deserialize)]
+pub struct FacilitapayRefundResponse {
+    pub data: RefundData,
+}
diff --git a/crates/hyperswitch_connectors/src/connectors/facilitapay/transformers.rs b/crates/hyperswitch_connectors/src/connectors/facilitapay/transformers.rs
index 81c2f752d3b..a123b4796cf 100644
--- a/crates/hyperswitch_connectors/src/connectors/facilitapay/transformers.rs
+++ b/crates/hyperswitch_connectors/src/connectors/facilitapay/transformers.rs
@@ -1,31 +1,45 @@
-use common_enums::enums;
-use common_utils::types::StringMinorUnit;
+use api_models::payments::QrCodeInformation;
+use common_enums::{enums, PaymentMethod};
+use common_utils::{
+    errors::CustomResult,
+    ext_traits::{BytesExt, Encode},
+    types::StringMajorUnit,
+};
+use error_stack::ResultExt;
 use hyperswitch_domain_models::{
-    payment_method_data::PaymentMethodData,
-    router_data::{ConnectorAuthType, RouterData},
+    payment_method_data::{BankTransferData, PaymentMethodData},
+    router_data::{AccessToken, ConnectorAuthType, ErrorResponse, RouterData},
     router_flow_types::refunds::{Execute, RSync},
     router_request_types::ResponseId,
     router_response_types::{PaymentsResponseData, RefundsResponseData},
-    types::{PaymentsAuthorizeRouterData, RefundsRouterData},
+    types,
+};
+use hyperswitch_interfaces::{
+    consts, errors, events::connector_api_logs::ConnectorEvent, types::Response,
 };
-use hyperswitch_interfaces::errors;
-use masking::Secret;
-use serde::{Deserialize, Serialize};
+use masking::{ExposeInterface, Secret};
+use time::PrimitiveDateTime;
+use url::Url;
 
+use super::{
+    requests::{
+        DocumentType, FacilitapayAuthRequest, FacilitapayCredentials, FacilitapayCustomerRequest,
+        FacilitapayPaymentsRequest, FacilitapayPerson, FacilitapayRefundRequest,
+        FacilitapayRouterData, FacilitapayTransactionRequest, PixTransactionRequest,
+    },
+    responses::{
+        FacilitapayAuthResponse, FacilitapayCustomerResponse, FacilitapayPaymentStatus,
+        FacilitapayPaymentsResponse, FacilitapayRefundResponse,
+    },
+};
 use crate::{
-    types::{RefundsResponseRouterData, ResponseRouterData},
-    utils::PaymentsAuthorizeRequestData,
+    types::{RefreshTokenRouterData, RefundsResponseRouterData, ResponseRouterData},
+    utils::{is_payment_failure, missing_field_err, QrImage, RouterData as OtherRouterData},
 };
+type Error = error_stack::Report<errors::ConnectorError>;
 
-//TODO: Fill the struct with respective fields
-pub struct FacilitapayRouterData<T> {
-    pub amount: StringMinorUnit, // The type of amount that a connector accepts, for example, String, i64, f64, etc.
-    pub router_data: T,
-}
-
-impl<T> From<(StringMinorUnit, T)> for FacilitapayRouterData<T> {
-    fn from((amount, item): (StringMinorUnit, T)) -> Self {
-        //Todo :  use utils to convert the amount to the type of amount that a connector accepts
+impl<T> From<(StringMajorUnit, T)> for FacilitapayRouterData<T> {
+    fn from((amount, item): (StringMajorUnit, T)) -> Self {
         Self {
             amount,
             router_data: item,
@@ -33,196 +47,491 @@ impl<T> From<(StringMinorUnit, T)> for FacilitapayRouterData<T> {
     }
 }
 
-//TODO: Fill the struct with respective fields
-#[derive(Default, Debug, Serialize, PartialEq)]
-pub struct FacilitapayPaymentsRequest {
-    amount: StringMinorUnit,
-    card: FacilitapayCard,
-}
-
-#[derive(Default, Debug, Serialize, Eq, PartialEq)]
-pub struct FacilitapayCard {
-    number: cards::CardNumber,
-    expiry_month: Secret<String>,
-    expiry_year: Secret<String>,
-    cvc: Secret<String>,
-    complete: bool,
-}
-
-impl TryFrom<&FacilitapayRouterData<&PaymentsAuthorizeRouterData>> for FacilitapayPaymentsRequest {
-    type Error = error_stack::Report<errors::ConnectorError>;
+impl TryFrom<&FacilitapayRouterData<&types::PaymentsAuthorizeRouterData>>
+    for FacilitapayPaymentsRequest
+{
+    type Error = Error;
     fn try_from(
-        item: &FacilitapayRouterData<&PaymentsAuthorizeRouterData>,
+        item: &FacilitapayRouterData<&types::PaymentsAuthorizeRouterData>,
     ) -> Result<Self, Self::Error> {
         match item.router_data.request.payment_method_data.clone() {
-            PaymentMethodData::Card(req_card) => {
-                let card = FacilitapayCard {
-                    number: req_card.card_number,
-                    expiry_month: req_card.card_exp_month,
-                    expiry_year: req_card.card_exp_year,
-                    cvc: req_card.card_cvc,
-                    complete: item.router_data.request.is_auto_capture()?,
-                };
-                Ok(Self {
-                    amount: item.amount.clone(),
-                    card,
-                })
+            PaymentMethodData::BankTransfer(bank_transfer_data) => match *bank_transfer_data {
+                BankTransferData::Pix {
+                    source_bank_account_id,
+                    destination_bank_account_id,
+                    ..
+                } => {
+                    // Set expiry time to 15 minutes from now
+                    let dynamic_pix_expires_at = {
+                        let now = time::OffsetDateTime::now_utc();
+                        let expires_at = now + time::Duration::minutes(15);
+
+                        PrimitiveDateTime::new(expires_at.date(), expires_at.time())
+                    };
+
+                    let transaction_data =
+                        FacilitapayTransactionRequest::Pix(PixTransactionRequest {
+                            // subject id must be generated by pre-process step and link with customer id
+                            // might require discussions to be done
+                            subject_id: item.router_data.get_connector_customer_id()?.into(),
+                            from_bank_account_id: source_bank_account_id.clone().ok_or(
+                                errors::ConnectorError::MissingRequiredField {
+                                    field_name: "source bank account id",
+                                },
+                            )?,
+
+                            to_bank_account_id: destination_bank_account_id.clone().ok_or(
+                                errors::ConnectorError::MissingRequiredField {
+                                    field_name: "destination bank account id",
+                                },
+                            )?,
+                            currency: item.router_data.request.currency,
+                            exchange_currency: item.router_data.request.currency,
+                            value: item.amount.clone(),
+                            use_dynamic_pix: true,
+                            // Format: YYYY-MM-DDThh:mm:ssZ
+                            dynamic_pix_expires_at,
+                        });
+
+                    Ok(Self {
+                        transaction: transaction_data,
+                    })
+                }
+                BankTransferData::AchBankTransfer {}
+                | BankTransferData::SepaBankTransfer {}
+                | BankTransferData::BacsBankTransfer {}
+                | BankTransferData::MultibancoBankTransfer {}
+                | BankTransferData::PermataBankTransfer {}
+                | BankTransferData::BcaBankTransfer {}
+                | BankTransferData::BniVaBankTransfer {}
+                | BankTransferData::BriVaBankTransfer {}
+                | BankTransferData::CimbVaBankTransfer {}
+                | BankTransferData::DanamonVaBankTransfer {}
+                | BankTransferData::MandiriVaBankTransfer {}
+                | BankTransferData::Pse {}
+                | BankTransferData::InstantBankTransfer {}
+                | BankTransferData::LocalBankTransfer { .. } => {
+                    Err(errors::ConnectorError::NotImplemented(
+                        "Selected payment method through Facilitapay".to_string(),
+                    )
+                    .into())
+                }
+            },
+            PaymentMethodData::Card(_)
+            | PaymentMethodData::CardRedirect(_)
+            | PaymentMethodData::Wallet(_)
+            | PaymentMethodData::PayLater(_)
+            | PaymentMethodData::BankRedirect(_)
+            | PaymentMethodData::BankDebit(_)
+            | PaymentMethodData::Crypto(_)
+            | PaymentMethodData::MandatePayment
+            | PaymentMethodData::Reward
+            | PaymentMethodData::RealTimePayment(_)
+            | PaymentMethodData::MobilePayment(_)
+            | PaymentMethodData::Upi(_)
+            | PaymentMethodData::Voucher(_)
+            | PaymentMethodData::GiftCard(_)
+            | PaymentMethodData::CardToken(_)
+            | PaymentMethodData::OpenBanking(_)
+            | PaymentMethodData::NetworkToken(_)
+            | PaymentMethodData::CardDetailsForNetworkTransactionId(_) => {
+                Err(errors::ConnectorError::NotImplemented(
+                    "Selected payment method through Facilitapay".to_string(),
+                )
+                .into())
             }
-            _ => Err(errors::ConnectorError::NotImplemented("Payment method".to_string()).into()),
         }
     }
 }
 
-//TODO: Fill the struct with respective fields
+// Helper to build the request from Hyperswitch Auth Type
+impl FacilitapayAuthRequest {
+    fn from_auth_type(auth: &FacilitapayAuthType) -> Self {
+        Self {
+            user: FacilitapayCredentials {
+                username: auth.username.clone(),
+                password: auth.password.clone(),
+            },
+        }
+    }
+}
+
 // Auth Struct
+#[derive(Debug, Clone)]
 pub struct FacilitapayAuthType {
-    pub(super) api_key: Secret<String>,
+    pub(super) username: Secret<String>,
+    pub(super) password: Secret<String>,
 }
 
 impl TryFrom<&ConnectorAuthType> for FacilitapayAuthType {
-    type Error = error_stack::Report<errors::ConnectorError>;
+    type Error = Error;
     fn try_from(auth_type: &ConnectorAuthType) -> Result<Self, Self::Error> {
         match auth_type {
-            ConnectorAuthType::HeaderKey { api_key } => Ok(Self {
-                api_key: api_key.to_owned(),
+            ConnectorAuthType::BodyKey { api_key, key1 } => Ok(Self {
+                username: key1.to_owned(),
+                password: api_key.to_owned(),
             }),
             _ => Err(errors::ConnectorError::FailedToObtainAuthType.into()),
         }
     }
 }
-// PaymentsResponse
-//TODO: Append the remaining status flags
-#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
-#[serde(rename_all = "lowercase")]
-pub enum FacilitapayPaymentStatus {
-    Succeeded,
-    Failed,
-    #[default]
-    Processing,
+
+impl TryFrom<&RefreshTokenRouterData> for FacilitapayAuthRequest {
+    type Error = Error;
+    fn try_from(item: &RefreshTokenRouterData) -> Result<Self, Self::Error> {
+        let auth_type = FacilitapayAuthType::try_from(&item.connector_auth_type)?;
+        Ok(Self::from_auth_type(&auth_type))
+    }
 }
 
-impl From<FacilitapayPaymentStatus> for common_enums::AttemptStatus {
-    fn from(item: FacilitapayPaymentStatus) -> Self {
-        match item {
-            FacilitapayPaymentStatus::Succeeded => Self::Charged,
-            FacilitapayPaymentStatus::Failed => Self::Failure,
-            FacilitapayPaymentStatus::Processing => Self::Authorizing,
+fn convert_to_document_type(document_type: &str) -> Result<DocumentType, errors::ConnectorError> {
+    match document_type.to_lowercase().as_str() {
+        "cc" => Ok(DocumentType::CedulaDeCiudadania),
+        "cnpj" => Ok(DocumentType::CadastroNacionaldaPessoaJurídica),
+        "cpf" => Ok(DocumentType::CadastrodePessoasFísicas),
+        "curp" => Ok(DocumentType::ClaveÚnicadeRegistrodePoblación),
+        "nit" => Ok(DocumentType::NúmerodeIdentificaciónTributaria),
+        "passport" => Ok(DocumentType::Passport),
+        "rfc" => Ok(DocumentType::RegistroFederaldeContribuyentes),
+        "rut" => Ok(DocumentType::RolUnicoTributario),
+        "tax_id" | "taxid" => Ok(DocumentType::TaxId),
+        _ => Err(errors::ConnectorError::NotSupported {
+            message: format!("Document type '{document_type}'"),
+            connector: "Facilitapay",
+        }),
+    }
+}
+
+pub fn parse_facilitapay_error_response(
+    res: Response,
+    event_builder: Option<&mut ConnectorEvent>,
+) -> CustomResult<ErrorResponse, errors::ConnectorError> {
+    let status_code = res.status_code;
+    let response_body_bytes = res.response.clone();
+
+    let (message, raw_error) =
+        match response_body_bytes.parse_struct::<serde_json::Value>("FacilitapayErrorResponse") {
+            Ok(json_value) => {
+                event_builder.map(|i| i.set_response_body(&json_value));
+
+                let message = extract_message_from_json(&json_value);
+                (
+                    message,
+                    serde_json::to_string(&json_value).unwrap_or_default(),
+                )
+            }
+            Err(_) => match String::from_utf8(response_body_bytes.to_vec()) {
+                Ok(text) => {
+                    event_builder.map(|i| i.set_response_body(&text));
+                    (text.clone(), text)
+                }
+                Err(_) => (
+                    "Invalid response format received".to_string(),
+                    format!(
+                        "Unable to parse response as JSON or UTF-8 string. Status code: {}",
+                        status_code
+                    ),
+                ),
+            },
+        };
+
+    Ok(ErrorResponse {
+        status_code,
+        code: consts::NO_ERROR_CODE.to_string(),
+        message,
+        reason: Some(raw_error),
+        attempt_status: None,
+        connector_transaction_id: None,
+        network_advice_code: None,
+        network_decline_code: None,
+        network_error_message: None,
+    })
+}
+
+// Helper function to extract a readable message from JSON error
+fn extract_message_from_json(json: &serde_json::Value) -> String {
+    if let Some(obj) = json.as_object() {
+        if let Some(error) = obj.get("error").and_then(|e| e.as_str()) {
+            return error.to_string();
+        }
+
+        if obj.contains_key("errors") {
+            return "Validation error occurred".to_string();
         }
+
+        if !obj.is_empty() {
+            return obj
+                .iter()
+                .next()
+                .map(|(k, v)| format!("{}: {}", k, v))
+                .unwrap_or_else(|| "Unknown error".to_string());
+        }
+    } else if let Some(s) = json.as_str() {
+        return s.to_string();
     }
+
+    "Unknown error format".to_string()
 }
 
-//TODO: Fill the struct with respective fields
-#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq)]
-pub struct FacilitapayPaymentsResponse {
-    status: FacilitapayPaymentStatus,
-    id: String,
+impl TryFrom<&types::ConnectorCustomerRouterData> for FacilitapayCustomerRequest {
+    type Error = Error;
+    fn try_from(item: &types::ConnectorCustomerRouterData) -> Result<Self, Self::Error> {
+        let email = item.request.email.clone();
+
+        let social_name = item.get_billing_full_name()?;
+
+        let (document_type, document_number) = match item.request.payment_method_data.clone() {
+            PaymentMethodData::BankTransfer(bank_transfer_data) => match *bank_transfer_data {
+                BankTransferData::Pix { cpf, .. } => {
+                    // Extract only digits from the CPF string
+                    let document_number =
+                        cpf.ok_or_else(missing_field_err("cpf"))?.map(|cpf_number| {
+                            cpf_number
+                                .chars()
+                                .filter(|chars| chars.is_ascii_digit())
+                                .collect::<String>()
+                        });
+
+                    let document_type = convert_to_document_type("cpf")?;
+                    (document_type, document_number)
+                }
+                _ => {
+                    return Err(errors::ConnectorError::NotImplemented(
+                        "Selected payment method through Facilitapay".to_string(),
+                    )
+                    .into())
+                }
+            },
+            _ => {
+                return Err(errors::ConnectorError::NotImplemented(
+                    "Selected payment method through Facilitapay".to_string(),
+                )
+                .into())
+            }
+        };
+
+        let fiscal_country = item.get_billing_country()?;
+
+        let person = FacilitapayPerson {
+            document_number,
+            document_type,
+            social_name,
+            fiscal_country,
+            email,
+            birth_date: None,
+            phone_country_code: None,
+            phone_area_code: None,
+            phone_number: None,
+            address_city: None,
+            address_state: None,
+            address_complement: None,
+            address_country: None,
+            address_number: None,
+            address_postal_code: None,
+            address_street: None,
+            net_monthly_average_income: None,
+        };
+
+        Ok(Self { person })
+    }
 }
 
-impl<F, T> TryFrom<ResponseRouterData<F, FacilitapayPaymentsResponse, T, PaymentsResponseData>>
+impl<F, T> TryFrom<ResponseRouterData<F, FacilitapayCustomerResponse, T, PaymentsResponseData>>
     for RouterData<F, T, PaymentsResponseData>
 {
-    type Error = error_stack::Report<errors::ConnectorError>;
+    type Error = Error;
     fn try_from(
-        item: ResponseRouterData<F, FacilitapayPaymentsResponse, T, PaymentsResponseData>,
+        item: ResponseRouterData<F, FacilitapayCustomerResponse, T, PaymentsResponseData>,
     ) -> Result<Self, Self::Error> {
         Ok(Self {
-            status: common_enums::AttemptStatus::from(item.response.status),
-            response: Ok(PaymentsResponseData::TransactionResponse {
-                resource_id: ResponseId::ConnectorTransactionId(item.response.id),
-                redirection_data: Box::new(None),
-                mandate_reference: Box::new(None),
-                connector_metadata: None,
-                network_txn_id: None,
-                connector_response_reference_id: None,
-                incremental_authorization_allowed: None,
-                charges: None,
+            response: Ok(PaymentsResponseData::ConnectorCustomerResponse {
+                connector_customer_id: item.response.data.customer_id.expose(),
             }),
             ..item.data
         })
     }
 }
 
-//TODO: Fill the struct with respective fields
-// REFUND :
-// Type definition for RefundRequest
-#[derive(Default, Debug, Serialize)]
-pub struct FacilitapayRefundRequest {
-    pub amount: StringMinorUnit,
+impl From<FacilitapayPaymentStatus> for common_enums::AttemptStatus {
+    fn from(item: FacilitapayPaymentStatus) -> Self {
+        match item {
+            FacilitapayPaymentStatus::Pending => Self::Pending,
+            FacilitapayPaymentStatus::Identified
+            | FacilitapayPaymentStatus::Exchanged
+            | FacilitapayPaymentStatus::Wired => Self::Charged,
+            FacilitapayPaymentStatus::Cancelled => Self::Failure,
+        }
+    }
 }
 
-impl<F> TryFrom<&FacilitapayRouterData<&RefundsRouterData<F>>> for FacilitapayRefundRequest {
-    type Error = error_stack::Report<errors::ConnectorError>;
-    fn try_from(item: &FacilitapayRouterData<&RefundsRouterData<F>>) -> Result<Self, Self::Error> {
+impl<F, T> TryFrom<ResponseRouterData<F, FacilitapayAuthResponse, T, AccessToken>>
+    for RouterData<F, T, AccessToken>
+{
+    type Error = Error;
+    fn try_from(
+        item: ResponseRouterData<F, FacilitapayAuthResponse, T, AccessToken>,
+    ) -> Result<Self, Self::Error> {
         Ok(Self {
-            amount: item.amount.to_owned(),
+            response: Ok(AccessToken {
+                token: item.response.jwt,
+                expires: 86400, // Facilitapay docs say 24 hours validity. 24 * 60 * 60 = 86400 seconds.
+            }),
+            ..item.data
         })
     }
 }
 
-// Type definition for Refund Response
+impl<F, T> TryFrom<ResponseRouterData<F, FacilitapayPaymentsResponse, T, PaymentsResponseData>>
+    for RouterData<F, T, PaymentsResponseData>
+{
+    type Error = Error;
+    fn try_from(
+        item: ResponseRouterData<F, FacilitapayPaymentsResponse, T, PaymentsResponseData>,
+    ) -> Result<Self, Self::Error> {
+        let status = if item.data.payment_method == PaymentMethod::BankTransfer
+            && item.response.data.status == FacilitapayPaymentStatus::Identified
+        {
+            common_enums::AttemptStatus::AuthenticationPending
+        } else {
+            common_enums::AttemptStatus::from(item.response.data.status.clone())
+        };
 
-#[allow(dead_code)]
-#[derive(Debug, Serialize, Default, Deserialize, Clone)]
-pub enum RefundStatus {
-    Succeeded,
-    Failed,
-    #[default]
-    Processing,
+        Ok(Self {
+            status,
+            response: if is_payment_failure(status) {
+                Err(ErrorResponse {
+                    code: item.response.data.status.clone().to_string(),
+                    message: item.response.data.status.clone().to_string(),
+                    reason: item.response.data.cancelled_reason,
+                    status_code: item.http_code,
+                    attempt_status: None,
+                    connector_transaction_id: Some(item.response.data.transaction_id),
+                    network_decline_code: None,
+                    network_advice_code: None,
+                    network_error_message: None,
+                })
+            } else {
+                Ok(PaymentsResponseData::TransactionResponse {
+                    resource_id: ResponseId::ConnectorTransactionId(
+                        item.response.data.transaction_id.clone(),
+                    ),
+                    redirection_data: Box::new(None),
+                    mandate_reference: Box::new(None),
+                    connector_metadata: get_qr_code_data(&item.response)?,
+                    network_txn_id: None,
+                    connector_response_reference_id: Some(item.response.data.transaction_id),
+                    incremental_authorization_allowed: None,
+                    charges: None,
+                })
+            },
+            ..item.data
+        })
+    }
 }
 
-impl From<RefundStatus> for enums::RefundStatus {
-    fn from(item: RefundStatus) -> Self {
-        match item {
-            RefundStatus::Succeeded => Self::Success,
-            RefundStatus::Failed => Self::Failure,
-            RefundStatus::Processing => Self::Pending,
-            //TODO: Review mapping
+fn get_qr_code_data(
+    response: &FacilitapayPaymentsResponse,
+) -> CustomResult<Option<serde_json::Value>, errors::ConnectorError> {
+    let expiration_time: i64 = if let Some(meta) = &response.data.meta {
+        if let Some(due_date_str) = meta
+            .get("dynamic_pix_due_date")
+            .and_then(|due_date_value| due_date_value.as_str())
+        {
+            let datetime = time::OffsetDateTime::parse(
+                due_date_str,
+                &time::format_description::well_known::Rfc3339,
+            )
+            .map_err(|_| errors::ConnectorError::ResponseHandlingFailed)?;
+
+            datetime.unix_timestamp() * 1000
+        } else {
+            // If dynamic_pix_due_date isn't present, use current time + 15 minutes
+            let now = time::OffsetDateTime::now_utc();
+            let expires_at = now + time::Duration::minutes(15);
+            expires_at.unix_timestamp() * 1000
         }
+    } else {
+        // If meta is null, use current time + 15 minutes
+        let now = time::OffsetDateTime::now_utc();
+        let expires_at = now + time::Duration::minutes(15);
+        expires_at.unix_timestamp() * 1000
+    };
+
+    let dynamic_pix_code = response.data.dynamic_pix_code.as_ref().ok_or_else(|| {
+        errors::ConnectorError::MissingRequiredField {
+            field_name: "dynamic_pix_code",
+        }
+    })?;
+
+    let image_data = QrImage::new_from_data(dynamic_pix_code.clone())
+        .change_context(errors::ConnectorError::ResponseHandlingFailed)?;
+
+    let image_data_url = Url::parse(image_data.data.clone().as_str())
+        .change_context(errors::ConnectorError::ResponseHandlingFailed)?;
+
+    let qr_code_info = QrCodeInformation::QrDataUrl {
+        image_data_url,
+        display_to_timestamp: Some(expiration_time),
+    };
+
+    Some(qr_code_info.encode_to_value())
+        .transpose()
+        .change_context(errors::ConnectorError::ResponseHandlingFailed)
+}
+
+impl<F> TryFrom<&FacilitapayRouterData<&types::RefundsRouterData<F>>> for FacilitapayRefundRequest {
+    type Error = Error;
+    fn try_from(
+        item: &FacilitapayRouterData<&types::RefundsRouterData<F>>,
+    ) -> Result<Self, Self::Error> {
+        Ok(Self {
+            amount: item.amount.clone(),
+        })
     }
 }
 
-//TODO: Fill the struct with respective fields
-#[derive(Default, Debug, Clone, Serialize, Deserialize)]
-pub struct RefundResponse {
-    id: String,
-    status: RefundStatus,
+impl From<FacilitapayPaymentStatus> for enums::RefundStatus {
+    fn from(item: FacilitapayPaymentStatus) -> Self {
+        match item {
+            FacilitapayPaymentStatus::Identified
+            | FacilitapayPaymentStatus::Exchanged
+            | FacilitapayPaymentStatus::Wired => Self::Success,
+            FacilitapayPaymentStatus::Cancelled => Self::Failure,
+            FacilitapayPaymentStatus::Pending => Self::Pending,
+        }
+    }
 }
 
-impl TryFrom<RefundsResponseRouterData<Execute, RefundResponse>> for RefundsRouterData<Execute> {
-    type Error = error_stack::Report<errors::ConnectorError>;
+impl TryFrom<RefundsResponseRouterData<Execute, FacilitapayRefundResponse>>
+    for types::RefundsRouterData<Execute>
+{
+    type Error = Error;
     fn try_from(
-        item: RefundsResponseRouterData<Execute, RefundResponse>,
+        item: RefundsResponseRouterData<Execute, FacilitapayRefundResponse>,
     ) -> Result<Self, Self::Error> {
         Ok(Self {
             response: Ok(RefundsResponseData {
-                connector_refund_id: item.response.id.to_string(),
-                refund_status: enums::RefundStatus::from(item.response.status),
+                connector_refund_id: item.response.data.refund_id.to_string(),
+                refund_status: enums::RefundStatus::from(item.response.data.status),
             }),
             ..item.data
         })
     }
 }
 
-impl TryFrom<RefundsResponseRouterData<RSync, RefundResponse>> for RefundsRouterData<RSync> {
-    type Error = error_stack::Report<errors::ConnectorError>;
+impl TryFrom<RefundsResponseRouterData<RSync, FacilitapayRefundResponse>>
+    for types::RefundsRouterData<RSync>
+{
+    type Error = Error;
     fn try_from(
-        item: RefundsResponseRouterData<RSync, RefundResponse>,
+        item: RefundsResponseRouterData<RSync, FacilitapayRefundResponse>,
     ) -> Result<Self, Self::Error> {
         Ok(Self {
             response: Ok(RefundsResponseData {
-                connector_refund_id: item.response.id.to_string(),
-                refund_status: enums::RefundStatus::from(item.response.status),
+                connector_refund_id: item.response.data.refund_id.to_string(),
+                refund_status: enums::RefundStatus::from(item.response.data.status),
             }),
             ..item.data
         })
     }
 }
-
-//TODO: Fill the struct with respective fields
-#[derive(Default, Debug, Serialize, Deserialize, PartialEq)]
-pub struct FacilitapayErrorResponse {
-    pub status_code: u16,
-    pub code: String,
-    pub message: String,
-    pub reason: Option<String>,
-}
diff --git a/crates/hyperswitch_connectors/src/connectors/itaubank/transformers.rs b/crates/hyperswitch_connectors/src/connectors/itaubank/transformers.rs
index 4f6cc393fc5..0ccf5518aa9 100644
--- a/crates/hyperswitch_connectors/src/connectors/itaubank/transformers.rs
+++ b/crates/hyperswitch_connectors/src/connectors/itaubank/transformers.rs
@@ -65,7 +65,9 @@ impl TryFrom<&ItaubankRouterData<&types::PaymentsAuthorizeRouterData>> for Itaub
         match item.router_data.request.payment_method_data.clone() {
             PaymentMethodData::BankTransfer(bank_transfer_data) => {
                 match *bank_transfer_data {
-                    BankTransferData::Pix { pix_key, cpf, cnpj } => {
+                    BankTransferData::Pix {
+                        pix_key, cpf, cnpj, ..
+                    } => {
                         let nome = item.router_data.get_optional_billing_full_name();
                         // cpf and cnpj are mutually exclusive
                         let devedor = match (cnpj, cpf) {
diff --git a/crates/hyperswitch_connectors/src/default_implementations.rs b/crates/hyperswitch_connectors/src/default_implementations.rs
index 35d95343aba..c15da205985 100644
--- a/crates/hyperswitch_connectors/src/default_implementations.rs
+++ b/crates/hyperswitch_connectors/src/default_implementations.rs
@@ -825,7 +825,6 @@ default_imp_for_create_customer!(
     connectors::Digitalvirgo,
     connectors::Dlocal,
     connectors::Elavon,
-    connectors::Facilitapay,
     connectors::Fiserv,
     connectors::Fiservemea,
     connectors::Fiuu,
diff --git a/crates/hyperswitch_connectors/src/default_implementations_v2.rs b/crates/hyperswitch_connectors/src/default_implementations_v2.rs
index 41817d955a6..97ac61d6470 100644
--- a/crates/hyperswitch_connectors/src/default_implementations_v2.rs
+++ b/crates/hyperswitch_connectors/src/default_implementations_v2.rs
@@ -2725,6 +2725,7 @@ default_imp_for_new_connector_integration_revenue_recovery!(
     connectors::Digitalvirgo,
     connectors::Dlocal,
     connectors::Elavon,
+    connectors::Facilitapay,
     connectors::Fiserv,
     connectors::Fiservemea,
     connectors::Fiuu,
diff --git a/crates/hyperswitch_connectors/src/utils.rs b/crates/hyperswitch_connectors/src/utils.rs
index 60cb878d9a3..4f0c2eb8639 100644
--- a/crates/hyperswitch_connectors/src/utils.rs
+++ b/crates/hyperswitch_connectors/src/utils.rs
@@ -13,10 +13,10 @@ use common_enums::{
     enums::{
         AlbaniaStatesAbbreviation, AndorraStatesAbbreviation, AttemptStatus,
         AustriaStatesAbbreviation, BelarusStatesAbbreviation, BelgiumStatesAbbreviation,
-        BosniaAndHerzegovinaStatesAbbreviation, BulgariaStatesAbbreviation,
-        CanadaStatesAbbreviation, CroatiaStatesAbbreviation, CzechRepublicStatesAbbreviation,
-        DenmarkStatesAbbreviation, FinlandStatesAbbreviation, FranceStatesAbbreviation,
-        FutureUsage, GermanyStatesAbbreviation, GreeceStatesAbbreviation,
+        BosniaAndHerzegovinaStatesAbbreviation, BrazilStatesAbbreviation,
+        BulgariaStatesAbbreviation, CanadaStatesAbbreviation, CroatiaStatesAbbreviation,
+        CzechRepublicStatesAbbreviation, DenmarkStatesAbbreviation, FinlandStatesAbbreviation,
+        FranceStatesAbbreviation, FutureUsage, GermanyStatesAbbreviation, GreeceStatesAbbreviation,
         HungaryStatesAbbreviation, IcelandStatesAbbreviation, IrelandStatesAbbreviation,
         ItalyStatesAbbreviation, LatviaStatesAbbreviation, LiechtensteinStatesAbbreviation,
         LithuaniaStatesAbbreviation, LuxembourgStatesAbbreviation, MaltaStatesAbbreviation,
@@ -5118,6 +5118,52 @@ impl ForeignTryFrom<String> for UkraineStatesAbbreviation {
     }
 }
 
+impl ForeignTryFrom<String> for BrazilStatesAbbreviation {
+    type Error = error_stack::Report<errors::ConnectorError>;
+
+    fn foreign_try_from(value: String) -> Result<Self, Self::Error> {
+        let state_abbreviation_check =
+            StringExt::<Self>::parse_enum(value.clone(), "BrazilStatesAbbreviation");
+
+        match state_abbreviation_check {
+            Ok(state_abbreviation) => Ok(state_abbreviation),
+            Err(_) => match value.as_str() {
+                "Acre" => Ok(Self::Acre),
+                "Alagoas" => Ok(Self::Alagoas),
+                "Amapá" => Ok(Self::Amapá),
+                "Amazonas" => Ok(Self::Amazonas),
+                "Bahia" => Ok(Self::Bahia),
+                "Ceará" => Ok(Self::Ceará),
+                "Distrito Federal" => Ok(Self::DistritoFederal),
+                "Espírito Santo" => Ok(Self::EspíritoSanto),
+                "Goiás" => Ok(Self::Goiás),
+                "Maranhão" => Ok(Self::Maranhão),
+                "Mato Grosso" => Ok(Self::MatoGrosso),
+                "Mato Grosso do Sul" => Ok(Self::MatoGrossoDoSul),
+                "Minas Gerais" => Ok(Self::MinasGerais),
+                "Pará" => Ok(Self::Pará),
+                "Paraíba" => Ok(Self::Paraíba),
+                "Paraná" => Ok(Self::Paraná),
+                "Pernambuco" => Ok(Self::Pernambuco),
+                "Piauí" => Ok(Self::Piauí),
+                "Rio de Janeiro" => Ok(Self::RioDeJaneiro),
+                "Rio Grande do Norte" => Ok(Self::RioGrandeDoNorte),
+                "Rio Grande do Sul" => Ok(Self::RioGrandeDoSul),
+                "Rondônia" => Ok(Self::Rondônia),
+                "Roraima" => Ok(Self::Roraima),
+                "Santa Catarina" => Ok(Self::SantaCatarina),
+                "São Paulo" => Ok(Self::SãoPaulo),
+                "Sergipe" => Ok(Self::Sergipe),
+                "Tocantins" => Ok(Self::Tocantins),
+                _ => Err(errors::ConnectorError::InvalidDataFormat {
+                    field_name: "address.state",
+                }
+                .into()),
+            },
+        }
+    }
+}
+
 pub trait ForeignTryFrom<F>: Sized {
     type Error;
 
diff --git a/crates/hyperswitch_domain_models/src/payment_method_data.rs b/crates/hyperswitch_domain_models/src/payment_method_data.rs
index f69b9dc6855..2d386d0f002 100644
--- a/crates/hyperswitch_domain_models/src/payment_method_data.rs
+++ b/crates/hyperswitch_domain_models/src/payment_method_data.rs
@@ -18,6 +18,7 @@ use common_utils::{
 use masking::{PeekInterface, Secret};
 use serde::{Deserialize, Serialize};
 use time::Date;
+
 // We need to derive Serialize and Deserialize because some parts of payment method data are being
 // stored in the database as serde_json::Value
 #[derive(Eq, PartialEq, Clone, Debug, Serialize, Deserialize)]
@@ -612,6 +613,10 @@ pub enum BankTransferData {
         cpf: Option<Secret<String>>,
         /// CNPJ is a Brazilian company tax identification number
         cnpj: Option<Secret<String>>,
+        /// Source bank account UUID
+        source_bank_account_id: Option<MaskedBankAccount>,
+        /// Destination bank account UUID.
+        destination_bank_account_id: Option<MaskedBankAccount>,
     },
     Pse {},
     LocalBankTransfer {
@@ -1450,9 +1455,19 @@ impl From<api_models::payments::BankTransferData> for BankTransferData {
             api_models::payments::BankTransferData::MandiriVaBankTransfer { .. } => {
                 Self::MandiriVaBankTransfer {}
             }
-            api_models::payments::BankTransferData::Pix { pix_key, cpf, cnpj } => {
-                Self::Pix { pix_key, cpf, cnpj }
-            }
+            api_models::payments::BankTransferData::Pix {
+                pix_key,
+                cpf,
+                cnpj,
+                source_bank_account_id,
+                destination_bank_account_id,
+            } => Self::Pix {
+                pix_key,
+                cpf,
+                cnpj,
+                source_bank_account_id,
+                destination_bank_account_id,
+            },
             api_models::payments::BankTransferData::Pse {} => Self::Pse {},
             api_models::payments::BankTransferData::LocalBankTransfer { bank_code } => {
                 Self::LocalBankTransfer { bank_code }
@@ -1478,11 +1493,19 @@ impl From<BankTransferData> for api_models::payments::additional_info::BankTrans
             BankTransferData::CimbVaBankTransfer {} => Self::CimbVa {},
             BankTransferData::DanamonVaBankTransfer {} => Self::DanamonVa {},
             BankTransferData::MandiriVaBankTransfer {} => Self::MandiriVa {},
-            BankTransferData::Pix { pix_key, cpf, cnpj } => Self::Pix(Box::new(
+            BankTransferData::Pix {
+                pix_key,
+                cpf,
+                cnpj,
+                source_bank_account_id,
+                destination_bank_account_id,
+            } => Self::Pix(Box::new(
                 api_models::payments::additional_info::PixBankTransferAdditionalData {
                     pix_key: pix_key.map(MaskedBankAccount::from),
                     cpf: cpf.map(MaskedBankAccount::from),
                     cnpj: cnpj.map(MaskedBankAccount::from),
+                    source_bank_account_id,
+                    destination_bank_account_id,
                 },
             )),
             BankTransferData::Pse {} => Self::Pse {},
diff --git a/crates/payment_methods/src/configs/payment_connector_required_fields.rs b/crates/payment_methods/src/configs/payment_connector_required_fields.rs
index 2f4fb7a8013..192d45c8fce 100644
--- a/crates/payment_methods/src/configs/payment_connector_required_fields.rs
+++ b/crates/payment_methods/src/configs/payment_connector_required_fields.rs
@@ -189,6 +189,8 @@ enum RequiredField {
     PixKey,
     PixCnpj,
     PixCpf,
+    PixSourceBankAccountId,
+    PixDestinationBankAccountId,
     GiftCardNumber,
     GiftCardCvc,
     DcbMsisdn,
@@ -782,6 +784,27 @@ impl RequiredField {
                     value: None,
                 },
             ),
+            Self::PixSourceBankAccountId => (
+                "payment_method_data.bank_transfer.pix.source_bank_account_id".to_string(),
+                RequiredFieldInfo {
+                    required_field: "payment_method_data.bank_transfer.pix.source_bank_account_id"
+                        .to_string(),
+                    display_name: "source_bank_account_id".to_string(),
+                    field_type: FieldType::UserSourceBankAccountId,
+                    value: None,
+                },
+            ),
+            Self::PixDestinationBankAccountId => (
+                "payment_method_data.bank_transfer.pix.destination_bank_account_id".to_string(),
+                RequiredFieldInfo {
+                    required_field:
+                        "payment_method_data.bank_transfer.pix.destination_bank_account_id"
+                            .to_string(),
+                    display_name: "destination_bank_account_id".to_string(),
+                    field_type: FieldType::UserDestinationBankAccountId,
+                    value: None,
+                },
+            ),
             Self::GiftCardNumber => (
                 "payment_method_data.gift_card.number".to_string(),
                 RequiredFieldInfo {
@@ -3068,6 +3091,20 @@ fn get_bank_transfer_required_fields() -> HashMap<enums::PaymentMethodType, Conn
                     },
                 ),
                 (Connector::Adyen, fields(vec![], vec![], vec![])),
+                (
+                    Connector::Facilitapay,
+                    RequiredFieldFinal {
+                        mandate: HashMap::new(),
+                        non_mandate: HashMap::new(),
+                        common: HashMap::from([
+                            RequiredField::PixSourceBankAccountId.to_tuple(),
+                            RequiredField::PixDestinationBankAccountId.to_tuple(),
+                            RequiredField::BillingAddressCountries(vec!["BR"]).to_tuple(),
+                            RequiredField::BillingUserFirstName.to_tuple(),
+                            RequiredField::BillingUserLastName.to_tuple(),
+                        ]),
+                    },
+                ),
             ]),
         ),
         (
diff --git a/crates/router/src/core/admin.rs b/crates/router/src/core/admin.rs
index c2f26b1ed9a..b00ed9a4600 100644
--- a/crates/router/src/core/admin.rs
+++ b/crates/router/src/core/admin.rs
@@ -1370,10 +1370,10 @@ impl ConnectorAuthTypeAndMetadataValidation<'_> {
                 elavon::transformers::ElavonAuthType::try_from(self.auth_type)?;
                 Ok(())
             }
-            // api_enums::Connector::Facilitapay => {
-            //     facilitapay::transformers::FacilitapayAuthType::try_from(self.auth_type)?;
-            //     Ok(())
-            // }
+            api_enums::Connector::Facilitapay => {
+                facilitapay::transformers::FacilitapayAuthType::try_from(self.auth_type)?;
+                Ok(())
+            }
             api_enums::Connector::Fiserv => {
                 fiserv::transformers::FiservAuthType::try_from(self.auth_type)?;
                 fiserv::transformers::FiservSessionObject::try_from(self.connector_meta_data)?;
diff --git a/crates/router/src/core/payments.rs b/crates/router/src/core/payments.rs
index b4d3995e994..34a8fba4767 100644
--- a/crates/router/src/core/payments.rs
+++ b/crates/router/src/core/payments.rs
@@ -40,7 +40,6 @@ use error_stack::{report, ResultExt};
 use events::EventInfo;
 use futures::future::join_all;
 use helpers::{decrypt_paze_token, ApplePayData};
-use hyperswitch_domain_models::payments::{payment_intent::CustomerData, ClickToPayMetaData};
 #[cfg(feature = "v2")]
 use hyperswitch_domain_models::payments::{
     PaymentCaptureData, PaymentConfirmData, PaymentIntentData, PaymentStatusData,
@@ -54,6 +53,10 @@ pub use hyperswitch_domain_models::{
     router_data::{PaymentMethodToken, RouterData},
     router_request_types::CustomerDetails,
 };
+use hyperswitch_domain_models::{
+    payments::{payment_intent::CustomerData, ClickToPayMetaData},
+    router_data::AccessToken,
+};
 use masking::{ExposeInterface, PeekInterface, Secret};
 #[cfg(feature = "v2")]
 use operations::ValidateStatusForOperation;
@@ -3052,16 +3055,6 @@ where
     // Validating the blocklist guard and generate the fingerprint
     blocklist_guard(state, merchant_account, key_store, operation, payment_data).await?;
 
-    let updated_customer = call_create_connector_customer_if_required(
-        state,
-        customer,
-        merchant_account,
-        key_store,
-        &merchant_connector_account,
-        payment_data,
-    )
-    .await?;
-
     #[cfg(feature = "v1")]
     let merchant_recipient_data = if let Some(true) = payment_data
         .get_payment_intent()
@@ -3114,6 +3107,22 @@ where
         &call_connector_action,
     );
 
+    let updated_customer = call_create_connector_customer_if_required(
+        state,
+        customer,
+        merchant_account,
+        key_store,
+        &merchant_connector_account,
+        payment_data,
+        router_data.access_token.as_ref(),
+    )
+    .await?;
+
+    #[cfg(feature = "v1")]
+    if let Some(connector_customer_id) = payment_data.get_connector_customer_id() {
+        router_data.connector_customer = Some(connector_customer_id);
+    }
+
     router_data.payment_method_token = if let Some(decrypted_token) =
         add_decrypted_payment_method_token(tokenization_action.clone(), payment_data).await?
     {
@@ -4275,6 +4284,7 @@ pub async fn call_create_connector_customer_if_required<F, Req, D>(
     key_store: &domain::MerchantKeyStore,
     merchant_connector_account: &helpers::MerchantConnectorAccountType,
     payment_data: &mut D,
+    access_token: Option<&AccessToken>,
 ) -> RouterResult<Option<storage::CustomerUpdate>>
 where
     F: Send + Clone + Sync,
@@ -4337,7 +4347,7 @@ where
 
             if should_call_connector {
                 // Create customer at connector and update the customer table to store this data
-                let router_data = payment_data
+                let mut customer_router_data = payment_data
                     .construct_router_data(
                         state,
                         connector.connector.id(),
@@ -4350,7 +4360,9 @@ where
                     )
                     .await?;
 
-                let connector_customer_id = router_data
+                customer_router_data.access_token = access_token.cloned();
+
+                let connector_customer_id = customer_router_data
                     .create_connector_customer(state, &connector)
                     .await?;
 
@@ -8056,6 +8068,9 @@ pub trait OperationSessionGetters<F> {
     fn get_capture_method(&self) -> Option<enums::CaptureMethod>;
     fn get_merchant_connector_id_in_attempt(&self) -> Option<id_type::MerchantConnectorAccountId>;
 
+    #[cfg(feature = "v1")]
+    fn get_connector_customer_id(&self) -> Option<String>;
+
     #[cfg(feature = "v1")]
     fn get_vault_operation(&self) -> Option<&domain_payments::VaultOperation>;
 
@@ -8247,6 +8262,11 @@ impl<F: Clone> OperationSessionGetters<F> for PaymentData<F> {
         self.vault_operation.as_ref()
     }
 
+    #[cfg(feature = "v1")]
+    fn get_connector_customer_id(&self) -> Option<String> {
+        self.connector_customer_id.clone()
+    }
+
     // #[cfg(feature = "v2")]
     // fn get_capture_method(&self) -> Option<enums::CaptureMethod> {
     //     Some(self.payment_intent.capture_method)
diff --git a/crates/router/src/types/api.rs b/crates/router/src/types/api.rs
index ad50919ae06..d130e0c5097 100644
--- a/crates/router/src/types/api.rs
+++ b/crates/router/src/types/api.rs
@@ -396,9 +396,9 @@ impl ConnectorData {
                 enums::Connector::Elavon => {
                     Ok(ConnectorEnum::Old(Box::new(connector::Elavon::new())))
                 }
-                // enums::Connector::Facilitapay => {
-                //     Ok(ConnectorEnum::Old(Box::new(connector::Facilitapay)))
-                // }
+                enums::Connector::Facilitapay => {
+                    Ok(ConnectorEnum::Old(Box::new(connector::Facilitapay::new())))
+                }
                 enums::Connector::Fiserv => {
                     Ok(ConnectorEnum::Old(Box::new(connector::Fiserv::new())))
                 }
diff --git a/crates/router/src/types/transformers.rs b/crates/router/src/types/transformers.rs
index 54abe8f7ce9..f95d80bf0d0 100644
--- a/crates/router/src/types/transformers.rs
+++ b/crates/router/src/types/transformers.rs
@@ -247,7 +247,7 @@ impl ForeignTryFrom<api_enums::Connector> for common_enums::RoutableConnectors {
             api_enums::Connector::Dlocal => Self::Dlocal,
             api_enums::Connector::Ebanx => Self::Ebanx,
             api_enums::Connector::Elavon => Self::Elavon,
-            // api_enums::Connector::Facilitapay => Self::Facilitapay,
+            api_enums::Connector::Facilitapay => Self::Facilitapay,
             api_enums::Connector::Fiserv => Self::Fiserv,
             api_enums::Connector::Fiservemea => Self::Fiservemea,
             api_enums::Connector::Fiuu => Self::Fiuu,
diff --git a/crates/router/tests/connectors/sample_auth.toml b/crates/router/tests/connectors/sample_auth.toml
index 0650e5e6a4d..2675c337029 100644
--- a/crates/router/tests/connectors/sample_auth.toml
+++ b/crates/router/tests/connectors/sample_auth.toml
@@ -47,6 +47,10 @@ key1 = "key1"
 api_key = "access_key"
 key1 = "secret_key"
 
+[facilitapay]
+api_key = "password"
+key1 = "username" # email id
+
 [fiserv]
 api_key = "MyApiKey"
 key1 = "MerchantID"
diff --git a/loadtest/config/development.toml b/loadtest/config/development.toml
index fc3a777ee6e..959a7a90dba 100644
--- a/loadtest/config/development.toml
+++ b/loadtest/config/development.toml
@@ -353,6 +353,9 @@ pix = { country = "BR", currency = "BRL" }
 red_compra = { country = "CL", currency = "CLP" }
 red_pagos = { country = "UY", currency = "UYU" }
 
+[pm_filters.facilitapay]
+pix = { country = "BR", currency = "BRL" }
+
 [pm_filters.globalpay]
 credit = { country = "AF,AX,AL,DZ,AS,AD,AO,AI,AQ,AG,AR,AM,AW,AU,AT,AZ,BS,BH,BD,BB,BY,BE,BZ,BJ,BM,BT,BO,BQ,BA,BW,BV,BR,IO,BN,BG,BF,BI,KH,CM,CA,CV,KY,CF,TD,CL,CN,CX,CC,CO,KM,CG,CD,CK,CR,CI,HR,CU,CW,CY,CZ,DK,DJ,DM,DO,EC,EG,SV,GQ,ER,EE,SZ,ET,FK,FO,FJ,FI,FR,GF,PF,TF,GA,GM,GE,DE,GH,GI,GR,GL,GD,GP,GU,GT,GG,GN,GW,GY,HT,HM,VA,HN,HK,HU,IS,IN,ID,IR,IQ,IE,IM,IL,IT,JM,JP,JE,JO,KZ,KE,KI,KP,KR,KW,KG,LA,LV,LB,LS,LR,LY,LI,LT,LU,MO,MK,MG,MW,MY,MV,ML,MT,MH,MQ,MR,MU,YT,MX,FM,MD,MC,MN,ME,MS,MA,MZ,MM,NA,NR,NP,NL,NC,NZ,NI,NE,NG,NU,NF,MP,NO,OM,PK,PW,PS,PA,PG,PY,PE,PH,PN,PL,PT,PR,QA,RE,RO,RU,RW,BL,SH,KN,LC,MF,PM,VC,WS,SM,ST,SA,SN,RS,SC,SL,SG,SX,SK,SI,SB,SO,ZA,GS,SS,ES,LK,SD,SR,SJ,SE,CH,SY,TW,TJ,TZ,TH,TL,TG,TK,TO,TT,TN,TR,TM,TC,TV,UG,UA,AE,GB,US,UM,UY,UZ,VU,VE,VN,VG,VI,WF,EH,YE,ZM,ZW", currency = "AFN,DZD,ARS,AMD,AWG,AUD,AZN,BSD,BHD,THB,PAB,BBD,BYN,BZD,BMD,BOB,BRL,BND,BGN,BIF,CVE,CAD,CLP,COP,KMF,CDF,NIO,CRC,CUP,CZK,GMD,DKK,MKD,DJF,DOP,VND,XCD,EGP,SVC,ETB,EUR,FKP,FJD,HUF,GHS,GIP,HTG,PYG,GNF,GYD,HKD,UAH,ISK,INR,IRR,IQD,JMD,JOD,KES,PGK,HRK,KWD,AOA,MMK,LAK,GEL,LBP,ALL,HNL,SLL,LRD,LYD,SZL,LSL,MGA,MWK,MYR,MUR,MXN,MDL,MAD,MZN,NGN,ERN,NAD,NPR,ANG,ILS,TWD,NZD,BTN,KPW,NOK,TOP,PKR,MOP,UYU,PHP,GBP,BWP,QAR,GTQ,ZAR,OMR,KHR,RON,MVR,IDR,RUB,RWF,SHP,SAR,RSD,SCR,SGD,PEN,SBD,KGS,SOS,TJS,SSP,LKR,SDG,SRD,SEK,CHF,SYP,BDT,WST,TZS,KZT,TTD,MNT,TND,TRY,TMT,AED,UGX,USD,UZS,VUV,KRW,YER,JPY,CNY,ZMW,ZWL,PLN,CLF,STD,CUC" }
 debit = { country = "AF,AX,AL,DZ,AS,AD,AO,AI,AQ,AG,AR,AM,AW,AU,AT,AZ,BS,BH,BD,BB,BY,BE,BZ,BJ,BM,BT,BO,BQ,BA,BW,BV,BR,IO,BN,BG,BF,BI,KH,CM,CA,CV,KY,CF,TD,CL,CN,CX,CC,CO,KM,CG,CD,CK,CR,CI,HR,CU,CW,CY,CZ,DK,DJ,DM,DO,EC,EG,SV,GQ,ER,EE,SZ,ET,FK,FO,FJ,FI,FR,GF,PF,TF,GA,GM,GE,DE,GH,GI,GR,GL,GD,GP,GU,GT,GG,GN,GW,GY,HT,HM,VA,HN,HK,HU,IS,IN,ID,IR,IQ,IE,IM,IL,IT,JM,JP,JE,JO,KZ,KE,KI,KP,KR,KW,KG,LA,LV,LB,LS,LR,LY,LI,LT,LU,MO,MK,MG,MW,MY,MV,ML,MT,MH,MQ,MR,MU,YT,MX,FM,MD,MC,MN,ME,MS,MA,MZ,MM,NA,NR,NP,NL,NC,NZ,NI,NE,NG,NU,NF,MP,NO,OM,PK,PW,PS,PA,PG,PY,PE,PH,PN,PL,PT,PR,QA,RE,RO,RU,RW,BL,SH,KN,LC,MF,PM,VC,WS,SM,ST,SA,SN,RS,SC,SL,SG,SX,SK,SI,SB,SO,ZA,GS,SS,ES,LK,SD,SR,SJ,SE,CH,SY,TW,TJ,TZ,TH,TL,TG,TK,TO,TT,TN,TR,TM,TC,TV,UG,UA,AE,GB,US,UM,UY,UZ,VU,VE,VN,VG,VI,WF,EH,YE,ZM,ZW", currency = "AFN,DZD,ARS,AMD,AWG,AUD,AZN,BSD,BHD,THB,PAB,BBD,BYN,BZD,BMD,BOB,BRL,BND,BGN,BIF,CVE,CAD,CLP,COP,KMF,CDF,NIO,CRC,CUP,CZK,GMD,DKK,MKD,DJF,DOP,VND,XCD,EGP,SVC,ETB,EUR,FKP,FJD,HUF,GHS,GIP,HTG,PYG,GNF,GYD,HKD,UAH,ISK,INR,IRR,IQD,JMD,JOD,KES,PGK,HRK,KWD,AOA,MMK,LAK,GEL,LBP,ALL,HNL,SLL,LRD,LYD,SZL,LSL,MGA,MWK,MYR,MUR,MXN,MDL,MAD,MZN,NGN,ERN,NAD,NPR,ANG,ILS,TWD,NZD,BTN,KPW,NOK,TOP,PKR,MOP,UYU,PHP,GBP,BWP,QAR,GTQ,ZAR,OMR,KHR,RON,MVR,IDR,RUB,RWF,SHP,SAR,RSD,SCR,SGD,PEN,SBD,KGS,SOS,TJS,SSP,LKR,SDG,SRD,SEK,CHF,SYP,BDT,WST,TZS,KZT,TTD,MNT,TND,TRY,TMT,AED,UGX,USD,UZS,VUV,KRW,YER,JPY,CNY,ZMW,ZWL,PLN,CLF,STD,CUC" }
@@ -404,7 +407,7 @@ gocardless = { long_lived_token = true, payment_method = "bank_debit" }
 billwerk = { long_lived_token = false, payment_method = "card" }
 
 [connector_customer]
-connector_list = "gocardless,stax,stripe"
+connector_list = "gocardless,stax,stripe,facilitapay"
 payout_connector_list = "nomupay,wise"
 
 [dummy_connector]
@@ -529,4 +532,4 @@ paybox = { payment_method = "card" }
 redsys = { payment_method = "card" }
 
 [billing_connectors_payment_sync]
-billing_connectors_which_require_payment_sync = "stripebilling, recurly"
\ No newline at end of file
+billing_connectors_which_require_payment_sync = "stripebilling, recurly"

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

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

## Description
<!-- Describe your changes in detail -->

This PR does the following:

- Adds Facilitapay Connector configs
- Enables Facilitapay Connector in Core
  - Feature Matrix
  - Pix Bank Transfer (QRCode flow)
  - Does not support `Manual` capture
  - AccessToken flow
  - Requires Connector Customer to be created prior to make a payment
- Adds Cypress test coverage for Facilitapay Pix Bank transfer

Also, this PR involves a small core change which is explained [here](https://github.com/juspay/hyperswitch/pull/7704#discussion_r2037127714). Quoted below:

> Previously, `updated_customer` was called before constructing the `router_data`. `updated_customer` returns us the `connector_customer` in `payment_data` that then gets updated in the `router_data` while it gets constructed.
> 
> Facilitapay requires us to pass `access_token` to create the `connectorCustomer` but `access_token` is available only in the `router_data`. This creates a cyclical dependency between `updated_customer` and `router_data`.
> 
> To comes overcome this, we need to move `updated_customer` after `router_data`.
> 
> `updated_customer` returns us the `connector_customer` value and it never gets updated in the `router_data` since it is called before calling `updated_customer` which results in `connector_customer_id` to go missing resulting in all payments that rely on `connector_customer_id` to fail.
> 
> Hence, we need to update the `router_data` with `connector_customer` value that we get from `payment_data` returned by the `updated_customer` and the above lines does the same.

### Additional Changes

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

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

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


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

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

New connector integration. Closes #7732

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

<details>
<summary>Authorize call</summary>

```curl
curl --location 'http://localhost:8080/payments' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'Accept-Language: ja' \
--header 'api-key: dev_ptC2LQhN7u066v4fCKUcOEAWodGDoMl3We9YxN0cM4d7dal16ZSmt9EOdSJ0C6I4' \
--data-raw '{
    "amount": 10400,
    "currency": "BRL",
    "confirm": false,
    "capture_method": "automatic",
    "capture_on": "2022-09-10T10:11:12Z",
    "amount_to_capture": 10400,
    "email": "guesjhvghht@example.com",
    "phone": "999999999",
    "phone_country_code": "+1",
    "description": "Its my first payment request",
    "authentication_type": "no_three_ds",
    "return_url": "https://duck.com",
    "billing": {
        "address": {
            "line1": "1467",
            "line2": "Harrison Street",
            "line3": "Harrison Street",
            "city": "San Fransico",
            "state": "California",
            "zip": "94122",
            "country": "BR",
            "first_name": "PiX"
        }
    },
    "shipping": {
        "address": {
            "line1": "1467",
            "line2": "Harrison Street",
            "line3": "Harrison Street",
            "city": "San Fransico",
            "state": "California",
            "zip": "94122",
            "country": "BR",
            "first_name": "PiX"
        }
    },
    "browser_info": {
		"ip_address": "192.168.0.1",
		"user_agent": "MY LAPTOP RUNS ON m0z://a"
	},
    "statement_descriptor_name": "joseph",
    "statement_descriptor_suffix": "JS",
    "metadata": {
        "udf1": "value1",
        "new_customer": "true",
        "login_date": "2019-09-10T10:11:12Z"
    }
}'
```
```json
{
    "payment_id": "pay_HqjCP9OWtYlxg0KYwPMU",
    "merchant_id": "postman_merchant_GHAction_1744364064",
    "status": "requires_payment_method",
    "amount": 10400,
    "net_amount": 10400,
    "shipping_cost": null,
    "amount_capturable": 0,
    "amount_received": null,
    "connector": null,
    "client_secret": "pay_HqjCP9OWtYlxg0KYwPMU_secret_VZlpnxNdhvw9MExKApxo",
    "created": "2025-04-11T11:27:27.560Z",
    "currency": "BRL",
    "customer_id": null,
    "customer": {
        "id": null,
        "name": null,
        "email": "guesjhvghht@example.com",
        "phone": "999999999",
        "phone_country_code": "+1"
    },
    "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": null,
    "payment_method_data": null,
    "payment_token": null,
    "shipping": {
        "address": {
            "city": "San Fransico",
            "country": "BR",
            "line1": "1467",
            "line2": "Harrison Street",
            "line3": "Harrison Street",
            "zip": "94122",
            "state": "California",
            "first_name": "PiX",
            "last_name": null
        },
        "phone": null,
        "email": null
    },
    "billing": {
        "address": {
            "city": "San Fransico",
            "country": "BR",
            "line1": "1467",
            "line2": "Harrison Street",
            "line3": "Harrison Street",
            "zip": "94122",
            "state": "California",
            "first_name": "PiX",
            "last_name": null
        },
        "phone": null,
        "email": null
    },
    "order_details": null,
    "email": null,
    "name": null,
    "phone": null,
    "return_url": "https://duck.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": null,
    "connector_label": null,
    "business_country": null,
    "business_label": "default",
    "business_sub_label": null,
    "allowed_payment_method_types": null,
    "ephemeral_key": null,
    "manual_retry_allowed": null,
    "connector_transaction_id": null,
    "frm_message": null,
    "metadata": {
        "udf1": "value1",
        "login_date": "2019-09-10T10:11:12Z",
        "new_customer": "true"
    },
    "connector_metadata": null,
    "feature_metadata": null,
    "reference_id": null,
    "payment_link": null,
    "profile_id": "pro_d88fTeKAHe2MonTWe8Dk",
    "surcharge_details": null,
    "attempt_count": 1,
    "merchant_decision": null,
    "merchant_connector_id": null,
    "incremental_authorization_allowed": null,
    "authorization_count": null,
    "incremental_authorizations": null,
    "external_authentication_details": null,
    "external_3ds_authentication_attempted": false,
    "expires_on": "2025-04-11T11:42:27.560Z",
    "fingerprint": null,
    "browser_info": {
        "ip_address": "192.168.0.1",
        "user_agent": "MY LAPTOP RUNS ON m0z://a"
    },
    "payment_method_id": null,
    "payment_method_status": null,
    "updated": "2025-04-11T11:27:27.583Z",
    "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": null,
    "force_3ds_challenge": false,
    "force_3ds_challenge_trigger": false,
    "issuer_error_code": null,
    "issuer_error_message": null
}
```

</details>


<details>
<summary>Confirm call</summary>


```curl
curl --location 'http://localhost:8080/payments/pay_HqjCP9OWtYlxg0KYwPMU/confirm' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'api-key: pk_dev_e765522f7c7543b9844fbcb1ab283a71' \
--data '{
    "payment_method": "bank_transfer",
    "payment_method_type": "pix",
    "payment_method_data": {
        "bank_transfer": {
            "pix": {
                "cpf": "866.656.235-80",
                "source_bank_account_id": "739d6b0a-e92a-40fd-9f58-6d4cdeb699bb",
                "destination_bank_account_id": "91f5cac1-9058-44b7-80e1-80c6f4a6f0bc",
                "pix_qr_expiry": "2025-04-11T19:53:54.807Z"
            }
        }
    },
    "client_secret": "pay_HqjCP9OWtYlxg0KYwPMU_secret_VZlpnxNdhvw9MExKApxo"
}'
```
```json
{
    "payment_id": "pay_HqjCP9OWtYlxg0KYwPMU",
    "merchant_id": "postman_merchant_GHAction_1744364064",
    "status": "requires_customer_action",
    "amount": 10400,
    "net_amount": 10400,
    "shipping_cost": null,
    "amount_capturable": 10400,
    "amount_received": null,
    "connector": "facilitapay",
    "client_secret": "pay_HqjCP9OWtYlxg0KYwPMU_secret_VZlpnxNdhvw9MExKApxo",
    "created": "2025-04-11T11:27:27.560Z",
    "currency": "BRL",
    "customer_id": null,
    "customer": {
        "id": null,
        "name": null,
        "email": "guesjhvghht@example.com",
        "phone": "999999999",
        "phone_country_code": "+1"
    },
    "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": "bank_transfer",
    "payment_method_data": {
        "bank_transfer": {
            "pix": {
                "pix_key": null,
                "cpf": "866.***.**5-80",
                "cnpj": null,
                "source_bank_account_id": "739d****-****-****-****-********99bb",
                "destination_bank_account_id": "91f5****-****-****-****-********f0bc"
            }
        },
        "billing": null
    },
    "payment_token": null,
    "shipping": {
        "address": {
            "city": "San Fransico",
            "country": "BR",
            "line1": "1467",
            "line2": "Harrison Street",
            "line3": "Harrison Street",
            "zip": "94122",
            "state": "California",
            "first_name": "PiX",
            "last_name": null
        },
        "phone": null,
        "email": null
    },
    "billing": {
        "address": {
            "city": "San Fransico",
            "country": "BR",
            "line1": "1467",
            "line2": "Harrison Street",
            "line3": "Harrison Street",
            "zip": "94122",
            "state": "California",
            "first_name": "PiX",
            "last_name": null
        },
        "phone": null,
        "email": null
    },
    "order_details": null,
    "email": null,
    "name": null,
    "phone": null,
    "return_url": "https://duck.com/",
    "authentication_type": "no_three_ds",
    "statement_descriptor_name": "joseph",
    "statement_descriptor_suffix": "JS",
    "next_action": {
        "type": "qr_code_information",
        "image_data_url": "data:image/png;base64,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",
        "display_to_timestamp": 1744371750000,
        "qr_code_url": null,
        "display_text": null,
        "border_color": null
    },
    "cancellation_reason": null,
    "error_code": null,
    "error_message": null,
    "unified_code": null,
    "unified_message": null,
    "payment_experience": null,
    "payment_method_type": "pix",
    "connector_label": null,
    "business_country": null,
    "business_label": "default",
    "business_sub_label": null,
    "allowed_payment_method_types": null,
    "ephemeral_key": null,
    "manual_retry_allowed": null,
    "connector_transaction_id": "aa3223d2-bd54-44d0-8816-fdbeae885c14",
    "frm_message": null,
    "metadata": {
        "udf1": "value1",
        "login_date": "2019-09-10T10:11:12Z",
        "new_customer": "true"
    },
    "connector_metadata": null,
    "feature_metadata": null,
    "reference_id": "aa3223d2-bd54-44d0-8816-fdbeae885c14",
    "payment_link": null,
    "profile_id": "pro_d88fTeKAHe2MonTWe8Dk",
    "surcharge_details": null,
    "attempt_count": 1,
    "merchant_decision": null,
    "merchant_connector_id": "mca_uEuYQIIpwmhh2zZgfnCK",
    "incremental_authorization_allowed": null,
    "authorization_count": null,
    "incremental_authorizations": null,
    "external_authentication_details": null,
    "external_3ds_authentication_attempted": false,
    "expires_on": "2025-04-11T11:42:27.560Z",
    "fingerprint": null,
    "browser_info": {
        "os_type": null,
        "language": null,
        "time_zone": null,
        "ip_address": "::1",
        "os_version": null,
        "user_agent": null,
        "color_depth": null,
        "device_model": null,
        "java_enabled": null,
        "screen_width": null,
        "accept_header": null,
        "screen_height": null,
        "accept_language": "en",
        "java_script_enabled": null
    },
    "payment_method_id": null,
    "payment_method_status": null,
    "updated": "2025-04-11T11:27:32.090Z",
    "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": null,
    "force_3ds_challenge": false,
    "force_3ds_challenge_trigger": false,
    "issuer_error_code": null,
    "issuer_error_message": null
}
```

</details>


<details>
<summary>QR Code</summary>

<img width="691" alt="image" src="https://github.com/user-attachments/assets/5e088c40-aaea-4056-baf5-e81b1a88603d" />

<img width="704" alt="image" src="https://github.com/user-attachments/assets/b87e6a91-a4d7-4dfa-a846-1cf785e8b298" />

</details>

<details>
<summary>Retrieve Call</summary>

```curl
curl --location 'http://localhost:8080/payments/pay_HqjCP9OWtYlxg0KYwPMU?force_sync=true' \
--header 'Accept: application/json' \
--header 'api-key: dev_ptC2LQhN7u066v4fCKUcOEAWodGDoMl3We9YxN0cM4d7dal16ZSmt9EOdSJ0C6I4'
```
```json
{
    "payment_id": "pay_HqjCP9OWtYlxg0KYwPMU",
    "merchant_id": "postman_merchant_GHAction_1744364064",
    "status": "requires_customer_action",
    "amount": 10400,
    "net_amount": 10400,
    "shipping_cost": null,
    "amount_capturable": 10400,
    "amount_received": null,
    "connector": "facilitapay",
    "client_secret": "pay_HqjCP9OWtYlxg0KYwPMU_secret_VZlpnxNdhvw9MExKApxo",
    "created": "2025-04-11T11:27:27.560Z",
    "currency": "BRL",
    "customer_id": null,
    "customer": {
        "id": null,
        "name": null,
        "email": "guesjhvghht@example.com",
        "phone": "999999999",
        "phone_country_code": "+1"
    },
    "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": "bank_transfer",
    "payment_method_data": {
        "bank_transfer": {
            "pix": {
                "pix_key": null,
                "cpf": "866.***.**5-80",
                "cnpj": null,
                "source_bank_account_id": "739d****-****-****-****-********99bb",
                "destination_bank_account_id": "91f5****-****-****-****-********f0bc"
            }
        },
        "billing": null
    },
    "payment_token": null,
    "shipping": {
        "address": {
            "city": "San Fransico",
            "country": "BR",
            "line1": "1467",
            "line2": "Harrison Street",
            "line3": "Harrison Street",
            "zip": "94122",
            "state": "California",
            "first_name": "PiX",
            "last_name": null
        },
        "phone": null,
        "email": null
    },
    "billing": {
        "address": {
            "city": "San Fransico",
            "country": "BR",
            "line1": "1467",
            "line2": "Harrison Street",
            "line3": "Harrison Street",
            "zip": "94122",
            "state": "California",
            "first_name": "PiX",
            "last_name": null
        },
        "phone": null,
        "email": null
    },
    "order_details": null,
    "email": null,
    "name": null,
    "phone": null,
    "return_url": "https://duck.com/",
    "authentication_type": "no_three_ds",
    "statement_descriptor_name": "joseph",
    "statement_descriptor_suffix": "JS",
    "next_action": {
        "type": "qr_code_information",
        "image_data_url": "data:image/png;base64,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",
        "display_to_timestamp": 1744371750000,
        "qr_code_url": null,
        "display_text": null,
        "border_color": null
    },
    "cancellation_reason": null,
    "error_code": null,
    "error_message": null,
    "unified_code": null,
    "unified_message": null,
    "payment_experience": null,
    "payment_method_type": "pix",
    "connector_label": null,
    "business_country": null,
    "business_label": "default",
    "business_sub_label": null,
    "allowed_payment_method_types": null,
    "ephemeral_key": null,
    "manual_retry_allowed": null,
    "connector_transaction_id": "aa3223d2-bd54-44d0-8816-fdbeae885c14",
    "frm_message": null,
    "metadata": {
        "udf1": "value1",
        "login_date": "2019-09-10T10:11:12Z",
        "new_customer": "true"
    },
    "connector_metadata": null,
    "feature_metadata": null,
    "reference_id": "aa3223d2-bd54-44d0-8816-fdbeae885c14",
    "payment_link": null,
    "profile_id": "pro_d88fTeKAHe2MonTWe8Dk",
    "surcharge_details": null,
    "attempt_count": 1,
    "merchant_decision": null,
    "merchant_connector_id": "mca_uEuYQIIpwmhh2zZgfnCK",
    "incremental_authorization_allowed": null,
    "authorization_count": null,
    "incremental_authorizations": null,
    "external_authentication_details": null,
    "external_3ds_authentication_attempted": false,
    "expires_on": "2025-04-11T11:42:27.560Z",
    "fingerprint": null,
    "browser_info": {
        "os_type": null,
        "language": null,
        "time_zone": null,
        "ip_address": "::1",
        "os_version": null,
        "user_agent": null,
        "color_depth": null,
        "device_model": null,
        "java_enabled": null,
        "screen_width": null,
        "accept_header": null,
        "screen_height": null,
        "accept_language": "en",
        "java_script_enabled": null
    },
    "payment_method_id": null,
    "payment_method_status": null,
    "updated": "2025-04-11T12:02:17.950Z",
    "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": null,
    "force_3ds_challenge": false,
    "force_3ds_challenge_trigger": false,
    "issuer_error_code": null,
    "issuer_error_message": null
}
```

</details>

<details>
<summary>Refund call</summary>

```curl
curl --location 'http://localhost:8080/refunds' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'api-key: dev_ptC2LQhN7u066v4fCKUcOEAWodGDoMl3We9YxN0cM4d7dal16ZSmt9EOdSJ0C6I4' \
--data '{
    "payment_id": "pay_HqjCP9OWtYlxg0KYwPMU",
    "amount": 600,
    "reason": "Customer returned product",
    "refund_type": "instant",
    "metadata": {
        "udf1": "value1",
        "new_customer": "true",
        "login_date": "2019-09-10T10:11:12Z"
    }
}'
```
```json
{
    "error": {
        "type": "invalid_request",
        "message": "This Payment could not be refund because it has a status of requires_customer_action. The expected state is succeeded, partially_captured",
        "code": "IR_14"
    }
}
```
</details>

<details>
<summary>Void call</summary>

Authorize

```curl
curl --location 'http://localhost:8080/payments' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'Accept-Language: ja' \
--header 'api-key: dev_ptC2LQhN7u066v4fCKUcOEAWodGDoMl3We9YxN0cM4d7dal16ZSmt9EOdSJ0C6I4' \
--data-raw '{
    "amount": 10400,
    "currency": "BRL",
    "confirm": false,
    "capture_method": "automatic",
    "capture_on": "2022-09-10T10:11:12Z",
    "amount_to_capture": 10400,
    "email": "guesjhvghht@example.com",
    "phone": "999999999",
    "phone_country_code": "+1",
    "description": "Its my first payment request",
    "authentication_type": "no_three_ds",
    "return_url": "https://duck.com",
    "billing": {
        "address": {
            "line1": "1467",
            "line2": "Harrison Street",
            "line3": "Harrison Street",
            "city": "San Fransico",
            "state": "California",
            "zip": "94122",
            "country": "BR",
            "first_name": "PiX"
        }
    },
    "shipping": {
        "address": {
            "line1": "1467",
            "line2": "Harrison Street",
            "line3": "Harrison Street",
            "city": "San Fransico",
            "state": "California",
            "zip": "94122",
            "country": "BR",
            "first_name": "PiX"
        }
    },
    "browser_info": {
		"ip_address": "192.168.0.1",
		"user_agent": "MY LAPTOP RUNS ON m0z://a"
	},
    "statement_descriptor_name": "joseph",
    "statement_descriptor_suffix": "JS",
    "metadata": {
        "udf1": "value1",
        "new_customer": "true",
        "login_date": "2019-09-10T10:11:12Z"
    }
}'
```
```json
{
    "payment_id": "pay_oEMHiZFEcOnYfhKdCGkX",
    "merchant_id": "postman_merchant_GHAction_1744364064",
    "status": "requires_payment_method",
    "amount": 10400,
    "net_amount": 10400,
    "shipping_cost": null,
    "amount_capturable": 0,
    "amount_received": null,
    "connector": null,
    "client_secret": "pay_oEMHiZFEcOnYfhKdCGkX_secret_4pCGB9AmNlBGvZUcT8La",
    "created": "2025-04-11T17:53:10.739Z",
    "currency": "BRL",
    "customer_id": null,
    "customer": {
        "id": null,
        "name": null,
        "email": "guesjhvghht@example.com",
        "phone": "999999999",
        "phone_country_code": "+1"
    },
    "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": null,
    "payment_method_data": null,
    "payment_token": null,
    "shipping": {
        "address": {
            "city": "San Fransico",
            "country": "BR",
            "line1": "1467",
            "line2": "Harrison Street",
            "line3": "Harrison Street",
            "zip": "94122",
            "state": "California",
            "first_name": "PiX",
            "last_name": null
        },
        "phone": null,
        "email": null
    },
    "billing": {
        "address": {
            "city": "San Fransico",
            "country": "BR",
            "line1": "1467",
            "line2": "Harrison Street",
            "line3": "Harrison Street",
            "zip": "94122",
            "state": "California",
            "first_name": "PiX",
            "last_name": null
        },
        "phone": null,
        "email": null
    },
    "order_details": null,
    "email": null,
    "name": null,
    "phone": null,
    "return_url": "https://duck.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": null,
    "connector_label": null,
    "business_country": null,
    "business_label": "default",
    "business_sub_label": null,
    "allowed_payment_method_types": null,
    "ephemeral_key": null,
    "manual_retry_allowed": null,
    "connector_transaction_id": null,
    "frm_message": null,
    "metadata": {
        "udf1": "value1",
        "login_date": "2019-09-10T10:11:12Z",
        "new_customer": "true"
    },
    "connector_metadata": null,
    "feature_metadata": null,
    "reference_id": null,
    "payment_link": null,
    "profile_id": "pro_d88fTeKAHe2MonTWe8Dk",
    "surcharge_details": null,
    "attempt_count": 1,
    "merchant_decision": null,
    "merchant_connector_id": null,
    "incremental_authorization_allowed": null,
    "authorization_count": null,
    "incremental_authorizations": null,
    "external_authentication_details": null,
    "external_3ds_authentication_attempted": false,
    "expires_on": "2025-04-11T18:08:10.739Z",
    "fingerprint": null,
    "browser_info": {
        "ip_address": "192.168.0.1",
        "user_agent": "MY LAPTOP RUNS ON m0z://a"
    },
    "payment_method_id": null,
    "payment_method_status": null,
    "updated": "2025-04-11T17:53:10.747Z",
    "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": null,
    "force_3ds_challenge": false,
    "force_3ds_challenge_trigger": false,
    "issuer_error_code": null,
    "issuer_error_message": null
}
```

Confirm

```curl
curl --location 'http://localhost:8080/payments/pay_oEMHiZFEcOnYfhKdCGkX/confirm' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'api-key: pk_dev_e765522f7c7543b9844fbcb1ab283a71' \
--data '{
    "payment_method": "bank_transfer",
    "payment_method_type": "pix",
    "payment_method_data": {
        "bank_transfer": {
            "pix": {
                "cpf": "866.656.235-80",
                "source_bank_account_id": "739d6b0a-e92a-40fd-9f58-6d4cdeb699bb",
                "destination_bank_account_id": "91f5cac1-9058-44b7-80e1-80c6f4a6f0bc",
                "pix_qr_expiry": "2025-04-11T19:53:54.807Z"
            }
        }
    },
    "client_secret": "pay_oEMHiZFEcOnYfhKdCGkX_secret_4pCGB9AmNlBGvZUcT8La"
}'
```
```json
{
    "payment_id": "pay_oEMHiZFEcOnYfhKdCGkX",
    "merchant_id": "postman_merchant_GHAction_1744364064",
    "status": "requires_customer_action",
    "amount": 10400,
    "net_amount": 10400,
    "shipping_cost": null,
    "amount_capturable": 10400,
    "amount_received": null,
    "connector": "facilitapay",
    "client_secret": "pay_oEMHiZFEcOnYfhKdCGkX_secret_4pCGB9AmNlBGvZUcT8La",
    "created": "2025-04-11T17:53:10.739Z",
    "currency": "BRL",
    "customer_id": null,
    "customer": {
        "id": null,
        "name": null,
        "email": "guesjhvghht@example.com",
        "phone": "999999999",
        "phone_country_code": "+1"
    },
    "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": "bank_transfer",
    "payment_method_data": {
        "bank_transfer": {
            "pix": {
                "pix_key": null,
                "cpf": "866.***.**5-80",
                "cnpj": null,
                "source_bank_account_id": "739d****-****-****-****-********99bb",
                "destination_bank_account_id": "91f5****-****-****-****-********f0bc"
            }
        },
        "billing": null
    },
    "payment_token": null,
    "shipping": {
        "address": {
            "city": "San Fransico",
            "country": "BR",
            "line1": "1467",
            "line2": "Harrison Street",
            "line3": "Harrison Street",
            "zip": "94122",
            "state": "California",
            "first_name": "PiX",
            "last_name": null
        },
        "phone": null,
        "email": null
    },
    "billing": {
        "address": {
            "city": "San Fransico",
            "country": "BR",
            "line1": "1467",
            "line2": "Harrison Street",
            "line3": "Harrison Street",
            "zip": "94122",
            "state": "California",
            "first_name": "PiX",
            "last_name": null
        },
        "phone": null,
        "email": null
    },
    "order_details": null,
    "email": null,
    "name": null,
    "phone": null,
    "return_url": "https://duck.com/",
    "authentication_type": "no_three_ds",
    "statement_descriptor_name": "joseph",
    "statement_descriptor_suffix": "JS",
    "next_action": {
        "type": "qr_code_information",
        "image_data_url": "data:image/png;base64,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",
        "display_to_timestamp": 1744394897000,
        "qr_code_url": null,
        "display_text": null,
        "border_color": null
    },
    "cancellation_reason": null,
    "error_code": null,
    "error_message": null,
    "unified_code": null,
    "unified_message": null,
    "payment_experience": null,
    "payment_method_type": "pix",
    "connector_label": null,
    "business_country": null,
    "business_label": "default",
    "business_sub_label": null,
    "allowed_payment_method_types": null,
    "ephemeral_key": null,
    "manual_retry_allowed": null,
    "connector_transaction_id": "33fe7dc7-25a0-4ba5-a7d2-4245fc0b2127",
    "frm_message": null,
    "metadata": {
        "udf1": "value1",
        "login_date": "2019-09-10T10:11:12Z",
        "new_customer": "true"
    },
    "connector_metadata": null,
    "feature_metadata": null,
    "reference_id": "33fe7dc7-25a0-4ba5-a7d2-4245fc0b2127",
    "payment_link": null,
    "profile_id": "pro_d88fTeKAHe2MonTWe8Dk",
    "surcharge_details": null,
    "attempt_count": 1,
    "merchant_decision": null,
    "merchant_connector_id": "mca_uEuYQIIpwmhh2zZgfnCK",
    "incremental_authorization_allowed": null,
    "authorization_count": null,
    "incremental_authorizations": null,
    "external_authentication_details": null,
    "external_3ds_authentication_attempted": false,
    "expires_on": "2025-04-11T18:08:10.739Z",
    "fingerprint": null,
    "browser_info": {
        "os_type": null,
        "language": null,
        "time_zone": null,
        "ip_address": "::1",
        "os_version": null,
        "user_agent": null,
        "color_depth": null,
        "device_model": null,
        "java_enabled": null,
        "screen_width": null,
        "accept_header": null,
        "screen_height": null,
        "accept_language": "en",
        "java_script_enabled": null
    },
    "payment_method_id": null,
    "payment_method_status": null,
    "updated": "2025-04-11T17:53:19.350Z",
    "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": null,
    "force_3ds_challenge": false,
    "force_3ds_challenge_trigger": false,
    "issuer_error_code": null,
    "issuer_error_message": null
}
```

Void

```curl
curl --location 'http://localhost:8080/payments/pay_oEMHiZFEcOnYfhKdCGkX/cancel' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'api-key: dev_ptC2LQhN7u066v4fCKUcOEAWodGDoMl3We9YxN0cM4d7dal16ZSmt9EOdSJ0C6I4' \
--data '{"cancellation_reason":"requested_by_customer"}'
```
```json
{
    "payment_id": "pay_oEMHiZFEcOnYfhKdCGkX",
    "merchant_id": "postman_merchant_GHAction_1744364064",
    "status": "cancelled",
    "amount": 10400,
    "net_amount": 10400,
    "shipping_cost": null,
    "amount_capturable": 10400,
    "amount_received": null,
    "connector": "facilitapay",
    "client_secret": "pay_oEMHiZFEcOnYfhKdCGkX_secret_4pCGB9AmNlBGvZUcT8La",
    "created": "2025-04-11T17:53:10.739Z",
    "currency": "BRL",
    "customer_id": null,
    "customer": {
        "id": null,
        "name": null,
        "email": "guesjhvghht@example.com",
        "phone": "999999999",
        "phone_country_code": "+1"
    },
    "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": "bank_transfer",
    "payment_method_data": {
        "bank_transfer": {
            "pix": {
                "pix_key": null,
                "cpf": "866.***.**5-80",
                "cnpj": null,
                "source_bank_account_id": "739d****-****-****-****-********99bb",
                "destination_bank_account_id": "91f5****-****-****-****-********f0bc"
            }
        },
        "billing": null
    },
    "payment_token": null,
    "shipping": {
        "address": {
            "city": "San Fransico",
            "country": "BR",
            "line1": "1467",
            "line2": "Harrison Street",
            "line3": "Harrison Street",
            "zip": "94122",
            "state": "California",
            "first_name": "PiX",
            "last_name": null
        },
        "phone": null,
        "email": null
    },
    "billing": {
        "address": {
            "city": "San Fransico",
            "country": "BR",
            "line1": "1467",
            "line2": "Harrison Street",
            "line3": "Harrison Street",
            "zip": "94122",
            "state": "California",
            "first_name": "PiX",
            "last_name": null
        },
        "phone": null,
        "email": null
    },
    "order_details": null,
    "email": null,
    "name": null,
    "phone": null,
    "return_url": "https://duck.com/",
    "authentication_type": "no_three_ds",
    "statement_descriptor_name": "joseph",
    "statement_descriptor_suffix": "JS",
    "next_action": {
        "type": "qr_code_information",
        "image_data_url": "data:image/png;base64,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",
        "display_to_timestamp": 1744394897000,
        "qr_code_url": null,
        "display_text": null,
        "border_color": null
    },
    "cancellation_reason": "requested_by_customer",
    "error_code": null,
    "error_message": null,
    "unified_code": null,
    "unified_message": null,
    "payment_experience": null,
    "payment_method_type": "pix",
    "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": "33fe7dc7-25a0-4ba5-a7d2-4245fc0b2127",
    "frm_message": null,
    "metadata": {
        "udf1": "value1",
        "login_date": "2019-09-10T10:11:12Z",
        "new_customer": "true"
    },
    "connector_metadata": null,
    "feature_metadata": null,
    "reference_id": "33fe7dc7-25a0-4ba5-a7d2-4245fc0b2127",
    "payment_link": null,
    "profile_id": "pro_d88fTeKAHe2MonTWe8Dk",
    "surcharge_details": null,
    "attempt_count": 1,
    "merchant_decision": null,
    "merchant_connector_id": "mca_uEuYQIIpwmhh2zZgfnCK",
    "incremental_authorization_allowed": null,
    "authorization_count": null,
    "incremental_authorizations": null,
    "external_authentication_details": null,
    "external_3ds_authentication_attempted": false,
    "expires_on": "2025-04-11T18:08:10.739Z",
    "fingerprint": null,
    "browser_info": {
        "os_type": null,
        "language": null,
        "time_zone": null,
        "ip_address": "::1",
        "os_version": null,
        "user_agent": null,
        "color_depth": null,
        "device_model": null,
        "java_enabled": null,
        "screen_width": null,
        "accept_header": null,
        "screen_height": null,
        "accept_language": "en",
        "java_script_enabled": null
    },
    "payment_method_id": null,
    "payment_method_status": null,
    "updated": "2025-04-11T17:53:20.936Z",
    "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": null,
    "force_3ds_challenge": false,
    "force_3ds_challenge_trigger": false,
    "issuer_error_code": null,
    "issuer_error_message": null
}
```

</details>

<details>
<summary>Manual Capture</summary>

Authorize

```curl
curl --location 'http://localhost:8080/payments' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'Accept-Language: ja' \
--header 'api-key: dev_ptC2LQhN7u066v4fCKUcOEAWodGDoMl3We9YxN0cM4d7dal16ZSmt9EOdSJ0C6I4' \
--data-raw '{
    "amount": 10400,
    "currency": "BRL",
    "confirm": false,
    "capture_method": "manual",
    "capture_on": "2022-09-10T10:11:12Z",
    "amount_to_capture": 10400,
    "email": "guesjhvghht@example.com",
    "phone": "999999999",
    "phone_country_code": "+1",
    "description": "Its my first payment request",
    "authentication_type": "no_three_ds",
    "return_url": "https://duck.com",
    "billing": {
        "address": {
            "line1": "1467",
            "line2": "Harrison Street",
            "line3": "Harrison Street",
            "city": "San Fransico",
            "state": "California",
            "zip": "94122",
            "country": "BR",
            "first_name": "PiX"
        }
    },
    "shipping": {
        "address": {
            "line1": "1467",
            "line2": "Harrison Street",
            "line3": "Harrison Street",
            "city": "San Fransico",
            "state": "California",
            "zip": "94122",
            "country": "BR",
            "first_name": "PiX"
        }
    },
    "browser_info": {
		"ip_address": "192.168.0.1",
		"user_agent": "MY LAPTOP RUNS ON m0z://a"
	},
    "statement_descriptor_name": "joseph",
    "statement_descriptor_suffix": "JS",
    "metadata": {
        "udf1": "value1",
        "new_customer": "true",
        "login_date": "2019-09-10T10:11:12Z"
    }
}'
```
```json
{
    "payment_id": "pay_ytZ1ZAAsTwKK0F7uA2IH",
    "merchant_id": "postman_merchant_GHAction_1744364064",
    "status": "requires_payment_method",
    "amount": 10400,
    "net_amount": 10400,
    "shipping_cost": null,
    "amount_capturable": 0,
    "amount_received": null,
    "connector": null,
    "client_secret": "pay_ytZ1ZAAsTwKK0F7uA2IH_secret_HjrEsQIrDAQunFZVLQY4",
    "created": "2025-04-11T17:55:46.411Z",
    "currency": "BRL",
    "customer_id": null,
    "customer": {
        "id": null,
        "name": null,
        "email": "guesjhvghht@example.com",
        "phone": "999999999",
        "phone_country_code": "+1"
    },
    "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": "manual",
    "payment_method": null,
    "payment_method_data": null,
    "payment_token": null,
    "shipping": {
        "address": {
            "city": "San Fransico",
            "country": "BR",
            "line1": "1467",
            "line2": "Harrison Street",
            "line3": "Harrison Street",
            "zip": "94122",
            "state": "California",
            "first_name": "PiX",
            "last_name": null
        },
        "phone": null,
        "email": null
    },
    "billing": {
        "address": {
            "city": "San Fransico",
            "country": "BR",
            "line1": "1467",
            "line2": "Harrison Street",
            "line3": "Harrison Street",
            "zip": "94122",
            "state": "California",
            "first_name": "PiX",
            "last_name": null
        },
        "phone": null,
        "email": null
    },
    "order_details": null,
    "email": null,
    "name": null,
    "phone": null,
    "return_url": "https://duck.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": null,
    "connector_label": null,
    "business_country": null,
    "business_label": "default",
    "business_sub_label": null,
    "allowed_payment_method_types": null,
    "ephemeral_key": null,
    "manual_retry_allowed": null,
    "connector_transaction_id": null,
    "frm_message": null,
    "metadata": {
        "udf1": "value1",
        "login_date": "2019-09-10T10:11:12Z",
        "new_customer": "true"
    },
    "connector_metadata": null,
    "feature_metadata": null,
    "reference_id": null,
    "payment_link": null,
    "profile_id": "pro_d88fTeKAHe2MonTWe8Dk",
    "surcharge_details": null,
    "attempt_count": 1,
    "merchant_decision": null,
    "merchant_connector_id": null,
    "incremental_authorization_allowed": null,
    "authorization_count": null,
    "incremental_authorizations": null,
    "external_authentication_details": null,
    "external_3ds_authentication_attempted": false,
    "expires_on": "2025-04-11T18:10:46.411Z",
    "fingerprint": null,
    "browser_info": {
        "ip_address": "192.168.0.1",
        "user_agent": "MY LAPTOP RUNS ON m0z://a"
    },
    "payment_method_id": null,
    "payment_method_status": null,
    "updated": "2025-04-11T17:55:46.418Z",
    "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": null,
    "force_3ds_challenge": false,
    "force_3ds_challenge_trigger": false,
    "issuer_error_code": null,
    "issuer_error_message": null
}
```

Confirm

```curl
curl --location 'http://localhost:8080/payments/pay_ytZ1ZAAsTwKK0F7uA2IH/confirm' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'api-key: pk_dev_e765522f7c7543b9844fbcb1ab283a71' \
--data '{
    "payment_method": "bank_transfer",
    "payment_method_type": "pix",
    "payment_method_data": {
        "bank_transfer": {
            "pix": {
                "cpf": "866.656.235-80",
                "source_bank_account_id": "739d6b0a-e92a-40fd-9f58-6d4cdeb699bb",
                "destination_bank_account_id": "91f5cac1-9058-44b7-80e1-80c6f4a6f0bc",
                "pix_qr_expiry": "2025-04-11T19:53:54.807Z"
            }
        }
    },
    "client_secret": "pay_ytZ1ZAAsTwKK0F7uA2IH_secret_HjrEsQIrDAQunFZVLQY4"
}'
```
```json
{
    "error": {
        "type": "invalid_request",
        "message": "Payment method type not supported",
        "code": "IR_19",
        "reason": "manual is not supported by facilitapay"
    }
}
```

</details>


<details>
<summary>Cypress tests</summary>

<img width="889" alt="image" src="https://github.com/user-attachments/assets/09dd0c44-5ca4-4387-bcd4-0555bdc6a615" />

</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 `just clippy`
- [x] I reviewed the submitted code
- [x] I added unit tests for my changes where possible
