openapi: 3.1.0
info:
title: Wise Platform 3ds kyc-review API
version: ''
description: "The Wise Platform API is a REST-based interface that enables programmatic access to Wise's payment infrastructure. All endpoints return JSON-formatted responses and use standard HTTP methods and status codes.\n{% admonition type=\"success\" name=\"New to wise?\" %}\n We strongly recommend first reading our **[Getting Started Guide](/guides/developer/index.md)** to help you set up credentials and make your first call.\n{% /admonition %}\n\nBefore you begin {% .title-2 .m-t-5 %}\n\nTo use this API reference effectively, you should have:\n\n- Received Valid [API credentials from Wise](/guides/developer/auth-and-security/index.md) (Client ID and Client Secret)\n- Understand OAuth 2.0 authentication\n- Be familiar with RESTful API concepts\n\nCore API resources {% .title-2 .m-t-5 .m-b-0 %}\n\n| Resource | Purpose |\n|----------|---------|\n| **[Quote](/api-reference/quote)** | Exchange rate and fee calculations |\n| **[Recipient](/api-reference/recipient)** | Beneficiary account management |\n| **[Transfer](/api-reference/transfer)** | Payment creation and execution |\n| **[Balance](/api-reference/balance)** | Multi-currency account operations |\n| **[Profile](/api-reference/profile)** | Account ownership details |\n| **[Rate](/api-reference/rate)** | Current and historical exchange rates |\n\n**Not sure which workflow to build?**
\nStart with our [Integration Guides](/guides/product/send-money/use-cases/index.md) for step-by-step implementation examples.{% .m-t-3 .m-b-5 %}\n"
servers:
- url: https://api.wise.com
description: Production Environment
- url: https://api.wise-sandbox.com
description: Sandbox Environment
tags:
- name: kyc-review
x-displayName: KYC Review
description: 'KYC Review API provides endpoints to view, update and submit information related to the KYC flow.
There are two ways to collect KYC requirements from your customers:
- **Hosted KYC** — redirect your customer to a Wise-hosted UI that guides them through the process.
- **API submission** — use the [KYC Requirement Submit](/api-reference/kyc-review/kycreviewrequirementsubmit) endpoint to submit requirements directly. This is only available for requirement types where `apiCollectionSupported` is `true`.
Please refer to our [Hosted KYC guide](/guides/product/kyc/wise-kyc/hosted-kyc) for more information on the general use of the endpoints included below.
'
paths:
/v1/profiles/{profileId}/kyc-reviews:
post:
operationId: kycReviewCreate
summary: Create a KYC Review
description: 'Creates a KYC Review for a specific customer action.
'
tags:
- kyc-review
security:
- UserToken: []
parameters:
- name: profileId
in: path
required: true
description: The profile ID.
schema:
type: integer
format: int64
- $ref: '#/components/parameters/X-External-Correlation-Id'
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- type
properties:
type:
type: string
description: 'Type of the underlying action or process this KYC Review is for. Usually a reference to which product this KYC Review is for (like `QUOTE` or `TRANSFER`) or a reference to a KYC process on the profile that isn''t related to a specific product (like `REFRESH_CYCLE` or `REPAPERING`).
Following types are available when creating a KYC Review using this endpoint:
- `QUOTE`
- `PROACTIVE_SEND_MONEY`
- `CARD`
'
enum:
- QUOTE
- PROACTIVE_SEND_MONEY
- CARD
example: QUOTE
triggerData:
type: object
description: 'Object containing data of the underlying product object that triggered the KYC Review.
'
properties:
id:
type: string
format: uuid
description: ID of the underlying product object. For example, if type is `QUOTE` then this would be the quote ID. This ID might be null when referencing an ID isn't meaningful. As an example, there's only ever one active refresh cycle per profile so referencing by ID isn't useful.
example: ba83a43a-f623-46f0-956d-196c13e2ab01
responses:
'202':
description: KYC Review successfully created.
content:
application/json:
schema:
$ref: '#/components/schemas/kyc-review'
headers:
X-External-Correlation-Id:
$ref: '#/components/headers/X-External-Correlation-Id'
x-trace-id:
$ref: '#/components/headers/x-trace-id'
'400':
description: Invalid request (e.g. unsupported `type`, null `type`).
headers:
X-External-Correlation-Id:
$ref: '#/components/headers/X-External-Correlation-Id'
x-trace-id:
$ref: '#/components/headers/x-trace-id'
'401':
description: User is not authorised to access the resource.
headers:
X-External-Correlation-Id:
$ref: '#/components/headers/X-External-Correlation-Id'
x-trace-id:
$ref: '#/components/headers/x-trace-id'
'404':
description: Underlying action with provided ID is not found (e.g. quote not found).
headers:
X-External-Correlation-Id:
$ref: '#/components/headers/X-External-Correlation-Id'
x-trace-id:
$ref: '#/components/headers/x-trace-id'
'429':
$ref: '#/components/responses/429'
get:
operationId: kycReviewList
summary: Get all KYC Reviews for a profile
description: 'Retrieves a list of all active KYC Reviews for a given profile.
'
tags:
- kyc-review
security:
- UserToken: []
parameters:
- name: profileId
in: path
required: true
description: The profile ID.
schema:
type: integer
format: int64
- name: pageNumber
in: query
required: false
description: Page number. Default value is `1`.
schema:
type: integer
default: 1
- name: pageSize
in: query
required: false
description: Desired number of items per page. Max `100`, default `100`.
schema:
type: integer
default: 100
maximum: 100
- $ref: '#/components/parameters/X-External-Correlation-Id'
responses:
'200':
description: Returns a list of KYC Review objects for the profile. Returns an empty list if no KYC Review exists for the profile.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/kyc-review'
headers:
X-External-Correlation-Id:
$ref: '#/components/headers/X-External-Correlation-Id'
x-trace-id:
$ref: '#/components/headers/x-trace-id'
'401':
description: User is not authorised to access the resource.
headers:
X-External-Correlation-Id:
$ref: '#/components/headers/X-External-Correlation-Id'
x-trace-id:
$ref: '#/components/headers/x-trace-id'
'429':
$ref: '#/components/responses/429'
/v1/profiles/{profileId}/kyc-reviews/{kycReviewId}:
get:
operationId: kycReviewGetV1
summary: Get KYC Review by ID (V1)
deprecated: true
description: '{% admonition type="warning" %}
This endpoint is deprecated. Use [Get KYC Review by ID](kycreviewget) (V2) instead.
{% /admonition %}
Retrieves a single KYC Review by ID for a profile.
'
tags:
- kyc-review
security:
- UserToken: []
parameters:
- name: profileId
in: path
required: true
description: The profile ID.
schema:
type: integer
format: int64
- name: kycReviewId
in: path
required: true
description: The KYC Review ID.
schema:
type: string
format: uuid
- $ref: '#/components/parameters/X-External-Correlation-Id'
responses:
'200':
description: Returns the KYC Review object.
content:
application/json:
schema:
$ref: '#/components/schemas/kyc-review'
headers:
X-External-Correlation-Id:
$ref: '#/components/headers/X-External-Correlation-Id'
x-trace-id:
$ref: '#/components/headers/x-trace-id'
'401':
description: User is not authorised to access the resource.
headers:
X-External-Correlation-Id:
$ref: '#/components/headers/X-External-Correlation-Id'
x-trace-id:
$ref: '#/components/headers/x-trace-id'
'404':
description: KYC Review not found.
headers:
X-External-Correlation-Id:
$ref: '#/components/headers/X-External-Correlation-Id'
x-trace-id:
$ref: '#/components/headers/x-trace-id'
'429':
$ref: '#/components/responses/429'
patch:
operationId: kycReviewRedirectUrlUpdate
summary: Update KYC Review to get a Hosted KYC link
description: 'Updates the KYC Review with a redirect URL.
Returns the KYC Review object with a `link` field containing a URL where the end customer needs to be directed in order to complete the Hosted KYC flow.
Once the Hosted KYC flow is completed by the end customer, they will be redirected to the `redirectUrl` provided in this API call. During the redirection, the `redirectUrl` will be appended with query parameters: `status=success`, `status=failed`, or `status=closed`.
'
tags:
- kyc-review
security:
- UserToken: []
parameters:
- name: profileId
in: path
required: true
description: The profile ID.
schema:
type: integer
format: int64
- name: kycReviewId
in: path
required: true
description: The KYC Review ID.
schema:
type: string
format: uuid
- $ref: '#/components/parameters/X-External-Correlation-Id'
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- redirectUrl
properties:
redirectUrl:
type: string
description: URL where the user will be redirected at the end of the flow. Can contain query params and path fragments. It has to be a valid URL as per [RFC 2396](https://www.ietf.org/rfc/rfc2396.txt).
example: https://example.com
responses:
'200':
description: Returns the updated KYC Review object.
content:
application/json:
schema:
$ref: '#/components/schemas/kyc-review'
headers:
X-External-Correlation-Id:
$ref: '#/components/headers/X-External-Correlation-Id'
x-trace-id:
$ref: '#/components/headers/x-trace-id'
'400':
description: Invalid request (e.g. not a valid URI).
headers:
X-External-Correlation-Id:
$ref: '#/components/headers/X-External-Correlation-Id'
x-trace-id:
$ref: '#/components/headers/x-trace-id'
'401':
description: User is not authorised to access the resource.
headers:
X-External-Correlation-Id:
$ref: '#/components/headers/X-External-Correlation-Id'
x-trace-id:
$ref: '#/components/headers/x-trace-id'
'404':
description: KYC Review not found.
headers:
X-External-Correlation-Id:
$ref: '#/components/headers/X-External-Correlation-Id'
x-trace-id:
$ref: '#/components/headers/x-trace-id'
'429':
$ref: '#/components/responses/429'
/v2/profiles/{profileId}/kyc-reviews/{kycReviewId}:
get:
operationId: kycReviewGet
summary: Get KYC Review by ID
description: 'Retrieves a single KYC Review by ID for a profile.
'
tags:
- kyc-review
security:
- UserToken: []
parameters:
- name: profileId
in: path
required: true
description: The profile ID.
schema:
type: integer
format: int64
- name: kycReviewId
in: path
required: true
description: The KYC Review ID.
schema:
type: string
format: uuid
- $ref: '#/components/parameters/X-External-Correlation-Id'
responses:
'200':
description: Returns the KYC Review object including the `requirements` field.
content:
application/json:
schema:
$ref: '#/components/schemas/kyc-review'
headers:
X-External-Correlation-Id:
$ref: '#/components/headers/X-External-Correlation-Id'
x-trace-id:
$ref: '#/components/headers/x-trace-id'
'401':
description: User is not authorised to access the resource.
headers:
X-External-Correlation-Id:
$ref: '#/components/headers/X-External-Correlation-Id'
x-trace-id:
$ref: '#/components/headers/x-trace-id'
'404':
description: KYC Review not found.
headers:
X-External-Correlation-Id:
$ref: '#/components/headers/X-External-Correlation-Id'
x-trace-id:
$ref: '#/components/headers/x-trace-id'
'429':
$ref: '#/components/responses/429'
/v2/profiles/{profileId}/kyc-requirements/{requirementKey}:
post:
operationId: kycReviewRequirementSubmit
summary: Submit a KYC Requirement
description: 'Submit a KYC requirement for a KYC Review.
- A KYC requirement can only be submitted if the KYC Review status is `WAITING_CUSTOMER_INPUT` or `PASSED_WITH_REQUIREMENTS`.
- A KYC requirement should only be submitted if its `state` is `NOT_PROVIDED` and `apiCollectionSupported` is `true`.
See the [KYC requirement types](/guides/product/kyc/wise-kyc/kyc-requirement-types) guide for the full list of supported requirement types, submission data structures, and accepted values.
'
tags:
- kyc-review
security:
- UserToken: []
parameters:
- name: profileId
in: path
required: true
description: The profile ID.
schema:
type: integer
format: int64
- name: requirementKey
in: path
required: true
description: 'The KYC requirement type to submit.
See the [KYC requirement types](/guides/product/kyc/wise-kyc/kyc-requirement-types) guide for details on each type.
'
schema:
type: string
enum:
- ACCOUNT_INTENT
- ACCOUNT_PURPOSE
- ANNUAL_VOLUME
- BUSINESS_ANNUAL_INCOME
- BUSINESS_AUTHORISATION_ID
- BUSINESS_AUTHORISATION_LETTER
- BUSINESS_DIRECTORS_CHECK
- BUSINESS_MONTHLY_VOLUME
- BUSINESS_REGISTRATION_DOCS
- BUSINESS_SHAREHOLDERS_CHECK
- BUSINESS_SOURCE_OF_WEALTH
- BUSINESS_SOURCE_OF_WEALTH_INFO
- BUSINESS_SOURCE_OF_WEALTH_PROOF
- BUSINESS_ULTIMATE_BENEFICIAL_OWNER_ID
- BUSINESS_USE_CASE
- ID_DOCUMENT
- INCOME
- INDIA_TRANSFER_PURPOSE
- PROOF_OF_TRADING_ADDRESS
- SOURCE_OF_FUNDS
- SOURCE_OF_WEALTH
- SOURCE_OF_WEALTH_INFO
- SOURCE_OF_WEALTH_PROOF
- TAX_RESIDENCY
- USE_CASE_COUNTRIES
- $ref: '#/components/parameters/X-External-Correlation-Id'
requestBody:
required: true
content:
multipart/form-data:
schema:
type: object
required:
- submissionData
properties:
submissionData:
type: string
format: application/json
description: "A JSON string containing the following fields:\n\n- `data` — an object whose fields vary by requirement type. Some requirement types do not require a `data` field.\n- `version` — the submission version, currently `\"V1\"`.\n- `kycReviewId` — the ID of the KYC Review this submission belongs to.\n\nFor example, the JSON payload would look like below, but it should be included as a string value in the multipart form field:\n\n```json\n{\n \"data\": {\n \"accountPurpose\": \"SENDING_MONEY_TO_FRIENDS_OR_FAMILY\"\n },\n \"version\": \"V1\",\n \"kycReviewId\": \"93a903ea-636c-4c86-a25c-cf6d2bd00e81\"\n}\n```\n\nSee the [KYC requirement types](/guides/product/kyc/wise-kyc/kyc-requirement-types) guide for the `data` structure and accepted values for each requirement type.\n"
files:
type: array
items:
type: string
format: binary
description: "One or more files to upload. Required for certain requirement types.\n\nThere are 3 accepted types for documents, they must be provided with the below content-type/Mime-type and have a matching file extension.\n\nContentType/MimeType & file extension:\n - `image/png` & `.png`\n - `image/jpeg` & (`.jpg` or `jpeg`)\n - `application/pdf` & `.pdf`\n\n\nSee the [KYC requirement types](/guides/product/kyc/wise-kyc/kyc-requirement-types) guide for which types require files.\n"
example:
submissionData: '{"data":{"accountPurpose":"SENDING_MONEY_TO_FRIENDS_OR_FAMILY"},"version":"V1","kycReviewId":"93a903ea-636c-4c86-a25c-cf6d2bd00e81"}'
x-codeSamples:
- lang: bash
label: cURL
source: "curl -X POST \\\n 'https://api.wise-sandbox.com/v2/profiles/{profileId}/kyc-requirements/{requirementKey}' \\\n -H 'Authorization: Bearer ' \\\n -F 'submissionData={\"data\":{\"accountPurpose\":\"SENDING_MONEY_TO_FRIENDS_OR_FAMILY\"},\"version\":\"V1\",\"kycReviewId\":\"93a903ea-636c-4c86-a25c-cf6d2bd00e81\"};type=application/json' \\\n -F 'files=@\"\"'\n"
responses:
'202':
description: KYC requirement successfully submitted.
headers:
X-External-Correlation-Id:
$ref: '#/components/headers/X-External-Correlation-Id'
x-trace-id:
$ref: '#/components/headers/x-trace-id'
'400':
description: 'Invalid request. Common error scenarios:
- No `submissionData` provided
- No `kycReviewId` provided in submission data
- No `data` provided in submission data
- Invalid field values
- Missing required files
'
content:
application/json:
schema:
type: object
properties:
type:
type: string
example: /errors/types/validation
title:
type: string
example: Validation Error
status:
type: integer
example: 400
instance:
type: string
detail:
type: string
errors:
type: array
items:
type: object
properties:
code:
type: string
ref:
type: string
detail:
type: string
attributes:
type: object
examples:
no-submission-data:
summary: No submissionData provided
value:
type: /errors/types/validation
title: Validation Error
status: 400
instance: /v2/profiles/{profileId}/kyc-requirements/ACCOUNT_INTENT
errors:
- code: invalid_value
ref: submissionData
detail: submissionData must not be empty
no-kyc-review-id:
summary: No kycReviewId provided
value:
type: /errors/types/validation
title: Validation Error
status: 400
instance: /v2/profiles/{profileId}/kyc-requirements/ACCOUNT_INTENT
errors:
- code: invalid_value
ref: submissionData.kycReviewId
detail: kycReviewId must not be empty
no-data:
summary: No data provided
value:
type: /errors/types/validation
title: Validation Error
status: 400
detail: No files or submissionData is submitted
instance: /v2/profiles/{profileId}/kyc-requirements/ACCOUNT_INTENT
errors: []
invalid-field-value:
summary: Invalid field value
value:
type: /errors/types/validation
title: Validation Error
status: 400
instance: /v2/profiles/{profileId}/kyc-requirements/ACCOUNT_INTENT
errors:
- code: invalid_value
ref: accountPurpose
detail: 'Invalid accountPurpose submitted: invalid'
attributes:
acceptedValues:
- Consult API documentation
negative-amount:
summary: Negative amount provided
value:
type: /errors/types/validation
title: Validation Error
status: 400
detail: Amount must be greater than zero.
instance: /v2/profiles/{profileId}/kyc-requirements/BUSINESS_ANNUAL_INCOME
errors: []
invalid-currency:
summary: Invalid currency provided
value:
type: /errors/types/validation
title: Validation Error
status: 400
instance: /v2/profiles/{profileId}/kyc-requirements/BUSINESS_ANNUAL_INCOME
errors:
- code: invalid_request
ref: submissionData
detail: submitted data is invalid
attributes: null
no-files:
summary: No files provided
value:
type: /errors/types/validation
title: Validation Error
status: 400
instance: /v2/profiles/{profileId}/kyc-requirements/BUSINESS_AUTHORISATION_ID
errors:
- code: missing_value
ref: files
detail: No file has been provided
mismatching-filenames:
summary: Mismatching fileNames provided
value:
type: /errors/types/validation
title: Validation Error
status: 400
instance: /v2/profiles/{profileId}/kyc-requirements/BUSINESS_AUTHORISATION_ID
errors:
- code: invalid_value
ref: files
detail: File - filenames mismatch
attributes:
acceptedValues:
- xx.png
missing-front-filename:
summary: Multiple files provided without frontFileName field
value:
type: /errors/types/validation
title: Validation Error
status: 400
instance: /v2/profiles/{profileId}/kyc-requirements/BUSINESS_AUTHORISATION_ID
errors:
- code: missing_value
ref: frontSideFilename
detail: No front side file name is provided
empty-source-of-wealth-list:
summary: Empty sourceOfWealthList provided
value:
type: /errors/types/validation
title: Validation Error
status: 400
instance: /v2/profiles/{profileId}/kyc-requirements/BUSINESS_SOURCE_OF_WEALTH
errors:
- code: invalid_value
ref: sourceOfWealthList
detail: No business source of wealth provided
attributes:
acceptedValues:
- REVENUE
- PERSONAL_FUNDING
- BUSINESS_LOAN
- FUNDING_AND_SHAREHOLDER_INVESTMENTS
- INVESTMENT_INCOME
- DONATIONS
- GRANTS
- OTHER
- LEGAL
missing-wealth-description:
summary: No description when sourceOfWealthList is OTHER
value:
type: /errors/types/validation
title: Validation Error
status: 400
instance: /v2/profiles/{profileId}/kyc-requirements/BUSINESS_SOURCE_OF_WEALTH
errors:
- code: invalid_value
ref: sourceOfWealthList
detail: Missing business source of wealth description
attributes:
acceptedValues:
- REVENUE
- PERSONAL_FUNDING
- BUSINESS_LOAN
- FUNDING_AND_SHAREHOLDER_INVESTMENTS
- INVESTMENT_INCOME
- DONATIONS
- GRANTS
- OTHER
- LEGAL
wealth-description-too-short:
summary: Short description when sourceOfWealthList is OTHER
value:
type: /errors/types/validation
title: Validation Error
status: 400
instance: /v2/profiles/{profileId}/kyc-requirements/BUSINESS_SOURCE_OF_WEALTH
errors:
- code: invalid_value
ref: sourceOfWealthList
detail: Source of wealth description too short
attributes:
acceptedValues:
- REVENUE
- PERSONAL_FUNDING
- BUSINESS_LOAN
- FUNDING_AND_SHAREHOLDER_INVESTMENTS
- INVESTMENT_INCOME
- DONATIONS
- GRANTS
- OTHER
- LEGAL
india-transfer-purpose-non-inr-from-currency:
summary: India transfer purpose submitted for non-INR currency
value:
type: /errors/types/validation
title: Validation Error
status: 400
instance: /v2/profiles/{profileId}/kyc-requirements/INDIA_TRANSFER_PURPOSE
errors:
- code: invalid_value
ref: requirementKey
detail: Transfer which triggered KycReview is not from INR currency so submission of this requirement is not permitted
india-transfer-purpose-not-accepted-to-currency:
summary: India transfer purpose submitted to not accepted currency
value:
type: /errors/types/validation
title: Validation Error
status: 400
instance: /v2/profiles/{profileId}/kyc-requirements/INDIA_TRANSFER_PURPOSE
errors:
- code: invalid_value
ref: requirementKey
detail: Transfer which triggered KycReview does not have an accepted target currency so submission of this requirement is not permitted
india-transfer-purpose-invalid-code:
summary: India transfer purpose invalid code
value:
type: /errors/types/validation
title: Validation Error
status: 400
instance: /v2/profiles/{profileId}/kyc-requirements/INDIA_TRANSFER_PURPOSE
errors:
- code: invalid_value
ref: code
detail: The code provided is not valid
india-transfer-purpose-not-required:
summary: India transfer purpose not required
value:
type: /errors/types/validation
title: Validation Error
status: 400
instance: /v2/profiles/{profileId}/kyc-requirements/INDIA_TRANSFER_PURPOSE
errors:
- code: invalid_value
ref: requirementKey
detail: INDIA_TRANSFER_PURPOSE is not required for the KycReview
india-transfer-purpose-additionaldocumentfilename-not-supplied:
summary: additionalDocumentFileName missing or empty
value:
type: /errors/types/validation
title: Validation Error
status: 400
instance: /v2/profiles/{profileId}/kyc-requirements/INDIA_TRANSFER_PURPOSE
errors:
- code: missing_value
ref: additionalDocumentFileName
detail: additionalDocumentFileName cannot be null or empty
india-transfer-purpose-educationpaidwithloan-not-supplied:
summary: educationPaidWithLoan missing
value:
type: /errors/types/validation
title: Validation Error
status: 400
instance: /v2/profiles/{profileId}/kyc-requirements/INDIA_TRANSFER_PURPOSE
errors:
- code: missing_value
ref: educationPaidWithLoan
detail: educationPaidWithLoan cannot be null
india-transfer-purpose-educationpaidwithloan-not-required:
summary: educationPaidWithLoan not required
value:
type: /errors/types/validation
title: Validation Error
status: 400
instance: /v2/profiles/{profileId}/kyc-requirements/INDIA_TRANSFER_PURPOSE
errors:
- code: invalid_value
ref: educationPaidWithLoan
detail: educationPaidWithLoan is only valid for OVERSEAS_EDUCATION & EDUCATION_EXPENSES
india-transfer-purpose-loandocumentfilename-not-supplied:
summary: loanDocumentFileName missing
value:
type: /errors/types/validation
title: Validation Error
status: 400
instance: /v2/profiles/{profileId}/kyc-requirements/INDIA_TRANSFER_PURPOSE
errors:
- code: missing_value
ref: loanDocumentFileName
detail: loanDocumentFileName must be provided if the code is OVERSEAS_EDUCATION or EDUCATION_EXPENSES and educationPaidWithLoan is true
india-transfer-purpose-passportfilename-not-supplied:
summary: passportFileName missing or empty
value:
type: /errors/types/validation
title: Validation Error
status: 400
instance: /v2/profiles/{profileId}/kyc-requirements/INDIA_TRANSFER_PURPOSE
errors:
- code: missing_value
ref: passportFileName
detail: passportFileName cannot be null or empty
india-transfer-purpose-tcstaxapplies-not-supplied:
summary: tcsTaxApplies missing
value:
type: /errors/types/validation
title: Validation Error
status: 400
instance: /v2/profiles/{profileId}/kyc-requirements/INDIA_TRANSFER_PURPOSE
errors:
- code: missing_value
ref: tcsTaxApplies
detail: tcsTaxApplies cannot be null
invalid-wealth-info-data:
summary: Invalid sourceOfWealthList submission data
value:
type: /errors/types/validation
title: Validation Error
status: 400
instance: /v2/profiles/{profileId}/kyc-requirements/BUSINESS_SOURCE_OF_WEALTH_INFO
errors:
- code: invalid_value
ref: sourceOfWealthList
detail: Invalid submission data provided
attributes:
acceptedValues:
- REVENUE
- PERSONAL_FUNDING
- BUSINESS_LOAN
- FUNDING_AND_SHAREHOLDER_INVESTMENTS
- INVESTMENT_INCOME
- DONATIONS
- GRANTS
- OTHER
- LEGAL
invalid-source-of-wealth-type:
summary: Invalid sourceOfWealthType provided
value:
type: /errors/types/validation
title: Validation Error
status: 400
instance: /v2/profiles/{profileId}/kyc-requirements/BUSINESS_SOURCE_OF_WEALTH_PROOF
errors:
- code: invalid_value
ref: sourceOfWealthType
detail: Invalid Source of Wealth type
attributes:
acceptedValues:
- REVENUE
- PERSONAL_FUNDING
- BUSINESS_LOAN
- FUNDING_AND_SHAREHOLDER_INVESTMENTS
- INVESTMENT_INCOME
- DONATIONS
- GRANTS
- OTHER
- LEGAL
invalid-document-type:
summary: Invalid documentType provided
value:
type: /errors/types/validation
title: Validation Error
status: 400
instance: /v2/profiles/{profileId}/kyc-requirements/BUSINESS_SOURCE_OF_WEALTH_PROOF
errors:
- code: invalid_value
ref: documentType
detail: Invalid Document Type
attributes:
acceptedValues:
- PAYSLIP
- INVOICES
- CONTRACTS
- TAX_DOCUMENTS
- AUDITED_FINANCIAL_STATEMENTS
- E_COMMERCE_STATEMENTS
- PERSONAL_INVESTMENT
- PERSONAL_LOAN_AGREEMENT
- PERSONAL_TAX_DECLARATION
- LOAN_AGREEMENT
- EQUITY_AGREEMENT
- SUBSCRIPTION_AGREEMENT
- SAVINGS_STATEMENT
- ASSET_SALE_AGREEMENT
- SHARE_SALE_CERTIFICATE
- DONATION_RECEIPTS
- GRANT_APPROVAL_LETTER
- WRITTEN_CONFIRMATION
- BANK_STATEMENT
shareholder-file-mismatch:
summary: File not matching fileName for shareholder
value:
type: /errors/types/validation
title: Validation Error
status: 400
instance: /v2/profiles/{profileId}/kyc-requirements/BUSINESS_ULTIMATE_BENEFICIAL_OWNER_ID
errors:
- code: invalid_value
ref: file
detail: 'No file was provided with a name that matches {fileName} for shareholderId: {shareHolderId}'
attributes: null
shareholder-not-found:
summary: Shareholder does not exist
value:
type: /errors/types/validation
title: Validation Error
status: 400
instance: /v2/profiles/{profileId}/kyc-requirements/BUSINESS_ULTIMATE_BENEFICIAL_OWNER_ID
errors:
- code: invalid_value
ref: shareholderId
detail: Shareholder does not exist
attributes: null
shareholder-document-type-mismatch:
summary: DocumentType not valid for shareholder
value:
type: /errors/types/validation
title: Validation Error
status: 400
instance: /v2/profiles/{profileId}/kyc-requirements/BUSINESS_ULTIMATE_BENEFICIAL_OWNER_ID
errors:
- code: invalid_value
ref: documentType
detail: 'DocumentType cannot be associated with shareholder: {shareHolderId}'
attributes:
acceptedValues:
- NATIONAL_ID
- DRIVING_LICENSE
- PASSPORT
empty-required-array:
summary: Required array field empty
value:
type: /errors/types/validation
title: Validation Error
status: 400
instance: /v2/profiles/{profileId}/kyc-requirements/BUSINESS_USE_CASE
errors:
- code: parameter_missing
ref: useCases
detail: No value provided
attributes: null
invalid-array-values:
summary: Invalid values in array field
value:
type: /errors/types/validation
title: Validation Error
status: 400
instance: /v2/profiles/{profileId}/kyc-requirements/BUSINESS_USE_CASE
errors:
- code: invalid_value
ref: useCases
detail: 'Invalid useCases are submitted: [invalid]'
attributes:
acceptedValues:
- Consult API documentation
file-name-not-found:
summary: No file matching specified fileName
value:
type: /errors/types/validation
title: Validation Error
status: 400
instance: /v2/profiles/{profileId}/kyc-requirements/ID_DOCUMENT
errors:
- code: invalid_request
ref: files
detail: 'No file was provided with the specified fileName: xxx.png'
attributes: null
invalid-issuing-country:
summary: Invalid issuingCountry provided
value:
type: /errors/types/validation
title: Validation Error
status: 400
instance: /v2/profiles/{profileId}/kyc-requirements/ID_DOCUMENT
errors:
- code: invalid_value
ref: issuingCountry
detail: Invalid issuingCountry provided
attributes:
acceptedValues:
- Consult API documentation
golden-visa-declaration-required:
summary: Golden visa declaration required
value:
type: /errors/types/validation
title: Validation Error
status: 400
instance: /v2/profiles/{profileId}/kyc-requirements/TAX_RESIDENCY
errors:
- code: invalid_request
ref: goldenVisaDeclaration
detail: Golden visa declaration is required when all declared countries are within golden visa jurisdictions.
golden-visa-values-not-true:
summary: Golden visa declaration values must be true
value:
type: /errors/types/validation
title: Validation Error
status: 400
instance: /v2/profiles/{profileId}/kyc-requirements/TAX_RESIDENCY
errors:
- code: invalid_request
ref: goldenVisaDeclaration
detail: All values in the golden visa declaration must be set to true.
headers:
X-External-Correlation-Id:
$ref: '#/components/headers/X-External-Correlation-Id'
x-trace-id:
$ref: '#/components/headers/x-trace-id'
'401':
description: User is not authorised to access the resource.
headers:
X-External-Correlation-Id:
$ref: '#/components/headers/X-External-Correlation-Id'
x-trace-id:
$ref: '#/components/headers/x-trace-id'
'404':
description: KYC Review or provided requirement key not found.
headers:
X-External-Correlation-Id:
$ref: '#/components/headers/X-External-Correlation-Id'
x-trace-id:
$ref: '#/components/headers/x-trace-id'
'429':
$ref: '#/components/responses/429'
components:
parameters:
X-External-Correlation-Id:
x-global: true
name: X-External-Correlation-Id
in: header
required: false
description: 'Optional UUID for correlating requests across systems. If provided, Wise echoes it back in the response. Maximum 36 characters. [Learn more](/guides/developer/headers/correlation-id).
'
schema:
type: string
format: uuid
maxLength: 36
example: f47ac10b-58cc-4372-a567-0e02b2c3d479
headers:
X-External-Correlation-Id:
x-global: true
description: Echoed back when `X-External-Correlation-Id` was included in the request. [Learn more](/guides/developer/headers/correlation-id).
schema:
type: string
format: uuid
maxLength: 36
example: f47ac10b-58cc-4372-a567-0e02b2c3d479
x-trace-id:
x-global: true
description: Unique trace identifier assigned by Wise. Useful when contacting support about a specific request.
schema:
type: string
example: fba501b6d453b96789f52338f019341f
responses:
'429':
x-global: true
description: Rate limit exceeded. Retry after the number of seconds specified in the `Retry-After` header.
headers:
Retry-After:
description: Number of seconds to wait before retrying the request.
schema:
type: integer
example: 5
X-Rate-Limited-By:
description: Identifies the rate limiter that triggered the 429 response.
schema:
type: string
example: wise-public-api
X-External-Correlation-Id:
$ref: '#/components/headers/X-External-Correlation-Id'
x-trace-id:
$ref: '#/components/headers/x-trace-id'
content:
application/json:
schema:
type: object
schemas:
kyc-review:
title: KYC Review
description: The return object of most KYC Review endpoints, which includes information about the given KYC Review such as status, trigger references, and a list of [KYC Requirements](api-reference/kyc-review/kyc-requirement).
x-tags:
- kyc-review
type: object
properties:
id:
type: string
format: uuid
description: Unique identifier for a KYC Review resource, generated by Wise.
example: 46e1a5c4-4a9b-4563-39d3-18174d3ac0f8
status:
type: string
description: 'Aggregated state of the underlying requirement set. Any of the states below could move into any other state.
'
enum:
- NEW
- PASSED
- PASSED_WITH_REQUIREMENTS
- WAITING_CUSTOMER_INPUT
- PROCESSING
example: WAITING_CUSTOMER_INPUT
link:
type:
- object
- 'null'
description: 'Contains the URL and expiry of said URL the end customer needs to be directed to in order to go through Hosted KYC flow. `link` is returned only when `status` is `WAITING_CUSTOMER_INPUT` and [Update redirect URL](kycreviewredirecturlupdate) is called.
'
properties:
value:
type: string
description: The URL that the end customer needs to be directed to in order to go through the Hosted KYC flow.
example: https://wise-sandbox.com/embedded-flows/verification?token=d7332edb-25bf-41af-a4e9-09f5efe39ded&checkId=3120073
expiresAt:
type: string
format: date-time
description: Timestamp for when the one-time token in the link will expire, after which a new link needs to be generated.
example: '2024-09-03T16:29:41.203225146'
createdAt:
type: string
format: date-time
description: Timestamp marking the creation of the KYC Review.
example: '2024-09-03T16:22:02.257725'
updatedAt:
type: string
format: date-time
description: Timestamp marking the last update of the KYC Review.
example: '2024-09-03T16:29:41.147522'
requiredBy:
type:
- string
- 'null'
format: date-time
description: Timestamp by which the underlying requirement set needs to be verified to not block the customer. Only relevant if the status is `PASSED_WITH_REQUIREMENTS`.
example: '2024-09-03T16:22:02.257725'
triggerReferences:
type: array
description: List of trigger reference objects.
items:
type: object
description: An object that refers to the action or process this KYC Review pertains to.
properties:
type:
type: string
description: 'Type of the underlying action or process this KYC Review is for. Usually a reference to which product this KYC Review pertains to (like `QUOTE` or `TRANSFER`) or a reference to a KYC process on the profile that isn''t related to a specific product (like `REFRESH_CYCLE` or `REPAPERING`).
Currently supported types:
- `QUOTE`
- `TRANSFER`
- `PROACTIVE_SEND_MONEY`
- `ADD_MONEY`
- `CARD`
- `BANK_ACCOUNT_DETAILS`
- `INFO_REQUEST`
'
example: QUOTE
triggerData:
type: object
description: 'Key-value object containing metadata of the underlying product object that triggered the KYC Review.
For `QUOTE`, `TRANSFER` and `ADD_MONEY` types, `triggerData` contains an `id` field that refers to their respective IDs.
For `BANK_ACCOUNT_DETAILS`, `triggerData` has a field called `currencies` which contains a list of currencies (e.g. USD, SGD, EUR) that the bank details have been created for.
Fields and their data types for each `triggerReference.type`:
- `QUOTE` - `id` (uuid)
- `TRANSFER` - `id` (long)
- `ADD_MONEY` - `id` (long)
- `BANK_ACCOUNT_DETAILS` - `currencies` (list of string)
'
additionalProperties: true
example:
id: ba83a43a-f623-46f0-956d-196c13e2ab01
redirectUrl:
type:
- string
- 'null'
description: 'URL where the user will be redirected at the end of the flow. Can contain query params and path fragments. It has to be a valid URL as per [RFC 2396](https://www.ietf.org/rfc/rfc2396.txt). Provided by the caller in the [Update redirect URL](kycreviewredirecturlupdate) call.
'
example: https://example.com
requirements:
type:
- array
- 'null'
description: 'Nested list of [KYC Requirement](api-reference/kyc-review/kyc-requirement) objects in `[[Requirement]]` format, where each inner list represents a combination of possible requirements to be provided. To fulfil the whole KYC Review, at least one item from each inner list should be provided.
For example, if the requirements are `[[a, b], [c, d]]` then it should be read as `(a or b) and (c or d)`.
'
items:
type: array
items:
type: object
$ref: '#/components/schemas/kyc-requirement'
kyc-requirement:
title: KYC Requirement
description: An object returned as part of the [KYC Review](api-reference/kyc-review/kyc-review) object, which includes information about a required evidence, its state, and any additional information that might be required.
x-tags:
- kyc-review
type: object
properties:
key:
type: string
description: The name of the KYC requirement. A single KYC Requirement should appear in the requirements list at most once.
example: ID_DOCUMENT
state:
type: string
description: 'The state of the KYC requirement.
- `NOT_PROVIDED` — the information is pending. Either the Hosted KYC flow or [KYC Requirement Submit](kycreviewrequirementsubmit) endpoint should be used to fulfil the requirement.
- `IN_REVIEW` — the required information has been retrieved and the KYC requirement is being reviewed. No action is needed.
'
enum:
- NOT_PROVIDED
- IN_REVIEW
example: NOT_PROVIDED
apiCollectionSupported:
type: boolean
description: 'Indicates if the requirement can be provided via the [KYC Requirement Submit](kycreviewrequirementsubmit) endpoint. If `false`, the requirement should be provided via the Hosted KYC flow.
'
example: true
additionalRequirements:
type:
- array
- 'null'
description: 'List of additional submissions that are needed to fulfill this requirement. These can appear when the originally submitted evidence is a wrong document, wrong format, incomplete or otherwise insufficient. Only provided if not empty.
'
items:
type: object
properties:
additionalRequirementId:
type: string
format: uuid
description: Unique identifier for an additional requirement, generated by Wise.
example: 8b789c45-60ae-475d-b667-c8714db9a6a4
key:
type: string
description: A key outlining what type of evidence is additionally required
enum:
- ACKNOWLEDGEMENT,
- DOCUMENT
- WRITTEN_ANSWER
- DOCUMENT_AND_WRITTEN_ANSWER
- DOCUMENT_OR_WRITTEN_ANSWER
- EMAIL
- CUSTOM_REQUEST
example: DOCUMENT_OR_WRITTEN_ANSWER
state:
type: string
description: 'The state of the additional requirement. This state should be treated as independent of the parent KYC Requirement''s state. They can, but don''t have to, change together.
- `NOT_PROVIDED` — the information is pending. Either the Hosted KYC flow or [KYC Requirement Submit](kycreviewrequirementsubmit) endpoint should be used to fulfil the additional requirement.
- `IN_REVIEW` — the required information has been retrieved and the additional requirement is being reviewed. No action is needed.
'
enum:
- NOT_PROVIDED
- IN_REVIEW
example: NOT_PROVIDED
reasons:
type: object
description: Contains information about the reason this additional requirement has been requested.
properties:
errorCode:
type: string
description: Code for the reason this additional requirement has been requested.
enum:
- NEEDED
- WRONG_DOCUMENT
- EXPIRED
- INVALID_TRADING_ADDRESS
- MISSING_ONE_SIDE
- MISSING_COUNTRY_OF_RESIDENCE
- MISSING_DIRECTORS
- MISSING_UBOS
- NO_UBO_DOC_REQUIRED
- MISMATCH_NAME
- MISMATCH_DATE_OF_BIRTH
- AGENT_DETAILS_PROVIDED
- DIRECTOR_IS_BUSINESS
- UBO_IS_BUSINESS
- UNCLEAR
- WEBSITE_LINK_BROKEN
- BUSINESS_NAME_NOT_ON_WEBSITE
- DRIVING_LICENSE_NOT_ACCEPTED
- BUSINESS_NOT_REGISTERED
- OTHER
example: EXPIRED
description:
type: string
example: The provided document or information has expired. A valid document is required.
dateTime:
type: string
format: date-time
description: Timestamp marking when this additional requirement was requested.
example: '2026-04-13T10:54:21.929314'
attributes:
type: object
description: Contains metadata information about the additional requirement. Not returned if empty.
properties:
fields:
type: object
description: Not returned if empty
properties:
name:
type: string
description: The name of the affected person(s) or business
examples:
- John Smith
- Hannah Myers and John Smith
- My Business Inc.
website:
type: string
description: The URL of the affected website
examples:
- https://example.com
businessName:
type: string
description: The name of the affected business
examples:
- My Business Inc.
owningBusinessName:
type: string
description: The name of the affected owning business
examples:
- Owning Business Inc.
markdownText:
type: string
description: Free format text written by a Wise Agent in markdown format.
example: 'Requirement details were unclear, *please* provide a clear scan where:
* All information is clearly readable
* The document is in colour'
issues:
type: array
description: A list of issues with the previously uploaded document. Not returned if empty
items:
type: string
enum:
- CANNOT_BE_SCREENSHOT
- INCORRECT_FILE_FORMAT
- NEED_COLOUR_VERSION
- POOR_QUALITY
example:
- CANNOT_BE_SCREENSHOT
- NEED_COLOUR_VERSION
versions:
type: array
description: '**Conditional:** Only present when `apiCollectionSupported` is `true`. Lists the available versions and their validity.
'
items:
type: object
properties:
version:
type: string
description: The version identifier.
example: v1
validUntil:
type:
- string
- 'null'
format: date
description: If present, indicates the expiry date of this version (ISO 8601).
example: '2026-06-30'
securitySchemes:
UserToken:
type: http
scheme: bearer
bearerFormat: JWT
description: 'User Access Token for making API calls on behalf of a Wise user.
Can be obtained via two OAuth 2.0 flows:
- **registration_code grant**: For partners creating users via API
- **authorization_code grant**: For partners using Wise''s authorization page
Access tokens are valid for 12 hours and can be refreshed using a refresh token.
'
PersonalToken:
type: http
scheme: bearer
bearerFormat: JWT
description: 'Personal API Token for individual personal or small business users.
Generated from Wise.com > Settings > Connect and manage apps > API tokens.
Has limited API access compared to OAuth tokens (PSD2 restrictions apply for EU/UK users).
'
ClientCredentialsToken:
type: http
scheme: bearer
bearerFormat: JWT
description: 'Application-level token for partner operations that don''t require a specific user context, such as bulk settlement and card spend controls.
Obtained via `POST /oauth/token` with Basic Authentication (client-id:client-secret) and `grant_type=client_credentials`.
Valid for 12 hours. No refresh token — fetch a new token when expired.
See [create an OAuth token](/api-reference/oauth-token/oauthtokencreate) for details.
'
BasicAuth:
type: http
scheme: basic
description: 'Basic Authentication using your Client ID and Client Secret as the username and password.
Client credentials are provided by Wise when your partnership begins. See [Getting Started](/guides/developer) for details.
'
x-tagGroups:
- name: Authentication
tags:
- oauth-token
- name: Enhanced Security
tags:
- jose
- name: Users
tags:
- user
- claim-account
- name: Profiles
tags:
- profile
- activity
- address
- name: Verification
tags:
- kyc-review
- verification
- facetec
- name: Strong Customer Authentication
tags:
- sca-ott
- sca-sessions
- sca-pin
- sca-facemaps
- sca-device-fingerprints
- sca-otp
- user-security
- name: Balances
tags:
- balance
- balance-statement
- bank-account-details
- multi-currency-account
- name: Cards
tags:
- card
- card-sensitive-details
- 3ds
- card-kiosk-collection
- card-order
- card-transaction
- spend-limits
- spend-controls
- digital-wallet
- disputes
- name: Quotes
tags:
- quote
- rate
- comparison
- name: Recipients
tags:
- recipient
- contact
- name: Transfers
tags:
- transfer
- delivery-estimate
- currencies
- batch-group
- name: Funding
tags:
- payin-deposit-detail
- direct-debit-account
- bulk-settlement
- payins
- name: Webhooks
tags:
- webhook
- webhook-event
- name: Simulations
tags:
- simulation
- name: Partner Support
tags:
- case