Skip to content

API Integration

In addition to a Wallet Verification Widget, CryptoSwift also provides full API support for self-hosted wallet verification. This means that all functionalities available using the Widget are also available using our REST API. This allows you to build a custom widget and/or cover custom wallet verification scenarios where needed (eg native mobile application integration).

Cryptographic Signature Proofs

Cryptographic signature proofs are widely recognized as the industry standard for verifying wallet ownership. This method involves the user signing an off-chain message using their private keys, which can then be validated against their blockchain address. This process provides cryptographic assurance that the user controls the private keys for the wallet to which they intend to transfer funds.

CryptoSwift strongly advocates for the use of open-source, industry-standard solutions for signature proofs. Among the available options, Wallet Connect (now known as Reown) stands out as the most robust solution, offering the broadest wallet compatibility. It supports over 450 different wallets across various networks (Bitcoin, Ethereum, Solana, Optimism, Arbitrum, Base, Polygon, BNB, Avalanche, and Cosmos, among others). You can see the list of all supported wallets here.

Visit Reown or explore the Reown docs to get started.

Integration

You can currently set up a direct integration with Reown to store the verification data for a self-hosted wallet.

Also see the web-based Wallet Connect demo.

Once verification is successfully completed, you should send a request to the CryptoSwift API:

curl --location 'https://api.cryptoswift.eu/wallet-verification/signature-proof' \
--header 'x-api-key: a70fcedf-416b-4f83-845c-a05aba0d7da4' \
--header 'Content-Type: application/json' \
--data '{
  "withdrawalAddress": "0x32Be343B94f860124dC4fEe278FDCBD38C102D88",
  "withdrawalMetadata": "be0bf82b-426e-40a6-a4e5-09800db30908",
  "asset": "ETH",
  "blockchain": "Ethereum",
  "signedMessage": "app.cryptoswift.eu:8080 wants you to sign in with your **blockchain** account:\n0x32Be343B94f860124dC4fEe278FDCBD38C102D88\n\nURI:https://app.cryptoswift.eu:8080/\nVersion: 1\nChain ID: eip155:1\nNonce: 1961\nIssued At: 2025-05-30 12:49:49",
  "signature": "q7XUz9XJbWjK9YO2iA8eW3OmEDCuqKDG12tzmPVNlDb9X6G6MxwGqv8J8B4gEZq43vU3D9VaGRKqB1wnyCrR7A=",
  "origin": "https://app.cryptoswift.eu:8080"
}'

Mandatory fields:

  • withdrawalAddress: Self-hosted wallet address to verify
  • asset: The virtual asset
  • blockchain: The blockchain
  • signedMessage: The original signed message to prove wallet ownership, please note the message must contain domain, chain id and issued at fields as shown in the example above.
  • signature: The cryptographic signature of the message
  • origin: The origin <scheme>://<hostname>[:<port>] that will be used while validating the signature

Optional fields:

  • withdrawalMetadata: Metadata to identify the wallet or user outside of the CryptoSwift system

More details: API documentation

Micro Transactions (Satoshi Test)

A Satoshi test is a verification method where a specific amount of cryptocurrency is sent from the destination wallet address within a designated time frame to verify ownership and control of the private keys. The CryptoSwift API supports this method.

Please ensure you set up a webhook before initiating a Satoshi test verification.

1. Send a Verification Request

curl --location 'https://api.cryptoswift.eu/wallet-verification/satoshi-test' \
--header 'x-api-key: a70fcedf-416b-4f83-845c-a05aba0d7da4' \
--header 'Content-Type: application/json' \
--data '{
    "withdrawalAddress": "BsRdeZ75szhDiGN8hJs8v8PcqwBm7KsFcp",
    "withdrawalMetadata": "505b5625-fd42-4c03-911b-2310ea14b76a",
    "depositAddress": "bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kygt080",
    "asset": "BTC"
}'

Mandatory fields:

  • withdrawalAddress
  • depositAddress
  • asset: Must be one of BTC, DASH, DOGE, LTC
  • blockchain

Optional fields:

  • amount: If not provided, a random value will be generated
  • withdrawalMetadata

2. Share Verification Details

The response includes:

  • verificationRequestId
  • asset, amount, withdrawalAddress, depositAddress
  • status, statusReasoning, verifiedTransactionHash, createdAt, updatedAt

Share the depositAddress, asset, and amount with the wallet owner. The verification expires after 48 hours from the createdAt timestamp.

3. Receive Notification via Webhook

Webhook header: X-Event-Type: 'wallet-verification'

Example success payload:

{
    ...
    "verificationRequestId": "53c8264f-5632-4ed2-b93e-42aa0bcd5830",
    "status": "VERIFIED",
    "verifiedTransactionHash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
    ...
}

More details: API documentation

Wallet Screenshots

This method involves uploading a screenshot as proof of ownership.

1. Send a Verification Request

curl --location 'https://api.cryptoswift.eu/wallet-verification/visual-proof' \
--header 'x-api-key: a70fcedf-416b-4f83-845c-a05aba0d7da4' \
--form 'file=@"../Visual Proof.pdf"' \
--form 'withdrawalAddress="bc1q7jxz3fgnzm9wp6t8qn8ekq09l8gwux5zft90je"' \
--form 'asset="BTC"'

Mandatory fields:

  • file: JPEG, PNG, JPG, or PDF up to 5MB
  • withdrawalAddress
  • asset
  • blockchain

Optional fields:

  • withdrawalMetadata

2. Approve the Verification Request

curl --location --request PATCH 'https://api.cryptoswift.eu/wallet-verification/2770f7b9-3397-44d7-88c7-d7642be38329' \
--header 'x-api-key: a70fcedf-416b-4f83-845c-a05aba0d7da4' \
--header 'Content-Type: application/json' \
--data '{"status":"VERIFIED", "statusReasoning": "Manual approval", "withdrawalMetadata": "Any related metadata" }'

Mandatory fields:

  • status: PENDING, VERIFIED, FAILED, or DELETED

Optional fields:

  • statusReasoning, withdrawalMetadata

More details: API documentation

Self-Declaration

This method allows users to self-declare wallet ownership with a checkbox.

curl --location 'https://api.cryptoswift.eu/wallet-verification/self-declared' \
--header 'x-api-key: a70fcedf-416b-4f83-845c-a05aba0d7da4' \
--header 'Content-Type: application/json' \
--data '{
    "withdrawalAddress": "BsRdeZ75szhDiGN8hJs8v8PcqwBm7KsFcp",
    "withdrawalMetadata": "05b5625-fd42-4c03-911b-2310ea14b76a",
    "approved": true,
    "asset": "BTC"
}'

Mandatory fields:

  • withdrawalAddress
  • asset
  • blockchain
  • approved: Must be true

Optional fields:

  • withdrawalMetadata

The request will be verified immediately.

More details: API documentation

Next steps