diff --git a/.stainless/stainless.yml b/.stainless/stainless.yml index 781afc91..ac980ca9 100644 --- a/.stainless/stainless.yml +++ b/.stainless/stainless.yml @@ -209,6 +209,7 @@ resources: external_account: '#/components/schemas/ExternalAccount' external_account_create: '#/components/schemas/ExternalAccountCreateRequest' external_account_info_one_of: "#/components/schemas/ExternalAccountInfoOneOf" + custody_type: "#/components/schemas/CustodyType" business_beneficiary: "#/components/schemas/BusinessBeneficiary" # Ownership verification (challenge/verify) ownership_verification_method: "#/components/schemas/OwnershipVerificationMethod" diff --git a/mintlify/openapi.yaml b/mintlify/openapi.yaml index c024979a..e2107ba8 100644 --- a/mintlify/openapi.yaml +++ b/mintlify/openapi.yaml @@ -12215,6 +12215,7 @@ components: | CARDHOLDER_KYC_NOT_APPROVED | The cardholder's KYC status is not `APPROVED`, so a card cannot be issued | | TRANSACTION_SIZE_LIMIT_EXCEEDED | The requested amount exceeds the configured maximum single-transaction amount for this trade corridor or withdrawal currency | | EXTERNAL_ACCOUNT_VERIFICATION_REQUIRED | The destination account's ownership must be verified before this transfer can proceed | + | COUNTERPARTY_USER_INFO_REQUIRED | The destination account needs beneficiary information before this transfer can proceed; update the external account with a `beneficiary` and retry | enum: - INVALID_INPUT - END_USER_TERMS_VERSION_NOT_FOUND @@ -12259,6 +12260,7 @@ components: - CARDHOLDER_KYC_NOT_APPROVED - TRANSACTION_SIZE_LIMIT_EXCEEDED - EXTERNAL_ACCOUNT_VERIFICATION_REQUIRED + - COUNTERPARTY_USER_INFO_REQUIRED message: type: string description: Error message @@ -17248,6 +17250,13 @@ components: - THIRD_PARTY description: Whether the external account belongs to the customer themselves (`FIRST_PARTY`) or to someone else (`THIRD_PARTY`). Required when creating self-custody crypto wallet external accounts on platforms subject to counterparty requirements — for example, under the EU Travel Rule or similar requirements in other regions; recommended for all other accounts, where providing it can unlock additional capabilities and smoother compliance handling. example: FIRST_PARTY + CustodyType: + type: string + enum: + - SELF_CUSTODY + - VASP_HOSTED + description: 'How a crypto wallet external account is custodied: `SELF_CUSTODY` for a wallet whose keys the owner controls directly, or `VASP_HOSTED` for an account held at a Virtual Asset Service Provider (an exchange or other custodial platform). Only relevant for crypto wallet accounts; defaults to `SELF_CUSTODY`. Ownership verification applies only to `SELF_CUSTODY` wallets — `VASP_HOSTED` accounts never require it.' + example: SELF_CUSTODY BeneficiaryVerificationStatus: type: string enum: @@ -19620,6 +19629,12 @@ components: example: acc_123456789 ownershipType: $ref: '#/components/schemas/OwnershipType' + custodyType: + $ref: '#/components/schemas/CustodyType' + vaspName: + type: string + description: Canonical name of the VASP that custodies this account, from the VASP directory (`GET /vasps`). Only present when `custodyType` is `VASP_HOSTED`. + example: Kraken currency: type: string description: The ISO 4217 currency code @@ -20534,6 +20549,12 @@ components: example: ext_acc_123456 ownershipType: $ref: '#/components/schemas/OwnershipType' + custodyType: + $ref: '#/components/schemas/CustodyType' + vaspName: + type: string + description: Canonical name of the VASP that custodies this account, from the VASP directory (`GET /vasps`). Required when `custodyType` is `VASP_HOSTED`; must be omitted otherwise. + example: Kraken defaultUmaDepositAccount: type: boolean description: Whether to set the external account as the default UMA deposit account. When set to true, incoming payments to this customer's UMA address will be automatically deposited into this external account. False if not provided. Note that only one external account can be set as the default UMA deposit account for a customer, so if there is already a default UMA deposit account, this will override the existing default UMA deposit account. If there is no default UMA deposit account, incoming UMA payments will be deposited into the primary internal account for the customer. diff --git a/openapi.yaml b/openapi.yaml index c024979a..e2107ba8 100644 --- a/openapi.yaml +++ b/openapi.yaml @@ -12215,6 +12215,7 @@ components: | CARDHOLDER_KYC_NOT_APPROVED | The cardholder's KYC status is not `APPROVED`, so a card cannot be issued | | TRANSACTION_SIZE_LIMIT_EXCEEDED | The requested amount exceeds the configured maximum single-transaction amount for this trade corridor or withdrawal currency | | EXTERNAL_ACCOUNT_VERIFICATION_REQUIRED | The destination account's ownership must be verified before this transfer can proceed | + | COUNTERPARTY_USER_INFO_REQUIRED | The destination account needs beneficiary information before this transfer can proceed; update the external account with a `beneficiary` and retry | enum: - INVALID_INPUT - END_USER_TERMS_VERSION_NOT_FOUND @@ -12259,6 +12260,7 @@ components: - CARDHOLDER_KYC_NOT_APPROVED - TRANSACTION_SIZE_LIMIT_EXCEEDED - EXTERNAL_ACCOUNT_VERIFICATION_REQUIRED + - COUNTERPARTY_USER_INFO_REQUIRED message: type: string description: Error message @@ -17248,6 +17250,13 @@ components: - THIRD_PARTY description: Whether the external account belongs to the customer themselves (`FIRST_PARTY`) or to someone else (`THIRD_PARTY`). Required when creating self-custody crypto wallet external accounts on platforms subject to counterparty requirements — for example, under the EU Travel Rule or similar requirements in other regions; recommended for all other accounts, where providing it can unlock additional capabilities and smoother compliance handling. example: FIRST_PARTY + CustodyType: + type: string + enum: + - SELF_CUSTODY + - VASP_HOSTED + description: 'How a crypto wallet external account is custodied: `SELF_CUSTODY` for a wallet whose keys the owner controls directly, or `VASP_HOSTED` for an account held at a Virtual Asset Service Provider (an exchange or other custodial platform). Only relevant for crypto wallet accounts; defaults to `SELF_CUSTODY`. Ownership verification applies only to `SELF_CUSTODY` wallets — `VASP_HOSTED` accounts never require it.' + example: SELF_CUSTODY BeneficiaryVerificationStatus: type: string enum: @@ -19620,6 +19629,12 @@ components: example: acc_123456789 ownershipType: $ref: '#/components/schemas/OwnershipType' + custodyType: + $ref: '#/components/schemas/CustodyType' + vaspName: + type: string + description: Canonical name of the VASP that custodies this account, from the VASP directory (`GET /vasps`). Only present when `custodyType` is `VASP_HOSTED`. + example: Kraken currency: type: string description: The ISO 4217 currency code @@ -20534,6 +20549,12 @@ components: example: ext_acc_123456 ownershipType: $ref: '#/components/schemas/OwnershipType' + custodyType: + $ref: '#/components/schemas/CustodyType' + vaspName: + type: string + description: Canonical name of the VASP that custodies this account, from the VASP directory (`GET /vasps`). Required when `custodyType` is `VASP_HOSTED`; must be omitted otherwise. + example: Kraken defaultUmaDepositAccount: type: boolean description: Whether to set the external account as the default UMA deposit account. When set to true, incoming payments to this customer's UMA address will be automatically deposited into this external account. False if not provided. Note that only one external account can be set as the default UMA deposit account for a customer, so if there is already a default UMA deposit account, this will override the existing default UMA deposit account. If there is no default UMA deposit account, incoming UMA payments will be deposited into the primary internal account for the customer. diff --git a/openapi/components/schemas/errors/Error400.yaml b/openapi/components/schemas/errors/Error400.yaml index 8af97d75..044f412a 100644 --- a/openapi/components/schemas/errors/Error400.yaml +++ b/openapi/components/schemas/errors/Error400.yaml @@ -57,6 +57,7 @@ properties: | CARDHOLDER_KYC_NOT_APPROVED | The cardholder's KYC status is not `APPROVED`, so a card cannot be issued | | TRANSACTION_SIZE_LIMIT_EXCEEDED | The requested amount exceeds the configured maximum single-transaction amount for this trade corridor or withdrawal currency | | EXTERNAL_ACCOUNT_VERIFICATION_REQUIRED | The destination account's ownership must be verified before this transfer can proceed | + | COUNTERPARTY_USER_INFO_REQUIRED | The destination account needs beneficiary information before this transfer can proceed; update the external account with a `beneficiary` and retry | enum: - INVALID_INPUT - END_USER_TERMS_VERSION_NOT_FOUND @@ -101,6 +102,7 @@ properties: - CARDHOLDER_KYC_NOT_APPROVED - TRANSACTION_SIZE_LIMIT_EXCEEDED - EXTERNAL_ACCOUNT_VERIFICATION_REQUIRED + - COUNTERPARTY_USER_INFO_REQUIRED message: type: string description: Error message diff --git a/openapi/components/schemas/external_accounts/CustodyType.yaml b/openapi/components/schemas/external_accounts/CustodyType.yaml new file mode 100644 index 00000000..8197cd50 --- /dev/null +++ b/openapi/components/schemas/external_accounts/CustodyType.yaml @@ -0,0 +1,12 @@ +type: string +enum: + - SELF_CUSTODY + - VASP_HOSTED +description: >- + How a crypto wallet external account is custodied: `SELF_CUSTODY` for a + wallet whose keys the owner controls directly, or `VASP_HOSTED` for an + account held at a Virtual Asset Service Provider (an exchange or other + custodial platform). Only relevant for crypto wallet accounts; defaults to + `SELF_CUSTODY`. Ownership verification applies only to `SELF_CUSTODY` + wallets — `VASP_HOSTED` accounts never require it. +example: SELF_CUSTODY diff --git a/openapi/components/schemas/external_accounts/ExternalAccount.yaml b/openapi/components/schemas/external_accounts/ExternalAccount.yaml index 08449b83..1410d929 100644 --- a/openapi/components/schemas/external_accounts/ExternalAccount.yaml +++ b/openapi/components/schemas/external_accounts/ExternalAccount.yaml @@ -24,6 +24,15 @@ allOf: example: acc_123456789 ownershipType: $ref: ./OwnershipType.yaml + custodyType: + $ref: ./CustodyType.yaml + vaspName: + type: string + description: >- + Canonical name of the VASP that custodies this account, from the + VASP directory (`GET /vasps`). Only present when `custodyType` is + `VASP_HOSTED`. + example: Kraken currency: type: string description: The ISO 4217 currency code diff --git a/openapi/components/schemas/external_accounts/ExternalAccountCreateRequest.yaml b/openapi/components/schemas/external_accounts/ExternalAccountCreateRequest.yaml index b97ace94..40792175 100644 --- a/openapi/components/schemas/external_accounts/ExternalAccountCreateRequest.yaml +++ b/openapi/components/schemas/external_accounts/ExternalAccountCreateRequest.yaml @@ -20,6 +20,15 @@ allOf: example: ext_acc_123456 ownershipType: $ref: ./OwnershipType.yaml + custodyType: + $ref: ./CustodyType.yaml + vaspName: + type: string + description: >- + Canonical name of the VASP that custodies this account, from the + VASP directory (`GET /vasps`). Required when `custodyType` is + `VASP_HOSTED`; must be omitted otherwise. + example: Kraken defaultUmaDepositAccount: type: boolean description: >-