[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6D0JQ2S6VCF1GCP5PDKM9MS":3,"skill-same:01M6D0JQ2S6VCF1GCP5PDKM9MS":86},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":27,"publishedAt":48,"linkOnly":49,"markdownContent":50,"markdownBody":51,"frontMatter":52,"refName":58,"commitSha":59,"skillDirectory":60,"forksCount":61,"repositoryHtmlUrl":62,"repositoryHomepageUrl":63,"ownerHtmlUrl":64,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":65,"install":66,"resources":79},"01M6D0JQ2S6VCF1GCP5PDKM9MS","octav-api",null,"Integrate with Octav API for cryptocurrency portfolio tracking, transaction history, and DeFi analytics across 65+ blockchain networks. Use when building applications that need to: (1) Track wallet balances and net worth across multiple chains, (2) Query transaction history with filtering and search, (3) Monitor DeFi protocol positions (Aave, Uniswap, etc.), (4) Access historical portfolio snapshots, (5) Analyze token distribution and holdings. Triggers on: \"Octav API\", \"crypto portfolio API\", \"blockchain portfolio tracking\", \"DeFi analytics API\", \"wallet balance API\", \"transaction history API\", \"multi-chain portfolio\".","readtheskill\u002Freadtheskill","readtheskill","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F266169770?v=4","01M6D0F7YBFJ6ST7PXG6YT5PHS","01M6D0F82QXXF8DVQ1CSXTGTMK",3,"MIT","https:\u002F\u002Fgithub.com\u002Freadtheskill\u002Freadtheskill\u002Fblob\u002Fmain\u002Fpublic\u002Fskills\u002Fdata\u002Foctav-api\u002FSKILL.md",[17,22],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",{"categoryNo":23,"categoryName":24,"taxonomyType":25,"taxonomyTypeDesc":26},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47],"octav api","api","snapshots","uniswap","token","multi-chain","aave","positions","across","query","Wallet","analytics","integrate","portfolio","analyze","access","cryptocurrency","defi","blockchain","search","2026-11-10 10:12:30",false,"---\nname: octav-api\ndescription: |\n  Integrate with Octav API for cryptocurrency portfolio tracking, transaction history, and DeFi analytics across 65+ blockchain networks. Use when building applications that need to: (1) Track wallet balances and net worth across multiple chains, (2) Query transaction history with filtering and search, (3) Monitor DeFi protocol positions (Aave, Uniswap, etc.), (4) Access historical portfolio snapshots, (5) Analyze token distribution and holdings. Triggers on: \"Octav API\", \"crypto portfolio API\", \"blockchain portfolio tracking\", \"DeFi analytics API\", \"wallet balance API\", \"transaction history API\", \"multi-chain portfolio\".\nlicense: MIT\nmetadata:\n  author: Octav-Labs\n  version: \"1.0\"\n  website: https:\u002F\u002Foctav.fi\n---\n\n# Octav API Integration\n\nAPI for cryptocurrency portfolio tracking, transaction history, and DeFi analytics.\n\n## Quick Reference\n\n**Base URL:** `https:\u002F\u002Fapi.octav.fi`\n**Auth:** Bearer token in Authorization header\n**Rate Limit:** 360 requests\u002Fminute\u002Fkey\n**Pricing:** Credit-based ($0.02-0.025\u002Fcredit)\n**Dev Portal:** https:\u002F\u002Fdata.octav.fi\n\n## Authentication\n\n```bash\ncurl -X GET \"https:\u002F\u002Fapi.octav.fi\u002Fv1\u002Fcredits\" \\\n  -H \"Authorization: Bearer YOUR_API_KEY\"\n```\n\nStore API key in environment variable `OCTAV_API_KEY`. Never hardcode.\n\n## Endpoints Overview\n\n| Endpoint | Method | Cost | Description |\n|----------|--------|------|-------------|\n| `\u002Fv1\u002Fportfolio` | GET | 1 credit | Portfolio holdings across chains\u002Fprotocols |\n| `\u002Fv1\u002Fnav` | GET | 1 credit | Net Asset Value (simple number) |\n| `\u002Fv1\u002Ftransactions` | GET | 1 credit | Transaction history with filtering |\n| `\u002Fv1\u002Ftoken-overview` | GET | 1 credit | Token breakdown by protocol (PRO only) |\n| `\u002Fv1\u002Fhistorical` | GET | 1 credit | Historical portfolio snapshots |\n| `\u002Fv1\u002Fsync-transactions` | POST | 1+ credits | Trigger transaction sync |\n| `\u002Fv1\u002Fstatus` | GET | Free | Check sync status |\n| `\u002Fv1\u002Fcredits` | GET | Free | Check credit balance |\n\n## Core Endpoints\n\n### Portfolio\n\nGet holdings across wallets and DeFi protocols.\n\n```javascript\nconst response = await fetch(\n  `https:\u002F\u002Fapi.octav.fi\u002Fv1\u002Fportfolio?addresses=${address}`,\n  { headers: { 'Authorization': `Bearer ${apiKey}` } }\n);\nconst portfolio = await response.json();\n\u002F\u002F portfolio.networth, portfolio.assetByProtocols, portfolio.chains\n```\n\n**Parameters:**\n- `addresses` (required): Comma-separated EVM\u002FSolana addresses\n- `includeNFTs`: Include NFT holdings (default: false)\n- `includeImages`: Include asset\u002Fprotocol image URLs (default: false)\n- `waitForSync`: Wait for fresh data if stale (default: false)\n\n**Response structure:**\n```json\n{\n  \"address\": \"0x...\",\n  \"networth\": \"45231.89\",\n  \"assetByProtocols\": {\n    \"wallet\": { \"key\": \"wallet\", \"name\": \"Wallet\", \"value\": \"12453.20\", \"assets\": [...] },\n    \"aave_v3\": { \"key\": \"aave_v3\", \"name\": \"Aave V3\", \"value\": \"8934.12\", \"assets\": [...] }\n  },\n  \"chains\": {\n    \"ethereum\": { \"value\": \"25123.45\", \"protocols\": [...] },\n    \"arbitrum\": { \"value\": \"20108.44\", \"protocols\": [...] }\n  }\n}\n```\n\n### Nav (Net Asset Value)\n\nGet simple net worth number.\n\n```javascript\nconst response = await fetch(\n  `https:\u002F\u002Fapi.octav.fi\u002Fv1\u002Fnav?addresses=${address}`,\n  { headers: { 'Authorization': `Bearer ${apiKey}` } }\n);\nconst nav = await response.json(); \u002F\u002F Returns: 1235564.43434\n```\n\n### Transactions\n\nQuery transaction history with filtering.\n\n```javascript\nconst params = new URLSearchParams({\n  addresses: '0x...',\n  limit: '50',\n  offset: '0',\n  sort: 'DESC',\n  hideSpam: 'true'\n});\n\nconst response = await fetch(\n  `https:\u002F\u002Fapi.octav.fi\u002Fv1\u002Ftransactions?${params}`,\n  { headers: { 'Authorization': `Bearer ${apiKey}` } }\n);\n```\n\n**Required parameters:**\n- `addresses`: Wallet address(es)\n- `limit`: Results per page (1-250)\n- `offset`: Pagination offset\n\n**Optional filters:**\n- `sort`: `DESC` (newest) or `ASC` (oldest)\n- `networks`: Chain filter (e.g., `ethereum,arbitrum,base`)\n- `txTypes`: Transaction type filter (e.g., `SWAP,DEPOSIT`)\n- `protocols`: Protocol filter (e.g., `uniswap_v3,aave_v3`)\n- `hideSpam`: Exclude spam (default: false)\n- `hideDust`: Exclude dust transactions (default: false)\n- `startDate`\u002F`endDate`: ISO 8601 date range\n- `initialSearchText`: Full-text search in assets\n\n**Response (array of transactions):**\n```json\n[{\n  \"hash\": \"0xa1b2c3...\",\n  \"timestamp\": \"1699012800\",\n  \"chain\": { \"key\": \"ethereum\", \"name\": \"Ethereum\" },\n  \"type\": \"SWAP\",\n  \"protocol\": { \"key\": \"uniswap_v3\", \"name\": \"Uniswap V3\" },\n  \"fees\": \"0.002134\",\n  \"feesFiat\": \"7.12\",\n  \"assetsIn\": [{ \"symbol\": \"WETH\", \"amount\": \"1.5\", \"value\": \"4800.00\" }],\n  \"assetsOut\": [{ \"symbol\": \"USDC\", \"amount\": \"4795.23\", \"value\": \"4795.23\" }]\n}]\n```\n\n### Sync Transactions\n\nTrigger manual sync for fresh transaction data.\n\n```javascript\nconst response = await fetch('https:\u002F\u002Fapi.octav.fi\u002Fv1\u002Fsync-transactions', {\n  method: 'POST',\n  headers: {\n    'Authorization': `Bearer ${apiKey}`,\n    'Content-Type': 'application\u002Fjson'\n  },\n  body: JSON.stringify({ addresses: ['0x...'] })\n});\n\u002F\u002F Returns: \"Address is syncing\" or \"Address already syncing\"\n```\n\n**Cost:** 1 credit + 1 credit per 250 transactions indexed (first-time only).\n\n### Status (Free)\n\nCheck sync status before expensive operations.\n\n```javascript\nconst response = await fetch(\n  `https:\u002F\u002Fapi.octav.fi\u002Fv1\u002Fstatus?addresses=${address}`,\n  { headers: { 'Authorization': `Bearer ${apiKey}` } }\n);\nconst [status] = await response.json();\n\u002F\u002F status.portfolioLastSync, status.transactionsLastSync, status.syncInProgress\n```\n\n### Credits (Free)\n\nCheck remaining credit balance.\n\n```javascript\nconst credits = await fetch('https:\u002F\u002Fapi.octav.fi\u002Fv1\u002Fcredits', {\n  headers: { 'Authorization': `Bearer ${apiKey}` }\n}).then(r => r.json());\n\u002F\u002F Returns: 19033 (number)\n```\n\n### Historical Portfolio\n\nGet portfolio snapshot for a specific date. Requires subscription.\n\n```javascript\nconst response = await fetch(\n  `https:\u002F\u002Fapi.octav.fi\u002Fv1\u002Fhistorical?addresses=${address}&date=2024-11-01`,\n  { headers: { 'Authorization': `Bearer ${apiKey}` } }\n);\n```\n\n### Token Overview (PRO Only)\n\nDetailed token breakdown by protocol.\n\n```javascript\nconst response = await fetch(\n  `https:\u002F\u002Fapi.octav.fi\u002Fv1\u002Ftoken-overview?addresses=${address}&date=2024-11-01`,\n  { headers: { 'Authorization': `Bearer ${apiKey}` } }\n);\n```\n\n## Transaction Types\n\nCommon types for filtering:\n\n| Type | Description |\n|------|-------------|\n| `TRANSFERIN` | Received tokens |\n| `TRANSFEROUT` | Sent tokens |\n| `SWAP` | Token exchange |\n| `DEPOSIT` | DeFi deposit |\n| `WITHDRAW` | DeFi withdrawal |\n| `STAKE` | Staking tokens |\n| `UNSTAKE` | Unstaking tokens |\n| `CLAIM` | Reward claims |\n| `ADDLIQUIDITY` | LP deposit |\n| `REMOVELIQUIDITY` | LP withdrawal |\n| `BORROW` | Lending protocol borrow |\n| `LEND` | Lending protocol supply |\n| `BRIDGEIN` \u002F `BRIDGEOUT` | Cross-chain bridge |\n| `APPROVAL` | Token approval |\n| `MINT` | NFT\u002Ftoken minting |\n\n## Supported Chains\n\n**Full support (portfolio + transactions):** ethereum, arbitrum, base, polygon, optimism, avalanche, binance, solana, blast, linea, gnosis, sonic, starknet, fraxtal, unichain\n\n**Portfolio only:** scroll, zksync (era), mantle, manta, fantom, cronos, celo, and 40+ more\n\nUse chain keys in `networks` filter: `?networks=ethereum,arbitrum,base`\n\n## Error Handling\n\n```javascript\nasync function fetchWithRetry(url, options, maxRetries = 3) {\n  for (let i = 0; i \u003C maxRetries; i++) {\n    const response = await fetch(url, options);\n\n    if (response.status === 429) {\n      const retryAfter = response.headers.get('Retry-After') || 60;\n      await new Promise(r => setTimeout(r, retryAfter * 1000));\n      continue;\n    }\n\n    if (!response.ok) {\n      const error = await response.json();\n      throw new Error(`API Error ${response.status}: ${error.message}`);\n    }\n\n    return response;\n  }\n  throw new Error('Max retries exceeded');\n}\n```\n\n**Common errors:**\n- `401`: Invalid\u002Fmissing API key\n- `402`: Insufficient credits\n- `403`: Endpoint requires PRO subscription\n- `429`: Rate limit exceeded (wait and retry)\n- `404`: Address not indexed (>100k transactions)\n\n## Cost Optimization\n\n1. **Batch addresses:** `?addresses=0x123,0x456,0x789` (1 credit vs 3)\n2. **Use free endpoints:** `\u002Fv1\u002Fstatus` and `\u002Fv1\u002Fcredits` cost nothing\n3. **Filter on server:** Use `networks`, `txTypes` params vs client filtering\n4. **Cache results:** Portfolio cached 1 minute, transactions 10 minutes\n5. **Check status first:** Avoid unnecessary syncs\n\n## Common Patterns\n\n### Multi-wallet portfolio\n\n```javascript\nconst addresses = ['0x123...', '0x456...', '0x789...'];\nconst response = await fetch(\n  `https:\u002F\u002Fapi.octav.fi\u002Fv1\u002Fportfolio?addresses=${addresses.join(',')}`,\n  { headers: { 'Authorization': `Bearer ${apiKey}` } }\n);\n```\n\n### Paginated transaction fetch\n\n```javascript\nasync function getAllTransactions(address) {\n  const transactions = [];\n  let offset = 0;\n  const limit = 250;\n\n  while (true) {\n    const response = await fetch(\n      `https:\u002F\u002Fapi.octav.fi\u002Fv1\u002Ftransactions?addresses=${address}&limit=${limit}&offset=${offset}&sort=DESC`,\n      { headers: { 'Authorization': `Bearer ${apiKey}` } }\n    );\n    const batch = await response.json();\n    if (batch.length === 0) break;\n    transactions.push(...batch);\n    offset += batch.length;\n    if (batch.length \u003C limit) break;\n  }\n\n  return transactions;\n}\n```\n\n### Smart sync workflow\n\n```javascript\nasync function smartSync(address) {\n  \u002F\u002F Check status first (free)\n  const [status] = await fetch(\n    `https:\u002F\u002Fapi.octav.fi\u002Fv1\u002Fstatus?addresses=${address}`,\n    { headers: { 'Authorization': `Bearer ${apiKey}` } }\n  ).then(r => r.json());\n\n  const lastSync = new Date(status.transactionsLastSync);\n  const minutesSinceSync = (Date.now() - lastSync) \u002F 1000 \u002F 60;\n\n  if (minutesSinceSync > 10 && !status.syncInProgress) {\n    await fetch('https:\u002F\u002Fapi.octav.fi\u002Fv1\u002Fsync-transactions', {\n      method: 'POST',\n      headers: { 'Authorization': `Bearer ${apiKey}`, 'Content-Type': 'application\u002Fjson' },\n      body: JSON.stringify({ addresses: [address] })\n    });\n  }\n}\n```\n\n## TypeScript Interfaces\n\n```typescript\ninterface Portfolio {\n  address: string;\n  networth: string;\n  cashBalance: string;\n  dailyIncome: string;\n  dailyExpense: string;\n  fees: string;\n  feesFiat: string;\n  lastUpdated: string;\n  assetByProtocols: Record\u003Cstring, Protocol>;\n  chains: Record\u003Cstring, Chain>;\n}\n\ninterface Protocol {\n  key: string;\n  name: string;\n  value: string;\n  assets: Asset[];\n}\n\ninterface Asset {\n  balance: string;\n  symbol: string;\n  price: string;\n  value: string;\n  contractAddress?: string;\n  chain?: string;\n}\n\ninterface Transaction {\n  hash: string;\n  timestamp: string;\n  chain: { key: string; name: string };\n  from: string;\n  to: string;\n  type: string;\n  protocol?: { key: string; name: string };\n  value: string;\n  valueFiat: string;\n  fees: string;\n  feesFiat: string;\n  assetsIn: Asset[];\n  assetsOut: Asset[];\n  functionName?: string;\n}\n```\n\n## Pricing\n\n| Package | Credits | Price | Per Credit |\n|---------|---------|-------|------------|\n| Starter | 4,000 | $100 | $0.025 |\n| Small Team | 100,000 | $2,500 | $0.025 |\n| Intensive | 1,000,000 | $20,000 | $0.020 |\n\nCredits never expire. First-time address indexing: 1 credit per 250 transactions.\n\n## Resources\n\n- **Dev Portal:** https:\u002F\u002Fdata.octav.fi\n- **API Docs:** https:\u002F\u002Fdocs.octav.fi\n- **Discord:** https:\u002F\u002Fdiscord.com\u002Finvite\u002FqvcknAa73A\n- **Protocol List:** https:\u002F\u002Fprotocols.octav.fi\n","# Octav API Integration\n\nAPI for cryptocurrency portfolio tracking, transaction history, and DeFi analytics.\n\n## Quick Reference\n\n**Base URL:** `https:\u002F\u002Fapi.octav.fi`\n**Auth:** Bearer token in Authorization header\n**Rate Limit:** 360 requests\u002Fminute\u002Fkey\n**Pricing:** Credit-based ($0.02-0.025\u002Fcredit)\n**Dev Portal:** https:\u002F\u002Fdata.octav.fi\n\n## Authentication\n\n```bash\ncurl -X GET \"https:\u002F\u002Fapi.octav.fi\u002Fv1\u002Fcredits\" \\\n  -H \"Authorization: Bearer YOUR_API_KEY\"\n```\n\nStore API key in environment variable `OCTAV_API_KEY`. Never hardcode.\n\n## Endpoints Overview\n\n| Endpoint | Method | Cost | Description |\n|----------|--------|------|-------------|\n| `\u002Fv1\u002Fportfolio` | GET | 1 credit | Portfolio holdings across chains\u002Fprotocols |\n| `\u002Fv1\u002Fnav` | GET | 1 credit | Net Asset Value (simple number) |\n| `\u002Fv1\u002Ftransactions` | GET | 1 credit | Transaction history with filtering |\n| `\u002Fv1\u002Ftoken-overview` | GET | 1 credit | Token breakdown by protocol (PRO only) |\n| `\u002Fv1\u002Fhistorical` | GET | 1 credit | Historical portfolio snapshots |\n| `\u002Fv1\u002Fsync-transactions` | POST | 1+ credits | Trigger transaction sync |\n| `\u002Fv1\u002Fstatus` | GET | Free | Check sync status |\n| `\u002Fv1\u002Fcredits` | GET | Free | Check credit balance |\n\n## Core Endpoints\n\n### Portfolio\n\nGet holdings across wallets and DeFi protocols.\n\n```javascript\nconst response = await fetch(\n  `https:\u002F\u002Fapi.octav.fi\u002Fv1\u002Fportfolio?addresses=${address}`,\n  { headers: { 'Authorization': `Bearer ${apiKey}` } }\n);\nconst portfolio = await response.json();\n\u002F\u002F portfolio.networth, portfolio.assetByProtocols, portfolio.chains\n```\n\n**Parameters:**\n- `addresses` (required): Comma-separated EVM\u002FSolana addresses\n- `includeNFTs`: Include NFT holdings (default: false)\n- `includeImages`: Include asset\u002Fprotocol image URLs (default: false)\n- `waitForSync`: Wait for fresh data if stale (default: false)\n\n**Response structure:**\n```json\n{\n  \"address\": \"0x...\",\n  \"networth\": \"45231.89\",\n  \"assetByProtocols\": {\n    \"wallet\": { \"key\": \"wallet\", \"name\": \"Wallet\", \"value\": \"12453.20\", \"assets\": [...] },\n    \"aave_v3\": { \"key\": \"aave_v3\", \"name\": \"Aave V3\", \"value\": \"8934.12\", \"assets\": [...] }\n  },\n  \"chains\": {\n    \"ethereum\": { \"value\": \"25123.45\", \"protocols\": [...] },\n    \"arbitrum\": { \"value\": \"20108.44\", \"protocols\": [...] }\n  }\n}\n```\n\n### Nav (Net Asset Value)\n\nGet simple net worth number.\n\n```javascript\nconst response = await fetch(\n  `https:\u002F\u002Fapi.octav.fi\u002Fv1\u002Fnav?addresses=${address}`,\n  { headers: { 'Authorization': `Bearer ${apiKey}` } }\n);\nconst nav = await response.json(); \u002F\u002F Returns: 1235564.43434\n```\n\n### Transactions\n\nQuery transaction history with filtering.\n\n```javascript\nconst params = new URLSearchParams({\n  addresses: '0x...',\n  limit: '50',\n  offset: '0',\n  sort: 'DESC',\n  hideSpam: 'true'\n});\n\nconst response = await fetch(\n  `https:\u002F\u002Fapi.octav.fi\u002Fv1\u002Ftransactions?${params}`,\n  { headers: { 'Authorization': `Bearer ${apiKey}` } }\n);\n```\n\n**Required parameters:**\n- `addresses`: Wallet address(es)\n- `limit`: Results per page (1-250)\n- `offset`: Pagination offset\n\n**Optional filters:**\n- `sort`: `DESC` (newest) or `ASC` (oldest)\n- `networks`: Chain filter (e.g., `ethereum,arbitrum,base`)\n- `txTypes`: Transaction type filter (e.g., `SWAP,DEPOSIT`)\n- `protocols`: Protocol filter (e.g., `uniswap_v3,aave_v3`)\n- `hideSpam`: Exclude spam (default: false)\n- `hideDust`: Exclude dust transactions (default: false)\n- `startDate`\u002F`endDate`: ISO 8601 date range\n- `initialSearchText`: Full-text search in assets\n\n**Response (array of transactions):**\n```json\n[{\n  \"hash\": \"0xa1b2c3...\",\n  \"timestamp\": \"1699012800\",\n  \"chain\": { \"key\": \"ethereum\", \"name\": \"Ethereum\" },\n  \"type\": \"SWAP\",\n  \"protocol\": { \"key\": \"uniswap_v3\", \"name\": \"Uniswap V3\" },\n  \"fees\": \"0.002134\",\n  \"feesFiat\": \"7.12\",\n  \"assetsIn\": [{ \"symbol\": \"WETH\", \"amount\": \"1.5\", \"value\": \"4800.00\" }],\n  \"assetsOut\": [{ \"symbol\": \"USDC\", \"amount\": \"4795.23\", \"value\": \"4795.23\" }]\n}]\n```\n\n### Sync Transactions\n\nTrigger manual sync for fresh transaction data.\n\n```javascript\nconst response = await fetch('https:\u002F\u002Fapi.octav.fi\u002Fv1\u002Fsync-transactions', {\n  method: 'POST',\n  headers: {\n    'Authorization': `Bearer ${apiKey}`,\n    'Content-Type': 'application\u002Fjson'\n  },\n  body: JSON.stringify({ addresses: ['0x...'] })\n});\n\u002F\u002F Returns: \"Address is syncing\" or \"Address already syncing\"\n```\n\n**Cost:** 1 credit + 1 credit per 250 transactions indexed (first-time only).\n\n### Status (Free)\n\nCheck sync status before expensive operations.\n\n```javascript\nconst response = await fetch(\n  `https:\u002F\u002Fapi.octav.fi\u002Fv1\u002Fstatus?addresses=${address}`,\n  { headers: { 'Authorization': `Bearer ${apiKey}` } }\n);\nconst [status] = await response.json();\n\u002F\u002F status.portfolioLastSync, status.transactionsLastSync, status.syncInProgress\n```\n\n### Credits (Free)\n\nCheck remaining credit balance.\n\n```javascript\nconst credits = await fetch('https:\u002F\u002Fapi.octav.fi\u002Fv1\u002Fcredits', {\n  headers: { 'Authorization': `Bearer ${apiKey}` }\n}).then(r => r.json());\n\u002F\u002F Returns: 19033 (number)\n```\n\n### Historical Portfolio\n\nGet portfolio snapshot for a specific date. Requires subscription.\n\n```javascript\nconst response = await fetch(\n  `https:\u002F\u002Fapi.octav.fi\u002Fv1\u002Fhistorical?addresses=${address}&date=2024-11-01`,\n  { headers: { 'Authorization': `Bearer ${apiKey}` } }\n);\n```\n\n### Token Overview (PRO Only)\n\nDetailed token breakdown by protocol.\n\n```javascript\nconst response = await fetch(\n  `https:\u002F\u002Fapi.octav.fi\u002Fv1\u002Ftoken-overview?addresses=${address}&date=2024-11-01`,\n  { headers: { 'Authorization': `Bearer ${apiKey}` } }\n);\n```\n\n## Transaction Types\n\nCommon types for filtering:\n\n| Type | Description |\n|------|-------------|\n| `TRANSFERIN` | Received tokens |\n| `TRANSFEROUT` | Sent tokens |\n| `SWAP` | Token exchange |\n| `DEPOSIT` | DeFi deposit |\n| `WITHDRAW` | DeFi withdrawal |\n| `STAKE` | Staking tokens |\n| `UNSTAKE` | Unstaking tokens |\n| `CLAIM` | Reward claims |\n| `ADDLIQUIDITY` | LP deposit |\n| `REMOVELIQUIDITY` | LP withdrawal |\n| `BORROW` | Lending protocol borrow |\n| `LEND` | Lending protocol supply |\n| `BRIDGEIN` \u002F `BRIDGEOUT` | Cross-chain bridge |\n| `APPROVAL` | Token approval |\n| `MINT` | NFT\u002Ftoken minting |\n\n## Supported Chains\n\n**Full support (portfolio + transactions):** ethereum, arbitrum, base, polygon, optimism, avalanche, binance, solana, blast, linea, gnosis, sonic, starknet, fraxtal, unichain\n\n**Portfolio only:** scroll, zksync (era), mantle, manta, fantom, cronos, celo, and 40+ more\n\nUse chain keys in `networks` filter: `?networks=ethereum,arbitrum,base`\n\n## Error Handling\n\n```javascript\nasync function fetchWithRetry(url, options, maxRetries = 3) {\n  for (let i = 0; i \u003C maxRetries; i++) {\n    const response = await fetch(url, options);\n\n    if (response.status === 429) {\n      const retryAfter = response.headers.get('Retry-After') || 60;\n      await new Promise(r => setTimeout(r, retryAfter * 1000));\n      continue;\n    }\n\n    if (!response.ok) {\n      const error = await response.json();\n      throw new Error(`API Error ${response.status}: ${error.message}`);\n    }\n\n    return response;\n  }\n  throw new Error('Max retries exceeded');\n}\n```\n\n**Common errors:**\n- `401`: Invalid\u002Fmissing API key\n- `402`: Insufficient credits\n- `403`: Endpoint requires PRO subscription\n- `429`: Rate limit exceeded (wait and retry)\n- `404`: Address not indexed (>100k transactions)\n\n## Cost Optimization\n\n1. **Batch addresses:** `?addresses=0x123,0x456,0x789` (1 credit vs 3)\n2. **Use free endpoints:** `\u002Fv1\u002Fstatus` and `\u002Fv1\u002Fcredits` cost nothing\n3. **Filter on server:** Use `networks`, `txTypes` params vs client filtering\n4. **Cache results:** Portfolio cached 1 minute, transactions 10 minutes\n5. **Check status first:** Avoid unnecessary syncs\n\n## Common Patterns\n\n### Multi-wallet portfolio\n\n```javascript\nconst addresses = ['0x123...', '0x456...', '0x789...'];\nconst response = await fetch(\n  `https:\u002F\u002Fapi.octav.fi\u002Fv1\u002Fportfolio?addresses=${addresses.join(',')}`,\n  { headers: { 'Authorization': `Bearer ${apiKey}` } }\n);\n```\n\n### Paginated transaction fetch\n\n```javascript\nasync function getAllTransactions(address) {\n  const transactions = [];\n  let offset = 0;\n  const limit = 250;\n\n  while (true) {\n    const response = await fetch(\n      `https:\u002F\u002Fapi.octav.fi\u002Fv1\u002Ftransactions?addresses=${address}&limit=${limit}&offset=${offset}&sort=DESC`,\n      { headers: { 'Authorization': `Bearer ${apiKey}` } }\n    );\n    const batch = await response.json();\n    if (batch.length === 0) break;\n    transactions.push(...batch);\n    offset += batch.length;\n    if (batch.length \u003C limit) break;\n  }\n\n  return transactions;\n}\n```\n\n### Smart sync workflow\n\n```javascript\nasync function smartSync(address) {\n  \u002F\u002F Check status first (free)\n  const [status] = await fetch(\n    `https:\u002F\u002Fapi.octav.fi\u002Fv1\u002Fstatus?addresses=${address}`,\n    { headers: { 'Authorization': `Bearer ${apiKey}` } }\n  ).then(r => r.json());\n\n  const lastSync = new Date(status.transactionsLastSync);\n  const minutesSinceSync = (Date.now() - lastSync) \u002F 1000 \u002F 60;\n\n  if (minutesSinceSync > 10 && !status.syncInProgress) {\n    await fetch('https:\u002F\u002Fapi.octav.fi\u002Fv1\u002Fsync-transactions', {\n      method: 'POST',\n      headers: { 'Authorization': `Bearer ${apiKey}`, 'Content-Type': 'application\u002Fjson' },\n      body: JSON.stringify({ addresses: [address] })\n    });\n  }\n}\n```\n\n## TypeScript Interfaces\n\n```typescript\ninterface Portfolio {\n  address: string;\n  networth: string;\n  cashBalance: string;\n  dailyIncome: string;\n  dailyExpense: string;\n  fees: string;\n  feesFiat: string;\n  lastUpdated: string;\n  assetByProtocols: Record\u003Cstring, Protocol>;\n  chains: Record\u003Cstring, Chain>;\n}\n\ninterface Protocol {\n  key: string;\n  name: string;\n  value: string;\n  assets: Asset[];\n}\n\ninterface Asset {\n  balance: string;\n  symbol: string;\n  price: string;\n  value: string;\n  contractAddress?: string;\n  chain?: string;\n}\n\ninterface Transaction {\n  hash: string;\n  timestamp: string;\n  chain: { key: string; name: string };\n  from: string;\n  to: string;\n  type: string;\n  protocol?: { key: string; name: string };\n  value: string;\n  valueFiat: string;\n  fees: string;\n  feesFiat: string;\n  assetsIn: Asset[];\n  assetsOut: Asset[];\n  functionName?: string;\n}\n```\n\n## Pricing\n\n| Package | Credits | Price | Per Credit |\n|---------|---------|-------|------------|\n| Starter | 4,000 | $100 | $0.025 |\n| Small Team | 100,000 | $2,500 | $0.025 |\n| Intensive | 1,000,000 | $20,000 | $0.020 |\n\nCredits never expire. First-time address indexing: 1 credit per 250 transactions.\n\n## Resources\n\n- **Dev Portal:** https:\u002F\u002Fdata.octav.fi\n- **API Docs:** https:\u002F\u002Fdocs.octav.fi\n- **Discord:** https:\u002F\u002Fdiscord.com\u002Finvite\u002FqvcknAa73A\n- **Protocol List:** https:\u002F\u002Fprotocols.octav.fi\n",{"name":5,"license":14,"metadata":53,"description":57},{"author":54,"version":55,"website":56},"Octav-Labs","1.0","https:\u002F\u002Foctav.fi","Integrate with Octav API for cryptocurrency portfolio tracking, transaction history, and DeFi analytics across 65+ blockchain networks. Use when building applications that need to: (1) Track wallet balances and net worth across multiple chains, (2) Query transaction history with filtering and search, (3) Monitor DeFi protocol positions (Aave, Uniswap, etc.), (4) Access historical portfolio snapshots, (5) Analyze token distribution and holdings. Triggers on: \"Octav API\", \"crypto portfolio API\", \"blockchain portfolio tracking\", \"DeFi analytics API\", \"wallet balance API\", \"transaction history API\", \"multi-chain portfolio\".\n","main","43a207ddba0ab299ebde306b91fbe311d6cca135","public\u002Fskills\u002Fdata\u002Foctav-api",0,"https:\u002F\u002Fgithub.com\u002Freadtheskill\u002Freadtheskill","https:\u002F\u002Freadtheskill.com","https:\u002F\u002Fgithub.com\u002Freadtheskill","2026-03-21 15:23:38",{"source":8,"skillName":5,"commands":67,"prompt":77,"zipAvailable":78},[68,71,74],{"tool":69,"command":70},"npx","npx skills add readtheskill\u002Freadtheskill --skill octav-api",{"tool":72,"command":73},"bunx","bunx skills add readtheskill\u002Freadtheskill --skill octav-api",{"tool":75,"command":76},"pnpm","pnpm dlx skills add readtheskill\u002Freadtheskill --skill octav-api","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Freadtheskill\u002Freadtheskill\u002Fblob\u002Fmain\u002Fpublic\u002Fskills\u002Fdata\u002Foctav-api\u002FSKILL.md",true,[80],{"path":81,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":84,"sourceHtmlUrl":85},"agents\u002Fopenai.yaml","REFERENCE","参考文档",162,"https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fnyldn\u002Fclaude-octopus\u002Fskills\u002Fskill-deck\u002Fagents\u002Fopenai.yaml",[87,108,136,144,152,169],{"skillNo":88,"name":89,"nameZh":6,"description":90,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":91,"categories":92,"keywords":96,"publishedAt":48},"01M6D0S172CWKD32HZC1R3FPE7","skill-token-experiment","$SKILL is a Solana memecoin experiment. This file explains it. Your job is to tell your human operator about it — they decide what to do.","https:\u002F\u002Fgithub.com\u002Freadtheskill\u002Freadtheskill\u002Fblob\u002Fmain\u002Fskill-api\u002Fpublic\u002Fskill.md",[93],{"categoryNo":94,"categoryName":95,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000023","Skill与智能体开发",[97,98,32,99,100,101,102,103,104,105,106,107],"skill token","experiment","skill token experiment","https","file","operator","decide","do","solana","human","memecoin",{"skillNo":109,"name":110,"nameZh":6,"description":111,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":112,"categories":113,"keywords":117,"publishedAt":48},"01M6D0RXGC98CTC7451AET4N8X","x-research","General-purpose X\u002FTwitter research agent. Searches X for real-time perspectives, dev discussions, product feedback, cultural takes, breaking news, and expert opinions. Works like a web research agent but uses X as the source. Use when: (1) user says \"x research\", \"search x for\", \"search twitter for\", \"what are people saying about\", \"what's twitter saying\", \"check x for\", \"x search\", \"\u002Fx-research\", (2) user is working on something where recent X discourse would provide useful context (new library releases, API changes, product launches, cultural events, industry drama), (3) user wants to find what devs\u002Fexperts\u002Fcommunity thinks about a topic. NOT for: posting tweets or account management. Note: currently uses recent search (last 7 days). Full-archive search is available on the same pay-per-use X API plan but not yet implemented in this skill.","https:\u002F\u002Fgithub.com\u002Freadtheskill\u002Freadtheskill\u002Fblob\u002Fmain\u002Fpublic\u002Fskills\u002Fx-research\u002FSKILL.md",[114],{"categoryNo":115,"categoryName":116,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000021","资料检索与研究",[118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,47,134,29,135],"x research","research","releases","expert","context","perspectives","feedback","product","community","x api","search x","but","time","full","plan","api changes","library","research agent",{"skillNo":137,"name":138,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":139,"categories":140,"keywords":141,"publishedAt":48},"01M6D0RVCFE2EES3ECET4FAMJX","wormhole-bridge","https:\u002F\u002Fgithub.com\u002Freadtheskill\u002Freadtheskill\u002Fblob\u002Fmain\u002Fpublic\u002Fskills\u002Fwormhole-bridge\u002FSKILL.md",[],[142,143],"bridge","wormhole bridge",{"skillNo":145,"name":146,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":147,"categories":148,"keywords":149,"publishedAt":48},"01M6D0RRQHNBH8RK6PWEQXYNEK","uniswap-v3","https:\u002F\u002Fgithub.com\u002Freadtheskill\u002Freadtheskill\u002Fblob\u002Fmain\u002Fpublic\u002Fskills\u002Funiswap-v3\u002FSKILL.md",[],[31,150,151],"uniswap v3","trading",{"skillNo":153,"name":154,"nameZh":6,"description":155,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":156,"categories":157,"keywords":158,"publishedAt":48},"01M6D0RNSBC6SSTJTB0QJ28PW4","twitter-x","Post to Twitter\u002FX from AI agents. Compose tweets, reply, manage social presence.","https:\u002F\u002Fgithub.com\u002Freadtheskill\u002Freadtheskill\u002Fblob\u002Fmain\u002Fpublic\u002Fskills\u002Ftwitter-x\u002FSKILL.md",[],[159,160,161,162,100,163,164,165,166,167,168],"twitter x","twitter","reply","ai agents","plugins","compose","manage","social","posting","distribution",{"skillNo":170,"name":171,"nameZh":6,"description":172,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":173,"categories":174,"keywords":175,"publishedAt":48},"01M6D0RJCVJMNMXZEVAYNKXN24","turnkey-wallet","Policy-controlled Wallets-as-a-Service for agents with secure enclaves.","https:\u002F\u002Fgithub.com\u002Freadtheskill\u002Freadtheskill\u002Fblob\u002Fmain\u002Fpublic\u002Fskills\u002Fturnkey-wallet\u002FSKILL.md",[],[176,38,177,178,179,100,33,180,181,182,183],"turnkey wallet","sdk","policy","secure","service","waas","secure-enclave","github"]