{"record":{"id":"e40f75be8034da89","repo":"juspay/hyperswitch","slug":"invalid-globalpay-metadata-format","errorCode":null,"errorMessage":"Invalid Globalpay metadata format","messagePattern":"Invalid Globalpay metadata format","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/router/src/core/unified_connector_service/connector_config.rs","lineNumber":1064,"sourceCode":"                ConnectorAuthType::BodyKey { api_key, key1 } => Ok(Self::Cryptopay {\n                    api_key: api_key.clone(),\n                    api_secret: key1.clone(),\n                }),\n                _ => Err(err(\"Cryptopay requires BodyKey auth type\")),\n            },\n            Connector::Datatrans => match auth {\n                ConnectorAuthType::BodyKey { api_key, key1 } => Ok(Self::Datatrans {\n                    merchant_id: key1.clone(),\n                    password: api_key.clone(),\n                }),\n                _ => Err(err(\"Datatrans requires BodyKey auth type\")),\n            },\n            Connector::Globalpay => match auth {\n                ConnectorAuthType::BodyKey { api_key, key1 } => {\n                    let globalpay_meta = metadata\n                        .map(|m| {\n                            serde_json::from_value::<GlobalpayMetadata>(m.clone())\n                                .map_err(|_| err(\"Invalid Globalpay metadata format\"))\n                        })\n                        .transpose()?;\n\n                    Ok(Self::Globalpay {\n                        app_id: key1.clone(),\n                        app_key: api_key.clone(),\n                        account_name: globalpay_meta.and_then(|m| m.account_name),\n                    })\n                }\n                _ => Err(err(\"Globalpay requires BodyKey auth type\")),\n            },\n            Connector::Hipay => match auth {\n                ConnectorAuthType::BodyKey { api_key, key1 } => Ok(Self::Hipay {\n                    api_key: api_key.clone(),\n                    api_secret: key1.clone(),\n                }),\n                _ => Err(err(\"Hipay requires BodyKey auth type\")),\n            },","sourceCodeStart":1046,"sourceCodeEnd":1082,"githubUrl":"https://github.com/juspay/hyperswitch/blob/afd92843521ced2c6856b98ae4ea332e75102d88/crates/router/src/core/unified_connector_service/connector_config.rs#L1046-L1082","documentation":"When building the Globalpay connector config, optional connector metadata is deserialized into `GlobalpayMetadata` via serde_json. If metadata JSON is present but does not match the `GlobalpayMetadata` schema, the deserialization is mapped to this error. It indicates malformed Globalpay-specific configuration data accompanying the credential.","triggerScenarios":"Calling connector config creation for `Connector::Globalpay` with a `metadata` JSON value whose fields do not conform to `GlobalpayMetadata` (wrong types, unknown required fields, non-object value), e.g. `metadata: {\"account_name\": 123}` instead of a string.","commonSituations":"Hand-edited merchant metadata in the DB or dashboard; API callers passing free-form metadata assuming it is passthrough; schema drift after a `GlobalpayMetadata` field type change with stale stored metadata.","solutions":["Validate the metadata JSON against the `GlobalpayMetadata` schema before sending it (correct field names and types, e.g. `account_name` as an optional string)","Remove the metadata field if Globalpay-specific metadata is not needed (metadata is optional)","Migrate/repair any stored connector metadata rows that fail deserialization","Check for a recent `GlobalpayMetadata` struct change and align the supplied payload"],"exampleFix":"// before\nmetadata: json!({\"account_name\": 42})\n// after\nmetadata: json!({\"account_name\": \"my-account\"})","handlingStrategy":"validation","validationCode":"if let Some(m) = &metadata {\n    let meta: GlobalpayMetadata = serde_json::from_value(m.clone())\n        .map_err(|e| report!(ConfigError::InvalidMetadata(e.to_string())))?;\n    assert!(meta.account_name.as_deref().map_or(true, |s| !s.is_empty()));\n}","typeGuard":"fn is_valid_globalpay_metadata(v: &serde_json::Value) -> bool {\n    v.as_object().map_or(false, |o| {\n        o.get(\"account_name\").map_or(true, |a| a.is_string())\n    })\n}","tryCatchPattern":"match serde_json::from_value::<GlobalpayMetadata>(metadata.clone()) {\n    Ok(m) => proceed(m),\n    Err(e) => log::warn!(\"Globalpay metadata rejected: {e}\"),\n}","preventionTips":["Validate metadata against GlobalpayMetadata before persisting or sending","Treat metadata as optional; omit it rather than sending an empty or wrong-typed object","Add serde round-trip tests for GlobalpayMetadata to catch schema drift"],"tags":["rust","json","metadata","connector-config","globalpay"],"backgroundTag":"schema-validation-failed","analyzedSha":"afd92843521ced2c6856b98ae4ea332e75102d88","analyzedAt":"2026-09-18T01:18:02.947Z","contentChangedAt":"2026-09-18T01:18:02.947Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}