CryptoConnect Integration for MoR Mode

• This guide provides the end-to-end workflow for MOR mode integration with CryptoConnect.

• Before starting the integration, confirm your operating model: MoR (Merchant of Record) or Gateway Mode. Refer to the official documentation for guidance: Determine Your Integration Model.


Generate a Wallet Address

This section explains how to generate and retrieve crypto wallet addresses for your users, which is the first step in enabling crypto deposits.

Step 1 — Create a new wallet

Use the Create a wallet API to generate a new CryptoConnect wallet for a user. This API returns a unique wallet ID that will be used in all subsequent operations.

💡

Tip: You can assign a nickname to the wallet during creation to simplify management.

Request Example

# Replace ${YOUR_API_ACCESS_TOKEN} with your API access token.
curl --request POST \
     --url https://api-sandbox.interlace.money/open-api/v3/cryptoconnect/wallets \
     --header 'accept: application/json' \
     --header 'content-type: application/json' \
     --header 'x-access-token: ${YOUR_API_ACCESS_TOKEN}' \
     --data '{
         "referenceId": "92a86ee7-5bb7-4272-afdb-3865bea9a2d5",
         "accountId": "b27c8873-e400-47cd-adc1-035cfa0d5347",
         "nickname": "Developer"
     }'

Response Example

{
    "code": "000000",
    "message": "success",
    "data": {
        "id": "60c667cd-06f4-48c0-85ca-24e570097685",
        "referenceId": "92a86ee7-5bb7-4272-afdb-3865bea9a2d5",
        "accountId": "b27c8873-e400-47cd-adc1-035cfa0d5347",
        "nickname": "Developer",
        "master": false,
        "balances": [
            {
                "currency": "USDC",
                "available": "0",
                "frozen": "0"
            },
            {
                "currency": "USDT",
                "available": "0",
                "frozen": "0"
            }
        ],
        "addresses": []
    }
}

Step 2 — Get a wallet address

Use the Get a wallet API to fetch wallet details, including balance and available addresses.

⚠️

Note: The request must include the wallet ID parameter.

Request Example

# Replace ${YOUR_API_ACCESS_TOKEN} with your API access token.
curl --request GET \
     --url https://api-sandbox.interlace.money/open-api/v3/cryptoconnect/wallets/60c667cd-06f4-48c0-85ca-24e570097685 \
     --header 'accept: application/json' \
     --header 'x-access-token: ${YOUR_API_ACCESS_TOKEN}'

Response Example

{
    "code": "000000",
    "message": "success",
    "data": {
        "id": "60c667cd-06f4-48c0-85ca-24e570097685",
        "referenceId": "92a86ee7-5bb7-4272-afdb-3865bea9a2d5",
        "accountId": "b27c8873-e400-47cd-adc1-035cfa0d5347",
        "nickname": "Developer",
        "master": false,
        "balances": [
            {
                "currency": "USDC",
                "available": "0",
                "frozen": "0"
            },
            {
                "currency": "USDT",
                "available": "0",
                "frozen": "0"
            }
        ],
        "addresses": []
    }
}

Step 3 — Generate an additional address (optional)

If no address is available, or if you need an address on a different blockchain, use the Create a blockchain address API to generate a new one.

Request Example

# Replace ${YOUR_API_ACCESS_TOKEN} with your API access token.
curl --request POST \
     --url https://api-sandbox.interlace.money/open-api/v3/cryptoconnect/wallets/60c667cd-06f4-48c0-85ca-24e570097685/addresses \
     --header 'accept: application/json' \
     --header 'content-type: application/json' \
     --header 'x-access-token: ${YOUR_API_ACCESS_TOKEN}' \
     --data '{
         "currency": "USDC",
         "chain": "ETH"
     }'

Response Example

{
    "code": "000000",
    "message": "success",
    "data": {
        "currency": "USDC",
        "chain": "ETH",
        "address": "0xd8b5f8e714d70e5cff389c5c2bf51d27e61c92c2",
        "selected": true
    }
}

Deposit Crypto to Infinity Account

After receiving the deposit webhook notification, use the Intra-account business transfer API to move USD/USDC/USDT/WUSD into your Infinity Account.

Step 1 — Get infinity account wallet

Use the List wallets API to retrieve details for wallets associated with an Infinity Account.

Request Example

# Replace ${YOUR_API_ACCESS_TOKEN} with your API access token.
curl --request GET \
     --url https://api-sandbox.interlace.money/open-api/v3/cards/wallets?accountId=b27c8873-e400-47cd-adc1-035cfa0d5347&walletType=0 \
     --header 'accept: application/json' \
     --header 'content-type: application/json' \
     --header 'x-access-token: ${YOUR_API_ACCESS_TOKEN}'

Response Example

{
    "code": "000000",
    "message": "success",
    "data": {
        "list": [
            {
                "id": "63b2af21-1e8c-407b-8df9-10adc05963aa",
                "accountId": "b27c8873-e400-47cd-adc1-035cfa0d5347",
                "createTime": "1700620189590",
                "currency": "USD",
                "walletType": 0,
                "available": "56846.52"
            }
        ],
        "total": "1"
    }
}

Step 2 — Deposit Crypto to Infinity Account

use the Intra-account business transfer API to move USD/USDC/USDT/WUSD into your Infinity Account.

Request Example

# Replace ${YOUR_API_ACCESS_TOKEN} with your API access token.
curl --request POST \
     --url https://api-sandbox.interlace.money/open-api/v3/business/transfer/internal \
     --header 'accept: application/json' \
     --header 'content-type: application/json' \
     --header 'x-access-token: ${YOUR_API_ACCESS_TOKEN}' \
     --data '{
         "clientTransactionId": "a0f57479-8218-4844-bec6-e819a38af55a",
         "accountId": "b27c8873-e400-47cd-adc1-035cfa0d5347",
         "from": {
             "businessType": 2,
             "id": "32aae8b7-4a69-474f-b7d5-337e190af878",
             "currency": "USDC"
         },
         "to": {
             "businessType": 0,
             "currency": "USD",
             "id": "63b2af21-1e8c-407b-8df9-10adc05963aa"
         },
         "amount": "10"
     }'

Response Example

{
    "code": "000000",
    "message": "success",
    "data": {
        "clientTransactionId": "a0f57479-8218-4844-bec6-e819a38af55a",
        "id": "1986315238040416258",
        "status": "CLOSED",
        "accountTransferType": "SAME_ACCOUNT",
        "from": {
            "id": "32aae8b7-4a69-474f-b7d5-337e190af878",
            "transferId": "33dd4cfb-ab69-4fd3-b472-358c89f2acb9",
            "accountId": "b27c8873-e400-47cd-adc1-035cfa0d5347",
            "amount": "10",
            "rate": 1.00,
            "currency": "USDC",
            "businessType": 2,
            "fees": [
                {
                    "feeType": 6,
                    "amount": "0.05",
                    "currency": "USDC"
                }
            ]
        },
        "to": {
            "id": "63b2af21-1e8c-407b-8df9-10adc05963aa",
            "transferId": "bf7dc081-947e-4eb7-96a2-06fa249516e8",
            "accountId": "b27c8873-e400-47cd-adc1-035cfa0d5347",
            "amount": "9.95",
            "currency": "USD",
            "businessType": 0,
            "fees": [
                {
                    "feeType": 0,
                    "amount": "0",
                    "currency": "USD"
                }
            ]
        }
    }
}


Convert & Withdraw Crypto (Redemption and Withdrawal)

To withdraw funds from your Infinity Account to an external wallet, follow these steps.

Step 1 — Move USD from Infinity Account to CryptoConnect Wallet

Use the Intra-account business transfer API to transfer USD from your Infinity Account into your CryptoConnect Wallet.

Request Example

# Replace ${YOUR_API_ACCESS_TOKEN} with your API access token.
curl --request POST \
     --url https://api-sandbox.interlace.money/open-api/v3/business/transfer/internal \
     --header 'accept: application/json' \
     --header 'content-type: application/json' \
     --header 'x-access-token: ${YOUR_API_ACCESS_TOKEN}' \
     --data '{
         "clientTransactionId": "24ec3603-293b-4f53-8d4d-ed68a3e40828",
         "accountId": "b27c8873-e400-47cd-adc1-035cfa0d5347",
         "from": {
             "businessType": 0,
             "currency": "USD",
             "id": "63b2af21-1e8c-407b-8df9-10adc05963aa"
         },
         "to": {
             "businessType": 2,
             "id": "b27c8873-e400-47cd-adc1-035cfa0d5347",
             "currency": "USD"
         },
         "amount": "10"
     }'

Response Example

{
    "code": "000000",
    "message": "success",
    "data": {
        "clientTransactionId": "24ec3603-293b-4f53-8d4d-ed68a3e40828",
        "id": "1986330518716162050",
        "status": "CLOSED",
        "accountTransferType": "SAME_ACCOUNT",
        "from": {
            "id": "63b2af21-1e8c-407b-8df9-10adc05963aa",
            "transferId": "984ccaad-b018-42cf-acc7-c1a74ec85fd9",
            "accountId": "b27c8873-e400-47cd-adc1-035cfa0d5347",
            "amount": "10",
            "rate": 1,
            "currency": "USD",
            "businessType": 0,
            "fees": [
                {
                    "feeType": 0,
                    "amount": "0",
                    "currency": "USD"
                }
            ]
        },
        "to": {
            "id": "b27c8873-e400-47cd-adc1-035cfa0d5347",
            "transferId": "0875ddd2-d375-4d70-9204-ab6a681a99c7",
            "accountId": "b27c8873-e400-47cd-adc1-035cfa0d5347",
            "amount": "10",
            "currency": "USD",
            "businessType": 2,
            "fees": []
        }
    }
}

Step 2 — Preview exchange rates and fees (optional)

Use the Get an estimate quote API to check rates and fees before conversion.

📘

Note: If skipped, the system will automatically request a quote in Step 3.

Request Example

# Replace ${YOUR_API_ACCESS_TOKEN} with your API access token.
curl --request POST \
     --url https://api-sandbox.interlace.money/open-api/v3/cryptoconnect/convert/estimate-quote \
     --header 'accept: application/json' \
     --header 'content-type: application/json' \
     --header 'x-access-token: ${YOUR_API_ACCESS_TOKEN}' \
     --data '{
         "accountId": "b27c8873-e400-47cd-adc1-035cfa0d5347",
         "baseCurrency": "USDC",
         "quoteCurrency": "USD",
         "side": "BUY",
         "rfqCurrency": "USD",
         "rfqAmount": "10"
     }'

Response Example

{
    "code": "000000",
    "message": "success",
    "data": {
        "id": "4ee15a1c-ade4-4e99-9222-661f33c0a7fe",
        "quoteTime": "1762413531106",
        "baseCurrency": "USDC",
        "baseAmount": "9.95",
        "quoteCurrency": "USD",
        "quoteAmount": "10",
        "side": "BUY",
        "rate": "1",
        "rfqAmount": "10",
        "rfqCurrency": "USD",
        "fee": "0.05",
        "feeCurrency": "USD",
        "ttlMs": "60000"
    }
}

Step 3 — Convert USD to Crypto

Use the Create a trade API to exchange USD for USDC/USDT/WUSD.

📘

Note:

  • Currently only conversions between USD ↔ USDC/USDT/WUSD and USDC ↔ USDT are supported.
  • For detailed instructions on using this endpoint, please refer to our official guide: Converting USD to Cryptocurrency

Request Example

# Replace ${YOUR_API_ACCESS_TOKEN} with your API access token.
curl --request POST \
     --url https://api-sandbox.interlace.money/open-api/v3/cryptoconnect/convert/trades \
     --header 'accept: application/json' \
     --header 'content-type: application/json' \
     --header 'x-access-token: ${YOUR_API_ACCESS_TOKEN}' \
     --data '{
         "referenceId": "590a3852-f1aa-494f-a6d5-a3d13a715f70",
         "accountId": "b27c8873-e400-47cd-adc1-035cfa0d5347",
         "baseCurrency": "USDC",
         "quoteCurrency": "USD",
         "side": "BUY",
         "rfqCurrency": "USD",
         "rfqAmount": "10"
     }'

Response Example

{
    "code": "000000",
    "message": "success",
    "data": {
        "id": "d8ffbe31-e3d2-4615-9e13-0cae46d09b75",
        "accountId": "b27c8873-e400-47cd-adc1-035cfa0d5347",
        "symbol": "USDC-USD",
        "baseWalletId": "32aae8b7-4a69-474f-b7d5-337e190af878",
        "baseCurrency": "USDC",
        "baseAmount": "9.95",
        "quoteCurrency": "USD",
        "quoteAmount": "10",
        "side": "BUY",
        "rate": "1",
        "fee": "0.05",
        "feeCurrency": "USD",
        "status": "COMPLETE",
        "referenceId": "590a3852-f1aa-494f-a6d5-a3d13a715f70",
        "createTime": "1762413577403",
        "completeTime": "1762413578326"
    }
}

Step 4 — Preview withdrawal fees (optional)

Use the Get transfer fee API to check fees before withdrawal.

📘

Note: If skipped, fees will be retrieved automatically in Step 5.

Request Example

# Replace ${YOUR_API_ACCESS_TOKEN} with your API access token.
curl --request POST \
     --url https://api-sandbox.interlace.money/open-api/v3/cryptoconnect/transfers/fee-and-quota \
     --header 'accept: application/json' \
     --header 'content-type: application/json' \
     --header 'x-access-token: ${YOUR_API_ACCESS_TOKEN}' \
     --data '{
         "accountId": "b27c8873-e400-47cd-adc1-035cfa0d5347",
         "source": {
             "type": "WALLET",
             "id": "32aae8b7-4a69-474f-b7d5-337e190af878"
         },
         "destination": {
             "type": "BLOCKCHAIN",
             "chain": "ARB",
             "address": "0x89F9Cfaa0dA076351DdfC6E320bD8df8b538dB17"
         },
         "amount": {
             "currency": "USDC",
             "amount": "10"
         }
     }'

Response Example

{
    "code": 0,
    "message": "ok",
    "data": {
        "crossChainQuota": "10000",
        "crossChainFeeRate": "0.003",
        "crossChainAmount": "0",
        "fees": [
            {
                "amount": "0.2",
                "currency": "USDC",
                "type": "GAS"
            }
        ]
    }
}

Step 5 — Withdraw Crypto

Use the Create a blockchain transfer API to withdraw crypto to an external wallet.

⚠️

Note: Ensure that both the wallet address and the blockchain network are correctly specified before initiating the withdrawal.

Withdrawal Status Flow 💰

  • When you initiate a withdrawal, Interlace first receives the request and assigns it a status of Pending, with the transactionHash set to null. This indicates that your request has been accepted and the on-chain transfer process has started.

  • Once the transaction is broadcast, Interlace monitors its progress. The status will update to Closed after 30 block confirmations, and a valid transactionHash will be available.

  • You can use this transactionHash to track the transfer directly on-chain, for example via Etherscan's tracker on Sepolia.

Request Example

# Replace ${YOUR_API_ACCESS_TOKEN} with your API access token.
curl --request POST \
     --url https://api-sandbox.interlace.money/open-api/v3/cryptoconnect/transfers \
     --header 'accept: application/json' \
     --header 'content-type: application/json' \
     --header 'x-access-token: ${YOUR_API_ACCESS_TOKEN}' \
     --data '{
         "idempotencyKey": "bfafe401-a54d-445a-a6c5-4b407b68a2cc",
         "source": {
             "type": "cryptoconnect_wallet",
             "id": "32aae8b7-4a69-474f-b7d5-337e190af878"
         },
         "destination": {
             "type": "blockchain",
             "chain": "ETH",
             "address": "0x89F9Cfaa0dA076351DdfC6E320bD8df8b538dB17"
         },
         "amount": {
             "amount": "9.95",
             "currency": "USDC"
         }
     }'

Response Example

{
    "code": 0,
    "message": "ok",
    "data": {
        "id": "aba46642-edcf-4faa-8942-7d63c967fb07",
        "accountId": "b27c8873-e400-47cd-adc1-035cfa0d5347",
        "idempotencyKey": "bfafe401-a54d-445a-a6c5-4b407b68a2cc",
        "source": {
            "type": "cryptoconnect_wallet",
            "id": "32aae8b7-4a69-474f-b7d5-337e190af878"
        },
        "destination": {
            "type": "blockchain",
            "chain": "ETH",
            "address": "0x89F9Cfaa0dA076351DdfC6E320bD8df8b538dB17"
        },
        "amount": {
            "amount": "9.95",
            "currency": "USDC"
        },
        "fees": [
            {
                "amount": "0.2",
                "currency": "USDC",
                "type": "GAS"
            }
        ],
        "status": "Pending",
        "createTime": "1758276661923",
        "updateTime": "1758276662488"
    }
}

🎉 Congratulations! The cryptocurrency transfer has been successfully completed using Interlace APIs.