API 密钥和钱包登录
访问 API 有两种方式:用于您服务器的 API 密钥,以及代表钱包执行操作的钱包会话(消息签名)。
Base URL 与格式
text
https://banipool.com/api/v1- 成功响应:
{ "data": …, "meta": { "requestId", "asOf", "nextCursor"?, "partial"? } }。 - 代币数量和金额以字符串形式发送(完整精度);不可用的指标为
null,绝不会编造。 - ID 采用 CAIP 标准:网络
eip155:8453,账户eip155:8453:0x…,代币eip155:8453/erc20:0x…。
API 密钥
在开发者门户 → API 密钥中创建密钥(需要钱包登录)。密钥绑定到所有者钱包,仅显示一次,可随时撤销。请将其存放在服务器环境变量中,切勿放入前端代码。
bash
# 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"| 权限范围 | 访问权限 |
|---|---|
data:read | 公开数据:网络、资金池、代币、账户余额与仓位、状态、SSE。 |
quotes:create | 交易报价与 Zap 计划(代表密钥所有者钱包模拟)。 |
plans:create | 为密钥所有者钱包生成未签名交易计划并跟踪交易。 |
strategies:read / write | 密钥所有者钱包的 paper/notify 自动化规则。 |
配额与速率限制
- 每次请求消耗:普通读取 1 单位;历史、余额、账户仓位 5;报价/计划 10;跟踪 5。
- 剩余配额显示在
X-Quota-Limit和X-Quota-Remaining响应头中;HTTP 429 会附带Retry-After。 - 公开读取会返回
ETag;发送If-None-Match,数据未变化时将得到无响应体的 304。
钱包登录(会话)
交易和个人数据端点(/v1/me/*)使用钱包会话。先创建 challenge,使用 personal_sign 原样签署其消息,然后验证。非浏览器客户端会获得有效期 7 天的会话令牌用于 Authorization: Bearer 头;浏览器则获得 HttpOnly Cookie。
ts
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>登录签名不授予任何交易权限。来自浏览器的写操作必须发送 x-banipool-csrf: 1 请求头。
TypeScript SDK
@defi/api-client 工作区包含由 OpenAPI 契约生成的类型化客户端。可在 /api/v1/openapi.json 下载契约,为其他语言生成客户端(openapi-generator、oapi-codegen 等)。
ts
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);python
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"))