Go client for the BingX cryptocurrency exchange API. Covers USDT-M and Coin-M perpetual futures, spot trading, copy trading, sub-accounts, and WebSocket streaming. 220+ API methods.
Package: pkg.go.dev/github.com/tigusigalpa/bingx-go
- Features
- Architecture
- Installation
- Quick Start
- Usage Examples
- Advanced Features
- Configuration
- Error Handling
- Best Practices
- Testing
- Contributing
- License
|
|
| Feature | Description |
|---|---|
| Real-Time Data | WebSocket support for live market data and account updates |
| Order Types | MARKET, LIMIT, STOP, STOP_MARKET, TAKE_PROFIT, and more |
| Position Modes | One-way and Hedge mode support |
| Margin Types | ISOLATED and CROSSED margin modes |
| Time in Force | GTC, IOC, FOK order execution options |
| Risk Management | Stop-loss, take-profit, trailing stops |
| Batch Operations | Create, modify, and cancel multiple orders at once |
| Historical Data | Access to comprehensive historical trading data |
bingx-go/
├── client.go # Main client with service orchestration
├── coinm_client.go # Coin-M futures client
├── http/
│ └── client.go # HTTP client with HMAC signing
├── errors/
│ └── errors.go # Custom error types
├── services/
│ ├── market.go # Market data service
│ ├── account.go # Account management service
│ ├── trade.go # Trading operations service
│ ├── wallet.go # Wallet operations service
│ ├── spotaccount.go # Spot account service
│ ├── subaccount.go # Sub-account service
│ ├── copytrading.go # Copy trading service
│ ├── contract.go # Contract service
│ ├── listenkey.go # WebSocket auth service
│ └── coinm/ # Coin-M specific services
│ ├── market.go
│ ├── trade.go
│ └── listenkey.go
└── examples/ # Usage examples
- Single Responsibility - Each service handles a specific domain
- Dependency Injection - HTTP client injected for testability
- Functional Options - Flexible client configuration
- Error Transparency - Rich error types for debugging
- Immutability - Thread-safe by design
- Go 1.21+
- BingX account with API keys (for authenticated endpoints)
go get github.com/tigusigalpa/bingx-goOnly external dependency: github.com/gorilla/websocket (for WebSocket features)
package main
import (
"fmt"
"log"
bingx "github.com/tigusigalpa/bingx-go"
)
func main() {
// Create client
client := bingx.NewClient(
"YOUR_API_KEY",
"YOUR_API_SECRET",
bingx.WithBaseURI("https://open-api.bingx.com"),
bingx.WithSignatureEncoding("base64"),
)
// Get current price
price, err := client.Market().GetLatestPrice("BTC-USDT")
if err != nil {
log.Fatal(err)
}
fmt.Printf("BTC price: %v\n", price)
// Get account balance
balance, err := client.Account().GetBalance()
if err != nil {
log.Fatal(err)
}
fmt.Printf("Balance: %v\n", balance)
// Create an order
order, err := client.Trade().CreateOrder(map[string]interface{}{
"symbol": "BTC-USDT",
"side": "BUY",
"type": "LIMIT",
"positionSide": "LONG",
"price": 50000.0,
"quantity": 0.001,
})
if err != nil {
log.Fatal(err)
}
fmt.Printf("Order created: %v\n", order)
}// Get futures symbols
symbols, err := client.Market().GetFuturesSymbols()
// Get spot symbols
spotSymbols, err := client.Market().GetSpotSymbols()
// Get all symbols
allSymbols, err := client.Market().GetAllSymbols()
// Get latest price
price, err := client.Market().GetLatestPrice("BTC-USDT")
// Get market depth
depth, err := client.Market().GetDepth("BTC-USDT", 20)
// Get K-lines
klines, err := client.Market().GetKlines("BTC-USDT", "1h", 100, nil, nil)
// Get spot K-lines with timezone (v2 endpoint)
// timeZone: 0=UTC (default), 8=UTC+8
timeZone := int64(8) // UTC+8
spotKlines, err := client.Market().GetSpotKlines("BTC-USDT", "1h", 100, nil, nil, &timeZone)
// Get 24hr ticker
ticker, err := client.Market().Get24hrTicker(nil) // nil for all symbols
// Get funding rate history
fundingRate, err := client.Market().GetFundingRateHistory("BTC-USDT", 100)// Get account balance
balance, err := client.Account().GetBalance()
// Get positions
positions, err := client.Account().GetPositions(nil) // nil for all positions
// Get positions for specific symbol
btcPositions, err := client.Account().GetPositions(&symbol)
// Get account info
accountInfo, err := client.Account().GetAccountInfo()
// Get/Set leverage
leverage, err := client.Account().GetLeverage("BTC-USDT", nil)
err = client.Account().SetLeverage("BTC-USDT", "BOTH", 20, nil)
// Get/Set margin mode
marginMode, err := client.Account().GetMarginMode("BTC-USDT")
err = client.Account().SetMarginMode("BTC-USDT", "ISOLATED")// Create order
order, err := client.Trade().CreateOrder(map[string]interface{}{
"symbol": "BTC-USDT",
"side": "BUY",
"type": "MARKET",
"positionSide": "LONG",
"quantity": 0.001,
})
// Cancel order
orderID := "123456789"
err = client.Trade().CancelOrder("BTC-USDT", &orderID, nil, nil, nil)
// Cancel all orders
err = client.Trade().CancelAllOrders(nil, &symbol, nil, nil)
// Get order details
order, err := client.Trade().GetOrder("BTC-USDT", "123456789")
// Get open orders
openOrders, err := client.Trade().GetOpenOrders(nil, 100)
// Get order history
history, err := client.Trade().GetOrderHistory(&symbol, 100, nil, nil)
// Get user trades
trades, err := client.Trade().GetUserTrades(&symbol, 100, nil, nil)// Get deposit history
deposits, err := client.Wallet().GetDepositHistory("USDT", nil, nil, nil, 100)
// Get deposit address
address, err := client.Wallet().GetDepositAddress("USDT", "TRC20")
// Get withdrawal history
withdrawals, err := client.Wallet().GetWithdrawalHistory("USDT", nil, nil, nil, 100)
// Create withdrawal
withdrawal, err := client.Wallet().Withdraw("USDT", "TXxx...xxx", 100.0, "TRC20", nil)
// Get all coin info
coins, err := client.Wallet().GetAllCoinInfo()import "github.com/tigusigalpa/bingx-go/services"
// Get spot balance
balance, err := client.SpotAccount().GetBalance()
// Internal transfer with wallet type constants
// Wallet types: WalletTypeFund=1, WalletTypeStandardFutures=2,
// WalletTypePerpetualFutures=3, WalletTypeSpot=4
userAccountType := 1 // 1=UID, 2=Phone, 3=Email
userAccount := "123456"
transfer, err := client.SpotAccount().InternalTransfer(
"USDT", // coin
services.WalletTypeSpot, // walletType (4 = Spot Account)
100.0, // amount
userAccountType, // userAccountType
userAccount, // userAccount
nil, // callingCode (required when userAccountType=2)
nil, // transferClientID
nil, // recvWindow
)
// Get all account balances
allBalances, err := client.SpotAccount().GetAllAccountBalances()// Get Coin-M market data
ticker, err := client.CoinM().Market().GetTicker("BTC-USD")
// Get Coin-M contracts
contracts, err := client.CoinM().Market().GetContracts()
// Create Coin-M order
order, err := client.CoinM().Trade().CreateOrder(map[string]interface{}{
"symbol": "BTC-USD",
"side": "BUY",
"positionSide": "LONG",
"type": "MARKET",
"quantity": 100,
})
// Get Coin-M positions
positions, err := client.CoinM().Trade().GetPositions(nil)
// Get Coin-M balance
balance, err := client.CoinM().Trade().GetBalance()import "github.com/tigusigalpa/bingx-go/services"
// Create sub-account
result, err := client.SubAccount().CreateSubAccount("sub_account_001")
// Get sub-account list
subAccounts, err := client.SubAccount().GetSubAccountList(nil, 1, 10)
// Create API key for sub-account
apiKey, err := client.SubAccount().CreateSubAccountAPIKey(
"sub_account_001",
"Trading Bot",
map[string]bool{"spot": true, "futures": true},
nil, // IP whitelist (optional)
)
// Sub-account internal transfer with wallet type constants
// Wallet types: SubAccountWalletTypeFund=1, SubAccountWalletTypeStandardFutures=2,
// SubAccountWalletTypePerpetualFutures=3, SubAccountWalletTypeSpot=15
userAccountType := 1 // 1=UID, 2=Phone, 3=Email
userAccount := "12345678"
transfer, err := client.SubAccount().SubAccountInternalTransfer(
"USDT", // coin
services.SubAccountWalletTypeSpot, // walletType (15 = Spot Account)
100.0, // amount
userAccountType, // userAccountType
userAccount, // userAccount
nil, // callingCode
nil, // transferClientID
nil, // recvWindow
)
// Sub-Mother Account Asset Transfer (master account only)
fromUID := int64(123456)
toUID := int64(789012)
transfer, err = client.SubAccount().SubMotherAccountAssetTransfer(
"USDT", // assetName
100.0, // transferAmount
fromUID, // fromUID
1, // fromType (1=Parent, 2=Sub)
1, // fromAccountType (1=Funding, 2=Standard futures, 3=Perpetual, 15=Spot)
toUID, // toUID
2, // toType (1=Parent, 2=Sub)
15, // toAccountType (15=Spot)
"Transfer to sub-account", // remark
nil, // recvWindow
)
// Query transferable amount (master account only)
transferable, err := client.SubAccount().GetSubMotherAccountTransferableAmount(
fromUID, // fromUID
1, // fromAccountType
toUID, // toUID
15, // toAccountType (Spot)
nil, // recvWindow
)
// Query transfer history (master account only)
var pageID, pagingSize int
pageID = 1
pagingSize = 50
history, err := client.SubAccount().GetSubMotherAccountTransferHistory(
fromUID, // uid
nil, // transferType (optional)
nil, // tranID (optional)
nil, // startTime (optional)
nil, // endTime (optional)
&pageID, // pageID
&pagingSize, // pagingSize
nil, // recvWindow
)
// Get sub-account assets
assets, err := client.SubAccount().GetSubAccountAssets("12345678")// Get current track orders
orders, err := client.CopyTrading().GetCurrentTrackOrders("BTC-USDT")
// Close track order
result, err := client.CopyTrading().CloseTrackOrder("1252864099381234567")
// Set take profit and stop loss
stopLoss := 48000.0
takeProfit := 52000.0
err = client.CopyTrading().SetTPSL("1252864099381234567", &stopLoss, &takeProfit)
// Get profit summary
summary, err := client.CopyTrading().GetProfitSummary()
// Set commission rate
err = client.CopyTrading().SetCommission(5.0) // 5% commission// Create market data stream
stream := client.NewMarketDataStream()
// Connect to WebSocket
if err := stream.Connect(); err != nil {
log.Fatal(err)
}
defer stream.Disconnect()
// Register message handler
stream.OnMessage(func(data map[string]interface{}) {
fmt.Printf("Received: %+v\n", data)
})
// Subscribe to various data types
stream.SubscribeTrade("BTC-USDT")
stream.SubscribeKline("BTC-USDT", "1m")
stream.SubscribeDepth("BTC-USDT", 20)
stream.SubscribeTicker("BTC-USDT")
stream.SubscribeBookTicker("BTC-USDT")
// Start listening (blocking)
stream.Listen()// Generate listen key
resp, err := client.ListenKey().Generate()
if err != nil {
log.Fatal(err)
}
listenKey := resp["listenKey"].(string)
// Create account data stream
stream := client.NewAccountDataStream(listenKey)
if err := stream.Connect(); err != nil {
log.Fatal(err)
}
defer stream.Disconnect()
// Listen for account updates
stream.OnAccountUpdate(func(eventType string, data map[string]interface{}) {
fmt.Printf("Event [%s]: %+v\n", eventType, data)
})
// Listen for specific update types
stream.OnBalanceUpdate(func(balances interface{}) {
fmt.Printf("Balance: %+v\n", balances)
})
stream.OnPositionUpdate(func(positions interface{}) {
fmt.Printf("Positions: %+v\n", positions)
})
stream.OnOrderUpdate(func(order interface{}) {
fmt.Printf("Order: %+v\n", order)
})
// Start listening
stream.Listen()For detailed WebSocket documentation, see websocket/README.md.
// Calculate futures commission
commission := client.Trade().CalculateFuturesCommission(100.0, 10, nil)
fmt.Printf("Commission: %.6f USDT\n", commission.Commission)
fmt.Printf("Net Position Value: %.2f USDT\n", commission.NetPositionValue)
// Quick commission amount
amount := client.Trade().GetCommissionAmount(100.0, 10)
fmt.Printf("Commission Amount: %.6f USDT\n", amount)// Create multiple orders at once
orders := []map[string]interface{}{
{
"symbol": "BTC-USDT",
"side": "BUY",
"type": "LIMIT",
"positionSide": "LONG",
"price": 50000.0,
"quantity": 0.001,
},
{
"symbol": "ETH-USDT",
"side": "BUY",
"type": "LIMIT",
"positionSide": "LONG",
"price": 3000.0,
"quantity": 0.01,
},
}
result, err := client.Trade().CreateBatchOrders(orders)
// Cancel multiple orders
orderIDs := []string{"123456789", "987654321"}
err = client.Trade().CancelBatchOrders("BTC-USDT", orderIDs, nil, nil, nil)import "time"
// Get trades from last 24 hours
startTime := time.Now().Add(-24 * time.Hour).UnixMilli()
endTime := time.Now().UnixMilli()
trades, err := client.Trade().GetUserTrades(
&symbol,
100,
&startTime,
&endTime,
)
// Get historical klines
klines, err := client.Market().GetKlines(
"BTC-USDT",
"1h",
100,
&startTime,
&endTime,
)client := bingx.NewClient(
apiKey,
apiSecret,
// Set custom base URI (default: https://open-api.bingx.com)
bingx.WithBaseURI("https://open-api.bingx.com"),
// Set source key for tracking (optional)
bingx.WithSourceKey("my-trading-bot-v1"),
// Set signature encoding: "base64" or "hex" (default: base64)
bingx.WithSignatureEncoding("base64"),
)# Recommended: Store credentials in environment variables
export BINGX_API_KEY="your_api_key_here"
export BINGX_API_SECRET="your_api_secret_here"
export BINGX_SOURCE_KEY="optional_source_key"import "os"
client := bingx.NewClient(
os.Getenv("BINGX_API_KEY"),
os.Getenv("BINGX_API_SECRET"),
bingx.WithSourceKey(os.Getenv("BINGX_SOURCE_KEY")),
)// The HTTP client uses default timeouts:
// - Connection timeout: 10 seconds
// - Request timeout: 30 seconds
// For custom timeout, modify the HTTP client in http/client.go| Method | Description | Returns |
|---|---|---|
NewClient(apiKey, apiSecret string, options...) |
Create new BingX client | *Client |
client.Market() |
Access market data service | *MarketService |
client.Account() |
Access account management service | *AccountService |
client.Trade() |
Access trading operations service | *TradeService |
client.Contract() |
Access contract service | *ContractService |
client.ListenKey() |
Access WebSocket auth service | *ListenKeyService |
client.Wallet() |
Access wallet operations service | *WalletService |
client.SpotAccount() |
Access spot account service | *SpotAccountService |
client.SubAccount() |
Access sub-account service | *SubAccountService |
client.CopyTrading() |
Access copy trading service | *CopyTradingService |
client.CoinM() |
Access Coin-M futures client | *CoinMClient |
client.NewMarketDataStream() |
Create market data WebSocket | *MarketDataStream |
client.NewAccountDataStream(listenKey) |
Create account data WebSocket | *AccountDataStream |
client.GetHTTPClient() |
Get underlying HTTP client | *http.BaseHTTPClient |
client.GetEndpoint() |
Get API endpoint URL | string |
client.GetAPIKey() |
Get configured API key | string |
Market Service Methods
GetFuturesSymbols()- Get all futures trading symbolsGetSpotSymbols()- Get all spot trading symbolsGetAllSymbols()- Get both spot and futures symbolsGetLatestPrice(symbol)- Get latest price for a symbolGetSpotLatestPrice(symbol)- Get latest spot priceGetDepth(symbol, limit)- Get order book depthGetSpotDepth(symbol, limit)- Get spot order bookGetKlines(symbol, interval, limit, startTime, endTime)- Get candlestick dataGetSpotKlines(...)- Get spot candlestick dataGet24hrTicker(symbol)- Get 24hr ticker statisticsGetSpot24hrTicker(symbol)- Get spot 24hr tickerGetFundingRateHistory(symbol, limit)- Get funding rate historyGetMarkPrice(symbol)- Get mark priceGetPremiumIndexKlines(...)- Get premium index klinesGetAggregateTrades(...)- Get aggregate tradesGetRecentTrades(symbol, limit)- Get recent tradesGetServerTime()- Get server timeGetContinuousKlines(...)- Get continuous contract klinesGetIndexPriceKlines(...)- Get index price klinesGetTopLongShortRatio(...)- Get long/short ratioGetHistoricalTopLongShortRatio(...)- Get historical ratiosGetBasis(...)- Get basis data
Account Service Methods
GetBalance()- Get account balanceGetPositions(symbol)- Get positionsGetAccountInfo()- Get account informationGetTradingFees(symbol)- Get trading feesGetMarginMode(symbol)- Get margin modeSetMarginMode(symbol, mode)- Set margin modeGetLeverage(symbol, recvWindow)- Get leverageSetLeverage(symbol, side, leverage, recvWindow)- Set leverageGetPositionMargin(symbol)- Get position marginSetPositionMargin(symbol, positionSide, amount, type)- Set position marginGetBalanceHistory(coin, limit)- Get balance historyGetAccountPermissions()- Get API permissionsGetAPIKey()- Get API key infoGetUserCommissionRates(symbol)- Get commission ratesGetAPIRateLimits()- Get rate limitsGetDepositHistory(coin, limit)- Get deposit historyGetWithdrawHistory(coin, limit)- Get withdrawal historyGetAssetDetails(asset)- Get asset detailsGetAllAssets()- Get all assetsGetFundingWallet(asset)- Get funding walletDustTransfer(assets)- Convert dust to BNB
Trade Service Methods
CreateOrder(params)- Create new orderModifyOrder(...)- Modify existing orderCreateTestOrder(params)- Create test order (no execution)CloseAllPositions(symbol, ...)- Close all positionsGetMarginType(symbol, ...)- Get margin typeChangeMarginType(symbol, type, ...)- Change margin typeGetLeverage(symbol, ...)- Get leverageSetLeverage(symbol, leverage, ...)- Set leverageCreateBatchOrders(orders)- Create multiple ordersCancelOrder(symbol, orderID, ...)- Cancel orderCancelAllOrders(...)- Cancel all ordersCancelBatchOrders(...)- Cancel multiple ordersGetOrder(symbol, orderID)- Get order detailsGetOpenOrders(symbol, limit)- Get open ordersGetOrderHistory(...)- Get order historyGetFilledOrders(...)- Get filled ordersGetUserTrades(...)- Get user tradesChangeLeverage(symbol, side, leverage, ...)- Change leverageCalculateFuturesCommission(margin, leverage, rate)- Calculate commissionGetCommissionAmount(margin, leverage)- Get commission amount
All API methods return (map[string]interface{}, error):
response, err := client.Market().GetLatestPrice("BTC-USDT")
if err != nil {
// Handle error
}
// Access response data
if data, ok := response["data"].(map[string]interface{}); ok {
price := data["price"]
fmt.Printf("Price: %v\n", price)
}import "github.com/tigusigalpa/bingx-go/errors"
// Handle errors
order, err := client.Trade().CreateOrder(params)
if err != nil {
switch e := err.(type) {
case *errors.AuthenticationException:
log.Printf("Authentication error: %v", e)
case *errors.RateLimitException:
log.Printf("Rate limit exceeded: %v", e)
case *errors.InsufficientBalanceException:
log.Printf("Insufficient balance: %v", e)
case *errors.APIException:
log.Printf("API error [%s]: %v", e.APICode, e)
default:
log.Printf("Error: %v", err)
}
return
}BingXException- Base exception for all errorsAPIException- API-level errors with error codesAuthenticationException- Authentication failuresRateLimitException- Rate limit exceededInsufficientBalanceException- Insufficient balance errors
// DO: Use environment variables for credentials
apiKey := os.Getenv("BINGX_API_KEY")
apiSecret := os.Getenv("BINGX_API_SECRET")
// ❌ DON'T: Hardcode credentials
apiKey := "your_api_key_here" // Never do this!
// ✅ DO: Restrict API key permissions
// Only enable permissions you need (read-only for monitoring, etc.)
// ✅ DO: Use IP whitelist
// Configure IP restrictions in BingX API settings// ✅ DO: Always check errors
result, err := client.Trade().CreateOrder(params)
if err != nil {
// Handle specific error types
switch e := err.(type) {
case *errors.RateLimitException:
// Implement exponential backoff
time.Sleep(time.Second * 5)
case *errors.InsufficientBalanceException:
// Log and alert
log.Error("Insufficient balance")
default:
// Generic error handling
log.Error(err)
}
return
}
// ❌ DON'T: Ignore errors
result, _ := client.Trade().CreateOrder(params) // Bad practice// ✅ DO: Reuse client instances
var globalClient *bingx.Client
func init() {
globalClient = bingx.NewClient(apiKey, apiSecret)
}
// ❌ DON'T: Create new client for each request
func makeRequest() {
client := bingx.NewClient(apiKey, apiSecret) // Wasteful
client.Market().GetLatestPrice("BTC-USDT")
}
// ✅ DO: Use batch operations when possible
orders := []map[string]interface{}{...}
client.Trade().CreateBatchOrders(orders)
// ❌ DON'T: Make individual requests in loops
for _, order := range orders {
client.Trade().CreateOrder(order) // Inefficient
}// ✅ DO: Client is thread-safe
var wg sync.WaitGroup
for _, symbol := range symbols {
wg.Add(1)
go func(s string) {
defer wg.Done()
price, _ := client.Market().GetLatestPrice(s)
// Process price
}(symbol)
}
wg.Wait()package main
import (
"testing"
bingx "github.com/tigusigalpa/bingx-go"
)
func TestMarketData(t *testing.T) {
client := bingx.NewClient("", "") // Empty credentials for public endpoints
symbols, err := client.Market().GetFuturesSymbols()
if err != nil {
t.Fatalf("Failed to get symbols: %v", err)
}
if symbols == nil {
t.Error("Expected symbols, got nil")
}
}func TestOrderCreation(t *testing.T) {
if testing.Short() {
t.Skip("Skipping integration test")
}
client := bingx.NewClient(
os.Getenv("BINGX_API_KEY"),
os.Getenv("BINGX_API_SECRET"),
)
// Test order creation
order, err := client.Trade().CreateTestOrder(params)
if err != nil {
t.Fatalf("Test order failed: %v", err)
}
}# Run all tests
go test ./...
# Run with coverage
go test -cover ./...
# Run specific test
go test -run TestMarketData
# Skip integration tests
go test -short ./...- Request Latency: < 50ms (network dependent)
- Memory Usage: ~2MB per client instance
- Concurrent Requests: Supports 1000+ concurrent goroutines
- Signature Generation: < 1ms per request
- Connection Pooling: HTTP client reuses connections automatically
- Batch Operations: Use batch methods for multiple orders
- Caching: Cache market data locally when appropriate
- Rate Limiting: Implement client-side rate limiting to avoid API limits
// Example: Rate-limited requests
import "golang.org/x/time/rate"
limiter := rate.NewLimiter(rate.Limit(10), 1) // 10 requests per second
func makeRequest() {
limiter.Wait(context.Background())
client.Market().GetLatestPrice("BTC-USDT")
}- Order builder with fluent interface
- Rate limiter middleware
- Request/response logging
- Retry with exponential backoff
- Built-in technical indicators
- Strategy backtesting framework
- Portfolio management tools
- Event-driven architecture
- Login to your BingX account
- Go to API Management
- Create API key, configure permissions (Read, Trade)
- Set IP whitelist (recommended)
- Save your API Key and Secret Key — the secret is shown only once
# Clone the repository
git clone https://github.com/tigusigalpa/bingx-go.git
cd bingx-go
# Install dependencies
go mod download
# Run tests
go test ./...
# Run linter
golangci-lint run- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Make your changes
- Add tests for new functionality
- Ensure all tests pass
- Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
- Follow Effective Go guidelines
- Use
gofmtfor formatting - Add comments for exported functions
MIT License — see LICENSE.
This SDK is provided "as-is". Cryptocurrency trading carries significant financial risk. Always test in a sandbox environment before production use. The authors are not responsible for any financial losses.
