API key & login wallet
Dua cara mengakses API: API key untuk server Anda, dan sesi wallet (tanda tangan pesan) untuk aksi atas nama sebuah wallet.
Base URL & format
https://banipool.com/api/v1- Respons sukses:
{ "data": …, "meta": { "requestId", "asOf", "nextCursor"?, "partial"? } }. - Nominal token dan nilai uang dikirim sebagai string (presisi penuh); metrik yang tidak tersedia bernilai
null, tidak pernah dikarang. - ID memakai standar CAIP: jaringan
eip155:8453, akuneip155:8453:0x…, tokeneip155:8453/erc20:0x….
API key
Buat key di Developer Portal → API key (perlu login wallet). Key terikat ke wallet pemiliknya, hanya ditampilkan sekali, dan bisa dicabut kapan saja. Simpan di environment server, jangan di kode frontend.
# Header x-api-key (atau Authorization: Bearer <key>)
curl -s "https://banipool.com/api/v1/pools?chain=base&limit=5" \
-H "x-api-key: $BANIPOOL_API_KEY"| Scope | Akses |
|---|---|
data:read | Data publik: jaringan, pool, token, saldo & posisi akun, status, SSE. |
quotes:create | Quote transaksi & rencana Zap (simulasi atas nama wallet pemilik key). |
plans:create | Rencana transaksi unsigned dan tracking transaksi wallet pemilik key. |
strategies:read / write | Aturan otomatisasi paper/notify milik wallet pemilik key. |
Kuota & batas laju
- Biaya per request: baca biasa 1 unit; histori, saldo, posisi akun 5; quote/plan 10; tracking 5.
- Sisa kuota terlihat di header
X-Quota-LimitdanX-Quota-Remaining; HTTP 429 menyertakanRetry-After. - Pembacaan publik membawa
ETag; kirimIf-None-Matchuntuk mendapat 304 tanpa body bila data tidak berubah.
Login wallet (sesi)
Endpoint transaksi dan data pribadi (/v1/me/*) memakai sesi wallet. Buat challenge, tanda tangani pesannya apa adanya dengan personal_sign, lalu verifikasi. Klien non-browser menerima token sesi 7 hari untuk header Authorization: Bearer; browser menerima cookie HttpOnly.
import { privateKeyToAccount } from 'viem/accounts';
const API = 'https://banipool.com/api/v1';
const account = privateKeyToAccount(process.env.WALLET_PRIVATE_KEY as `0x${string}`);
// 1) Challenge
const ch = await fetch(`${API}/auth/challenges`, {
method: 'POST',
headers: { 'content-type': 'application/json' },
body: JSON.stringify({ address: account.address, chainId: 8453 }),
}).then((r) => r.json());
// 2) Tanda tangani pesan apa adanya (personal_sign)
const signature = await account.signMessage({ message: ch.data.message });
// 3) Verifikasi → token sesi 7 hari
const v = await fetch(`${API}/auth/verify`, {
method: 'POST',
headers: { 'content-type': 'application/json' },
body: JSON.stringify({ challengeId: ch.data.id, signature }),
}).then((r) => r.json());
const session = v.data.token; // Authorization: Bearer <session>Tanda tangan login tidak memberi izin transaksi apa pun. Mutasi dari browser wajib mengirim header x-banipool-csrf: 1.
SDK TypeScript
Workspace @defi/api-client berisi client bertipe yang dibuat dari kontrak OpenAPI. Unduh kontraknya di /api/v1/openapi.json untuk membuat client bahasa lain (openapi-generator, oapi-codegen, dll.).
import { createDefiClient } from '@defi/api-client';
const client = createDefiClient({
baseUrl: 'https://banipool.com/api',
apiKey: process.env.BANIPOOL_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.length, data?.meta.nextCursor);import os, requests
API = "https://banipool.com/api/v1"
r = requests.get(f"{API}/pools", params={"chain": "base", "limit": 50},
headers={"x-api-key": os.environ["BANIPOOL_API_KEY"]}, timeout=20)
r.raise_for_status()
body = r.json()
for pool in body["data"]:
print(pool["id"], pool.get("tvlUsd"))
print("cursor berikutnya:", body["meta"].get("nextCursor"))