mcpField
O
octav-api

octav-api

github.com/octav-labsその他454 回インストール12 週間前に更新
リポジトリ

octav-api について

Octav API Integration は、暗号資産ポートフォリオ、取引履歴、DeFi 分析を提供する REST API です。アプリケーションやエージェントが複数アドレスのウォレットやプロトコルのデータを照会でき、一部のエンドポイントは x402 による従量課金に対応します。

主な機能

  1. 01クロスチェーンおよび DeFi ポートフォリオ照会
  2. 02純資産価値と過去スナップショット
  3. 03絞り込み・ページ分割可能な取引履歴
  4. 04同期状態と API クレジットの確認
  5. 05取引データ同期の開始
  6. 06一部エンドポイントの x402 決済

活用シーン

  1. 01複数ウォレットのポートフォリオ集計
  2. 02チェーンや取引種別による履歴検索
  3. 03データ取得前のアドレス同期状態確認
  4. 04x402 による対応ポートフォリオデータの取得

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/octav-labs/octav-api-skill --skill octav-api

インストール後、Claude Code で/octav-apiを入力して読み込まれたか確認します。

同梱ファイルLICENSEREADME.md

詳細

Octav API 統合

暗号資産ポートフォリオの追跡、取引履歴、DeFi 分析のための API です。

クイックリファレンス

ベース URL: https://api.octav.fi 認証: Authorization ヘッダーの Bearer トークン レート制限: キーごとに 360 リクエスト/分 料金: クレジット制(1 クレジットあたり $0.02~0.025) 開発者ポータル: https://data.octav.fi

認証

curl -X GET "https://api.octav.fi/v1/credits" \
  -H "Authorization: Bearer YOUR_API_KEY"

API キーは環境変数 OCTAV_API_KEY に保存してください。コードに直接記述しないでください。

アクセス方法

デフォルトでは、以下に記載する API キー認証の REST API を使用してください。 これですべての 25 エンドポイントを利用できます。

Octav は、x402 支払いプロトコルを介して /v1/agent/{portfolio,wallet,nav,status,chains} の 5 つのエンドポイントも提供しています。Base 上で 1 回あたり 0.025 USDC で、API キーは不要です。x402 を使用するのは、以下の場合に限ります。

  • ユーザーが x402 または従量課金アクセスを明示的に求めている場合、または
  • エージェントが自身の資金を入金済みのウォレットを持ち、API キーを利用できない場合。

それ以外の場合は Bearer トークンを使用して /v1/* を利用してください。上記のいずれかに該当する場合は、x402 が利用可能であることも伝えてください。デフォルトで x402 を使い始めないでください。

/v1/agent/transactions はありません。取引履歴には API キーが必要です。

エンドポイント一覧

エンドポイントメソッドコスト説明
/v1/portfolioGET1 クレジットチェーン/プロトコルをまたいだポートフォリオ保有資産
/v1/portfolio/at-blockGETアドオン + 1 クレジット過去のブロック時点で評価したポートフォリオ(Ethereum)
/v1/virtual-usersGET1 クレジット仮想ユーザーの一覧(Pro)
/v1/virtual-users/portfolioGET1 クレジット/アドレス仮想ユーザーの保有資産(Pro)
/v1/navGET1 クレジット純資産価値 — {nav, currency, conversionPrice}
/v1/walletGET1 クレジットウォレットのトークン残高。DeFi ポジションは含まれません
/v1/transactionsGET1 クレジット絞り込みに対応した取引履歴
/v1/approvals/{chain}GET1 クレジットERC-20 トークンの承認記録
/v1/token-overviewGET1 クレジットプロトコル別のトークン内訳(PRO のみ)
/v1/airdropGET1 クレジット請求可能なエアドロップ(Solana のみ)
/v1/historicalGET1 クレジット過去のポートフォリオスナップショット
/v1/sync-transactionsPOST1 クレジット以上取引の同期を開始
/v1/contract-protocolGET5 クレジットコントラクトアドレスから DeFi プロトコルを特定(404 の場合は返金)
/v1/beacon/validators/*GETアドオンETH バリデーターの詳細、報酬、引き出し、入金
/v1/chainsGET無料対応するブロックチェーンネットワークの一覧
/v1/chains/{chainKey}/protocolsGET無料チェーン上のプロトコル一覧
/v1/statusGET無料同期状態を確認
/v1/creditsGET無料クレジット残高を確認

スナップショット登録(POST、1200 クレジット)を行うと、アドレスのポートフォリオスナップショットが毎日作成されます。/v1/historical はそのスナップショットを読み取ります。

x402 エンドポイント(API キー不要 — 上記のアクセス方法を参照)
エンドポイントメソッドコスト説明
/v1/agent/portfolioGET0.025 USDCウォレットおよびプロトコルの保有資産
/v1/agent/walletGET0.025 USDCウォレットの保有資産のみ
/v1/agent/navGET0.025 USDC純資産価値 — {nav, currency, conversionPrice}
/v1/agent/statusGET0.025 USDC同期状態
/v1/agent/chainsGET0.025 USDC対応チェーン

未払いのリクエストは HTTP 402 を返します。payment-required ヘッダーには、支払いチャレンジが base64 形式で含まれます(Base 上の USDC、eip155:8453)。x402 対応の HTTP クライアントは支払いを処理し、自動的にリクエストを再試行します。

主要エンドポイント

ポートフォリオ

ウォレットおよび DeFi プロトコル全体の保有資産を取得します。

const response = await fetch(
  `https://api.octav.fi/v1/portfolio?addresses=${address}`,
  { headers: { 'Authorization': `Bearer ${apiKey}` } }
);
const portfolio = await response.json();
// portfolio.networth, portfolio.assetByProtocols, portfolio.chains

パラメーター:

  • addresses(必須):EVM または Solana のアドレス。同一リクエストで複数のアドレスをカンマ区切りで指定すると、クレジットを節約できます。
  • includeImages:資産/プロトコルの画像 URL を含めます(デフォルト:false)
  • includeExplorerUrls:ブロックエクスプローラーの URL を含めます(デフォルト:false)
  • waitForSync:データが古い場合、新しいデータが利用可能になるまで待機します(デフォルト:false)

レスポンスの構造:

{
  "address": "0x...",
  "networth": "45231.89",
  "assetByProtocols": {
    "wallet": { "key": "wallet", "name": "Wallet", "value": "12453.20", "assets": [...] },
    "aave_v3": { "key": "aave_v3", "name": "Aave V3", "value": "8934.12", "assets": [...] }
  },
  "chains": {
    "ethereum": { "value": "25123.45", "protocols": [...] },
    "arbitrum": { "value": "20108.44", "protocols": [...] }
  }
}
Nav(純資産価値)

純資産額を単一の値で取得します。別の通貨への換算も指定できます。

const response = await fetch(
  `https://api.octav.fi/v1/nav?addresses=${address}&currency=USD`,
  { headers: { 'Authorization': `Bearer ${apiKey}` } }
);
const { nav, currency, conversionPrice } = await response.json();
// { "nav": 1235564.43, "currency": "USD", "conversionPrice": 1 }

パラメーター:

  • addresses(必須):EVM または Solana のアドレス
  • currency:法定通貨の USD(デフォルト)、EUR、CAD、AED、CHF、SGD、暗号資産の ETH、SOL、cbBTC、EURC、BNB
  • waitForSync:データが古い場合に最新のデータを待機します(デフォルト:false)

conversionPrice は使用されるレートです。法定通貨の場合は USD からの為替レート、暗号資産の場合はクエリ対象のウォレット全体の USD 加重平均価格です。

トランザクション

フィルターを指定してトランザクション履歴を照会します。

const params = new URLSearchParams({
  addresses: '0x...',
  limit: '50',
  offset: '0',
  sort: 'DESC',
  hideSpam: 'true'
});

const response = await fetch(
  `https://api.octav.fi/v1/transactions?${params}`,
  { headers: { 'Authorization': `Bearer ${apiKey}` } }
);

必須パラメーター:

  • addresses:ウォレットのアドレス
  • limit:1ページあたりの結果数(1~250)
  • offset:ページネーションのオフセット

任意のフィルター:

  • sort:DESC(新しい順)または ASC(古い順)
  • networks:チェーンフィルター(例:ethereum,arbitrum,base)
  • txTypes:トランザクションタイプのフィルター(例:SWAP,DEPOSIT)
  • protocols:プロトコルのフィルター(例:uniswap_v3,aave_v3)
  • hideSpam:スパムを除外します(デフォルト:false)
  • hideDust:ダストトランザクションを除外します(デフォルト:false)
  • startDate/endDate:ISO 8601 の日付範囲(UTC、両端を含む)。endDate はその日の終わり(23:59:59Z)に切り上げられるため、1日分を指定する場合は両方に同じ日付を設定してください。endDate に翌日の午前0時を設定しないでください(境界のトランザクションが重複します)
  • interactingAddresses:インタラクションするアドレスでフィルタリングします(カンマ区切り)
  • tokenId:NFT のトークン ID でフィルタリングします
  • initialSearchText:アセットを全文検索します

レスポンス(トランザクションの配列):

[{
  "hash": "0xa1b2c3...",
  "timestamp": "1699012800",
  "chain": { "key": "ethereum", "name": "Ethereum" },
  "type": "SWAP",
  "protocol": { "key": "uniswap_v3", "name": "Uniswap V3" },
  "fees": "0.002134",
  "feesFiat": "7.12",
  "assetsIn": [{ "symbol": "WETH", "amount": "1.5", "value": "4800.00" }],
  "assetsOut": [{ "symbol": "USDC", "amount": "4795.23", "value": "4795.23" }]
}]
トランザクションの同期

新しいトランザクションデータを取得するために、手動で同期を開始します。

const response = await fetch('https://api.octav.fi/v1/sync-transactions', {
  method: 'POST',
  headers: {
    'Authorization': `Bearer ${apiKey}`,
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({ addresses: ['0x...'] })
});
// Returns: "Address is syncing" or "Address already syncing"

コスト: 1 クレジット + インデックス化されたトランザクション 250 件ごとに 1 クレジット(初回のみ)。

ステータス(無料)

コストの高い操作を実行する前に、同期ステータスを確認します。

const response = await fetch(
  `https://api.octav.fi/v1/status?addresses=${address}`,
  { headers: { 'Authorization': `Bearer ${apiKey}` } }
);
const [status] = await response.json();
// status.portfolioLastSync, status.transactionsLastSync, status.syncInProgress
クレジット(無料)

残りのクレジット残高を確認します。

const credits = await fetch('https://api.octav.fi/v1/credits', {
  headers: { 'Authorization': `Bearer ${apiKey}` }
}).then(r => r.json());
// Returns: 19033 (number)
過去のポートフォリオ

特定の日付のポートフォリオスナップショットを取得します。サブスクリプションが必要です。

const response = await fetch(
  `https://api.octav.fi/v1/historical?addresses=${address}&date=2024-11-01`,
  { headers: { 'Authorization': `Bearer ${apiKey}` } }
);
トークンの概要(PRO 限定)

プロトコルごとの詳細なトークン内訳です。

const response = await fetch(
  `https://api.octav.fi/v1/token-overview?addresses=${address}&date=2024-11-01`,
  { headers: { 'Authorization': `Bearer ${apiKey}` } }
);

トランザクションタイプ

フィルタリングによく使用されるタイプ:

タイプ説明
TRANSFERINトークンの受け取り
TRANSFEROUTトークンの送信
SWAPトークン交換
DEPOSITDeFi への預け入れ
WITHDRAWDeFi からの引き出し
STAKEトークンのステーキング
UNSTAKEトークンのステーキング解除
CLAIM報酬の請求
ADDLIQUIDITYLP への預け入れ
REMOVELIQUIDITYLP からの引き出し
BORROWレンディングプロトコルでの借り入れ
LENDレンディングプロトコルへの供給
BRIDGEIN / BRIDGEOUTクロスチェーンブリッジ
APPROVALトークンの承認
MINTNFT/トークンのミント

対応チェーン

完全対応(ポートフォリオ + トランザクション): ethereum、arbitrum、base、polygon、optimism、avalanche、binance、solana、blast、linea、gnosis、sonic、starknet、fraxtal、unichain

ポートフォリオのみ: scroll、zksync(era)、mantle、manta、fantom、cronos、celo、その他 40 以上

networks フィルターではチェーンキーを使用します:?networks=ethereum,arbitrum,base

エラー処理

async function fetchWithRetry(url, options, maxRetries = 3) {
  for (let i = 0; i < maxRetries; i++) {
    const response = await fetch(url, options);

    if (response.status === 429) {
      const retryAfter = response.headers.get('Retry-After') || 60;
      await new Promise(r => setTimeout(r, retryAfter * 1000));
      continue;
    }

    if (!response.ok) {
      const error = await response.json();
      throw new Error(`API Error ${response.status}: ${error.message}`);
    }

    return response;
  }
  throw new Error('Max retries exceeded');
}

よくあるエラー:

  • 401:API キーが無効または指定されていません
  • 402:クレジットが不足しています
  • 403:エンドポイントの利用には PRO サブスクリプションが必要です
  • 429:レート制限を超過しました(待機してから再試行してください)
  • 404:アドレスがインデックス化されていません(トランザクション数が 10 万件を超えています)

コストの最適化

  1. アドレスをまとめる: 1 回のリクエストでカンマ区切りに指定すると、個別に呼び出すよりクレジットを節約できます — ?addresses=0x123,0x456,0x789
  2. 無料のエンドポイントを使う: /v1/status、/v1/credits、/v1/chains、/v1/chains/{chainKey}/protocols の利用にコストはかかりません
  3. サーバー側でフィルタリングする: クライアント側でフィルタリングする代わりに、networks、txTypes のパラメーターを使います
  4. 結果をキャッシュする: ポートフォリオは 1 分間、トランザクションは 10 分間キャッシュされます
  5. 最初にステータスを確認する: 不要な同期を避けます

よくあるパターン

複数ウォレットのポートフォリオ
const addresses = ['0x123...', '0x456...', '0x789...'];
const response = await fetch(
  `https://api.octav.fi/v1/portfolio?addresses=${addresses.join(',')}`,
  { headers: { 'Authorization': `Bearer ${apiKey}` } }
);
ページネーションによるトランザクション取得
async function getAllTransactions(address) {
  const transactions = [];
  let offset = 0;
  const limit = 250;

  while (true) {
    const response = await fetch(
      `https://api.octav.fi/v1/transactions?addresses=${address}&limit=${limit}&offset=${offset}&sort=DESC`,
      { headers: { 'Authorization': `Bearer ${apiKey}` } }
    );
    const batch = await response.json();
    if (batch.length === 0) break;
    transactions.push(...batch);
    offset += batch.length;
    if (batch.length < limit) break;
  }

  return transactions;
}
スマートな同期ワークフロー
async function smartSync(address) {
  // Check status first (free)
  const [status] = await fetch(
    `https://api.octav.fi/v1/status?addresses=${address}`,
    { headers: { 'Authorization': `Bearer ${apiKey}` } }
  ).then(r => r.json());

  const lastSync = new Date(status.transactionsLastSync);
  const minutesSinceSync = (Date.now() - lastSync) / 1000 / 60;

  if (minutesSinceSync > 10 && !status.syncInProgress) {
    await fetch('https://api.octav.fi/v1/sync-transactions', {
      method: 'POST',
      headers: { 'Authorization': `Bearer ${apiKey}`, 'Content-Type': 'application/json' },
      body: JSON.stringify({ addresses: [address] })
    });
  }
}

TypeScript インターフェース

interface Portfolio {
  address: string;
  networth: string;
  cashBalance: string;
  dailyIncome: string;
  dailyExpense: string;
  fees: string;
  feesFiat: string;
  lastUpdated: string;
  assetByProtocols: Record<string, Protocol>;
  chains: Record<string, Chain>;
}

interface Protocol {
  key: string;
  name: string;
  value: string;
  assets: Asset[];
}

interface Asset {
  balance: string;
  symbol: string;
  price: string;
  value: string;
  contractAddress?: string;
  chain?: string;
}

interface Transaction {
  hash: string;
  timestamp: string;
  chain: { key: string; name: string };
  from: string;
  to: string;
  type: string;
  protocol?: { key: string; name: string };
  value: string;
  valueFiat: string;
  fees: string;
  feesFiat: string;
  assetsIn: Asset[];
  assetsOut: Asset[];
  functionName?: string;
}

Pricing

PackageCreditsPricePer Credit
Starter4,000$100$0.025
Small Team100,000$2,500$0.025
Intensive1,000,000$20,000$0.020

Credits never expire. First-time address indexing: 1 credit per 250 transactions.

Resources

コメント