Immutable
release. Only release title and notes can be modified.
1.125.0 (2026-07-09)
Docker Images
-
v1.125.0(with AWS SES support):docker pull docker.juspay.io/juspaydotin/hyperswitch-router:v1.125.0 -
v1.125.0-standalone(without AWS SES support):docker pull docker.juspay.io/juspaydotin/hyperswitch-router:v1.125.0-standalone
Features
- Connector: [ADEYN] DISPUTES Changes (#12868)
- analytics:
- api_models/connector: [SANTANDER] Add boleto related fields in feature metadata (#12683)
- authentication:
- connector:
- [worldpayxml] Googlepay predecrypt | hyperswitch decrypt (#12181)
- Fiserv commerce hub manual capture and setupmandate MIT| UCS BUMP (#12637)
- [airwallex] add extended authorization (#12825)
- [Authorizedotnet] Pass surcharge in payments request (#12851)
- [iMerchant Solutions] Support Apple Pay and Google Pay Pre-Decrypted Flow (#12934)
- connector_cloning: Clone a connector across profiles within a merchant (#12660)
- core:
- Limit cell ID's length to 2 (#12688)
- Added eligible connector and payment_method as a part of sdk configs api (#12667)
- Allow JWT authentication for Payments Capture flow (#12761)
- Add surcharge support for MIT (#12715)
- Store external_surcharge_details in payment_attempt (#12879)
- Added sdk authorisation support to sdk configs (#12887)
- Bump UCS to tag 2026.06.19.0 and emit Adyen applicationInfo (#16707) (#12786)
- core/connector:
- derive: Introduce
ApplyChangesetderive macro and migrate dieselUpdateInternalstructs to use it (#12751) - dlocal,ucs: GCash Recurring + customer document plumbing to UCS (#12686)
- doc: Add dispute management endpoints (#12650)
- kv: Add Redis KV support for captures table (#12630)
- payment-methods:
- payments:
- redis_interface: Redis metrics addition (#12656)
- relay: Add relay report generation endpoints and configuration (#12897)
- router:
- superposition:
- ucs:
- vault: Add runtime flag for entity_id and fingerprint data and refactor FingerprintWalletData and FingerprintBankDebitData (#12554)
Bug Fixes
- config: Fix duplicate entry in integration_test.toml file (#12810)
- connector:
- [Peachpayments] Add 5xx Error Response Structure (#12706)
- [payload] remove billing descriptor, description and attributes for ACH setup mandate flow (#12704)
- [checkout] populate network_txn_link_id from payments response (#12738)
- [Nexixpay] Update Status Mapping for Automatic Capture in Nexixpay (#12668)
- [Paypal] make order status optional in PSync to handle declined captures (#12783)
- [Nexixpay] Revert Status Mapping (#12776)
- [WorldpayWPG] Add Mastercard in WASM for Payouts (#12846)
- Add payconex to ucs_only_connectors in env_specific config (#12856)
- [WorldpayWPG] correct XML element ordering in payments request (#12867)
- [fiuu] fix error propogation in webhook flow (#13096)
- core: Propagate mit_category in Setup Mandate flows (#13064)
- cypress: Exclude worldpayxml from card mandate tests (#12860)
- docs: Add superposition to scripts (#12784)
- events: Suppress shadow UCS connector logs (#13069)
- external_vault: Reuse saved PM on repeat & populate /client card scheme (#12882)
- kv:
- modular: Forward compatibility job (#12895)
- payments:
- relay: Remove raw connector response population logic for unreferenced refunds (#12788)
- router: [stripe connect] saved card (#12878)
- ucs:
- unified_connector_service: Populate connector_response in payment capture readback (#12693)
- vault: Rename
proxy_cardtovault_data_card(#12837)
Refactors
- adyen: Gracefully handle unknown response enum variants and missing optional fields (#12877)
- configs: Allow config retrieve API to be called with internal API key or admin API key (#12885)
- connector: [Finix] Empty event support for webhook configuration (#12824)
- core: Populate surcharge_details in payment list api (#12956)
Documentation
- api-reference: Mark additional payments and payout fields as deprecated (#12682)
Miscellaneous Tasks
- metrics: Adjust f64 histogram buckets size (#12884)
Compatibility
This version of the Hyperswitch App server is compatible with the following versions of the other components:
- Control Center: v1.38.6
- Web Client: v0.132.0
- WooCommerce Plugin: v1.6.1
- Card Vault: v0.7.0
- Encryption Service: v0.1.13
- Superposition: v0.102.0
Database Migration Changes
DB Difference between v1.124.0 and v1.125.0
-- Rename Santander Pix EMV payment method type to Pix QR while preserving existing data.
UPDATE payment_attempt
SET payment_method_data = jsonb_set(
payment_method_data #- '{bank_transfer,pix_emv}',
'{bank_transfer,pix_qr}',
payment_method_data->'bank_transfer'->'pix_emv',
true
)
WHERE payment_method_type = 'pix_emv'
AND payment_method_data->'bank_transfer' ? 'pix_emv'
AND connector = 'santander';
UPDATE payment_attempt
SET payment_method_type = 'pix_qr'
WHERE payment_method_type = 'pix_emv'
AND connector = 'santander';
UPDATE payment_attempt
SET straight_through_algorithm = jsonb_set(
straight_through_algorithm,
'{pre_routing_results}',
(straight_through_algorithm -> 'pre_routing_results' ||
jsonb_build_object('pix_qr', straight_through_algorithm -> 'pre_routing_results' -> 'pix_emv'))
- 'pix_emv'
)
WHERE straight_through_algorithm #> '{pre_routing_results}' ? 'pix_emv'
AND connector = 'santander';
UPDATE merchant_connector_account
SET metadata = (metadata - 'pix_emv') || jsonb_build_object('pix_qr', metadata->'pix_emv')
WHERE connector_name = 'santander'
AND metadata ? 'pix_emv';
WITH updated_data AS (
SELECT
id,
array_agg(
REPLACE(elem::text, '"payment_method_type":"pix_emv"', '"payment_method_type":"pix_qr"')::json
) AS new_array
FROM
merchant_connector_account,
unnest(payment_methods_enabled) AS elem
WHERE
connector_name = 'santander'
GROUP BY
id
)
UPDATE merchant_connector_account m
SET payment_methods_enabled = u.new_array
FROM updated_data u
WHERE m.id = u.id;
-- Your SQL goes here
ALTER TABLE authentication ADD COLUMN updated_by VARCHAR(32);Configuration Changes
diff --git a/config/deployments/env_specific.toml b/config/deployments/env_specific.toml
index 6290ed8749..c77ffea7dc 100644
--- a/config/deployments/env_specific.toml
+++ b/config/deployments/env_specific.toml
@@ -250,20 +250,21 @@ port = 5432 # DB Port
dbname = "hyperswitch_db" # Name of Database
pool_size = 5 # Number of connections to keep open
connection_timeout = 10 # Timeout for database connection in seconds
queue_strategy = "Fifo" # Add the queue strategy used by the database bb8 client
[report_download_config]
dispute_function = "report_download_config_dispute_function" # Config to download dispute report
payment_function = "report_download_config_payment_function" # Config to download payment report
refund_function = "report_download_config_refund_function" # Config to download refund report
payout_function = "report_download_config_payout_function" # Config to download payout report
+relay_function = "report_download_config_relay_function" # Config to download relay report
region = "report_download_config_region" # Region of the bucket
[opensearch]
host = "https://localhost:9200"
enabled = false
[opensearch.auth]
auth = "basic"
username = "admin"
password = "admin"
@@ -352,21 +353,21 @@ accounts_schema = "public"
redis_key_prefix = ""
clickhouse_database = "default"
[multitenancy.tenants.public.user]
control_center_url = "http://localhost:9000"
[user_auth_methods]
encryption_key = "user_auth_table_encryption_key" # Encryption key used for encrypting data in user_authentication_methods table
[cell_information]
-id = "12345" # Default CellID for Global Cell Information
+id = "0a" # Default CellID for Global Cell Information
[network_tokenization_service] # Network Tokenization Service Configuration
generate_token_url= "" # base url to generate token
fetch_token_url= "" # base url to fetch token
token_service_api_key= "" # api key for token service
public_key= "" # public key to encrypt data for token service
private_key= "" # private key to decrypt response payload from token service
key_id= "" # key id to encrypt data for token service
delete_token_url= "" # base url to delete token from token service
check_token_status_url= "" # base url to check token status from token service
@@ -396,27 +397,29 @@ foreground_color = "#000000" # Foreground color of email tex
primary_color = "#006DF9" # Primary color of email body
background_color = "#FFFFFF" # Background color of email body
[connectors.unified_authentication_service] #Unified Authentication Service Configuration
base_url = "http://localhost:8000" #base url to call unified authentication service
[connectors.hyperswitch_vault] # Hyperswitch Vault Configuration
base_url = "http://localhost:8080" # base url to call hyperswitch vault service
[clone_connector_allowlist]
-merchant_ids = "merchant_ids" # Comma-separated list of allowed merchant IDs
-connector_names = "connector_names" # Comma-separated list of allowed connector names
+connector_names = "connector_names" # Comma-separated list of cloneable connector names
+
+[clone_connector_allowlist.payment_method_types]
+payment_method = "payment_method_types" # <payment_method> = comma-separated cloneable payment_method_types
[grpc_client.unified_connector_service]
base_url = "http://localhost:8000" # Unified Connector Service Base URL
connection_timeout = 10 # Connection Timeout Duration in Seconds
-ucs_only_connectors = "imerchantsolutions, paytm, phonepe, hyperpg, revolv3, fiservcommercehub, absa_sanlam, interpayments" # Comma-separated list of connectors that use UCS only
+ucs_only_connectors = "imerchantsolutions, paytm, phonepe, hyperpg, revolv3, fiservcommercehub, absa_sanlam, interpayments, payconex, dlocal" # Comma-separated list of connectors that use UCS only
ucs_psync_disabled_connectors = "cashtocode, trustly" # Comma-separated list of connectors to disable UCS PSync call
[revenue_recovery]
# monitoring threshold - 120 days
monitoring_threshold_in_seconds = 10368000
retry_algorithm_type = "cascading"
redis_ttl_in_seconds=3888000
# Card specific configuration for Revenue Recovery
[revenue_recovery.card_config.amex]diff --git a/config/deployments/sandbox.toml b/config/deployments/sandbox.toml
index e5125cfefb..5d392f101a 100644
--- a/config/deployments/sandbox.toml
+++ b/config/deployments/sandbox.toml
@@ -235,52 +235,52 @@ supported_connectors = "adyen"
adyen = "Star,Pulse,Accel,Nyce"
[frm]
enabled = true
[zero_mandates.supported_payment_methods]
bank_debit.ach = { connector_list = "gocardless,adyen,payload" }
bank_debit.becs = { connector_list = "gocardless,adyen" }
bank_debit.bacs = { connector_list = "gocardless" }
bank_debit.sepa = { connector_list = "gocardless,adyen" }
-card.credit.connector_list = "checkout,stripe,adyen,zift,authorizedotnet,cybersource,datatrans,worldpay,nmi,bankofamerica,wellsfargo,bamboraapac,nexixpay,novalnet,paypal,archipel,tesouro,mollie"
-card.debit.connector_list = "checkout,stripe,adyen,zift,authorizedotnet,cybersource,datatrans,worldpay,nmi,bankofamerica,wellsfargo,bamboraapac,nexixpay,novalnet,paypal,archipel,tesouro,mollie"
+card.credit.connector_list = "checkout,stripe,adyen,zift,authorizedotnet,cybersource,datatrans,worldpay,nmi,bankofamerica,wellsfargo,bamboraapac,nexixpay,novalnet,paypal,archipel,tesouro,mollie,fiservcommercehub,imerchantsolutions"
+card.debit.connector_list = "checkout,stripe,adyen,zift,authorizedotnet,cybersource,datatrans,worldpay,nmi,bankofamerica,wellsfargo,bamboraapac,nexixpay,novalnet,paypal,archipel,tesouro,mollie,fiservcommercehub,imerchantsolutions"
pay_later.klarna.connector_list = "adyen"
-wallet.apple_pay.connector_list = "aci,checkout,stripe,adyen,cybersource,bankofamerica,novalnet,nuvei,authorizedotnet,nmi,tesouro,worldpaymodular,worldpayxml"
+wallet.apple_pay.connector_list = "aci,checkout,stripe,adyen,cybersource,bankofamerica,novalnet,nuvei,authorizedotnet,nmi,tesouro,worldpaymodular,worldpayxml,imerchantsolutions"
wallet.samsung_pay.connector_list = "aci,cybersource"
-wallet.google_pay.connector_list = "aci,checkout,stripe,adyen,cybersource,bankofamerica,novalnet,nuvei,authorizedotnet,nmi,tesouro,worldpaymodular,worldpayxml"
+wallet.google_pay.connector_list = "aci,checkout,stripe,adyen,cybersource,bankofamerica,novalnet,nuvei,authorizedotnet,nmi,tesouro,worldpaymodular,worldpayxml,imerchantsolutions"
wallet.paypal.connector_list = "adyen,novalnet"
wallet.momo.connector_list = "adyen"
wallet.kakao_pay.connector_list = "adyen"
wallet.go_pay.connector_list = "adyen"
wallet.gcash.connector_list = "adyen"
wallet.dana.connector_list = "adyen"
wallet.twint.connector_list = "adyen"
wallet.vipps.connector_list = "adyen"
bank_redirect.ideal.connector_list = "adyen"
bank_redirect.bancontact_card.connector_list = "adyen"
bank_redirect.trustly.connector_list = "adyen"
bank_redirect.open_banking_uk.connector_list = "adyen"
bank_transfer.pix_automatico_push = { connector_list = "santander" }
bank_transfer.pix_automatico_qr = { connector_list = "santander" }
[mandates.supported_payment_methods]
bank_debit.ach = { connector_list = "gocardless,adyen,stripe,payload" }
bank_debit.becs = { connector_list = "gocardless,stripe,adyen" }
bank_debit.bacs = { connector_list = "stripe,gocardless" }
bank_debit.sepa = { connector_list = "gocardless,adyen,stripe,deutschebank" }
-card.credit.connector_list = "aci,checkout,stripe,adyen,authorizedotnet,cybersource,datatrans,globalpay,worldpay,multisafepay,nmi,nexinets,noon,bankofamerica,braintree,nuvei,payme,wellsfargo,bamboraapac,elavon,fiuu,nexixpay,novalnet,paybox,paypal,xendit,moneris,archipel,worldpayvantiv,payload,paysafe,finix,tesouro,mollie,airwallex,peachpayments"
-card.debit.connector_list = "aci,checkout,stripe,adyen,authorizedotnet,cybersource,datatrans,globalpay,worldpay,multisafepay,nmi,nexinets,noon,bankofamerica,braintree,nuvei,payme,wellsfargo,bamboraapac,elavon,fiuu,nexixpay,novalnet,paybox,paypal,xendit,moneris,archipel,worldpayvantiv,payload,paysafe,finix,tesouro,mollie,airwallex,peachpayments"
+card.credit.connector_list = "aci,checkout,stripe,adyen,authorizedotnet,cybersource,datatrans,globalpay,worldpay,multisafepay,nmi,nexinets,noon,bankofamerica,braintree,nuvei,payme,wellsfargo,bamboraapac,elavon,fiuu,nexixpay,novalnet,paybox,paypal,xendit,moneris,archipel,worldpayvantiv,payload,paysafe,finix,tesouro,mollie,airwallex,peachpayments,fiservcommercehub,imerchantsolutions"
+card.debit.connector_list = "aci,checkout,stripe,adyen,authorizedotnet,cybersource,datatrans,globalpay,worldpay,multisafepay,nmi,nexinets,noon,bankofamerica,braintree,nuvei,payme,wellsfargo,bamboraapac,elavon,fiuu,nexixpay,novalnet,paybox,paypal,xendit,moneris,archipel,worldpayvantiv,payload,paysafe,finix,tesouro,mollie,airwallex,peachpayments,fiservcommercehub,imerchantsolutions"
pay_later.klarna.connector_list = "adyen,aci"
-wallet.apple_pay.connector_list = "aci,checkout,stripe,adyen,braintree,cybersource,noon,bankofamerica,nexinets,novalnet,nuvei,authorizedotnet,wellsfargo,worldpaymodular,worldpayvantiv,finix,nmi,tesouro,worldpayxml,payme"
+wallet.apple_pay.connector_list = "aci,checkout,stripe,adyen,braintree,cybersource,noon,bankofamerica,nexinets,novalnet,nuvei,authorizedotnet,wellsfargo,worldpaymodular,worldpayvantiv,finix,nmi,tesouro,worldpayxml,payme,imerchantsolutions"
wallet.samsung_pay.connector_list = "aci,cybersource"
-wallet.google_pay.connector_list = "aci,checkout,stripe,adyen,cybersource,bankofamerica,noon,globalpay,multisafepay,novalnet,nuvei,authorizedotnet,wellsfargo,worldpaymodular,worldpayvantiv,finix,nmi,tesouro,worldpayxml"
+wallet.google_pay.connector_list = "aci,checkout,stripe,adyen,cybersource,bankofamerica,noon,globalpay,multisafepay,novalnet,nuvei,authorizedotnet,wellsfargo,worldpaymodular,worldpayvantiv,finix,nmi,tesouro,worldpayxml,imerchantsolutions"
wallet.paypal.connector_list = "adyen,globalpay,nexinets,novalnet,paypal,authorizedotnet"
wallet.momo.connector_list = "adyen"
wallet.kakao_pay.connector_list = "adyen"
wallet.go_pay.connector_list = "adyen"
wallet.gcash.connector_list = "adyen"
wallet.dana.connector_list = "adyen"
wallet.twint.connector_list = "adyen"
wallet.vipps.connector_list = "adyen"
bank_redirect.ideal.connector_list = "stripe,adyen,globalpay,multisafepay,nexinets,aci"
@@ -891,21 +891,21 @@ interac = { currency = "CAD"}
[pm_filters.dlocal]
oxxo = { currency = "MXN" }
[pm_filters.coingate]
crypto_currency = { country = "AL, AD, AT, BE, BA, BG, HR, CZ, DK, EE, FI, FR, DE, GR, HU, IS, IE, IT, LV, LT, LU, MT, MD, NL, NO, PL, PT, RO, RS, SK, SI, ES, SE, CH, UA, GB, AR, BR, CL, CO, CR, DO, SV, GD, MX, PE, LC, AU, NZ, CY, HK, IN, IL, JP, KR, QA, SA, SG, EG", currency = "EUR, USD, GBP" }
[pm_filters.paystack]
eft = { country = "NG, ZA, GH, KE, CI", currency = "NGN, GHS, ZAR, KES, USD" }
[pm_filters.santander]
-pix_emv = { country = "BR", currency = "BRL" }
+pix_qr = { country = "BR", currency = "BRL" }
boleto = { country = "BR", currency = "BRL" }
pix_automatico_qr = { country = "BR", currency = "BRL" }
pix_automatico_push = { country = "BR", currency = "BRL" }
[pm_filters.calida]
bluecode = { country = "AT,BE,BG,HR,CY,CZ,DK,EE,FI,FR,DE,GR,HU,IE,IT,LV,LT,LU,MT,NL,PL,PT,RO,SK,SI,ES,SE,IS,LI,NO", currency = "EUR" }
[pm_filters.boku]
dana = { country = "ID", currency = "IDR" }
gcash = { country = "PH", currency = "PHP" }
@@ -1032,21 +1032,21 @@ billing_connectors_which_requires_invoice_sync_call = "recurly"
[authentication_providers]
click_to_pay = {connector_list = "adyen, cybersource, trustpay"}
[authentication_service_enabled_connectors]
connector_list = "juspaythreedsserver, ctp_mastercard, ctp_visa"
[list_dispute_supported_connectors]
connector_list = "worldpayvantiv"
[grpc_client.unified_connector_service]
-ucs_only_connectors = "imerchantsolutions, paytm, phonepe, hyperpg, revolv3, fiservcommercehub, absa_sanlam, interpayments, payconex" # Comma-separated list of connectors that use UCS only
+ucs_only_connectors = "imerchantsolutions, paytm, phonepe, hyperpg, revolv3, fiservcommercehub, absa_sanlam, interpayments, payconex, dlocal" # Comma-separated list of connectors that use UCS only
ucs_psync_disabled_connectors = "cashtocode, trustly" # Comma-separated list of connectors to disable UCS PSync call
# Merchant Advice Code Configuration
[merchant_advice_codes.visa]
"01" = { description = "The issuer will never approve (do not reattempt with the same card)", recommended_action = "do_not_retry" }
"02" = { description = "The issuer cannot approve at this time (limit the reattempts with the same card to a maximum of 20 times within 30 days)", recommended_action = "retry_later" }
"03" = { description = "Data quality (monitor for fraud attacks, revalidate the customer data prior to reattempt for a maximum of 20 times within 30 days)", recommended_action = "retry_after_instrument_update" }
"04" = { description = "Generic response codes (limit the reattempts with the same card to a maximum of 20 times within 30 days)", recommended_action = "retry_later" }
[merchant_advice_codes.mastercard]diff --git a/config/superposition_seed.toml b/config/superposition_seed.toml
index 5f87a00087..77ab7aa316 100644
--- a/config/superposition_seed.toml
+++ b/config/superposition_seed.toml
@@ -150,20 +150,27 @@ value = false
schema = { type = "boolean" }
description = "Whether to call the PM modular service for an organization"
change_reason = "Initial setup"
[default-configs.should_schedule_modular_forward_compat]
value = false
schema = { type = "boolean" }
description = "Whether to schedule PM modular forward compatibility PT for a merchant"
change_reason = "Initial setup"
+[default-configs.should_trigger_fingerprint_migration]
+value = false
+schema = { type = "boolean" }
+description = "Whether to trigger fingerprint and entity_id migration for a merchant"
+change_reason = "Initial setup"
+
+
[default-configs.should_schedule_modular_backward_compat]
value = false
schema = { type = "boolean" }
description = "Whether to schedule PM modular backward compatibility PT for a merchant"
change_reason = "Initial setup"
[default-configs.should_trigger_backwards_compatibility_inline]
value = false
schema = { type = "boolean" }
description = "Whether to trigger PM modular backward compatibility inline for a merchant"
@@ -248,11 +255,10 @@ frequencies = [[300, 5]]
schema = { type = "object" }
description = "Dispute sync retry process tracker mapping configuration"
change_reason = "Initial setup"
[default-configs.pt_mapping_dispute_sync.value]
max_retries_count = 5
[default-configs.pt_mapping_dispute_sync.value.default_mapping]
start_after = 60
frequencies = [[300, 5]]
-Full Changelog: v1.124.0...v1.125.0