Referensi API
Kelola API key · Unduh kontrak OpenAPI
Autentikasi dan scope
Kirim key melalui header x-api-key atau Bearer. Simpan key di server. Portal memerlukan sesi wallet; key tidak dapat membuat key baru. Pembacaan publik juga tersedia tanpa key, dengan rate limit IP.
curl "$API_BASE_URL/v1/chains" -H "x-api-key: $DEFI_API_KEY"data:read untuk data; quotes:create untuk quote; plans:create untuk rencana unsigned dan tracking transaksi milik wallet pemilik key. Signature wallet tetap diperlukan. strategies:read membaca aturan otomatisasi milik wallet pemilik key (GET /v1/strategies); strategies:write membuat, mengubah, menjeda, melanjutkan, dan mencabut aturan (eksekusi live tetap butuh izin keeper on-chain yang ditandatangani wallet). webhooks:manage mengelola subscription webhook (GET/POST /v1/developer/webhooks, DELETE /v1/developer/webhooks/{id}, GET …/deliveries). Pengelolaan API key tetap hanya lewat sesi wallet.
Login wallet untuk klien non-browser
Endpoint transaksi juga menerima sesi wallet. Buat challenge, tandatangani pesannya apa adanya dengan personal_sign, lalu verifikasi. Respons berisi token sesi 7 hari untuk header Authorization: Bearer (opsi sessionToken di SDK). Browser menerima cookie HttpOnly saja. Tanda tangan login tidak memberi izin transaksi apa pun.
POST /v1/auth/challenges {"address":"0x…","chainId":8453} → {id, message, expiresAt}
POST /v1/auth/verify {"challengeId":"…","signature":"0x…"} → {token, actor, expiresAt}
GET /v1/auth/session (Authorization: Bearer <token>) → {actor}
DELETE /v1/auth/session → logoutSDK TypeScript
Workspace @defi/api-client menyediakan client yang dibuat dari OpenAPI. Jalankan di server.
import { createDefiClient } from '@defi/api-client';
const client = createDefiClient({
baseUrl: process.env.API_BASE_URL!,
apiKey: process.env.DEFI_API_KEY!,
});
const { data, error, response } = await client.GET('/v1/pools', {
params: { query: { chain: 'base', limit: 50 } },
});
if (!response.ok) throw new Error(JSON.stringify(error));
console.log(data?.data, data?.meta.nextCursor);Pagination dan presisi
Daftar pool, token, dan riwayat transaksi (GET /v1/transactions) memakai limit 1–200 (default 50) dan cursor dari meta.nextCursor. Pertahankan filter dan sort saat mengambil halaman berikutnya. Nominal token dan nilai keuangan dikirim sebagai string; metrik yang tidak tersedia bernilai null. Periksa meta.partial, dataStatus, dan timestamp sebelum menggunakan data.
Kuota, error, dan idempotency
Biaya: baca biasa 1 unit, histori/saldo/posisi akun 5, quote/plan 10, tracking 5. Kuota harian per key ditentukan operator; lihat X-Quota-Limit dan X-Quota-Remaining. HTTP 429 menyertakan Retry-After. Batas IP tetap berlaku. Baca publik membawa ETag: kirim If-None-Match untuk mendapat 304 tanpa body bila data tidak berubah. Response sukses berbentuk data/meta; error memuat code, message, retryable, details, dan requestId.
POST /v1/quotes memerlukan Idempotency-Key 8–128 karakter; POST /v1/developer/api-keys dan /webhooks menerimanya secara opsional (ulangan payload sama mengembalikan resource yang sama dengan replayed: true dan secret null). Gunakan key yang sama untuk payload yang sama. Client tidak mengulangi mutasi otomatis. Plan tidak menandatangani atau menyiarkan transaksi.
Webhook
Endpoint wajib HTTPS publik port 443. Secret ditampilkan sekali. Header: x-webhook-id, x-webhook-timestamp, x-webhook-signature. Verifikasi HMAC SHA-256 atas timestamp + titik + raw body dengan secret, bandingkan secara constant-time, tolak timestamp di luar ±5 menit, dan deduplikasi event ID. Body: id, type, data, createdAt.
Retry maksimal 8 attempt dengan backoff/jitter; setelahnya status dead. Respons 2xx menandakan diterima; redirect tidak diikuti. Event yang dapat dilanggan: transaction.finalized, transaction.failed, data.degraded publik (sekali per episode gangguan head jaringan), position.out_of_range, strategy.executed (paper/notified, atau executed oleh keeper live) dan strategy.execution_failed (eksekusi keeper live gagal; aturan dijeda). Event transaksi diproduksi otomatis oleh reconcile latar belakang (±30 detik setelah transaksi final/gagal), tanpa perlu polling; event posisi/strategi dari worker automation dan keeper. Preferensi positionOutOfRange mengendalikan event posisi; event audit strategi tetap tersedia.
Realtime (SSE)
GET /v1/events/stream mengalirkan event yang sama dengan webhook (milik pemilik sesi/key, plus data.degraded publik) sebagai text/event-stream. Setiap event membawa id sebagai cursor; sambung ulang dengan header Last-Event-ID (EventSource melakukannya otomatis) atau ?after=. Server menutup koneksi sekitar 100 detik untuk browser dan 15 menit untuk API key. Event revoked berarti key dicabut/kedaluwarsa atau sesi berakhir. Event reset berarti cursor sudah lewat retensi: ambil snapshot baru (mis. GET /v1/transactions). Di browser gunakan sesi same-origin; jangan menaruh API key di URL — kirim lewat header x-api-key (scope data:read, 1 unit per koneksi).
const es = new EventSource('/api/v1/events/stream');
es.addEventListener('transaction.finalized', (e) => console.log(e.lastEventId, JSON.parse(e.data)));
es.addEventListener('reset', () => { /* sinkron ulang */ });Data pengguna (/v1/me)
Hanya sesi wallet (API key ditolak 403). GET/POST /v1/me/watchlist dan DELETE /v1/me/watchlist/ {itemId} : pool (ID internal), token (CAIP-19) atau akun watch-only (CAIP-10), maks. 200 item; menambah item yang sudah ada mengembalikan 200 dengan created: false. GET/PUT /v1/me/settings: preferensi notifikasi dengan version guard (kirim version terakhir; berbeda → 409). GET /v1/me/portfolio: wallet sesi di jaringan aktif + maks. 20 akun watch-only; akun yang gagal dibaca berstatus error dan meta.partial true, tidak dihitung nol. DELETE /v1/me/data menghapus watchlist dan preferensi (audit log keamanan tetap).
Strategi paper dan pemberitahuan
GET/POST /v1/strategies, GET/PATCH /v1/strategies/ {id} , POST preview/pause/resume/revoke, GET executions. Semua privat untuk pemilik sesi/key. Mutasi membutuhkan strategies:write (5 unit); pembacaan strategies:read (1 unit). PATCH dan perubahan status membutuhkan version terbaru; konflik 409. Mode paper mencatat pemicu, bukan simulasi trade; mode notify hanya untuk type notify. Compound/rebalance/exit belum mengeksekusi dana. Worker menerapkan time buffer, cooldown, batas harian UTC dan expiry. Revoke mencabut aturan off-chain, bukan allowance on-chain.Kelola aturan.
Sandbox, changelog, dan deprecation
Versi 1.4.0: strategi paper/pemberitahuan, API scope strategi, event posisi/strategi. Versi 1.3.0: endpoint /v1/me (watchlist, preferensi, portofolio gabungan, hapus data). Versi 1.0.0 menambahkan portal, key, kuota, SDK, dan webhook. Versi 1.2.0: schema respons transaksi/quote/saldo/status lengkap (kolom internal tidak lagi dikirim), pagination riwayat transaksi, ETag, Idempotency-Key opsional di portal, SSE API key 15 menit/1 unit. Versi 1.1.0 menambahkan login wallet di kontrak OpenAPI, GET /v1/tokens/ {tokenId} di SDK (ID CAIP-19 di-URL-encode), SSE /v1/events/stream, dan event transaksi otomatis. Untuk sandbox, jalankan database lokal serta integration test berbasis fixture; API tidak mengarang data mainnet. Registry menunjukkan capability nyata setiap deployment. Breaking change memakai versi major baru dan pengumuman periode migrasi sebelum versi lama dinonaktifkan. Belum ada endpoint deprecated.
Endpoint publik & sesi
Daftar endpoint diambil langsung dari kontrak OpenAPI yang sedang berjalan.
| Metode | Endpoint | Keterangan |
|---|---|---|
| GET | /v1/chains | |
| GET | /v1/chains/{chainSlug}/capabilities | |
| GET | /v1/protocols | |
| GET | /v1/vaults | Vault ERC-4626 resmi BaniPool (Spark spUSDG Robinhood, sUSDC Base); snapshot langsung atau unavailable. |
| GET | /v1/vaults/{vaultId} | |
| POST | /v1/vaults/{vaultId}/quotes | Owner-bound read-only preview including contract fees and limits. |
| GET | /v1/vaults/{vaultId}/position | Posisi wallet sesi di vault: shares, nilai aset, batas tarik kontrak, saldo aset di wallet. |
| POST | /v1/vaults/{vaultId}/plans | Rencana transaksi vault. |
| GET | /v1/pools | |
| GET | /v1/pools/search | |
| GET | /v1/pools/ohlcv | Candle harga pool (GeckoTerminal) untuk grafik rentang. |
| GET | /v1/pools/dex-listed | Apakah DexScreener mengindeks pool (untuk grafik embed). |
| GET | /v1/pools/studio/state | On-chain state of any Uniswap v2/v3/v4 or v3-fork pool by address or v4 pool ID: tokens, fee, tick, active liquidity, 24h LP fees (fee-growth accumulator) and whether adding liquidity is available. |
| GET | /v1/pools/studio/liquidity | Active-liquidity distribution around the current price (v3/v4) from initialized ticks; USD value per segment at current token prices. |
| GET | /v1/pools/studio/chart | Price, TVL (v2/v3 balances), LP fees, volume (static fee only) and APR per interval from archive state over 1d/7d/30d. |
| GET | /v1/pools/security | The last full report is stored server-side and served immediately (cachedAt); reports older than 30 minutes or still computing are served while a background re-check runs (refreshing=true); fresh=1 forces a new check. |
| GET | /v1/pools/security/history | Security scan history (grade timeline) and detected change events for a pool: grade drops, checks that became riskier, owner/proxy/hook controller changes, active-liquidity and TVL drops of 50% or more. |
| GET | /v1/pools/security/alerts/key | VAPID public key for Web Push security alerts (generated once and stored server-side). |
| POST | /v1/pools/security/alerts | Opt in to Web Push alerts for one pool (warning/danger events from the 30-minute monitor and the real-time WSS watcher). |
| POST | /v1/pools/security/alerts/remove | Stop Web Push alerts for one pool on this browser. |
| POST | /v1/pools/security/alerts/status | Whether this browser receives alerts for the pool. |
| GET | /v1/pools/{poolId} | |
| GET | /v1/pools/{poolId}/history | |
| GET | /v1/pools/{poolId}/analytics | Observed TVL/price changes over at most 30 days; not PnL/APR. |
| GET | /v1/analytics/pools | Compare 1–5 unique pools using a common observation window. |
| GET | /v1/tokens | |
| GET | /v1/tokens/{tokenId} | |
| GET | /v1/token-icons | Ikon raster on-demand untuk aset terindeks atau hasil deteksi pool, cocok jaringan dan CA. |
| GET | /v1/accounts/{accountId}/balances | |
| GET | /v1/accounts/{accountId}/positions | |
| GET | /v1/positions/{positionId}/opened | Waktu posisi NFT dibuat (block mint). |
| GET | /v1/positions/{positionId} | |
| GET | /v1/status | |
| GET | /v1/developer/api-keys | Sesi wallet pemilik diperlukan. |
| POST | /v1/developer/api-keys | Sesi wallet pemilik diperlukan. |
| DELETE | /v1/developer/api-keys/{id} | Sesi wallet pemilik diperlukan. |
| GET | /v1/developer/usage | Sesi wallet pemilik diperlukan. |
| GET | /v1/developer/webhooks | Sesi wallet pemilik diperlukan. |
| POST | /v1/developer/webhooks | Sesi wallet pemilik diperlukan. |
| DELETE | /v1/developer/webhooks/{id} | Sesi wallet pemilik diperlukan. |
| GET | /v1/developer/webhooks/{id}/deliveries | Sesi wallet pemilik diperlukan. |
| GET | /v1/events/stream | Server-Sent Events (text/event-stream): transaction.finalized/failed milik pemilik sesi/API key dan event publik data.degraded. |
| GET | /v1/me/watchlist | Watchlist pool/token/akun milik wallet sesi (maks. |
| POST | /v1/me/watchlist | Tambah item. |
| DELETE | /v1/me/watchlist/{itemId} | Sesi wallet pemilik diperlukan. |
| GET | /v1/me/settings | Preferensi wallet sesi (default bila belum pernah disimpan, version 0). |
| PUT | /v1/me/settings | Simpan preferensi dengan version guard: kirim version terakhir yang dibaca (0 bila belum ada); berbeda → 409. |
| GET | /v1/me/portfolio | Agregasi wallet sesi (terverifikasi) di jaringan EVM aktif + maks. |
| DELETE | /v1/me/data | Hapus watchlist dan preferensi milik wallet sesi. |
| GET | /v1/strategies | Strategi privat milik sesi/key. |
| POST | /v1/strategies | Buat draft dari posisi milik wallet. |
| GET | /v1/strategies/{id} | |
| PATCH | /v1/strategies/{id} | Ganti konfigurasi dengan version guard. |
| POST | /v1/strategies/{id}/preview | Evaluasi read-only; tidak mengubah timer, budget atau histori; tidak simulasi trade. |
| POST | /v1/strategies/{id}/pause | |
| POST | /v1/strategies/{id}/resume | Aktifkan versi ini setelah cek pemilik, expiry dan data RPC. |
| POST | /v1/strategies/{id}/revoke | Cabut permanen penjadwalan strategi off-chain ini. |
| GET | /v1/strategies/{id}/executions | |
| GET | /v1/strategies/{id}/keeper | Status izin keeper dana nyata (kebijakan BaniKeeperV4 & izin NFT on-chain) untuk posisi aturan ini, data transaksi pemberian/pencabutan izin (ditandatangani wallet pemilik), dan 20 pekerjaan keeper terakhir. |
| POST | /v1/strategies/{id}/keeper/plan | Rencana aksi keeper (compound/rebalance/exit aturan ini) untuk ditandatangani PEMILIK sendiri ("Jalankan sekarang"); disimulasikan, batas minimum dari simulasi. |
| POST | /v1/strategies/{id}/keeper/confirm | Catat transaksi keeper yang sudah terkonfirmasi (diverifikasi on-chain: ke kontrak keeper, event untuk posisi & pemilik aturan ini). |
| GET | /v1/me/notifications | Kanal notifikasi /automation milik wallet sesi: kunci publik Web Push dan status tautan Telegram. |
| POST | /v1/me/notifications/push | Daftarkan browser ini untuk Web Push notifikasi aturan. |
| POST | /v1/me/notifications/push/remove | Sesi wallet pemilik diperlukan. |
| POST | /v1/me/notifications/push/status | Sesi wallet pemilik diperlukan. |
| POST | /v1/me/notifications/telegram/link | Kode tautan sekali pakai (15 menit): buka url lalu tekan Start di bot. |
| POST | /v1/me/notifications/telegram/verify | Sesi wallet pemilik diperlukan. |
| POST | /v1/me/notifications/telegram/manual | Tautkan chat ID Telegram secara manual; hanya berhasil bila pesan uji terkirim. |
| POST | /v1/me/notifications/telegram/unlink | Sesi wallet pemilik diperlukan. |
| POST | /v1/me/notifications/test | Kirim notifikasi uji ke semua kanal wallet sesi. |
| POST | /v1/keeper/rebalance | Rebalance posisi Uniswap v4 dalam satu transaksi lewat kontrak BaniKeeperV4 (tarik → swap penyeimbang di pool yang sama → posisi baru ±widthPct% milik pemilik). |
| POST | /v1/keeper/confirm | Verifikasi rebalance on-chain (event Rebalanced untuk posisi & pemilik ini) dan pindahkan aturan /automation pemilik ke posisi baru. |
| POST | /v1/auth/challenges | Buat challenge login (SIWE-like) untuk alamat wallet. |
| POST | /v1/auth/verify | Verifikasi signature dan buat sesi 7 hari. |
| GET | /v1/auth/session | Alamat pemilik sesi aktif. |
| DELETE | /v1/auth/session | Logout: cabut sesi. |
| POST | /v1/quotes | |
| POST | /v1/transaction-plans | |
| POST | /v1/transactions/{id}/submissions | |
| POST | /v1/transaction-tracking | |
| POST | /v1/transactions/{id}/rejected | |
| GET | /v1/zap-balances | Saldo wallet sesi (ETH native = alamat nol), maksimal 100 token jaringan per permintaan. |
| POST | /v1/zap-plans | Rencana Zap In: token jaringan dikonversi melalui pool kanonik v2/v3 (langsung atau lewat wrapped native/stablecoin), lalu disesuaikan dengan rasio pool tujuan. |
| POST | /v1/zap-out-plans | |
| POST | /v1/zap-out-batches | |
| POST | /v1/zap-out-contract-plans | |
| POST | /v1/zap-in-contract-plans | |
| GET | /v1/token-holdings | Semua token ERC-20 milik wallet sesi (pemilih token Zap). |
| GET | /v1/zap-approvals | Izin seluruh koleksi NFT posisi v4 milik wallet sesi ke kontrak Zap BaniPool, beserta transaksi pencabutannya. |
| GET | /v1/zap-receipts | Status konfirmasi transaksi approval milik sesi, menggunakan RPC server dan cadangannya. |
| GET | /v1/transactions | |
| POST | /v1/transactions/{id}/replacement | |
| GET | /v1/transactions/{id} | |
| GET | /v1/bridge/routes | Rute bridge Across terverifikasi (Base ↔ Robinhood Chain: ETH, WETH, USDC↔USDG). |
| POST | /v1/bridge/quotes | Kuota bridge Across: biaya & jumlah diterima dari API Across, divalidasi terhadap SpokePool registry; calldata depositV3 dibangun server dan disimulasikan. |
| POST | /v1/bridge/transfers | Catat transaksi deposit yang sudah dikirim wallet. |
| GET | /v1/bridge/transfers | 50 transfer bridge terakhir milik wallet sesi. |
| GET | /v1/bridge/transfers/{id} | Sesi wallet pemilik diperlukan. |
| POST | /v1/swap-routes | Rute swap halaman /swap (khusus gateway Rust, sesi wallet): token A → B di satu jaringan lewat pool Uniswap v2/v3 terdaftar, langsung atau lewat wrapped native/stablecoin (hasil terbesar). |
| GET | /v1/token-meta | Simbol & desimal token ERC-20 dibaca dari kontrak (khusus gateway Rust, sesi wallet; maks. |
| POST | /v1/bridge/estimates | Perkiraan Across untuk rencana swap lintas jaringan (khusus gateway Rust, sesi wallet): tanpa cek saldo, tanpa calldata, tidak disimpan. |
| POST | /v1/me/notifications/email/link | Kirim kode verifikasi 6 digit ke alamat email (khusus gateway Rust, sesi wallet; sekali per menit; aktif bila SMTP diatur). |
| POST | /v1/me/notifications/email/verify | Verifikasi kode 6 digit (maks. |
| POST | /v1/me/notifications/email/unlink | Lepas email notifikasi. |
| GET | /v1/platform-fee | Fee platform yang berlaku (publik, khusus gateway Rust), bps (100 = 1%) dikirim ke `recipient` di transaksi yang sama: `swapBps`/`stableBps` dari hasil swap /swap (stableBps untuk stablecoin ↔ stablecoin); `zapBps` dari input Zap In / hasil Zap Out (BaniZapV6); `bridgeBps` dari jumlah bridge di jaringan asal (BaniBridgeV1); `keeperBps` dari fee LP yang di-compound wallet keeper (BaniKeeperV6, maks `maxKeeperBps`, berlaku untuk izin baru). |
| GET | /v1/pool-create/check | Cek sebelum membuat pool baru (sesi wallet; Fase H, saat ini Robinhood Chain): urutan token0/token1, simbol & desimal, status terverifikasi, harga USD, apakah pool/pair sudah ada, tick spacing, dan harga pasar pembanding (token1 per token0). |
| GET | /v1/pool-create/detect | Deteksi otomatis untuk Buat pool (sesi wallet): jaringan (yang sudah dibuka) tempat kedua alamat adalah token valid, simbol/desimal/harga, dan per protokol daftar fee tier beserta pool yang sudah ada. |
| GET | /v1/pool-create/token | Langkah pertama Buat pool (sesi wallet): metadata satu token di jaringan yang dibuka dan hasil pemeriksaan keamanan token tanpa pool (nilai A–F, ringkasan, daftar pemeriksaan: peniru, proxy, mint, pajak, owner, dll.). |
| POST | /v1/pool-create/zap-plan | Zap In untuk pool baru (sesi wallet): bayar satu token (token pool, ETH, atau token lain). |
| POST | /v1/pool-create/zap-contract-plan | Zap In pool baru dalam SATU transaksi lewat kontrak BaniZapCreate (sesi wallet): body sama dengan /v1/pool-create/zap-plan ditambah slippageBps, swapSlippageBps, acceptTokenRisk, acceptPriceDeviation. |