BackpackExchange, Backpack Exchange borsasının REST API’leri için geliştirilmiş, resmi olmayan bir .NET istemci kütüphanesidir.
SPOT piyasa için public ve authenticated endpoint’ler altında tip güvenli modeller, async/await tabanlı servisler ve ED25519 imzalama altyapısı sunar.
Uyarı: Bu kütüphane Backpack Exchange tarafından resmi olarak yayınlanmamıştır.
Gerçek para ile işlem yapmadan önce mutlaka kendi testlerinizi yapın ve Backpack Exchange’in
resmi API dokümantasyonunu inceleyin.
| Alan | Açıklama |
|---|---|
| System | Ping, sistem zamanı, sistem durumu (/api/v1/system/*) |
| Assets | Varlıklar ve teminat bilgisi (/api/v1/assets, /api/v1/collateral) |
| Markets | Piyasalar, ticker, derinlik, K-Line, mark prices, open interest (/api/v1/markets, /api/v1/depth vb.) |
| Trades (Public) | Son işlemler ve geçmiş işlemler (/api/v1/trades, /api/v1/trades/history) |
| Account | Hesap özeti, hesap ayarları, max order quantity, max withdrawal quantity (/api/v1/account/*) |
| Capital | Bakiyeler, collateral, yatırma/çekme geçmişi, dust conversion (/api/v1/capital, /wapi/v1/capital/*) |
| History | Fill history, order history, settlement history, dust history (/wapi/v1/history/*) |
| Orders (SPOT) | SPOT emir açma, güncelleme, iptal, tüm emirler, batch emir (/api/v1/orders) |
| HTTP İmzalama | ED25519 anahtar çifti ile imzalama (X-API-KEY, X-SIGNATURE, X-TIMESTAMP, X-WINDOW) |
| Async & Cancel | Tüm servis metotlarında Task<T> ve CancellationToken kullanımı |
| DI Entegrasyonu | AddBackpackExchangeClient(...) ile IServiceCollection üzerinden kolay kayıt |
| Tip Güvenliği | Enum tabanlı modeller (order türleri, zaman aralıkları, durumlar, blockchain, sort direction, vs.) |
Not: Bu kütüphane yalnızca SPOT piyasa işlemlerine odaklanır. Futures / Margin / Leverage entegrasyonları bilerek eklenmemiştir.
dotnet add package BackpackExchange --version 1.0.0<PackageReference Include="BackpackExchange" Version="1.0.0" />Private (kimlik doğrulama gerektiren) API uç noktalarını kullanmak için Backpack Exchange hesabınızdan bir API Key oluşturmanız gerekir.
Ekteki ekran görüntülerine göre özet akış:
- Backpack hesabınızda sağ üstten Settings ekranına gidin.
- Üst sekmelerden API Keys sekmesini açın.
Burada mevcut anahtarlarınızı ve izinlerini görebilirsiniz. - Sağ taraftaki New API key butonuna tıklayın.
- Açılan Create API key penceresinde:
- Name alanına, örneğin
Backpack API Testgibi açıklayıcı bir isim yazın. - Subaccount alanında ana hesap (Main) veya ister seniz belirli bir alt hesabı seçin.
- Sadece okuma için kullanacaksanız Read only anahtar oluşturabilirsiniz; emir açma/iptal gibi işlemler için bu seçeneği kapatıp Read / Write izinli bir anahtar oluşturmalısınız.
- Name alanına, örneğin
- Anahtarı onayladıktan sonra ekranda:
API Key(Backpack Exchange tarafında gördüğünüz base64 ED25519 public key),API Secret(gizli anahtar / seed),- İzinler (ör. Read / Write) ve IP kısıtlaması (IP/CIDR) bilgileri gösterilir.
API KeyveAPI Secretdeğerlerini güvenli bir yerde saklayın; bu değerler bir daha tam hâliyle gösterilmeyebilir.
Bu kütüphanede, Backpack’in verdiği ED25519 API key (public) ve secret (private seed) değerlerini doğrudan kullanıyoruz.
Güvenlik için önerilen kullanım:
var apiKey = Environment.GetEnvironmentVariable("BACKPACK_API_KEY");
var secretKey = Environment.GetEnvironmentVariable("BACKPACK_SECRET_KEY");Bu değerleri asla kaynak koda gömmeyin; üretimde environment değişkenleri, secret manager veya benzeri mekanizmalar kullanın.
Public endpoint’ler için sadece HttpClient yeterlidir.
using BackpackExchange.Services;
// 🌐 Sadece public API uç noktaları için
using var httpClient = new HttpClient { BaseAddress = new Uri("https://api.backpack.exchange") };
var marketService = new MarketService(httpClient);
// Tüm spot piyasaları getir
var markets = await marketService.GetMarketsAsync();
if (markets is not null)
{
foreach (var m in markets)
{
Console.WriteLine($"{m.Symbol} - {m.BaseSymbol}/{m.QuoteSymbol} - Tip:{m.MarketType}");
}
}
// Belirli bir sembol için ticker getir
var ticker = await marketService.GetTickerAsync("SOL_USDC");
if (ticker is not null)
{
Console.WriteLine($"SOL_USDC Son Fiyat: {ticker.LastPrice} | 24h Hacim: {ticker.Volume}");
}
// Derinlik
var depth = await marketService.GetDepthAsync("SOL_USDC", Enums.DepthLimit.Twenty);
Console.WriteLine($"Asks: {depth?.Asks.Count}, Bids: {depth?.Bids.Count}");Aşağıdaki örnek, BackpackExchange_Test/Program.cs içinde kurguladığımız akışın sadeleştirilmiş hâlidir:
- API anahtarları ile
BackpackExchangeClientoluştur - Hesap bilgilerini getir
- Limit alış emri ver
- Emri sorgula
- Emri güncelle
- Emri iptal et
- Açık emirleri, geçmiş emirleri ve diğer order/history servislerini kullan
using BackpackExchange;
using BackpackExchange.Enums;
using BackpackExchange.Models.Order;
using BackpackExchange.Services;
// 1) Kimlik bilgilerini ortam değişkenlerinden al
var apiKey = Environment.GetEnvironmentVariable("BACKPACK_API_KEY");
var secretKey = Environment.GetEnvironmentVariable("BACKPACK_SECRET_KEY");
if (string.IsNullOrWhiteSpace(apiKey) || string.IsNullOrWhiteSpace(secretKey))
{
Console.WriteLine("Lütfen BACKPACK_API_KEY ve BACKPACK_SECRET_KEY değişkenlerini ayarlayın.");
return;
}
// 2) HttpClient + BackpackExchangeClient oluştur
using var httpClient = new HttpClient { BaseAddress = new Uri("https://api.backpack.exchange") };
using var client = new BackpackExchangeClient(httpClient, new BackpackExchange.Models.Common.BackpackOptions
{
ApiKey = apiKey,
SecretKey = secretKey,
});
// Servislere erişim
var account = client.AccountService;
var orders = client.OrderService;
// 3) Hesap özetini getir
var accountSummary = await account.GetAccountAsync();
if (accountSummary is not null)
{
Console.WriteLine($"Spot Maker Fee: {accountSummary.SpotMakerFee} | Spot Taker Fee: {accountSummary.SpotTakerFee}");
}
// 4) SOL_USDC için örnek limit alış emri ver
var newOrder = new ExecuteOrderRequest
{
Symbol = "SOL_USDC",
Side = OrderSide.Bid,
OrderType = OrderType.Limit,
TimeInForce = TimeInForce.Gtc,
Quantity = "0.1",
Price = "50",
};
var createdOrder = await orders.ExecuteOrderAsync(newOrder);
if (createdOrder is null)
{
Console.WriteLine("Emir oluşturulamadı.");
return;
}
Console.WriteLine($"Yeni emir oluşturuldu. Id: {createdOrder.Id}, Durum: {createdOrder.Status}");
// 5) Emri detaylarıyla tekrar sorgula
var fetched = await orders.GetOrderAsync(createdOrder.Id);
if (fetched is not null)
{
Console.WriteLine($"Emir durumu: {fetched.Status}, Gerçekleşen Miktar: {fetched.ExecutedQuantity}");
}
// 6) Emri güncelle (örnek: fiyat değiştir)
var updateRequest = new ExecuteOrderRequest
{
Symbol = newOrder.Symbol,
Side = newOrder.Side,
OrderType = newOrder.OrderType,
TimeInForce = newOrder.TimeInForce,
Quantity = newOrder.Quantity,
Price = "55", // Yeni fiyat
ClientId = createdOrder.Id, // Orijinal emir ile ilişkilendirme
};
var updated = await orders.ExecuteOrderAsync(updateRequest);
Console.WriteLine($"Emir güncelleme isteği gönderildi. Yeni fiyat: {updateRequest.Price}");
// 7) Emri iptal et
var cancelled = await orders.CancelOrderAsync(new CancelOrderRequest
{
Symbol = newOrder.Symbol,
OrderId = createdOrder.Id,
});
if (cancelled is not null)
{
Console.WriteLine($"Emir iptal edildi. Id: {cancelled.Id}, Durum: {cancelled.Status}");
}
// 8) Açık emirler ve geçmiş emirler
var openOrders = await orders.GetOpenOrdersAsync(symbol: "SOL_USDC");
Console.WriteLine($"Açık emir sayısı: {openOrders?.Count ?? 0}");
var history = await client.HistoryService.GetOrderHistoryAsync(symbol: "SOL_USDC", limit: 10);
Console.WriteLine($"Son 10 emir geçmişi kaydı: {history?.Count ?? 0}");Detaylı ve tam akış için
BackpackExchange_Test/Program.csdosyasını inceleyebilirsiniz; orada tümOrderServicemetotları (tekli emir, batch emir, cancel, cancel all, history) sırasıyla denenmektedir.
BackpackExchangeServiceCollectionExtensions ile IBackpackExchangeClient’ı ASP.NET Core veya worker servislerinde kolayca kullanabilirsiniz.
using BackpackExchange;
using BackpackExchange.Interfaces;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddBackpackExchangeClient(options =>
{
options.BaseUrl = builder.Configuration["Backpack:BaseUrl"] ?? "https://api.backpack.exchange";
options.ApiKey = builder.Configuration["Backpack:ApiKey"];
options.SecretKey = builder.Configuration["Backpack:SecretKey"];
});
var app = builder.Build();
app.MapGet("/sol-ticker", async (IBackpackExchangeClient bpClient, CancellationToken ct) =>
{
var ticker = await bpClient.MarketService.GetTickerAsync("SOL_USDC", ct);
return ticker is null
? Results.Problem("Ticker alınamadı.", statusCode: 502)
: Results.Ok(ticker);
});
app.Run();appsettings.json örneği:
{
"Backpack": {
"BaseUrl": "https://api.backpack.exchange",
"ApiKey": "BASE64_ENCODED_PUBLIC_KEY",
"SecretKey": "BASE64_ENCODED_PRIVATE_KEY_SEED"
}
}HTTP 2xx dışındaki tüm yanıtlar için kütüphane BackpackHttpException fırlatır.
Bu exception üzerinden:
- HTTP status code,
- Backpack API
codevemessage, - Ham response body
gibi bilgilere erişebilirsiniz.
using BackpackExchange.Core.Exceptions;
try
{
var balances = await client.CapitalService.GetBalancesAsync();
}
catch (BackpackHttpException ex)
{
Console.WriteLine($"HTTP Hatası: {(int)ex.StatusCode} - {ex.StatusCode}");
Console.WriteLine($"API Kodu : {ex.ErrorCode}");
Console.WriteLine($"Mesaj : {ex.Message}");
Console.WriteLine($"Body : {ex.ResponseContent}");
}
catch (InvalidOperationException ex)
{
// Kimlik bilgileri eksik vb.
Console.WriteLine(ex.Message);
}| Servis | Metot | Açıklama |
|---|---|---|
SystemService |
GetStatusAsync |
Sistem durumu |
SystemService |
PingAsync |
Ping |
SystemService |
GetTimeAsync |
Sistem zamanı |
SystemService |
GetWalletsAsync |
Cüzdan bilgileri |
AssetService |
GetAssetsAsync |
Tüm varlıklar |
AssetService |
GetCollateralInfoAsync |
Teminat parametreleri |
MarketService |
GetMarketsAsync |
Tüm piyasalar |
MarketService |
GetMarketAsync |
Tekil piyasa |
MarketService |
GetTickerAsync |
Tekil ticker |
MarketService |
GetTickersAsync |
Tüm ticker'lar |
MarketService |
GetDepthAsync |
Emir defteri derinliği |
MarketService |
GetKlinesAsync |
Mum verileri (K-Line) |
TradeService |
GetRecentTradesAsync |
Son işlemler |
TradeService |
GetHistoricalTradesAsync |
Geçmiş işlemler |
| Servis | Metot | Açıklama |
|---|---|---|
AccountService |
GetAccountAsync |
Hesap bilgileri |
AccountService |
UpdateAccountAsync |
Hesap ayarlarını güncelle |
AccountService |
GetMaxOrderQuantityAsync |
Maks. emir miktarı |
AccountService |
GetMaxWithdrawalQuantityAsync |
Maks. çekim miktarı |
CapitalService |
GetBalancesAsync |
Bakiyeler |
CapitalService |
GetCollateralAsync |
Teminat durumu |
CapitalService |
GetDepositsAsync |
Yatırma işlemleri |
CapitalService |
GetDepositAddressAsync |
Yatırma adresi |
CapitalService |
GetWithdrawalsAsync |
Çekim işlemleri |
CapitalService |
RequestWithdrawalAsync |
Çekim talebi |
CapitalService |
ConvertDustAsync |
Dust dönüşümü |
CapitalService |
GetDustHistoryAsync |
Dust geçmişi |
OrderService |
GetOrderAsync |
Tekil emir sorgula |
OrderService |
ExecuteOrderAsync |
Emir ver |
OrderService |
ExecuteOrdersAsync |
Toplu emir |
OrderService |
CancelOrderAsync |
Emir iptal |
OrderService |
GetOpenOrdersAsync |
Açık emirler |
OrderService |
CancelAllOrdersAsync |
Tüm emirleri iptal |
HistoryService |
GetFillHistoryAsync |
Eşleşme (fill) geçmişi |
HistoryService |
GetOrderHistoryAsync |
Emir geçmişi |
HistoryService |
GetSettlementHistoryAsync |
Uzlaşma geçmişi |
Backpack Exchange, kimlik doğrulama için ED25519 anahtar çifti kullanır. Örneğin Python ile anahtar oluşturabilirsiniz:
python3 -c "
from cryptography.hazmat.primitives.asymmetric import ed25519
import base64
key = ed25519.Ed25519PrivateKey.generate()
seed = key.private_bytes_raw()
pub = key.public_key().public_bytes_raw()
print(f'Secret Key (Seed): {base64.b64encode(seed).decode()}')
print(f'Public Key (API Key): {base64.b64encode(pub).decode()}')
"Bu proje MIT Lisansı ile lisanslanmıştır.
Bu kütüphane resmi olmayan bir üçüncü parti projesidir ve Backpack Exchange ile herhangi bir kurumsal bağlantısı yoktur.
Kripto para işlemleri yüksek risk içerir; kullanım riski tamamen kullanıcıya aittir. Üretim ortamında kullanmadan önce mutlaka kendi testlerinizi yapın ve ilgili tüm yasal/mevzuat gerekliliklerini göz önünde bulundurun.
Bu kütüphaneyi faydalı bulduysanız ve geliştirilmesine katkıda bulunmak istiyorsanız, kripto para bağışı yapabilirsiniz:
Tüm Ağlar İçin Cüzdan Adresi:
0x21bc1e50042708a30275c151e43f7b1c1be99f2f
Desteklenen tokenlar: Tüm ERC-20/BEP-20 tokenları