Balance
curl --request GET \
--url https://api-bluvo.com/v0/wallet/withdraw/balance \
--header 'x-bluvo-api-key: <api-key>' \
--header 'x-bluvo-org-id: <api-key>' \
--header 'x-bluvo-project-id: <api-key>' \
--header 'x-bluvo-wallet-id: <api-key>'import requests
url = "https://api-bluvo.com/v0/wallet/withdraw/balance"
headers = {
"x-bluvo-api-key": "<api-key>",
"x-bluvo-org-id": "<api-key>",
"x-bluvo-project-id": "<api-key>",
"x-bluvo-wallet-id": "<api-key>"
}
response = requests.get(url, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {
'x-bluvo-api-key': '<api-key>',
'x-bluvo-org-id': '<api-key>',
'x-bluvo-project-id': '<api-key>',
'x-bluvo-wallet-id': '<api-key>'
}
};
fetch('https://api-bluvo.com/v0/wallet/withdraw/balance', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api-bluvo.com/v0/wallet/withdraw/balance",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-bluvo-api-key: <api-key>",
"x-bluvo-org-id: <api-key>",
"x-bluvo-project-id: <api-key>",
"x-bluvo-wallet-id: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api-bluvo.com/v0/wallet/withdraw/balance"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-bluvo-api-key", "<api-key>")
req.Header.Add("x-bluvo-org-id", "<api-key>")
req.Header.Add("x-bluvo-project-id", "<api-key>")
req.Header.Add("x-bluvo-wallet-id", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api-bluvo.com/v0/wallet/withdraw/balance")
.header("x-bluvo-api-key", "<api-key>")
.header("x-bluvo-org-id", "<api-key>")
.header("x-bluvo-project-id", "<api-key>")
.header("x-bluvo-wallet-id", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-bluvo.com/v0/wallet/withdraw/balance")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-bluvo-api-key"] = '<api-key>'
request["x-bluvo-org-id"] = '<api-key>'
request["x-bluvo-project-id"] = '<api-key>'
request["x-bluvo-wallet-id"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"lastSyncAt": "2025-01-21T08:10:34.942Z",
"balances": [
{
"asset": "ADA",
"amount": 0.032475,
"amountInFiat": 0.02804703375,
"networks": [
{
"id": "base",
"name": "base",
"displayName": "Base",
"minWithdrawal": "1",
"maxWithdrawal": "5000000",
"assetName": "ADA",
"addressRegex": "(^(addr)1[ac-hj-np-z02-9]{6,}$)|(^(DdzFFz|Ae2td)[1-9A-HJ-NP-Za-km-z]+)"
},
{
"id": "cardano",
"name": "cardano",
"displayName": "Cardano",
"minWithdrawal": "1",
"maxWithdrawal": "5000000",
"assetName": "ADA",
"addressRegex": "(^(addr)1[ac-hj-np-z02-9]{6,}$)|(^(DdzFFz|Ae2td)[1-9A-HJ-NP-Za-km-z]+)"
}
]
},
{
"asset": "SOL",
"amount": 0.001242188,
"amountInFiat": 0.26810764698,
"networks": [
{
"id": "solana",
"name": "solana",
"displayName": "Solana",
"minWithdrawal": "0.005",
"maxWithdrawal": "200000",
"assetName": "SOL",
"addressRegex": "^[1-9A-HJ-NP-Za-km-z]{32,44}"
}
]
},
{
"asset": "MATIC",
"amount": 0.00987156,
"networks": [
{
"id": "ethereum",
"name": "ethereum",
"displayName": "Ethereum",
"minWithdrawal": "1e-7",
"maxWithdrawal": "10000000",
"assetName": "MATIC",
"addressRegex": "^(0x)[0-9A-Fa-f]{40}$"
}
]
},
{
"asset": "NU",
"amount": 5.59075662,
"networks": [
{
"id": "ethereum",
"name": "ethereum",
"displayName": "Ethereum",
"minWithdrawal": "43.3",
"maxWithdrawal": "7559900",
"assetName": "NU",
"addressRegex": "^(0x)[0-9A-Fa-f]{40}$"
}
]
},
{
"asset": "MANA",
"amount": 0.02350406,
"amountInFiat": 0.007538927244999999,
"networks": [
{
"id": "ethereum",
"name": "ethereum",
"displayName": "Ethereum",
"minWithdrawal": "0.01",
"maxWithdrawal": "2275400",
"assetName": "MANA",
"addressRegex": "^(0x)[0-9A-Fa-f]{40}$"
}
]
},
{
"asset": "ALGO",
"amount": 0.089748,
"amountInFiat": 0.020965132799999998,
"networks": [
{
"id": "algorand",
"name": "algorand",
"displayName": "Algorand",
"minWithdrawal": "0.1",
"maxWithdrawal": "55000000",
"assetName": "ALGO",
"addressRegex": "^[A-Z2-7]{58}$"
}
]
},
{
"asset": "ETC",
"amount": 0.00007164,
"amountInFiat": 0.001463247,
"networks": [
{
"id": "ethereum_classic",
"name": "ethereumclassic",
"displayName": "Ethereum Classic",
"minWithdrawal": "0.001",
"maxWithdrawal": "15350",
"assetName": "ETC",
"addressRegex": "^(0x)[0-9A-Fa-f]{40}$"
}
]
},
{
"asset": "XRP",
"amount": 0.025191,
"amountInFiat": 0.07440791625,
"networks": [
{
"id": "base",
"name": "base",
"displayName": "Base",
"minWithdrawal": "1",
"maxWithdrawal": "10000000",
"assetName": "XRP",
"addressRegex": "^r[1-9a-km-zA-HJ-NP-Z]{25,35}$"
},
{
"id": "ripple",
"name": "ripple",
"displayName": "Ripple",
"minWithdrawal": "0.35",
"maxWithdrawal": "10000000",
"assetName": "XRP",
"addressRegex": "^r[1-9a-km-zA-HJ-NP-Z]{25,35}$"
}
]
},
{
"asset": "LTC",
"amount": 0.00027151,
"amountInFiat": 0.0303955445,
"networks": [
{
"id": "base",
"name": "base",
"displayName": "Base",
"minWithdrawal": "0.001",
"maxWithdrawal": "54400",
"assetName": "LTC",
"addressRegex": "^((L|M)[a-km-zA-HJ-NP-Z1-9]{25,34})|^(ltc1([qpzry9x8gf2tvdw0s3jn54khce6mua7l]{39}|[qpzry9x8gf2tvdw0s3jn54khce6mua7l]{59}))$"
},
{
"id": "litecoin",
"name": "litecoin",
"displayName": "Litecoin",
"minWithdrawal": "0.001",
"maxWithdrawal": "54400",
"assetName": "LTC",
"addressRegex": "^((L|M)[a-km-zA-HJ-NP-Z1-9]{25,34})|^(ltc1([qpzry9x8gf2tvdw0s3jn54khce6mua7l]{39}|[qpzry9x8gf2tvdw0s3jn54khce6mua7l]{59}))$"
}
]
},
{
"asset": "XLM",
"amount": 0.0394491,
"amountInFiat": 0.01472585591625,
"networks": [
{
"id": "stellar",
"name": "stellar",
"displayName": "Stellar",
"minWithdrawal": "2",
"maxWithdrawal": "30000000",
"assetName": "XLM",
"addressRegex": "^G[A-Z2-7]{55}$"
}
]
},
{
"asset": "OXT",
"amount": 0.18757786,
"amountInFiat": 0.009988521045,
"networks": [
{
"id": "ethereum",
"name": "ethereum",
"displayName": "Ethereum",
"minWithdrawal": "0.01",
"maxWithdrawal": "11572400",
"assetName": "OXT",
"addressRegex": "^(0x)[0-9A-Fa-f]{40}$"
}
]
},
{
"asset": "EUR",
"amount": 0.27,
"networks": []
},
{
"asset": "BTC",
"amount": 0.00032638,
"amountInFiat": 36.3887051073,
"networks": [
{
"id": "arbitrum",
"name": "arbitrum",
"displayName": "Arbitrum",
"minWithdrawal": "0.00002",
"maxWithdrawal": "200",
"assetName": "BTC",
"addressRegex": "^([13][a-km-zA-HJ-NP-Z1-9]{25,34})|^(bc1[pqzry9x8gf2tvdw0s3jn54khce6mua7l]([qpzry9x8gf2tvdw0s3jn54khce6mua7l]{38}|[qpzry9x8gf2tvdw0s3jn54khce6mua7l]{58}))$"
},
{
"id": "base",
"name": "base",
"displayName": "Base",
"minWithdrawal": "0.00002",
"maxWithdrawal": "200",
"assetName": "BTC",
"addressRegex": "^([13][a-km-zA-HJ-NP-Z1-9]{25,34})|^(bc1[pqzry9x8gf2tvdw0s3jn54khce6mua7l]([qpzry9x8gf2tvdw0s3jn54khce6mua7l]{38}|[qpzry9x8gf2tvdw0s3jn54khce6mua7l]{58}))$"
},
{
"id": "bitcoin",
"name": "bitcoin",
"displayName": "Bitcoin",
"minWithdrawal": "0.0001",
"maxWithdrawal": "2400",
"assetName": "BTC",
"addressRegex": "^([13][a-km-zA-HJ-NP-Z1-9]{25,34})|^(bc1[pqzry9x8gf2tvdw0s3jn54khce6mua7l]([qpzry9x8gf2tvdw0s3jn54khce6mua7l]{38}|[qpzry9x8gf2tvdw0s3jn54khce6mua7l]{58}))$"
},
{
"id": "ethereum",
"name": "ethereum",
"displayName": "Ethereum",
"minWithdrawal": "0.00002",
"maxWithdrawal": "200",
"assetName": "BTC",
"addressRegex": "^([13][a-km-zA-HJ-NP-Z1-9]{25,34})|^(bc1[pqzry9x8gf2tvdw0s3jn54khce6mua7l]([qpzry9x8gf2tvdw0s3jn54khce6mua7l]{38}|[qpzry9x8gf2tvdw0s3jn54khce6mua7l]{58}))$"
},
{
"id": "solana",
"name": "solana",
"displayName": "Solana",
"minWithdrawal": "0.00002",
"maxWithdrawal": "200",
"assetName": "BTC",
"addressRegex": "^([13][a-km-zA-HJ-NP-Z1-9]{25,34})|^(bc1[pqzry9x8gf2tvdw0s3jn54khce6mua7l]([qpzry9x8gf2tvdw0s3jn54khce6mua7l]{38}|[qpzry9x8gf2tvdw0s3jn54khce6mua7l]{58}))$"
}
]
}
]
}{
"error": "Insufficient permissions",
"type": "APIKEY_INSUFFICIENT_PERMISSIONS",
"missing": [
"read"
]
}{
"error": "Wallet not found",
"type": "WALLET_NOT_FOUND"
}Withdrawals
Balance
Get withdrawable balances and supported networks.
Required API Key Scopes: read
GET
/
v0
/
wallet
/
withdraw
/
balance
Balance
curl --request GET \
--url https://api-bluvo.com/v0/wallet/withdraw/balance \
--header 'x-bluvo-api-key: <api-key>' \
--header 'x-bluvo-org-id: <api-key>' \
--header 'x-bluvo-project-id: <api-key>' \
--header 'x-bluvo-wallet-id: <api-key>'import requests
url = "https://api-bluvo.com/v0/wallet/withdraw/balance"
headers = {
"x-bluvo-api-key": "<api-key>",
"x-bluvo-org-id": "<api-key>",
"x-bluvo-project-id": "<api-key>",
"x-bluvo-wallet-id": "<api-key>"
}
response = requests.get(url, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {
'x-bluvo-api-key': '<api-key>',
'x-bluvo-org-id': '<api-key>',
'x-bluvo-project-id': '<api-key>',
'x-bluvo-wallet-id': '<api-key>'
}
};
fetch('https://api-bluvo.com/v0/wallet/withdraw/balance', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api-bluvo.com/v0/wallet/withdraw/balance",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-bluvo-api-key: <api-key>",
"x-bluvo-org-id: <api-key>",
"x-bluvo-project-id: <api-key>",
"x-bluvo-wallet-id: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api-bluvo.com/v0/wallet/withdraw/balance"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-bluvo-api-key", "<api-key>")
req.Header.Add("x-bluvo-org-id", "<api-key>")
req.Header.Add("x-bluvo-project-id", "<api-key>")
req.Header.Add("x-bluvo-wallet-id", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api-bluvo.com/v0/wallet/withdraw/balance")
.header("x-bluvo-api-key", "<api-key>")
.header("x-bluvo-org-id", "<api-key>")
.header("x-bluvo-project-id", "<api-key>")
.header("x-bluvo-wallet-id", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-bluvo.com/v0/wallet/withdraw/balance")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-bluvo-api-key"] = '<api-key>'
request["x-bluvo-org-id"] = '<api-key>'
request["x-bluvo-project-id"] = '<api-key>'
request["x-bluvo-wallet-id"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"lastSyncAt": "2025-01-21T08:10:34.942Z",
"balances": [
{
"asset": "ADA",
"amount": 0.032475,
"amountInFiat": 0.02804703375,
"networks": [
{
"id": "base",
"name": "base",
"displayName": "Base",
"minWithdrawal": "1",
"maxWithdrawal": "5000000",
"assetName": "ADA",
"addressRegex": "(^(addr)1[ac-hj-np-z02-9]{6,}$)|(^(DdzFFz|Ae2td)[1-9A-HJ-NP-Za-km-z]+)"
},
{
"id": "cardano",
"name": "cardano",
"displayName": "Cardano",
"minWithdrawal": "1",
"maxWithdrawal": "5000000",
"assetName": "ADA",
"addressRegex": "(^(addr)1[ac-hj-np-z02-9]{6,}$)|(^(DdzFFz|Ae2td)[1-9A-HJ-NP-Za-km-z]+)"
}
]
},
{
"asset": "SOL",
"amount": 0.001242188,
"amountInFiat": 0.26810764698,
"networks": [
{
"id": "solana",
"name": "solana",
"displayName": "Solana",
"minWithdrawal": "0.005",
"maxWithdrawal": "200000",
"assetName": "SOL",
"addressRegex": "^[1-9A-HJ-NP-Za-km-z]{32,44}"
}
]
},
{
"asset": "MATIC",
"amount": 0.00987156,
"networks": [
{
"id": "ethereum",
"name": "ethereum",
"displayName": "Ethereum",
"minWithdrawal": "1e-7",
"maxWithdrawal": "10000000",
"assetName": "MATIC",
"addressRegex": "^(0x)[0-9A-Fa-f]{40}$"
}
]
},
{
"asset": "NU",
"amount": 5.59075662,
"networks": [
{
"id": "ethereum",
"name": "ethereum",
"displayName": "Ethereum",
"minWithdrawal": "43.3",
"maxWithdrawal": "7559900",
"assetName": "NU",
"addressRegex": "^(0x)[0-9A-Fa-f]{40}$"
}
]
},
{
"asset": "MANA",
"amount": 0.02350406,
"amountInFiat": 0.007538927244999999,
"networks": [
{
"id": "ethereum",
"name": "ethereum",
"displayName": "Ethereum",
"minWithdrawal": "0.01",
"maxWithdrawal": "2275400",
"assetName": "MANA",
"addressRegex": "^(0x)[0-9A-Fa-f]{40}$"
}
]
},
{
"asset": "ALGO",
"amount": 0.089748,
"amountInFiat": 0.020965132799999998,
"networks": [
{
"id": "algorand",
"name": "algorand",
"displayName": "Algorand",
"minWithdrawal": "0.1",
"maxWithdrawal": "55000000",
"assetName": "ALGO",
"addressRegex": "^[A-Z2-7]{58}$"
}
]
},
{
"asset": "ETC",
"amount": 0.00007164,
"amountInFiat": 0.001463247,
"networks": [
{
"id": "ethereum_classic",
"name": "ethereumclassic",
"displayName": "Ethereum Classic",
"minWithdrawal": "0.001",
"maxWithdrawal": "15350",
"assetName": "ETC",
"addressRegex": "^(0x)[0-9A-Fa-f]{40}$"
}
]
},
{
"asset": "XRP",
"amount": 0.025191,
"amountInFiat": 0.07440791625,
"networks": [
{
"id": "base",
"name": "base",
"displayName": "Base",
"minWithdrawal": "1",
"maxWithdrawal": "10000000",
"assetName": "XRP",
"addressRegex": "^r[1-9a-km-zA-HJ-NP-Z]{25,35}$"
},
{
"id": "ripple",
"name": "ripple",
"displayName": "Ripple",
"minWithdrawal": "0.35",
"maxWithdrawal": "10000000",
"assetName": "XRP",
"addressRegex": "^r[1-9a-km-zA-HJ-NP-Z]{25,35}$"
}
]
},
{
"asset": "LTC",
"amount": 0.00027151,
"amountInFiat": 0.0303955445,
"networks": [
{
"id": "base",
"name": "base",
"displayName": "Base",
"minWithdrawal": "0.001",
"maxWithdrawal": "54400",
"assetName": "LTC",
"addressRegex": "^((L|M)[a-km-zA-HJ-NP-Z1-9]{25,34})|^(ltc1([qpzry9x8gf2tvdw0s3jn54khce6mua7l]{39}|[qpzry9x8gf2tvdw0s3jn54khce6mua7l]{59}))$"
},
{
"id": "litecoin",
"name": "litecoin",
"displayName": "Litecoin",
"minWithdrawal": "0.001",
"maxWithdrawal": "54400",
"assetName": "LTC",
"addressRegex": "^((L|M)[a-km-zA-HJ-NP-Z1-9]{25,34})|^(ltc1([qpzry9x8gf2tvdw0s3jn54khce6mua7l]{39}|[qpzry9x8gf2tvdw0s3jn54khce6mua7l]{59}))$"
}
]
},
{
"asset": "XLM",
"amount": 0.0394491,
"amountInFiat": 0.01472585591625,
"networks": [
{
"id": "stellar",
"name": "stellar",
"displayName": "Stellar",
"minWithdrawal": "2",
"maxWithdrawal": "30000000",
"assetName": "XLM",
"addressRegex": "^G[A-Z2-7]{55}$"
}
]
},
{
"asset": "OXT",
"amount": 0.18757786,
"amountInFiat": 0.009988521045,
"networks": [
{
"id": "ethereum",
"name": "ethereum",
"displayName": "Ethereum",
"minWithdrawal": "0.01",
"maxWithdrawal": "11572400",
"assetName": "OXT",
"addressRegex": "^(0x)[0-9A-Fa-f]{40}$"
}
]
},
{
"asset": "EUR",
"amount": 0.27,
"networks": []
},
{
"asset": "BTC",
"amount": 0.00032638,
"amountInFiat": 36.3887051073,
"networks": [
{
"id": "arbitrum",
"name": "arbitrum",
"displayName": "Arbitrum",
"minWithdrawal": "0.00002",
"maxWithdrawal": "200",
"assetName": "BTC",
"addressRegex": "^([13][a-km-zA-HJ-NP-Z1-9]{25,34})|^(bc1[pqzry9x8gf2tvdw0s3jn54khce6mua7l]([qpzry9x8gf2tvdw0s3jn54khce6mua7l]{38}|[qpzry9x8gf2tvdw0s3jn54khce6mua7l]{58}))$"
},
{
"id": "base",
"name": "base",
"displayName": "Base",
"minWithdrawal": "0.00002",
"maxWithdrawal": "200",
"assetName": "BTC",
"addressRegex": "^([13][a-km-zA-HJ-NP-Z1-9]{25,34})|^(bc1[pqzry9x8gf2tvdw0s3jn54khce6mua7l]([qpzry9x8gf2tvdw0s3jn54khce6mua7l]{38}|[qpzry9x8gf2tvdw0s3jn54khce6mua7l]{58}))$"
},
{
"id": "bitcoin",
"name": "bitcoin",
"displayName": "Bitcoin",
"minWithdrawal": "0.0001",
"maxWithdrawal": "2400",
"assetName": "BTC",
"addressRegex": "^([13][a-km-zA-HJ-NP-Z1-9]{25,34})|^(bc1[pqzry9x8gf2tvdw0s3jn54khce6mua7l]([qpzry9x8gf2tvdw0s3jn54khce6mua7l]{38}|[qpzry9x8gf2tvdw0s3jn54khce6mua7l]{58}))$"
},
{
"id": "ethereum",
"name": "ethereum",
"displayName": "Ethereum",
"minWithdrawal": "0.00002",
"maxWithdrawal": "200",
"assetName": "BTC",
"addressRegex": "^([13][a-km-zA-HJ-NP-Z1-9]{25,34})|^(bc1[pqzry9x8gf2tvdw0s3jn54khce6mua7l]([qpzry9x8gf2tvdw0s3jn54khce6mua7l]{38}|[qpzry9x8gf2tvdw0s3jn54khce6mua7l]{58}))$"
},
{
"id": "solana",
"name": "solana",
"displayName": "Solana",
"minWithdrawal": "0.00002",
"maxWithdrawal": "200",
"assetName": "BTC",
"addressRegex": "^([13][a-km-zA-HJ-NP-Z1-9]{25,34})|^(bc1[pqzry9x8gf2tvdw0s3jn54khce6mua7l]([qpzry9x8gf2tvdw0s3jn54khce6mua7l]{38}|[qpzry9x8gf2tvdw0s3jn54khce6mua7l]{58}))$"
}
]
}
]
}{
"error": "Insufficient permissions",
"type": "APIKEY_INSUFFICIENT_PERMISSIONS",
"missing": [
"read"
]
}{
"error": "Wallet not found",
"type": "WALLET_NOT_FOUND"
}Authorizations
Bluvo API Key
Bluvo Organization ID
Bluvo Project ID
Bluvo Wallet ID
Query Parameters
Override balance refresh threshold in minutes. Set to 0 to always refresh balances from the exchange. Defaults to 0.
Required range:
x >= 0Automatically delete the wallet if API credentials are found to be invalid during balance fetch. Defaults to true.
Was this page helpful?
โI