---
title: "Set up crypto external account verification"
method: PUT
path: "/core/external-accounts/{externalAccountId}/verifications/{level}"
tags: ["External accounts"]
---

# Set up crypto external account verification

`PUT /core/external-accounts/{externalAccountId}/verifications/{level}`

## Request

- Base URL: `https://api.enterprise.sandbox.uphold.com`
- URL: `https://api.enterprise.sandbox.uphold.com/core/external-accounts/{externalAccountId}/verifications/{level}`
- Auth: OAuth 2
  - Client credentials
  - Token URL: `/core/oauth2/token` scopes: `core.external-accounts:update`, `core.requests-for-information:read`
- TypeScript: <https://skmtc.dev/uphold/apis/core-api/docs/core/external-accounts/:externalAccountId/verifications/:level/put.ts> (a function with typed inputs; its response is checked against the schema)

Sets up a single-level verification process for a crypto external account.

## Path parameters

- `externalAccountId` string, uuid, required
- `level` 'declared' | 'verified', required

## Headers

- `X-On-Behalf-Of` string
- `X-Uphold-User-Ip` union
  - string, ipv4
  - string, ipv6
- `X-Uphold-User-Agent` string
- `X-Uphold-User-Origin` string
- `X-Uphold-User-Country` string
- `X-Uphold-User-Subdivision` string
- `X-Uphold-User-City` string

## Response `200`

Verification set up or initiated.

- object
  - `verification` object, required
    - `via` 'request-for-information', required: The method through which the verification is tracked.
    - `level` 'declared' | 'verified', required: The level of the verification.
    - `status` 'pending' | 'completed' | 'failed', required: The status of the verification.
    - `completedAt` string, date-time: The time at which the verification was completed.
    - `requestForInformation` union, required
      - RequestForInformationTravelRule: The request for information to obtain travel rule details when they are missing or insufficient.
        - `id` string, required: The id of the RFI.
        - `type` 'travel-rule', required: The type of the RFI.
        - `status` 'ok' | 'pending' | 'failed', required: The status of the RFI.
        - `expiresAt` string, date-time: The date and time when the RFI expires.
        - `context` object, required: The context of this RFI.
          - `network` string, required
          - `addresses` string[], required
        - `proofOptions` object, required: The proof mechanisms available to resolve this RFI.
          - `selfDeclaration` object: The self-declaration proof requirements.
            - `schema` object: The JSON Schema describing which fields are required.
          - `messageSigning` object: The message signing proof requirements.
            - `schema` object: The JSON Schema describing which fields are required.
            - `message` string: The exact message to sign.
          - `satoshiTest` object: The Satoshi test proof requirements.
            - `address` string, required: The address to send the deposit to.
            - `asset` string, required: The asset to send.
            - `amount` string, required: The exact amount to send, in the asset's standard denomination.
            - `amountSubunits` string, required: The exact amount to send, in the asset's smallest subunit.
            - `decimals` integer: The number of decimal places used to convert between `amount` and `amountSubunits`.
            - `reference` string: An optional destination tag/memo required by some networks.
        - `proof` object: The provided travel rule information.
          - `originatorProof` union
            - RequestForInformationSelfDeclarationProof: The provided self-declaration proof.
              - …
            - RequestForInformationMessageSigningProof: The provided message signing proof.
              - …
            - RequestForInformationSatoshiTestProof: The provided Satoshi test proof.
              - …
          - `beneficiaryProof` union
            - RequestForInformationSelfDeclarationProof: The provided self-declaration proof.
              - …
            - RequestForInformationMessageSigningProof: The provided message signing proof.
              - …
            - RequestForInformationSatoshiTestProof: The provided Satoshi test proof.
              - …
      - RequestForInformationCryptoAddressTravelRule: The request for information to obtain basic self-declaration for an external account's crypto address.
        - `id` string, required: The id of the RFI.
        - `type` 'crypto-address-travel-rule', required: The type of the RFI.
        - `status` 'ok' | 'pending' | 'failed', required: The status of the RFI.
        - `expiresAt` string, date-time: The date and time when the RFI expires.
        - `context` object, required: The context of this RFI.
          - `network` string, required
          - `addresses` string[], required
        - `proofOptions` object, required: The proof mechanisms available to resolve this RFI.
          - `selfDeclaration` object: The self-declaration proof requirements.
            - `schema` object: The JSON Schema describing which fields are required.
          - `messageSigning` object: The message signing proof requirements.
            - `schema` object: The JSON Schema describing which fields are required.
            - `message` string: The exact message to sign.
          - `satoshiTest` object: The Satoshi test proof requirements.
            - `address` string, required: The address to send the deposit to.
            - `asset` string, required: The asset to send.
            - `amount` string, required: The exact amount to send, in the asset's standard denomination.
            - `amountSubunits` string, required: The exact amount to send, in the asset's smallest subunit.
            - `decimals` integer: The number of decimal places used to convert between `amount` and `amountSubunits`.
            - `reference` string: An optional destination tag/memo required by some networks.
        - `proof` object: The provided basic self-declaration.
          - `isVASP` boolean, required
          - `isSelfHostedWallet` boolean, required
          - `isSelfOwnedCryptoAddress` boolean, required
          - `isBusiness` boolean
          - `name` object
      - RequestForInformationCryptoAddressVerification: The request for information to obtain proof of ownership for an external account's crypto address.
        - `id` string, required: The id of the RFI.
        - `type` 'crypto-address-verification', required: The type of the RFI.
        - `status` 'ok' | 'pending' | 'failed', required: The status of the RFI.
        - `expiresAt` string, date-time: The date and time when the RFI expires.
        - `context` object, required: The context of this RFI.
          - `network` string, required
          - `addresses` string[], required
        - `proofOptions` object, required: The proof mechanisms available to resolve this RFI.
          - `selfDeclaration` object: The self-declaration proof requirements.
            - `schema` object: The JSON Schema describing which fields are required.
          - `messageSigning` object: The message signing proof requirements.
            - `schema` object: The JSON Schema describing which fields are required.
            - `message` string: The exact message to sign.
          - `satoshiTest` object: The Satoshi test proof requirements.
            - `address` string, required: The address to send the deposit to.
            - `asset` string, required: The asset to send.
            - `amount` string, required: The exact amount to send, in the asset's standard denomination.
            - `amountSubunits` string, required: The exact amount to send, in the asset's smallest subunit.
            - `decimals` integer: The number of decimal places used to convert between `amount` and `amountSubunits`.
            - `reference` string: An optional destination tag/memo required by some networks.
        - `proof` union
          - RequestForInformationMessageSigningProof: The provided message signing proof.
            - `type` 'bip-137' | 'bip-322' | 'cip-8' | 'concordium' | 'cosmos-ecdsa' | 'ed25519' | 'eip-1271' | 'eip-191' | 'eip-712' | 'siwe' | 'siwx' | 'sol-siwx' | 'sr25519' | 'tip-191' | 'xlm-ed25519' | 'xpub' | 'xrp-ed25519', required: The specific signing scheme used.
            - `address` string
            - `attestation` string
            - `proof` string
          - RequestForInformationSatoshiTestProof: The provided Satoshi test proof.
            - `type` 'satoshi-test', required
            - `proof` string

## Other responses

- `201`: Verification set up or initiated.
- `400`: Bad Request.
- `401`: Unauthorized.
- `403`: Forbidden.
- `404`: Resource not found.
- `409`: Business logic error.
- `429`: Too Many Requests.

---

[API](https://skmtc.dev/uphold/apis/core-api.md) - [All operations](https://skmtc.dev/uphold/apis/core-api/llms.txt) - [OpenAPI document](https://skmtc.dev/uphold/apis/core-api/revisions/6c663575c57a?raw)
