Bug: [BUG] update adyenplatform's error mapping for payout failures



### Bug Description

Adyen Platform connector has two main issues:

1. Error responses do not include valuable error details from the `detail` field when `invalid_fields` is not present
2. Improper use of `ApiErrorResponse::PayoutFailed` in core payout logic causes incorrect error handling patterns in the API response


### Expected Behavior

- When Adyen returns error responses with meaningful information in the `detail` field (but no `invalid_fields`), the error message should include both the title and detail

- Payout errors should follow proper pre-connector vs post-connector error handling patterns, with connector-specific errors being handled by the connector's error response mapping


### Actual Behavior

- Error responses only include the `title` field, missing valuable context from the `detail` field

- Core payout logic throws `PayoutFailed` errors after connector calls, which bypasses proper connector error handling and results in generic error messages instead of connector-specific error details

### Steps To Reproduce

- Create a payout request that triggers an Adyen error with `detail` field but no `invalid_fields` (invalid currency / amount etc.)
- Observe that only the title is included in the error message
- Notice that some error scenarios result in generic `PayoutFailed` errors instead of detailed connector error responses

### Context For The Bug

_No response_

### Environment

Are you using hyperswitch hosted version? Yes/No
If yes, please provide the value of the `x-request-id` response header to help us debug your issue.

If not (or if building/running locally), please provide the following details:
1. Operating System or Linux distribution:
2. Rust version (output of `rustc --version`): ``
3. App version (output of `cargo r --features vergen -- --version`): ``


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

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

### Have you read the Contributing Guidelines?

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

### Are you willing to submit a PR?

Yes, I am willing to submit a PR!
diff --git a/crates/hyperswitch_connectors/src/connectors/adyenplatform.rs b/crates/hyperswitch_connectors/src/connectors/adyenplatform.rs
index 71feb122d17..c20d50d974b 100644
--- a/crates/hyperswitch_connectors/src/connectors/adyenplatform.rs
+++ b/crates/hyperswitch_connectors/src/connectors/adyenplatform.rs
@@ -115,10 +115,24 @@ impl ConnectorCommon for Adyenplatform {
         event_builder.map(|i| i.set_response_body(&response));
         router_env::logger::info!(connector_response=?response);
 
+        let message = if let Some(invalid_fields) = &response.invalid_fields {
+            match serde_json::to_string(invalid_fields) {
+                Ok(invalid_fields_json) => format!(
+                    "{}\nInvalid fields: {}",
+                    response.title, invalid_fields_json
+                ),
+                Err(_) => response.title.clone(),
+            }
+        } else if let Some(detail) = &response.detail {
+            format!("{}\nDetail: {}", response.title, detail)
+        } else {
+            response.title.clone()
+        };
+
         Ok(ErrorResponse {
             status_code: res.status_code,
             code: response.error_code,
-            message: response.title,
+            message,
             reason: response.detail,
             attempt_status: None,
             connector_transaction_id: None,
diff --git a/crates/hyperswitch_connectors/src/connectors/adyenplatform/transformers/payouts.rs b/crates/hyperswitch_connectors/src/connectors/adyenplatform/transformers/payouts.rs
index ec654971e41..2f49d297569 100644
--- a/crates/hyperswitch_connectors/src/connectors/adyenplatform/transformers/payouts.rs
+++ b/crates/hyperswitch_connectors/src/connectors/adyenplatform/transformers/payouts.rs
@@ -206,7 +206,7 @@ pub enum AdyenTransactionDirection {
     Outgoing,
 }
 
-#[derive(Debug, Serialize, Deserialize)]
+#[derive(Debug, Clone, Copy, Serialize, Deserialize, strum::Display)]
 #[serde(rename_all = "lowercase")]
 pub enum AdyenTransferStatus {
     Authorised,
@@ -582,10 +582,27 @@ impl<F> TryFrom<PayoutsResponseRouterData<F, AdyenTransferResponse>> for Payouts
         let response: AdyenTransferResponse = item.response;
         let status = enums::PayoutStatus::from(response.status);
 
-        let error_code = match status {
-            enums::PayoutStatus::Ineligible => Some(response.reason),
-            _ => None,
-        };
+        if matches!(status, enums::PayoutStatus::Failed) {
+            return Ok(Self {
+                response: Err(hyperswitch_domain_models::router_data::ErrorResponse {
+                    code: response.status.to_string(),
+                    message: if !response.reason.is_empty() {
+                        response.reason
+                    } else {
+                        response.status.to_string()
+                    },
+                    reason: None,
+                    status_code: item.http_code,
+                    attempt_status: None,
+                    connector_transaction_id: Some(response.id),
+                    network_advice_code: None,
+                    network_decline_code: None,
+                    network_error_message: None,
+                    connector_metadata: None,
+                }),
+                ..item.data
+            });
+        }
 
         Ok(Self {
             response: Ok(types::PayoutsResponseData {
@@ -593,7 +610,7 @@ impl<F> TryFrom<PayoutsResponseRouterData<F, AdyenTransferResponse>> for Payouts
                 connector_payout_id: Some(response.id),
                 payout_eligible: None,
                 should_add_next_step_to_process_tracker: false,
-                error_code,
+                error_code: None,
                 error_message: None,
             }),
             ..item.data
@@ -605,8 +622,7 @@ impl From<AdyenTransferStatus> for enums::PayoutStatus {
     fn from(adyen_status: AdyenTransferStatus) -> Self {
         match adyen_status {
             AdyenTransferStatus::Authorised => Self::Initiated,
-            AdyenTransferStatus::Refused => Self::Ineligible,
-            AdyenTransferStatus::Error => Self::Failed,
+            AdyenTransferStatus::Error | AdyenTransferStatus::Refused => Self::Failed,
         }
     }
 }
diff --git a/crates/router/src/core/payouts.rs b/crates/router/src/core/payouts.rs
index 491957045c7..714fafe8d5a 100644
--- a/crates/router/src/core/payouts.rs
+++ b/crates/router/src/core/payouts.rs
@@ -705,14 +705,6 @@ pub async fn payouts_fulfill_core(
     .await
     .attach_printable("Payout fulfillment failed for given Payout request")?;
 
-    if helpers::is_payout_err_state(status) {
-        return Err(report!(errors::ApiErrorResponse::PayoutFailed {
-            data: Some(
-                serde_json::json!({"payout_status": status.to_string(), "error_message": payout_attempt.error_message, "error_code": payout_attempt.error_code})
-            ),
-        }));
-    }
-
     trigger_webhook_and_handle_response(&state, &merchant_context, &payout_data).await
 }
 
@@ -1324,9 +1316,65 @@ pub async fn create_recipient(
                         .attach_printable("Error updating payouts in db")?;
                 }
             }
-            Err(err) => Err(errors::ApiErrorResponse::PayoutFailed {
-                data: serde_json::to_value(err).ok(),
-            })?,
+            Err(err) => {
+                let status = storage_enums::PayoutStatus::Failed;
+                let (error_code, error_message) = (Some(err.code), Some(err.message));
+                let (unified_code, unified_message) = helpers::get_gsm_record(
+                    state,
+                    error_code.clone(),
+                    error_message.clone(),
+                    payout_data.payout_attempt.connector.clone(),
+                    consts::PAYOUT_FLOW_STR,
+                )
+                .await
+                .map_or(
+                    (
+                        Some(crate::consts::DEFAULT_UNIFIED_ERROR_CODE.to_string()),
+                        Some(crate::consts::DEFAULT_UNIFIED_ERROR_MESSAGE.to_string()),
+                    ),
+                    |gsm| (gsm.unified_code, gsm.unified_message),
+                );
+                let updated_payout_attempt = storage::PayoutAttemptUpdate::StatusUpdate {
+                    connector_payout_id: payout_data.payout_attempt.connector_payout_id.to_owned(),
+                    status,
+                    error_code,
+                    error_message,
+                    is_eligible: None,
+                    unified_code: unified_code
+                        .map(UnifiedCode::try_from)
+                        .transpose()
+                        .change_context(errors::ApiErrorResponse::InvalidDataValue {
+                            field_name: "unified_code",
+                        })?,
+                    unified_message: unified_message
+                        .map(UnifiedMessage::try_from)
+                        .transpose()
+                        .change_context(errors::ApiErrorResponse::InvalidDataValue {
+                            field_name: "unified_message",
+                        })?,
+                };
+                let db = &*state.store;
+                payout_data.payout_attempt = db
+                    .update_payout_attempt(
+                        &payout_data.payout_attempt,
+                        updated_payout_attempt,
+                        &payout_data.payouts,
+                        merchant_context.get_merchant_account().storage_scheme,
+                    )
+                    .await
+                    .change_context(errors::ApiErrorResponse::InternalServerError)
+                    .attach_printable("Error updating payout_attempt in db")?;
+                payout_data.payouts = db
+                    .update_payout(
+                        &payout_data.payouts,
+                        storage::PayoutsUpdate::StatusUpdate { status },
+                        &payout_data.payout_attempt,
+                        merchant_context.get_merchant_account().storage_scheme,
+                    )
+                    .await
+                    .change_context(errors::ApiErrorResponse::InternalServerError)
+                    .attach_printable("Error updating payouts in db")?;
+            }
         }
     }
     Ok(())
@@ -1371,10 +1419,8 @@ pub async fn complete_payout_eligibility(
             .is_eligible
             .unwrap_or(state.conf.payouts.payout_eligibility),
         || {
-            Err(report!(errors::ApiErrorResponse::PayoutFailed {
-                data: Some(serde_json::json!({
-                    "message": "Payout method data is invalid"
-                }))
+            Err(report!(errors::ApiErrorResponse::InvalidRequestData {
+                message: "Payout method data is invalid".to_string(),
             })
             .attach_printable("Payout data provided is invalid"))
         },
@@ -1454,13 +1500,6 @@ pub async fn check_payout_eligibility(
                 .await
                 .change_context(errors::ApiErrorResponse::InternalServerError)
                 .attach_printable("Error updating payouts in db")?;
-            if helpers::is_payout_err_state(status) {
-                return Err(report!(errors::ApiErrorResponse::PayoutFailed {
-                    data: Some(
-                        serde_json::json!({"payout_status": status.to_string(), "error_message": payout_data.payout_attempt.error_message.as_ref(), "error_code": payout_data.payout_attempt.error_code.as_ref()})
-                    ),
-                }));
-            }
         }
         Err(err) => {
             let status = storage_enums::PayoutStatus::Failed;
@@ -1676,13 +1715,6 @@ pub async fn create_payout(
                 .await
                 .change_context(errors::ApiErrorResponse::InternalServerError)
                 .attach_printable("Error updating payouts in db")?;
-            if helpers::is_payout_err_state(status) {
-                return Err(report!(errors::ApiErrorResponse::PayoutFailed {
-                    data: Some(
-                        serde_json::json!({"payout_status": status.to_string(), "error_message": payout_data.payout_attempt.error_message.as_ref(), "error_code": payout_data.payout_attempt.error_code.as_ref()})
-                    ),
-                }));
-            }
         }
         Err(err) => {
             let status = storage_enums::PayoutStatus::Failed;
@@ -2407,13 +2439,7 @@ pub async fn fulfill_payout(
                 .await
                 .change_context(errors::ApiErrorResponse::InternalServerError)
                 .attach_printable("Error updating payouts in db")?;
-            if helpers::is_payout_err_state(status) {
-                return Err(report!(errors::ApiErrorResponse::PayoutFailed {
-                    data: Some(
-                        serde_json::json!({"payout_status": status.to_string(), "error_message": payout_data.payout_attempt.error_message.as_ref(), "error_code": payout_data.payout_attempt.error_code.as_ref()})
-                    ),
-                }));
-            } else if payout_data.payouts.recurring
+            if payout_data.payouts.recurring
                 && payout_data.payouts.payout_method_id.clone().is_none()
             {
                 let payout_method_data = payout_data

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

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

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

This PR fixes two critical issues in Adyen Platform connector and payout core flow error handling:

1. **Enhanced error message construction**: Modified `build_error_response` in `crates/hyperswitch_connectors/src/connectors/adyenplatform.rs` to include the `detail` field when `invalid_fields` is not present. This provides users with comprehensive error information, especially for business logic errors where Adyen provides detailed explanations.

2. **Fixed improper PayoutFailed usage**: Removed multiple instances of `PayoutFailed` from core payouts flow that were being thrown after connector calls. This was bypassing proper connector error handling and preventing detailed error messages from reaching the API response.

### Additional Changes

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

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

This PR allows mapping the right error codes and messages from Adyenplatform to HyperSwitch's payout API response in case of failures.

**Solution**:
This change ensures that all available error information from Adyen is properly communicated to users, improving the debugging experience and reducing support overhead.

## 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>1. Create a payout in an account without any funds</summary>

cURL (AUD has 0 balance)

    curl --location --request POST 'http://localhost:8080/payouts/create' \
        --header 'Content-Type: application/json' \
        --header 'api-key: dev_7fXFUFajfCYtS5aKrQXJMyIiBLr2gw3Y862wqkp6qXHpl88H0hQaEr89xAnvsxvp' \
        --data-raw '{"amount":1,"currency":"AUD","profile_id":"pro_E9Z7dCKDd54NaVYCFFhF","customer":{"id":"cus_X7urM1AQqvpECo6G5XkW","name":"New Name"},"connector":["adyenplatform"],"description":"Its my first payout request","payout_type":"card","payout_method_data":{"card":{"card_number":"4111111111111111","expiry_month":"01","expiry_year":"2030","card_holder_name":"John Doe"}},"billing":{"address":{"line1":"1467","line2":"Harrison Street","city":"San Fransico","state":"CA","country":"IT","first_name":"John","last_name":"Doe"},"email":"random@example.com"},"recurring":true,"metadata":{"ref":"123"},"confirm":true,"auto_fulfill":true}'

Response

    {"payout_id":"payout_cX5OwgVAuqaHJkF9zxeu","merchant_id":"merchant_1757926554","merchant_order_reference_id":null,"amount":1,"currency":"AUD","connector":"adyenplatform","payout_type":"card","payout_method_data":{"card":{"card_issuer":"JP Morgan","card_network":"Visa","card_type":"CREDIT","card_issuing_country":"INDIA","bank_code":"JP_JPM","last4":"1111","card_isin":"411111","card_extended_bin":null,"card_exp_month":"01","card_exp_year":"2030","card_holder_name":"John Doe"}},"billing":{"address":{"city":"San Fransico","country":"IT","line1":"1467","line2":"Harrison Street","line3":null,"zip":null,"state":"CA","first_name":"John","last_name":"Doe","origin_zip":null},"phone":null,"email":"random@example.com"},"auto_fulfill":true,"customer_id":"cus_X7urM1AQqvpECo6G5XkW","customer":{"id":"cus_X7urM1AQqvpECo6G5XkW","name":"Albert Klaassen","email":null,"phone":"6168205362","phone_country_code":"+1"},"client_secret":"payout_payout_cX5OwgVAuqaHJkF9zxeu_secret_eIw5TJyjUYBydBp3Aa5c","return_url":null,"business_country":null,"business_label":null,"description":"Its my first payout request","entity_type":"Individual","recurring":true,"metadata":{"ref":"123"},"merchant_connector_id":"mca_m86KCMmTaeQ2mTtSgfRA","status":"failed","error_message":"notEnoughBalance","error_code":"Refused","profile_id":"pro_E9Z7dCKDd54NaVYCFFhF","created":"2025-09-15T11:55:40.044Z","connector_transaction_id":null,"priority":null,"payout_link":null,"email":null,"name":"Albert Klaassen","phone":"6168205362","phone_country_code":"+1","unified_code":"UE_9000","unified_message":"Something went wrong","payout_method_id":null}

Expectation

- Payout must fail
- error_message and error_code must be populated

</details>

<details>
    <summary>2. Create a payout using invalid transfer details</summary>

cURL (Invalid postcode)

    curl --location --request POST 'http://localhost:8080/payouts/create' \
        --header 'Content-Type: application/json' \
        --header 'api-key: dev_7fXFUFajfCYtS5aKrQXJMyIiBLr2gw3Y862wqkp6qXHpl88H0hQaEr89xAnvsxvp' \
        --data-raw '{"amount":1,"currency":"EUR","profile_id":"pro_E9Z7dCKDd54NaVYCFFhF","customer":{"id":"cus_X7urM1AQqvpECo6G5XkW","name":"New Name"},"connector":["adyenplatform"],"description":"Its my first payout request","payout_type":"card","payout_method_data":{"card":{"card_number":"4111111111111111","expiry_month":"01","expiry_year":"2030","card_holder_name":"John Doe"}},"billing":{"address":{"line1":"1467","line2":"Harrison Street","city":"San Fransico","state":"CA","zip":"123","country":"IT","first_name":"John","last_name":"Doe"},"email":"random@example.com"},"recurring":true,"metadata":{"ref":"123"},"confirm":true,"auto_fulfill":true}'

Response

    {"payout_id":"payout_lAUUuhWCoj1qVo9jwHeQ","merchant_id":"merchant_1757926554","merchant_order_reference_id":null,"amount":1,"currency":"EUR","connector":"adyenplatform","payout_type":"card","payout_method_data":{"card":{"card_issuer":"JP Morgan","card_network":"Visa","card_type":"CREDIT","card_issuing_country":"INDIA","bank_code":"JP_JPM","last4":"1111","card_isin":"411111","card_extended_bin":null,"card_exp_month":"01","card_exp_year":"2030","card_holder_name":"John Doe"}},"billing":{"address":{"city":"San Fransico","country":"IT","line1":"1467","line2":"Harrison Street","line3":null,"zip":"123","state":"CA","first_name":"John","last_name":"Doe","origin_zip":null},"phone":null,"email":"random@example.com"},"auto_fulfill":true,"customer_id":"cus_X7urM1AQqvpECo6G5XkW","customer":{"id":"cus_X7urM1AQqvpECo6G5XkW","name":"Albert Klaassen","email":null,"phone":"6168205362","phone_country_code":"+1"},"client_secret":"payout_payout_lAUUuhWCoj1qVo9jwHeQ_secret_Bl8J3MXCywJd0j2EzzGk","return_url":null,"business_country":null,"business_label":null,"description":"Its my first payout request","entity_type":"Individual","recurring":true,"metadata":{"ref":"123"},"merchant_connector_id":"mca_m86KCMmTaeQ2mTtSgfRA","status":"failed","error_message":"Invalid transfer information provided\nInvalid fields: [{\"name\":\"counterparty.cardHolder.address.postalCode\",\"value\":\"123\",\"message\":\"Not valid for IT. Allowed formats: NNNNN.\"}]","error_code":"30_081","profile_id":"pro_E9Z7dCKDd54NaVYCFFhF","created":"2025-09-15T11:57:20.960Z","connector_transaction_id":null,"priority":null,"payout_link":null,"email":null,"name":"Albert Klaassen","phone":"6168205362","phone_country_code":"+1","unified_code":"UE_9000","unified_message":"Something went wrong","payout_method_id":null}

cURL (Invalid expiry)

    curl --location --request POST 'http://localhost:8080/payouts/create' \
        --header 'Content-Type: application/json' \
        --header 'api-key: dev_7fXFUFajfCYtS5aKrQXJMyIiBLr2gw3Y862wqkp6qXHpl88H0hQaEr89xAnvsxvp' \
        --data-raw '{"amount":1,"currency":"EUR","profile_id":"pro_E9Z7dCKDd54NaVYCFFhF","customer":{"id":"cus_X7urM1AQqvpECo6G5XkW","name":"New Name"},"connector":["adyenplatform"],"description":"Its my first payout request","payout_type":"card","payout_method_data":{"card":{"card_number":"4111111111111111","expiry_month":"01","expiry_year":"2024","card_holder_name":"John Doe"}},"billing":{"address":{"line1":"1467","line2":"Harrison Street","city":"San Fransico","state":"CA","country":"IT","first_name":"John","last_name":"Doe"},"email":"random@example.com"},"recurring":true,"metadata":{"ref":"123"},"confirm":true,"auto_fulfill":true}'

Response

    {"payout_id":"payout_ME3BMSySpDKtX5tsZI7S","merchant_id":"merchant_1757926554","merchant_order_reference_id":null,"amount":1,"currency":"EUR","connector":"adyenplatform","payout_type":"card","payout_method_data":{"card":{"card_issuer":"JP Morgan","card_network":"Visa","card_type":"CREDIT","card_issuing_country":"INDIA","bank_code":"JP_JPM","last4":"1111","card_isin":"411111","card_extended_bin":null,"card_exp_month":"01","card_exp_year":"2024","card_holder_name":"John Doe"}},"billing":{"address":{"city":"San Fransico","country":"IT","line1":"1467","line2":"Harrison Street","line3":null,"zip":null,"state":"CA","first_name":"John","last_name":"Doe","origin_zip":null},"phone":null,"email":"random@example.com"},"auto_fulfill":true,"customer_id":"cus_X7urM1AQqvpECo6G5XkW","customer":{"id":"cus_X7urM1AQqvpECo6G5XkW","name":"Albert Klaassen","email":null,"phone":"6168205362","phone_country_code":"+1"},"client_secret":"payout_payout_ME3BMSySpDKtX5tsZI7S_secret_T2I0yoRxYatQobkNfApR","return_url":null,"business_country":null,"business_label":null,"description":"Its my first payout request","entity_type":"Individual","recurring":true,"metadata":{"ref":"123"},"merchant_connector_id":"mca_m86KCMmTaeQ2mTtSgfRA","status":"failed","error_message":"Invalid transfer information provided\nInvalid fields: [{\"name\":\"counterparty.cardIdentification.expiryYear\",\"value\":\"2024\",\"message\":\"Expiry date must be in the future\"},{\"name\":\"counterparty.cardIdentification.expiryMonth\",\"value\":\"01\",\"message\":\"Expiry date must be in the future\"}]","error_code":"30_081","profile_id":"pro_E9Z7dCKDd54NaVYCFFhF","created":"2025-09-15T11:58:19.648Z","connector_transaction_id":null,"priority":null,"payout_link":null,"email":null,"name":"Albert Klaassen","phone":"6168205362","phone_country_code":"+1","unified_code":"UE_9000","unified_message":"Something went wrong","payout_method_id":null}

cURL (Invalid state)

    curl --location --request POST 'http://localhost:8080/payouts/create' \
        --header 'Content-Type: application/json' \
        --header 'api-key: dev_7fXFUFajfCYtS5aKrQXJMyIiBLr2gw3Y862wqkp6qXHpl88H0hQaEr89xAnvsxvp' \
        --data-raw '{"amount":1,"currency":"EUR","profile_id":"pro_E9Z7dCKDd54NaVYCFFhF","customer":{"id":"cus_X7urM1AQqvpECo6G5XkW","name":"New Name"},"connector":["adyenplatform"],"description":"Its my first payout request","payout_type":"card","payout_method_data":{"card":{"card_number":"4111111111111111","expiry_month":"03","expiry_year":"2030","card_holder_name":"John Doe"}},"billing":{"address":{"line1":"1467","line2":"Harrison Street","city":"San Fransico","state":"CA","country":"AU","first_name":"John","last_name":"Doe"},"email":"random@example.com"},"recurring":true,"metadata":{"ref":"123"},"confirm":true,"auto_fulfill":true}'

Response

    {"payout_id":"payout_7s7zCL1wMqTmSk304LJg","merchant_id":"merchant_1757926554","merchant_order_reference_id":null,"amount":1,"currency":"EUR","connector":"adyenplatform","payout_type":"card","payout_method_data":{"card":{"card_issuer":"JP Morgan","card_network":"Visa","card_type":"CREDIT","card_issuing_country":"INDIA","bank_code":"JP_JPM","last4":"1111","card_isin":"411111","card_extended_bin":null,"card_exp_month":"03","card_exp_year":"2030","card_holder_name":"John Doe"}},"billing":{"address":{"city":"San Fransico","country":"AU","line1":"1467","line2":"Harrison Street","line3":null,"zip":null,"state":"CA","first_name":"John","last_name":"Doe","origin_zip":null},"phone":null,"email":"random@example.com"},"auto_fulfill":true,"customer_id":"cus_X7urM1AQqvpECo6G5XkW","customer":{"id":"cus_X7urM1AQqvpECo6G5XkW","name":"Albert Klaassen","email":null,"phone":"6168205362","phone_country_code":"+1"},"client_secret":"payout_payout_7s7zCL1wMqTmSk304LJg_secret_AlVXYS4afLwAvtoiuA12","return_url":null,"business_country":null,"business_label":null,"description":"Its my first payout request","entity_type":"Individual","recurring":true,"metadata":{"ref":"123"},"merchant_connector_id":"mca_m86KCMmTaeQ2mTtSgfRA","status":"failed","error_message":"Invalid transfer information provided\nInvalid fields: [{\"name\":\"counterparty.cardHolder.address.stateOrProvince\",\"value\":\"CA\",\"message\":\"Not valid for AU. Allowed values: [VIC, ACT, NSW, NT, TAS, QL... For full list visit documentation.\"}]","error_code":"30_081","profile_id":"pro_E9Z7dCKDd54NaVYCFFhF","created":"2025-09-15T11:59:00.645Z","connector_transaction_id":null,"priority":null,"payout_link":null,"email":null,"name":"Albert Klaassen","phone":"6168205362","phone_country_code":"+1","unified_code":"UE_9000","unified_message":"Something went wrong","payout_method_id":null}

</details>

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

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