Skip to content
Last updated

KRW recipient verification

When you create a KRW recipient via the Wise API, we automatically run a series of validations (format checks) and verifications (Confirmation of Payee, or CoP) before returning the response.

This guide provides details specific to the verification that occurs when creating KRW recipients.

Supported recipient types

KRW supports the following recipient types, which follow the same recipient behaviour:

Recipient typeAPI value Description
South Korean (Personal)south_korean_paygateBank code + bank account number (individual).
South Korean (Business)south_korean_paygate_businessBank code + bank account number (business).

Step 1: Field-level validation

Field-level validation checks the format and correctness of input fields. If any fail, the recipient is not created and the API returns a validation error.

South Korean

The following validations occur when the recipient type is south_korean_paygate or south_korean_paygate_business:

FieldRulesError if invalid
Bank CodeMust be a valid bank code from the Wise bank list for South Korea.NOT_VALID
Account Number10–16 digits only.NOT_VALID
NameAt least one character for first name and family name allowed. Max length validated.NOT_VALID

Sample field validation errors

Invalid account number:

{
 "errors": [
   {
     "code": "NOT_VALID",
     "path": "accountNumber",
     "message": "The account number provided is invalid."
   }
 ]
}

Step 2: Verification

Verification checks account existence only (type ACCOUNT_EXISTENCE). It only runs after all field validations pass. There is no name matching for KRW. The check only validates that the account number and bank code pair is valid. We would thus return an outcomes.[].type of type ACCOUNT_EXISTENCE.

How it works

  1. Wise calls the data provider service with the recipient's bank code and account number.
  2. Data provider verifies that the account number is valid for the given bank.
  • If the account/bank pair is invalid, the outcome is blocking and recipient creation fails with an error.
  • If the account is valid, the outcome is SUCCESS.

There is no name matching step. The verification only confirms account existence. The resolvedName, providedName, and recommendedUpdates fields are always empty for KRW.

Fields checked by recipient type

The fieldsChecked paths are the same in both V1 and V2 for KRW.

Recipient typeFields checked (V1 & V2)
South Korean (both personal and business)details.accountNumber, details.bankCode

Verification blocking outcomes

If verification discovers the account/bank pair is invalid, this is blocking and recipient creation fails.

Blocking outcome Error codeError pathWhen it happens
INVALID_ACCOUNT_BANK_PAIRINVALID_ACCOUNT_BANK_PAIRaccount/details/accountNumberData provider says the account number is not valid for the selected bank.

Sample blocking error (Invalid account/bank pair)

{
  "errors": [
    {
      "code": "INVALID_ACCOUNT_BANK_PAIR",
      "path": "account/details/accountNumber",
      "message": "The entered account number is not valid for the selected bank."
    }
  ]
}

Possible outcomes for KRW

OutcomeBlocking?When it happens
SUCCESSNoAccount number is valid for the selected bank.
COULD_NOT_CHECKNoPayGate service returned an error or timed out.
(blocks creation)YesAccount number is not valid for the selected bank.

What to do

Outcome Recipient created?What to do
SUCCESSYesProceed with the transfer. No additional action needed.
COULD_NOT_CHECKYesInform the user that verification wasn't possible. If they accept, make PATCH request to proceed.
(blocking error)NoFix the invalid input and retry recipient creation.

KRW never produces PARTIAL_FAILURE or non-blocking FAILURE outcomes. The only possible non-blocking outcomes are SUCCESS and COULD_NOT_CHECK.

V1 vs V2 endpoints

Both V1 and V2 endpoints run the same validations and verifications. The difference is the field naming and how the confirmation result is returned.

Aspect/v1/accounts//v2/accounts/
Confirmations in responseAlways included in the recipient response (if available)Only included if you request them via responseConfiguration.additionalInformation
Fields checked pathsdetails/accountNumber, details/bankCodedetails/accountNumber, details/bankCode
Accept confirmationPATCH /v1/accounts/{id}/confirmationsPATCH /v2/accounts/{id}/confirmations

Unlike other currencies, the fieldsChecked paths are identical between V1 and V2 for KRW because bankCode and accountNumber paths are the same in both versions.

V2 request confirmations

When creating a recipient with V2, include the following in your request to receive the confirmations field:

{
  "type": "south_korean_paygate",
  "details": { ... },
  "responseConfiguration": {
    "additionalInformation": ["CONFIRMATION_RESULT"]
  }
}

Without this, V2 will create the recipient and run all checks, but will not include the confirmations field in the response. You would then need to fetch it separately via GET /v2/accounts/{id}.

Sample payloads

All payloads below show the confirmations field as it appears in the response after creating a recipient.

Because KRW is account-existence-only, there is no resolvedName, providedName, or recommendedUpdates.

SUCCESS (account exists)

{
"id": 123456,
"type": "south_korean_paygate",
"accountHolderName": "Kim Minjun",
"details": {
 "bankCode": "088",
 "accountNumber": "1234567890"
},
"confirmations": {
 "acceptedOutcomes": false,
 "acceptedAt": null,
 "quoteId": null,
 "outcomes": [
   {
     "type": "ACCOUNT_EXISTENCE",
     "outcome": "SUCCESS",
     "timestamp": "2026-03-08T10:30:00Z",
     "requiresCustomerAcceptance": false,
     "fieldsChecked": ["details/accountNumber", "details/bankCode"],
     "message": null,
     "resolvedName": null,
     "providedName": null,
     "recommendedUpdates": []
   }
 ]
}
}

COULD_NOT_CHECK (data provider service error)

{
  "id": 123456,
  "type": "south_korean_paygate",
  "accountHolderName": "Kim Minjun",
  "details": {
    "bankCode": "088",
    "accountNumber": "1234567890"
  },
  "confirmations": {
    "acceptedOutcomes": false,
    "acceptedAt": null,
    "quoteId": null,
    "outcomes": [
      {
        "type": "ACCOUNT_EXISTENCE",
        "outcome": "COULD_NOT_CHECK",
        "timestamp": "2026-03-08T10:30:00Z",
        "requiresCustomerAcceptance": true,
        "fieldsChecked": ["details/accountNumber", "details/bankCode"],
        "message": "We couldn't verify the account right now. You can still proceed.",
        "resolvedName": null,
        "providedName": null,
        "recommendedUpdates": []
      }
    ]
  }
}

COULD_NOT_CHECK (service error or timeout)

Returned when an internal Wise error occurs.

Accept confirmation outcomes

The requiresCustomerAcceptance field is true when the outcome value is COULD_NOT_CHECK.

Before you can use the recipient for a transfer, you must make a PATCH request to confirm the user has acknowledged the result.

For KRW, acceptance is only needed for COULD_NOT_CHECK. SUCCESS does not require acceptance, and FAILURE (invalid account/bank pair) is blocking, so there's no confirmation to accept.

Request

Endpoint: PATCH /v1/accounts/{accountId}/confirmations or PATCH /v2/accounts/{accountId}/confirmations

Body:

{
  "acceptedOutcomes": true
}

Response after acceptance

The response mirrors the original confirmations object, but now acceptedOutcomes is true and acceptedAt contains a timestamp:

{
  "confirmations": {
    "acceptedOutcomes": true,
    "acceptedAt": "2026-03-08T10:35:00Z",
    "quoteId": null,
    "outcomes": [
      {
        "type": "ACCOUNT_EXISTENCE",
        "outcome": "COULD_NOT_CHECK",
        "timestamp": "2026-03-08T10:30:00Z",
        "requiresCustomerAcceptance": true,
        "fieldsChecked": ["details/accountNumber", "details/bankCode"],
        "message": "We couldn't verify the account right now. You can still proceed.",
        "resolvedName": null,
        "providedName": null,
        "recommendedUpdates": []
      }
    ]
  }
}

Test in the sandbox

  1. Create a recipient via POST /v1/accounts/ (or V2) with valid details.
  2. Inspect the response. Check the confirmations.outcomes.outcome field.
  3. If outcome requires acceptance (requiresCustomerAcceptance: true), call PATCH /v1/accounts/{id}/confirmations with {"acceptedOutcomes": true}.
  4. Create a transfer using the accepted recipient.

How to trigger each verification outcome

Recipient verification is not available in the sandbox environment for KRW because the data provider is disabled in the sandbox. This means that in sandbox, verification will always return COULD_NOT_CHECK.

To test the full verification flow with actual account validation, you must test in a staging or production-like environment. Contact the Wise team for testing options.

Test scenarioExpected outcome
Any valid account/bank pairCOULD_NOT_CHECK
Any invalid account/bank pairCOULD_NOT_CHECK — (no validation occurs)
Invalid account number format (outside 10–16 digits)Blocking field error: NOT_VALID on details/accountNumber
Invalid bank codeBlocking field error: NOT_VALID on details/bankCode

Expected outcomes in production

Test scenarioExpected outcome
Valid account number for the selected bankSUCCESS
Invalid account number for the selected bankBlocking error: INVALID_ACCOUNT_BANK_PAIR
Data provider service error/timeoutCOULD_NOT_CHECK
Invalid account number formatBlocking field error: NOT_VALID on details/accountNumber