Skip to content

hubbleprotocol/hubble-public-api-docs

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

74 Commits
 
 

Repository files navigation

đź›° Hubble Public API

Hubble Public API is a TypeScript API (using Express) that serves public data of the Hubble Protocol.

Table of contents

Development

Database

We use Flyway for database migrations and PostgreSQL for data storage.

Lint your migration files:

cd migrations
./lint.sh

Run migrations with docker:

# Run postgresql at localhost:5432 and apply flyway migrations
docker-compose up db flyway

Local API Setup

You will need to use yarn to install the dependencies.

We are using private nodes without rate limit for fetching mainnet-beta and devnet chain data. You will have to add an .env file in the root of this repository with the correct environment variables inside. Please take a look at the example .env.example file:

cd hubble-public-api
cp .env.example .env
# edit .env with actual endpoints with your favorite editor
# nano .env  
# code .env
# ...

We also use Redis for caching API responses from PostgreSQL database. You can use docker-compose to run an instance of the Redis cluster locally.

Run the API with yarn (for debugging) and dependencies with docker-compose:

cd hubble-public-api
docker-compose up -d redis db flyway
yarn start

Run everything with docker-compose:

cd hubble-public-api
docker-compose up -d

API will be available at http://localhost:8888.

Some routes are protected by basic authentication - for local dev API you can use these credentials:

  • user: hubble
  • password: development

Tests

We use a test database and migrations for integration tests that needs to be launched before running the tests:

docker-compose up -d test-db test-flyway
yarn test
yarn test -- -t 'should calculate the fees and rewards of strategy shareholder 2 with race condition'

How to run locally

Deployment

Deployments are done automatically, everything that gets pushed to the master branch will be packaged as a docker container and pushed to Hubble's DockerHub.

Cache

We cache all the endpoint responses with Redis.

Local development cache

To access the local cache, you will need to install redis-cli and run:

# make sure local redis is running first:
docker-compose up redis

# a few examples below

# list all keys in all cluster nodes:
for port in {7001..7006}; do echo "Keys from localhost:$port:"; redis-cli -c -h localhost -p $port --scan; done
# get specific redis key contents:
for port in {7001..7006}; do value=$(redis-cli -c -h localhost -p $port GET strategies-leaderboard-mainnet-beta); if [ "$value" ]; then echo "$value"; break; fi; done
# delete specific redis key:
for port in {7001..7006}; redis-cli -c -h localhost -p $port DEL strategies-leaderboard-mainnet-beta; done
# check when a specific redis key will expire:
for port in {7001..7006}; do redis-cli -c -h localhost -p $port TTL staking-yields-v2; done 
# clear entire cache in the cluster - delete all redis keys (useful when testing locally, not enabled in production)
for port in {7001..7006}; do redis-cli -c -h localhost -p $port FLUSHALL; done

Production cache

⚠️ This can be potentially be very dangerous, proceed with caution! ⚠️

Make sure you have everything required to access the Kubernetes clusters: Developer Setup.

To access the production redis cache:

# connect to the prod kubernetes cluster 
export NAME=k8s.hubbleprotocol.io
export KOPS_STATE_STORE=s3://k8s.hubbleprotocol.io-kops-state-store
kops export kubecfg k8s.hubbleprotocol.io --admin

# reverse-proxy the redis instance in the api namespace to localhost:6380
kubectl -n api port-forward redis-hubble-public-api-master-0 6380:6379

# access the prod redis cache by using localhost:6380 with redis-cli
redis-cli -p 6380

A very common use case is to clear certain redis keys in production to force a refresh:

# the commands below support wildcard (*) usage 

# WARNING - POTENTIALLY DANGEROUS, DOUBLE CHECK BEFORE EXECUTING, MAKE A BACKUP IF NECESSARY

# check how many keys you're deleting beforehand - make sure the keys returned are expected
redis-cli -p 6380 KEYS "*transactions*"
# clear all redis keys that have "transactions" in their name
redis-cli -p 6380 KEYS "*transactions*" | xargs redis-cli DEL

# clear all redis keys that start with "strategies" in their name
redis-cli -p 6380 KEYS "strategies*" | xargs redis-cli DEL

Usage

Metrics

Get mainnet-beta metrics of Hubble Protocol:

GET https://api.hubbleprotocol.io/metrics

You may also specify the environment (mainnet-beta[default],devnet,localnet,testnet) by using an env query parameter:

GET https://api.hubbleprotocol.io/metrics?env=devnet

Metrics History

Get mainnet-beta metrics of Hubble Protocol:

GET https://api.hubbleprotocol.io/history

You may also specify the environment (mainnet-beta[default],devnet,localnet,testnet) by using an env query parameter:

GET https://api.hubbleprotocol.io/history?env=devnet

History endpoint will only return the historical data of the current year by default. Warning: the maximum allowed period for the history endpoint is 1 year per request.

GET https://api.hubbleprotocol.io/history?year=2022

Config

Runtime config specifies all of the public configuration used by Hubble (accounts, public keys, program ids...). Also available as a NPM package.

Get runtime config of all environments:

GET https://api.hubbleprotocol.io/config

You may also filter by environment (mainnet-beta[default],devnet,localnet,testnet) by using an env query parameter:

GET https://api.hubbleprotocol.io/config?env=devnet

IDL

Get a list of all Hubble IDLs (Interface Description Language) generated by Anchor. Also available as a NPM package.

GET https://api.hubbleprotocol.io/idl

Circulating Supply Value HBB

Get circulating supply value of HBB (number of HBB issued * HBB price).

This is also included in the /metrics endpoint, but we need this for external services like CoinMarketCap.

GET https://api.hubbleprotocol.io/circulating-supply-value

You may also filter by environment (mainnet-beta[default],devnet,localnet,testnet) by using an env query parameter:

GET https://api.hubbleprotocol.io/circulating-supply-value?env=devnet

Circulating Supply HBB

Get circulating supply of HBB (number of HBB issued).

This is also included in the /metrics endpoint, but we need this for external services like CoinGecko.

GET https://api.hubbleprotocol.io/circulating-supply

You may also filter by environment (mainnet-beta[default],devnet,localnet,testnet) by using an env query parameter:

GET https://api.hubbleprotocol.io/circulating-supply?env=devnet

API Version

Get current version of the API.

GET https://api.hubbleprotocol.io/version

Maintenance mode

Get maintenance mode parameter that specifies if Hubble webapp/smart contracts are in maintenance mode.

GET https://api.hubbleprotocol.io/maintenance-mode

Borrowing version

Get borrowing version parameter that specifies the current version of the borrowing market state (smart contracts).

GET https://api.hubbleprotocol.io/borrowing-version

Loans

You may use the env query param for all of the methods specified below (mainnet-beta[default],devnet,localnet,testnet).

Get a list of all loans and their values from on-chain Hubble data:

GET https://api.hubbleprotocol.io/loans?env=mainnet-beta

Get specific loan data:

// GET https://api.hubbleprotocol.io/loans/:pubkey
GET https://api.hubbleprotocol.io/loans/HrwbdQYwSnAyVpVHuGQ661HiNbWmGjDp5DdDR9YMw7Bu

Get a specific user's list of loans by specifying their public key:

// GET https://api.hubbleprotocol.io/owners/:pubkey/loans
GET https://api.hubbleprotocol.io/owners/HrwbdQYwSnAyVpVHuGQ661HiNbWmGjDp5DdDR9YMw7Bu/loans

Get specific loan's history data:

// GET https://api.hubbleprotocol.io/loans/:pubkey/history
GET https://api.hubbleprotocol.io/loans/HrwbdQYwSnAyVpVHuGQ661HiNbWmGjDp5DdDR9YMw7Bu/history

Get all unique loan pubkeys that were created by a specific user:

// GET https://api.hubbleprotocol.io/owners/:pubkey/loans/created?env={cluster}
GET https://api.hubbleprotocol.io/owners/HrwbdQYwSnAyVpVHuGQ661HiNbWmGjDp5DdDR9YMw7Bu/loans/created?env=mainnet-beta

Staking

You may use the env query param for all of the methods specified below (mainnet-beta[default],devnet,localnet,testnet).

Get HBB and USDH staking stats (APR, APY):

GET https://api.hubbleprotocol.io/staking

Get all HBB stakers (grouped by owner public key):

GET https://api.hubbleprotocol.io/staking/hbb/users

Get all USDH stakers (grouped by owner public key):

GET https://api.hubbleprotocol.io/staking/usdh/users

Get LIDO staking rewards (APR + APY):

GET https://api.hubbleprotocol.io/staking/lido

Get eligible loans for LIDO staking rewards for a specified month and year.

Months are to be input from 1 (January) - 12 (December) and years from 2022 and above.

GET https://api.hubbleprotocol.io/staking/lido/eligible-loans/years/2022/months/07?env=devnet

Get single loan data for LIDO staking rewards for a specified month and year.

Months are to be input from 1 (January) - 12 (December) and years from 2022 and above.

// GET https://api.hubbleprotocol.io/staking/lido/eligible-loans/:loanPubkey/years/:year/months/:month?env={cluster}
GET https://api.hubbleprotocol.io/staking/lido/eligible-loans/6Hfhr9d9NRkhiPLbpRbHRLWLHBrCfMKDzdkv1sKd1S9M/years/2022/months/07?env=devnet

Get eligible loans for LIDO staking rewards for a specified time interval (start date is inclusive, end date is exclusive).

If no start/end date is specified it will use start date: today - 14 days and end date = today.

Please note: This route is not exposed to the public and requires basic authentication. Please use the route above to get monthly data instead.

GET https://api.hubbleprotocol.io/staking/lido/eligible-loans?env=devnet&start=2022-06-01&end=2022-07-01

Get staking yields (DEPRECATED)

⚠️ DEPRECATED, PLEASE USE /v2/staking-yields INSTEAD! ⚠️

GET https://api.hubbleprotocol.io/staking-yields

Example request: https://api.hubbleprotocol.io/staking-yields

Example response:

[
    {
        "apy": "0.076269480000000005",
        "token": "cgntSOL",
        "tokenMint": "CgnTSoL3DgY9SFHxcLj6CgCgKKoTBr6tp4CPAEWy25DE"
    },
    {
        "apy": "6.88",
        "token": "LDO",
        "tokenMint": "HZRCwxP2Vq9PCpPXooayhJ2bxTpo5xfpQrwB1svh332p"
    }
]

Get staking yields v2

GET https://api.hubbleprotocol.io/v2/staking-yields

Example request: https://api.hubbleprotocol.io/v2/staking-yields

Example response:

[
  {
    "apy": "0.252619403785070711510296827413476389122",
    "tokenMint": "mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So"
  },
  {
    "apy": "0.263020843260597671599388280100460408894",
    "tokenMint": "J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn"
  },
  {
    "apy": "0.24426365077443429533690036384035569496",
    "tokenMint": "bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1"
  },
  {
    "apy": "0.2727867352767135230363060182415164271",
    "tokenMint": "jupSoLaHXQiZZTSfEWMTRRgpnyFm8f6sZdosWBjx93v"
  },
  {
    "apy": "0.282542463074495351542281213938801414377",
    "tokenMint": "he1iusmfkpAdwvxLNGV8Y1iSbj4rUy6yMhEA3fotn9A"
  }
]

Get median staking yields v2

GET https://api.hubbleprotocol.io/v2/staking-yields/median

Example request: https://api.hubbleprotocol.io/v2/staking-yields/median

Example response:

[
  {
    "apy": "0.252619403785070711510296827413476389122",
    "tokenMint": "mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So"
  },
  {
    "apy": "0.263020843260597671599388280100460408894",
    "tokenMint": "J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn"
  },
  {
    "apy": "0.24426365077443429533690036384035569496",
    "tokenMint": "bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1"
  },
  {
    "apy": "0.2727867352767135230363060182415164271",
    "tokenMint": "jupSoLaHXQiZZTSfEWMTRRgpnyFm8f6sZdosWBjx93v"
  },
  {
    "apy": "0.282542463074495351542281213938801414377",
    "tokenMint": "he1iusmfkpAdwvxLNGV8Y1iSbj4rUy6yMhEA3fotn9A"
  }
]

Get epochs

GET https://api.hubbleprotocol.io/epochs

Example request: https://api.hubbleprotocol.io/epochs

Example response:

[
    {
        "epoch": 627,
        "first_slot": 270864000,
        "last_slot": 271295999,
        "start_block_time": "2024-06-09T18:21:01.000Z",
        "end_block_time": "2024-06-11T23:21:40.000Z"
    },
    {
        "epoch": 626,
        "first_slot": 270432000,
        "last_slot": 270863999,
        "start_block_time": "2024-06-07T14:10:07.000Z",
        "end_block_time": "2024-06-09T18:21:00.000Z"
    }
]

Get staking rate history

GET https://api.hubbleprotocol.io/staking-rates/tokens/:mint/history?start={start timestamp}&end={end timestamp}&interpolate={true/false}

Example request: https://api.hubbleprotocol.io/staking-rates/tokens/mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So/history?start=2024-01-01T00:00Z&end=2024-02-01T01:00Z&interpolate=false

Example response (first item in array is epoch timestamp, second is stake rate):

[
  [
    1704067200000,
    "0.8636310820345713"
  ],
  [
    1704067500000,
    "0.8636310820345713"
  ],
  [
    1704067800000,
    "0.8636310820345713"
  ]
]

Get staking yield history

GET https://api.hubbleprotocol.io/staking-yields/tokens/:mint/history?start={start timestamp}&end={end timestamp}

Example request: https://api.hubbleprotocol.io/staking-yields/tokens/mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So/history?start=2024-01-01T00:00Z&end=2024-02-01T01:00Z

Example response:

[
  {
    "apy": "0.0685815525901495360734829436051179078079",
    "epoch": 587,
    "startBlockTime": "2024-03-11T21:37:21.000Z",
    "endBlockTime": "2024-03-14T00:25:05.000Z"
  },
  {
    "apy": "0.0772467014510651101771957924044147574663",
    "epoch": 586,
    "startBlockTime": "2024-03-09T19:55:31.000Z",
    "endBlockTime": "2024-03-11T21:37:20.000Z"
  }
]

Get median staking yield history

GET https://api.hubbleprotocol.io/staking-yields/tokens/:mint/history/median

Example request: https://api.hubbleprotocol.io/staking-yields/tokens/mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So/history

Example response:

[
  {
    "startEpoch": 502,
    "startBlockTime": "2023-09-11T05:22:50.000Z",
    "endBlockTime": "2023-10-05T01:18:02.000Z",
    "endEpoch": 512,
    "apy": 0.06882309627010348
  },
  {
    "startEpoch": 503,
    "startBlockTime": "2023-09-13T10:14:26.000Z",
    "endBlockTime": "2023-10-07T03:15:54.000Z",
    "endEpoch": 513,
    "apy": 0.06900975295240162
  }
]

Get yield history for specific source

GET https://api.hubbleprotocol.io/yields/:source/history

Example request, get JLP pool yield history: https://api.hubbleprotocol.io/yields/5BUwFW4nRbftYTDMbgxykoFWqWHPzahFSNAaaaJtVKsq/history

Example response (please note APR/APY is in decimal format, not in percentage, multiply by 100 to get percentage):

[
  {
    "createdOn": "2024-01-01T00:00:07.569Z",
    "apr": "5.16226661065975",
    "apy": "1.72282489033179"
  },
  {
    "createdOn": "2024-01-01T01:00:07.569Z",
    "apr": "5.53223063067687",
    "apy": "9.201613187495"
  }
]

Get USDs rewards yield

Wrapper over Allez API

GET https://api.hubbleprotocol.io/yields/usds-rewards

Example request:

Example response:

{
  "timestamp_hour": "2024-11-28 14:00:00",
  "usds_balance_total": 58012704.78112555,
  "usds_flagged_addresses": 452091.5947593333,
  "usds_total_supply": 58464796.37588488,
  "bridged_usds_total": 159993178.337911,
  "effective_bridged_usds_total": 155287132.57078904,
  "net_usds_supply_in_kamino_total": 35401432.65644375,
  "effective_usds_balance_total": 34337023.08437288,
  "hourly_rewards_per_unit": 0.000017335168915938846,
  "per_unit_rewards_apr": 0.1518560797036242,
  "per_unit_rewards_apy": 0.163991170143378,
  "accrued_rewards_total": 129166.66666666612
}

Stability

You may use the env query param for all the methods specified below (mainnet-beta[default],devnet,localnet,testnet).

Get stability liquidation rewards (APR + APY):

GET https://api.hubbleprotocol.io/stability/liquidation-rewards

Get stability pool state history:

Returns 15 days of stability pool state history if no start/end date query params are specified.

GET https://api.hubbleprotocol.io/stability/history?env=mainnet-beta&start=2020-01-01&end=2023-01-10

Get stability provider history for a wallet:

Returns 15 days of stability provider history if no start/end date query params are specified.

GET https://api.hubbleprotocol.io/stability/providers/FDiwbqCeDFWcDq7EdQBLc8KtdW8zMmFWwZpf6T8dFFbW/history?env=mainnet-beta&start=2020-01-01&end=2023-01-09'

Strategies Kamino

You may use the env query param for all the methods specified below (mainnet-beta[default],devnet,localnet,testnet).

Get frontend-enabled strategies:

// GET https://api.hubbleprotocol.io/strategies/enabled?env={cluster}
GET https://api.hubbleprotocol.io/strategies/enabled?env=mainnet-beta

Get specific strategy stats (tvl/pnl/shares..):

// GET https://api.hubbleprotocol.io/strategies/:strategy_pubkey/metrics?env={cluster}
GET https://api.hubbleprotocol.io/strategies/ByXB4xCxVhmUEmQj3Ut7byZ1Hbva1zhKjaVcv3jBMN7E/metrics?env=mainnet-beta

Get strategy stats for all frontend-enabled strategies (tvl/pnl/shares..):

// GET https://api.hubbleprotocol.io/strategies/metrics?env={cluster}
GET https://api.hubbleprotocol.io/strategies/metrics?env=mainnet-beta

Get strategy stats for strategies by status (tvl/pnl/shares..):

// GET https://api.hubbleprotocol.io/strategies/metrics?env={cluster}&status={status}
GET https://api.hubbleprotocol.io/strategies/metrics?env=mainnet-beta&status=IGNORED

Get strategy reward stats for all live strategies:

// GET https://api.hubbleprotocol.io/strategies/rewards?env={cluster}
GET https://api.hubbleprotocol.io/strategies/rewards?env=mainnet-beta

Example response:

[
    {
        "apr": "0.03089658127477581433161189171198501610943",
        "apy": "0.031377485860868284369015169698693427029",
        "totalReturn": "9959.75762697216",
        "totalInvestment": "322357.9184504589828735999999999999999998",
        "strategy": "2dczcMRpxWHZTcsiEjPT4YBcSseTaUmWFzw24HxYMFod",
        "token": "RAY",
        "rewardsPerDay": "137.8944",
        "rewardsPerHour": "5.7456",
        "rewardsPerSecond": "0.001596",
        "rewardIsOption": false      
    },
    {
        "apr": "0.1837059453843344336978185004649421142565",
        "apy": "0.201606883863164306468378664554523674214",
        "totalReturn": "39084.02775504",
        "totalInvestment": "212753.2000843610114423811349599999999999",
        "strategy": "6K4jM79yijUEFxdFhCFZSjav1nZji1gsxUWQE6XrC8YD",
        "token": "LDO",
        "rewardsPerDay": "48.386592",
        "rewardsPerHour": "2.016108",
        "rewardsPerSecond": "0.00056003",
        "rewardIsOption": false      
    }
]

Get strategy stats for rewards:

// GET https://api.hubbleprotocol.io/strategies/:strategy_pubkey/rewards?env={cluster}&year={year}
GET https://api.hubbleprotocol.io/strategies/ByXB4xCxVhmUEmQj3Ut7byZ1Hbva1zhKjaVcv3jBMN7E/rewards?env=mainnet-beta

Example response:

    {
        "apr": "0.03089658127477581433161189171198501610943",
        "apy": "0.031377485860868284369015169698693427029",
        "totalReturn": "9959.75762697216",
        "totalInvestment": "322357.9184504589828735999999999999999998",
        "strategy": "2dczcMRpxWHZTcsiEjPT4YBcSseTaUmWFzw24HxYMFod",
        "token": "RAY",
        "rewardsPerDay": "137.8944",
        "rewardsPerHour": "5.7456",
        "rewardsPerSecond": "0.001596",
        "rewardIsOption": false  
    }

Get rewards for eligible shareholders of a specific strategy:

This will fetch the last 14 days of data by default, you can use the start and end query parameter dates to change it.

Please note: This route is not exposed to the public and requires basic authentication.

Please use the public route to get rewards for a specific shareholder.

// GET https://api.hubbleprotocol.io/strategies/:strategy_pubkey/rewards?env={cluster}&start={start}&end={end}
GET https://api.hubbleprotocol.io/strategies/ByXB4xCxVhmUEmQj3Ut7byZ1Hbva1zhKjaVcv3jBMN7E/rewards/eligible-shareholders?env=mainnet-beta&start=2022-09-01&end=2022-09-30

Get amount of rewards for a specific Kamino shareholder (all strategies):

// GET https://api.hubbleprotocol.io/strategies/shareholders/:shareholder_pubkey/rewards/history?env={cluster}
GET https://api.hubbleprotocol.io/strategies/shareholders/GkeDRfHcACap2CM9oaWrb3QUMG7pk6F6EMYca8Lu52t8/rewards/history?env=mainnet-beta

Get strategy state history aggregated by the hour for a specific year (default current year, or use query param year):

⚠️ DEPRECATED, PLEASE USE /v2/strategies/:pubkey/history INSTEAD! ⚠️

// GET https://api.hubbleprotocol.io/strategies/:strategy_pubkey/history?env={cluster}&year={year}
GET https://api.hubbleprotocol.io/strategies/ByXB4xCxVhmUEmQj3Ut7byZ1Hbva1zhKjaVcv3jBMN7E/history?env=devnet&year=2022

Get full non-aggregated strategy state history for a specific year (default current year, or use query param year):

⚠️ DEPRECATED, PLEASE USE /v2/strategies/:pubkey/history INSTEAD! ⚠️

Please note: This route is not exposed to the public and requires basic authentication.

Please use the public route to get hourly aggregated history for a specific strategy.

// GET https://api.hubbleprotocol.io/strategies/:strategy_pubkey/full-history?env={cluster}&year={year}
GET https://api.hubbleprotocol.io/strategies/Cfuy5T6osdazUeLego5LFycBQebm9PP3H7VNdCndXXEN/full-history?env=mainnet-beta&year=2022

Get strategy state history v2:

GET https://api.hubbleprotocol.io/v2/strategies/:strategyPubkey/history?env={cluster}&start={start}&end={end}&frequency={frequency}&includePerfFee={true/false}

Query params:

  • env: solana cluster, e.g. "mainnet-beta" (default) | "devnet"
  • start: start date (inclusive), e.g. 2023-05-01T00:00:00.000Z (optional, default since beginning of strategy)
  • end: end date (exclusive), e.g. 2023-05-02T00:00:00.000Z (optional, default now)
  • frequency: frequency of the snapshots, e.g. "hour" (default) | "day"
  • includePerfFee: add perfFee field to the response (optional, default false)

Example requests:

Example response:

[
  {
    "timestamp": "2023-06-06T00:00:00.000Z",
    "feesCollectedCumulativeA": "4528.851182",
    "feesCollectedCumulativeB": "4388.399699",
    "rewardsCollectedCumulative0": "6816.973791",
    "rewardsCollectedCumulative1": "869.925191",
    "rewardsCollectedCumulative2": "0",
    "kaminoRewardsIssuedCumulative0": "0",
    "kaminoRewardsIssuedCumulative1": "0",
    "kaminoRewardsIssuedCumulative2": "0",
    "sharePrice": "1.009166844496339887986660123337354133388",
    "sharesIssued": "2000370.229713",
    "tokenAAmounts": "1941835.079462",
    "tokenBAmounts": "83285.638712",
    "tokenAPrice": "0.9966972458",
    "tokenBPrice": "0.99999998",
    "reward0Price": "0.042612354",
    "reward1Price": "0.6421835081",
    "reward2Price": "0.99999998",
    "kaminoReward0Price": "0",
    "kaminoReward1Price": "0",
    "kaminoReward2Price": "0",
    "totalValueLocked": "2018707.312543886771519599999999999999998983602957644",
    "solPrice": "0",
    "profitAndLoss": "0"
  }
]

Get user's shares history aggregated by the hour for a specific year (default current year, or use query param year):

// GET https://api.hubbleprotocol.io/owners/:owner_pubkey/strategies/:strategy_pubkey/shares/history?env={cluster}&year={year}
GET https://api.hubbleprotocol.io/owners/BabJ4KTDUDqaBRWLFza3Ek3zEcjXaPDmeRGRwusQyLPS/strategies/ByXB4xCxVhmUEmQj3Ut7byZ1Hbva1zhKjaVcv3jBMN7E/shares/history?env=mainnet-beta&year=2022

Get fees and rewards earned for a strategy shareholder:

// GET https://api.hubbleprotocol.io/strategies/:strategyPubkey/shareholders/:shareholderPubkey/fees-and-rewards?env={cluster}
GET https://api.hubbleprotocol.io/strategies/Cfuy5T6osdazUeLego5LFycBQebm9PP3H7VNdCndXXEN/shareholders/HZYHFagpyCqXuQjrSCN2jWrMHTVHPf9VWP79UGyvo95L/fees-and-rewards?env=mainnet-beta

Sample response:

{
    "feesAEarned": "31.32619353486741639998339868",
    "feesBEarned": "24.70081628219520072196336092",
    "feesAEarnedUsd": "31.256576407153470503340282981001181676",
    "feesBEarnedUsd": "24.698716826795158937664218970228174",
    "rewards0Earned": "0",
    "rewards1Earned": "0",
    "rewards2Earned": "0",
    "rewards0EarnedUsd": "0",
    "rewards1EarnedUsd": "0",
    "rewards2EarnedUsd": "0",
    "kaminoRewards0Earned": "712379.5022312449919715809869996",
    "kaminoRewards1Earned": "0",
    "kaminoRewards2Earned": "0",
    "kaminoRewards0EarnedUsd": "0.61236142011797819509877101642485616",
    "kaminoRewards1EarnedUsd": "0",
    "kaminoRewards2EarnedUsd": "0",
    "lastCalculated": "2023-01-12T13:10:21.212Z"
}
  • fees/rewards earned represent the amount of tokens earned from the first deposit
  • fees/rewards earned in USD represent the USD amount earned from the first deposit
  • rewards represent vault rewards, kamino rewards represent autocompounded rewards
  • last calculated refers to the last calculation date (fees and rewards are calculated every 5 minutes)

Get latest fees and rewards earned for a strategy shareholder:

Fetch strategy shareholder fees and rewards for only the latest position. This endpoint takes a look at when the user's position was last closed (fully withdrawn) and opened again and only calculates the fees and rewards after that time.

For all-time fees and rewards of a strategy shareholder use endpoint mentioned in the previous section (Get fees and rewards earned for a strategy shareholder above).

// GET https://api.hubbleprotocol.io/strategies/:strategyPubkey/shareholders/:shareholderPubkey/fees-and-rewards/latest-position?env={cluster}
GET https://api.hubbleprotocol.io/strategies/Cfuy5T6osdazUeLego5LFycBQebm9PP3H7VNdCndXXEN/shareholders/HZYHFagpyCqXuQjrSCN2jWrMHTVHPf9VWP79UGyvo95L/fees-and-rewards/latest-position?env=mainnet-beta

Example request:

https://api.hubbleprotocol.io/strategies/Cfuy5T6osdazUeLego5LFycBQebm9PP3H7VNdCndXXEN/shareholders/HZYHFagpyCqXuQjrSCN2jWrMHTVHPf9VWP79UGyvo95L/fees-and-rewards/latest-position?env=mainnet-beta

Sample response:

{
    "feesAEarned": "31.32619353486741639998339868",
    "feesBEarned": "24.70081628219520072196336092",
    "feesAEarnedUsd": "31.256576407153470503340282981001181676",
    "feesBEarnedUsd": "24.698716826795158937664218970228174",
    "rewards0Earned": "0",
    "rewards1Earned": "0",
    "rewards2Earned": "0",
    "rewards0EarnedUsd": "0",
    "rewards1EarnedUsd": "0",
    "rewards2EarnedUsd": "0",
    "kaminoRewards0Earned": "712379.5022312449919715809869996",
    "kaminoRewards1Earned": "0",
    "kaminoRewards2Earned": "0",
    "kaminoRewards0EarnedUsd": "0.61236142011797819509877101642485616",
    "kaminoRewards1EarnedUsd": "0",
    "kaminoRewards2EarnedUsd": "0",
    "lastCalculated": "2023-01-12T13:10:21.212Z"
}
  • fees/rewards earned represent the amount of tokens earned from the last deposit
  • fees/rewards earned in USD represent the USD amount earned from the last deposit
  • rewards represent vault rewards, kamino rewards represent autocompounded rewards
  • last calculated refers to the last calculation date (fees and rewards are calculated every 5 minutes)

Get fees and rewards for strategies:

GET https://api.hubbleprotocol.io/strategies/fees-and-rewards?env={cluster}&period={timePeriod}&status={strategyStatus}

Query params:

Example response:

[
  {
    "strategyPubkey": "2VQaDuSqqxeX2h9dS9WgpvN6ShaBxd8JjaaWEvbmTDY1",
    "feesAEarned": "1.037294",
    "feesBEarned": "2.753151",
    "rewards0Earned": "0",
    "rewards1Earned": "0",
    "rewards2Earned": "0",
    "kaminoRewards0Earned": "0",
    "kaminoRewards1Earned": "0",
    "kaminoRewards2Earned": "0",
    "feesAEarnedUsd": "1.0344169674816346",
    "feesBEarnedUsd": "2.75657612228428",
    "rewards0EarnedUsd": "0",
    "rewards1EarnedUsd": "0",
    "rewards2EarnedUsd": "0",
    "kaminoRewards0EarnedUsd": "0",
    "kaminoRewards1EarnedUsd": "0",
    "kaminoRewards2EarnedUsd": "0",
    "lastCalculated": "2023-03-24T14:14:13.885Z"
  },
  {
    "strategyPubkey": "2dczcMRpxWHZTcsiEjPT4YBcSseTaUmWFzw24HxYMFod",
    "feesAEarned": "1.389828787",
    "feesBEarned": "1.182662835",
    "rewards0Earned": "681.574997269",
    "rewards1Earned": "272.629657",
    "rewards2Earned": "0",
    "kaminoRewards0Earned": "351.579127",
    "kaminoRewards1Earned": "0",
    "kaminoRewards2Earned": "0",
    "feesAEarnedUsd": "29.78482623351582254",
    "feesBEarnedUsd": "27.9253762204614832164",
    "rewards0EarnedUsd": "31.2709271924846080985",
    "rewards1EarnedUsd": "66.55395386232317",
    "rewards2EarnedUsd": "0",
    "kaminoRewards0EarnedUsd": "85.68865812406762",
    "kaminoRewards1EarnedUsd": "0",
    "kaminoRewards2EarnedUsd": "0",
    "lastCalculated": "2023-03-24T14:14:13.885Z"
  }
]
  • fees/rewards earned represent the amount of tokens earned from the first deposit
  • fees/rewards earned in USD represent the USD amount earned from the first deposit
  • rewards represent vault rewards, kamino rewards represent autocompounded rewards
  • last calculated refers to the last calculation date (fees and rewards are calculated every 5 minutes)

Get PnL for a strategy shareholder position:

Caclulate profit and loss and cost basis for a Kamino strategy shareholder's latest position.

// GET https://api.hubbleprotocol.io/strategies/:strategyPubkey/shareholders/:shareholderPubkey/pnl?env={cluster}
GET https://api.hubbleprotocol.io/strategies/Cfuy5T6osdazUeLego5LFycBQebm9PP3H7VNdCndXXEN/shareholders/HZYHFagpyCqXuQjrSCN2jWrMHTVHPf9VWP79UGyvo95L/pnl?env=mainnet-beta

Example request:

https://api.hubbleprotocol.io/strategies/Cfuy5T6osdazUeLego5LFycBQebm9PP3H7VNdCndXXEN/shareholders/HZYHFagpyCqXuQjrSCN2jWrMHTVHPf9VWP79UGyvo95L/pnl?env=mainnet-beta

Sample response:

{
  "totalPnl": {
    "sol": "0.821586623506697901642320602103",
    "usd": "15.932660735531558716134077510914",
    "a": "0.821586623506697901642320602103",
    "b": "0.742615763210195652674132993392"
  },
  "totalCostBasis": {
    "sol": "1.263745586773755885725088551614",
    "usd": "24.507251109021206639863158576972",
    "a": "1.263745586773755885725088551614",
    "b": "1.142274431659923954552610113376"
  }
}

"a" and "b" properties in the response refer to the token A and token B that the strategy contains.

Get PnL history for a strategy shareholder:

Return PnL history data for strategy shareholder with mark to market analysis.

Returns hourly timeseries if user's latest position is under 15 days old, otherwise it returns daily timeseries data. This is an optimization for frontend charts.

// GET https://api.hubbleprotocol.io/strategies/:strategyPubkey/shareholders/:shareholderPubkey/pnl/history?env={cluster}&start={date}&end={date}
GET https://api.hubbleprotocol.io/strategies/Cfuy5T6osdazUeLego5LFycBQebm9PP3H7VNdCndXXEN/shareholders/HZYHFagpyCqXuQjrSCN2jWrMHTVHPf9VWP79UGyvo95L/pnl/history?env=mainnet-beta

Query params:

  • env: solana cluster, e.g. "mainnet-beta" (default) | "devnet"
  • start: start date (inclusive), e.g. 2023-05-01T00:55:00.000Z
  • end: end date (exclusive), e.g. 2023-05-01T00:55:00.000Z

Example request:

https://api.hubbleprotocol.io/strategies/Cfuy5T6osdazUeLego5LFycBQebm9PP3H7VNdCndXXEN/shareholders/HZYHFagpyCqXuQjrSCN2jWrMHTVHPf9VWP79UGyvo95L/pnl/history?env=mainnet-beta

Sample response:

{
  "history": [
    {
      "timestamp": 1672051577137,
      "type": "buy",
      "price": {
        "sol": "13.707781891346918813283886561673",
        "usd": "264.432819438594964488396234360437",
        "a": "13.707781891346918813283886561673",
        "b": "12.38943455028558047998876234889"
      },
      "quantity": "0.042891188",
      "positionPnl": {
        "sol": "0",
        "usd": "0",
        "a": "0",
        "b": "0"
      },
      "realizedPnl": {
        "sol": "0",
        "usd": "0",
        "a": "0",
        "b": "0"
      },
      "allHistoryPnl": {
        "sol": "0",
        "usd": "0",
        "a": "0",
        "b": "0"
      },
      "position": "0.042891188",
      "positionValue": {
        "sol": "0.587943050164756268041296075887",
        "usd": "11.341837771910831077725126706445",
        "a": "0.587943050164756268041296075887",
        "b": "0.531397566509994286056328243793"
      },
      "costBasis": {
        "sol": "0.587943050164756268041296075887",
        "usd": "11.341837771910831077725126706445",
        "a": "0.587943050164756268041296075887",
        "b": "0.531397566509994286056328243793"
      },
      "investment": {
        "sol": "0.587943050164756268041296075887",
        "usd": "11.341837771910831077725126706445",
        "a": "0.587943050164756268041296075887",
        "b": "0.531397566509994286056328243793"
      }
    }
  ],
  "totalPnl": {
    "sol": "0.815290185426638259315771871017",
    "usd": "15.727525000165956333285426076312",
    "a": "0.815290185426638259315771871017",
    "b": "0.736879567525786810587921709799"
  },
  "totalCostBasis": {
    "sol": "1.270417392486119200058849813594",
    "usd": "24.507251109021206639863158576972",
    "a": "1.270417392486119200058849813594",
    "b": "1.148234868376991871955894984218"
  },
  "strategy": "ByXB4xCxVhmUEmQj3Ut7byZ1Hbva1zhKjaVcv3jBMN7E",
  "wallet": "2VGzusQTEFJneuTWd7RQXx53vXiTi2qNYXx4ftj26Vvb"
}

"a" and "b" properties in the response refer to the token A and token B that the strategy contains.

Transaction type can be buy, sell or mark-to-market. Buys and sells are actual transactions of the user. Mark to market represents potential position and PnL if they bought/sold at that specific time.

Get volume for strategies:

⚠️ DEPRECATED, PLEASE USE /v2/strategies/volume INSTEAD! ⚠️

GET https://api.hubbleprotocol.io/strategies/volume?env={cluster}&status={strategyStatus}

Query params:

Example response:

[
  {
    "strategy": "6K4jM79yijUEFxdFhCFZSjav1nZji1gsxUWQE6XrC8YD",
    "kaminoVolume": [
      {
        "period": "24h",
        "amount": "0"
      },
      {
        "period": "7d",
        "amount": "4943.5832904232213864595352"
      },
      {
        "period": "30d",
        "amount": "70711922.7175338705593670146676"
      }
    ],
    "poolVolume": [
      {
        "period": "24h",
        "amount": "32449.432601658486"
      },
      {
        "period": "7d",
        "amount": "199221.15394896772"
      },
      {
        "period": "30d",
        "amount": "1493200.352996167"
      }
    ]
  }
]

Get volume for all strategies v2:

Return 24h/7d/30d volume (in USD) for every single Kamino strategy.

GET https://api.hubbleprotocol.io/v2/strategies/volume?env={cluster}

Query params:

  • env: solana cluster, e.g. "mainnet-beta" (default) | "devnet"

Example request: https://api.hubbleprotocol.io/v2/strategies/volume?env=mainnet-beta

Example response:

[
  {
    "strategy": "BfyQYYr2T9eJfMfq5gPXcq3SUkJSh2ahtk7ZNUCzkx9e",
    "kaminoVolume": [
      {
        "period": "24h",
        "amount": "110492.5009755243"
      },
      {
        "period": "7d",
        "amount": "2720522.381172522"
      },
      {
        "period": "30d",
        "amount": "5617787.72039797"
      }
    ]
  },
  {
    "strategy": "9zBNQtnenpQY6mCoRqbPpeePeSy17h34DZP82oegt1fL",
    "kaminoVolume": [
      {
        "period": "24h",
        "amount": "110492.5009755243"
      },
      {
        "period": "7d",
        "amount": "2720522.381172522"
      },
      {
        "period": "30d",
        "amount": "5617787.72039797"
      }
    ]
  }
]

Get volume for specific strategy v2:

Return 24h/7d/30d volume (in USD) for specified Kamino strategy.

GET https://api.hubbleprotocol.io/v2/strategies/:strategyPubkey/volume?env={cluster}

Query params:

  • env: solana cluster, e.g. "mainnet-beta" (default) | "devnet"

Example request: https://api.hubbleprotocol.io/v2/strategies/BfyQYYr2T9eJfMfq5gPXcq3SUkJSh2ahtk7ZNUCzkx9e/volume?env=mainnet-beta

Example response:

{
  "strategy": "BfyQYYr2T9eJfMfq5gPXcq3SUkJSh2ahtk7ZNUCzkx9e",
  "kaminoVolume": [
    {
      "period": "24h",
      "amount": "110492.5009755243"
    },
    {
      "period": "7d",
      "amount": "2720522.381172522"
    },
    {
      "period": "30d",
      "amount": "5617787.72039797"
    }
  ]
}

Get all-time Kamino volume:

GET https://api.hubbleprotocol.io/strategies/all-time-volume?env={cluster}

Query params:

  • env: solana cluster, e.g. "mainnet-beta" (default) | "devnet"

Example request:

https://api.hubbleprotocol.io/strategies/all-time-volume

Example response:

{
  "volumeUsd": "106015327.76",
  "lastCalculated": "2023-04-13T15:55:31.761Z"
}

Get all-time Kamino fees and rewards:

GET https://api.hubbleprotocol.io/strategies/all-time-fees-and-rewards?env={cluster}

Query params:

  • env: solana cluster, e.g. "mainnet-beta" (default) | "devnet"

Example request:

https://api.hubbleprotocol.io/strategies/all-time-fees-and-rewards

Example response:

{
  "feesAEarnedUsd": "59246.89656897732967689080867366185019",
  "feesBEarnedUsd": "57080.94920621374904358352501138520562",
  "rewards0EarnedUsd": "5927.1681652971537634193",
  "rewards1EarnedUsd": "4404.4392311526895494322",
  "rewards2EarnedUsd": "0",
  "kaminoRewards0EarnedUsd": "39648.8949681613351787107",
  "kaminoRewards1EarnedUsd": "1231.803977675133",
  "kaminoRewards2EarnedUsd": "0",
  "totalUsd": "167540.15211747739021203653368504705581",
  "lastCalculated": "2023-04-14T09:52:59.292Z"
}

If you want to get a breakdown of all-time Kamino fees and rewards for each strategy, you can use this endpoint instead:

GET https://api.hubbleprotocol.io/strategies/all-time-fees-and-rewards/breakdown?env={cluster}

Example request:

https://api.hubbleprotocol.io/strategies/all-time-fees-and-rewards/breakdown

Example response:

{
  "lastCalculated": "2023-06-27T13:58:16.619Z",
  "strategies": [
    {
      "strategyPubkey": "12iZna9cRnhSY85cDTvas3mav36bYE9WeDuL9uFzH2Zw",
      "feesAEarned": "0.08458176",
      "feesBEarned": "0.00064853",
      "rewards0Earned": "0",
      "rewards1Earned": "0",
      "rewards2Earned": "0",
      "kaminoRewards0Earned": "0",
      "kaminoRewards1Earned": "0",
      "kaminoRewards2Earned": "0",
      "feesAEarnedUsd": "1.492410700820064",
      "feesBEarnedUsd": "1.114493941025",
      "rewards0EarnedUsd": "0",
      "rewards1EarnedUsd": "0",
      "rewards2EarnedUsd": "0",
      "kaminoRewards0EarnedUsd": "0",
      "kaminoRewards1EarnedUsd": "0",
      "kaminoRewards2EarnedUsd": "0",
      "totalUsd": "2.606904641845064"
    },
    {
      "strategyPubkey": "13GDKPRjvK5GWtk8YNTMGj7S4PzhQ6gpQdHJpmCSmWn6",
      "feesAEarned": "0",
      "feesBEarned": "0",
      "rewards0Earned": "0",
      "rewards1Earned": "0",
      "rewards2Earned": "0",
      "kaminoRewards0Earned": "0",
      "kaminoRewards1Earned": "0",
      "kaminoRewards2Earned": "0",
      "feesAEarnedUsd": "0",
      "feesBEarnedUsd": "0",
      "rewards0EarnedUsd": "0",
      "rewards1EarnedUsd": "0",
      "rewards2EarnedUsd": "0",
      "kaminoRewards0EarnedUsd": "0",
      "kaminoRewards1EarnedUsd": "0",
      "kaminoRewards2EarnedUsd": "0",
      "totalUsd": "0"
    }
  ]
}

Get Kamino TVL:

GET https://api.hubbleprotocol.io/strategies/tvl?env={cluster}

Query params:

  • env: solana cluster, e.g. "mainnet-beta" (default) | "devnet"

Example request:

https://api.hubbleprotocol.io/strategies/tvl?env=mainnet-beta

Example response:

{
  "tvl": "8360625.990205809513007916645145375207353"
}

Get all strategies with filters

  • The current filters that are supported are:
    • strategyType which can be:

      • NON_PEGGED: e.g. SOL-BONK
      • PEGGED: e.g. BSOL-JitoSOL
      • STABLE: e.g. USDH-USDC
    • strategyCreationStatus which can be:

      • IGNORED
      • SHADOW
      • LIVE
      • DEPRECATED
      • STAGING

If no filters are provided all strategies are fetched

GET https://api.hubbleprotocol.io/strategies?env={cluster}&type={type}&status={status}

Examples:

Get all NON_PEGGED strategies

GET https://api.hubbleprotocol.io/strategies?type=NON_PEGGED

Get all STAGING strategies

GET https://api.hubbleprotocol.io/strategies?status=STAGING

Get total token amounts in live strategies

GET https://api.hubbleprotocol.io/strategies/tokens/{tokenMint}/amounts?env={cluster}

Example request to get total MSOL stored in Kamino: https://api.hubbleprotocol.io/strategies/tokens/mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So/amounts?env=mainnet-beta

Example response:

{
    "totalTokenAmount": "2643,805199154",
    "vaults": [
        {
            "address": "9zBNQtnenpQY6mCoRqbPpeePeSy17h34DZP82oegt1fL",
            "frontendUrl": "https://app.kamino.finance/liquidity/9zBNQtnenpQY6mCoRqbPpeePeSy17h34DZP82oegt1fL",
            "amount": "1641.613204799"
        },
        {
            "address": "F3v6sBb5gXL98kaMkaKm5GfEoBNUaSd3ZGErbjqgzTho",
            "frontendUrl": "https://app.kamino.finance/liquidity/F3v6sBb5gXL98kaMkaKm5GfEoBNUaSd3ZGErbjqgzTho",
            "amount": "1002.191994355"
        }
    ],
    "timestamp": "2023-02-21T12:09:21.304Z"
}

Get strategy historical ranges

GET https://api.hubbleprotocol.io/strategies/:strategyPubkey/ranges/history?env={cluster}&period={24h/7d/30d}&start={timestamp}&end={timestamp}

Example requests:

Query params:

  • env: solana cluster, e.g. "mainnet-beta" (default) | "devnet"
  • period: time period for fees and rewards "24h" (default) | "7d" | "30d"
  • start: start date (inclusive), e.g. 2023-05-01T00:55:00.000Z
  • end: end date (exclusive), e.g. 2023-05-01T00:55:00.000Z

You can either use a custom range with start/end query params, or a fixed range with period query param. Fixed range should generally be faster due to caching.

Example response:

[
  {
    "poolPrice": "0.9972366173254501385554518847257254077598",
    "priceLower": "0.9967056034608861435985512952707255012191",
    "priceUpper": "0.9991004498350494870014376094211437370195",
    "oraclePrice": "0.9971830421584632669044453843263363536864",
    "rebalanceParams": {
      "rangePriceLower": "0.9967056034608861435985512952707255012191",
      "rangePriceUpper": "0.9991004498350494870014376094211437370195"
    },
    "date": "2023-06-25T12:00:00.000Z"
  },
  {
    "poolPrice": "0.9972366173254501385554518847257254077598",
    "priceLower": "0.9967056034608861435985512952707255012191",
    "priceUpper": "0.9991004498350494870014376094211437370195",
    "oraclePrice": "0.9971830421584632669044453843263363536864",
    "rebalanceParams": {
      "rangePriceLower": "0.9967056034608861435985512952707255012191",
      "rangePriceUpper": "0.9991004498350494870014376094211437370195"
    },
    "date": "2023-06-25T13:00:00.000Z"
  }
]

Get strategy metrics history

GET https://api.hubbleprotocol.io/strategies/:strategyPubkey/metrics/history?env={cluster}&period={24h/7d/30d}&start={timestamp}&end={timestamp}

Example requests:

Query params:

  • env: solana cluster, e.g. "mainnet-beta" (default) | "devnet"
  • period: time period for fees and rewards "24h" (default) | "7d" | "30d"
  • start: start date (inclusive), e.g. 2023-05-01T00:00:00.000Z
  • end: end date (exclusive), e.g. 2023-06-01T00:00:00.000Z

You can either use a custom range with start/end query params, or a fixed range with period query param. Fixed range should generally be faster due to caching.

Example response:

[
  {
    "date": "2023-06-28T13:00:00.000Z",
    "feesAndRewards24hUsd": "6.892236874",
    "volume24hUsd": "137960909.25357357",
    "cumulativeFeesAndRewardsUsd": "65507.881823738092895",
    "apy24h": "0.001245986450885626907330639945496746179"
  },
  {
    "date": "2023-06-28T12:00:00.000Z",
    "feesAndRewards24hUsd": "6.3897214358",
    "volume24hUsd": "137922148.76631424",
    "cumulativeFeesAndRewardsUsd": "65507.881823738092895",
    "apy24h": "0.001186575692116333812242675851871094793"
  }
]

Get strategy shareholders history

GET https://api.hubbleprotocol.io/strategies/:strategyPubkey/shareholders/history?env={cluster}&start={start}&end={end}&frequency={frequency}

Query params:

  • env: solana cluster, e.g. "mainnet-beta" (default) | "devnet"
  • start: start date (inclusive), e.g. 2023-05-01T00:00:00.000Z (optional, default since beginning of strategy)
  • end: end date (exclusive), e.g. 2023-05-02T00:00:00.000Z (optional, default now)
  • frequency: frequency of the snapshots, e.g. "hour" (default) | "day"

Example requests:

Example response:

[
    {
        "timestamp": "2023-06-06T11:00:00.000Z",
        "shareholders": [
            {
                "sharesAmount": "25215.549995",
                "sharePrice": "1.067670377475403913338573081893682618365",
                "sharesUsd": "26921.89578141156925960743690845138333804",
                "tokenAAmount": "820.4214362237481540135710513269",
                "tokenAPrice": "19.98425069",
                "tokenAUsd": "16395.507652945230041231933551843626740561",
                "tokenBAmount": "0.408879105380424526340758204",
                "tokenBPrice": "25744.5",
                "tokenBUsd": "10526.388128466339218379649582878",
                "wallet": "7tH1k4PsMu3sNUYJxD5ezxhAmYYXyVVZz5c3dbaxcvUV"
            },
            {
                "sharesAmount": "0.853582",
                "sharePrice": "1.067670377475403913338573081893682618365",
                "sharesUsd": "0.9113442161462102231553658883889733967492",
                "tokenAAmount": "0.027772424972431754280993115411983",
                "tokenAPrice": "19.98425069",
                "tokenAUsd": "0.55501110291829251646784712055717090201827",
                "tokenBAmount": "0.00001384113551352396460160423028",
                "tokenBPrice": "25744.5",
                "tokenBUsd": "0.35633311322791770668600010644346",
                "wallet": "BUfcRmRPQNqMbPSKh6a7Pp3tSTneNMt2zWYr5DefW5hd"
            }
        ]
    }
]

Get strategies start date overrides

GET https://api.hubbleprotocol.io/strategies/start-date-overrides?env={cluster}

Query params:

  • env: solana cluster, e.g. "mainnet-beta" (default) | "devnet"

Example request:

Example response:

[
  {
    "strategy": "Cfuy5T6osdazUeLego5LFycBQebm9PP3H7VNdCndXXEN",
    "start": "2022-09-01T00:00:00.000Z"
  },
  {
    "strategy": "ByXB4xCxVhmUEmQj3Ut7byZ1Hbva1zhKjaVcv3jBMN7E",
    "start": "2022-09-01T00:00:00.000Z"
  },
  {
    "strategy": "98kNMp1aqWoYAaUU8m5REBAYVwhFb4aX9yoSpgq8kUFu",
    "start": "2022-09-01T00:00:00.000Z"
  }
]

Whirlpools Kamino

You may use the env query param for all the methods specified below (mainnet-beta[default],devnet,localnet,testnet).

Get Orca whirlpool history for a specific year (default current year, or use query param year):

// GET https://api.hubbleprotocol.io/whirlpools/:whirlpool_pubkey/history?env={cluster}&year={year}
GET https://api.hubbleprotocol.io/whirlpools/BabJ4KTDUDqaBRWLFza3Ek3zEcjXaPDmeRGRwusQyLPS/history?env=mainnet-beta&year=2022

Get whirlpools TVL

Get all unique Orca/Raydium pools from Kamino strategies and return their TVL:

GET https://api.hubbleprotocol.io/whirlpools/tvl?env={cluster}

Example request:

https://api.hubbleprotocol.io/whirlpools/tvl

Response example:

[
    {
        "tvl": "10628.86524130715",
        "pool": "3BScXnPjT4hut1G5yJ5UGQWhUmoYxyBFQf3juLBeMH2S"
    },
    {
        "tvl": "522635.86139358365",
        "pool": "4nFbdT7DeXATvaRZfR3WqALGJnogMjqe9vf2H6C1WXBr"
    }
]

Get whirlpool fees

Get all unique Orca/Raydium pools from Kamino strategies and return their fees:

GET https://api.hubbleprotocol.io/whirlpools/fees?env={cluster}

Example request:

https://api.hubbleprotocol.io/whirlpools/fees

Response example:

[
  {
    "fees": [
      {
        "period": "24h",
        "amount": "0.13107745873661961"
      },
      {
        "period": "7d",
        "amount": "0.4323762174032862"
      },
      {
        "period": "30d",
        "amount": "0.52013355740328621"
      }
    ],
    "pool": "H1fREbTWrkhCs2stH3tKANWJepmqeF9hww4nWRYrM7uV"
  },
  {
    "fees": [
      {
        "period": "24h",
        "amount": "437.0303313444236"
      },
      {
        "period": "7d",
        "amount": "2578.2959811239195"
      },
      {
        "period": "30d",
        "amount": "7032.52314803323"
      }
    ],
    "pool": "BVXNG6BrL2Tn3NmppnMeXHjBHTaQSnSnLE99JKwZSWPg"
  }
]

kToken metadata (Kamino)

You may use the env query param for all the methods specified below (mainnet-beta[default],devnet,localnet,testnet).

All mints must be valid kToken mints.

Get kToken metadata for mint:

// GET https://api.hubbleprotocol.io/ktokens/:mint/metadata
GET https://api.hubbleprotocol.io/ktokens/BabJ4KTDUDqaBRWLFza3Ek3zEcjXaPDmeRGRwusQyLPS/metadata

Get kToken image for mint:

// GET https://api.hubbleprotocol.io/ktokens/:mint/metadata/image.svg
GET https://api.hubbleprotocol.io/ktokens/BabJ4KTDUDqaBRWLFza3Ek3zEcjXaPDmeRGRwusQyLPS/metadata/image.svg

Prices

Get all prices:

GET https://api.hubbleprotocol.io/prices?env={cluster}&source={priceSource:scope(default)|birdeye}

Example request: https://api.hubbleprotocol.io/prices?env=mainnet-beta&source=scope Example response:

[
    {
        "usdPrice": "22.382246552631578",
        "token": "SOL",
        "mint": "So11111111111111111111111111111111111111112"
    },
    {
        "usdPrice": "1580.8847893915756",
        "token": "ETH",
        "mint": "7vfCXTUXx5WJV5JADk17DUJ4ksgau7utNKj4b963voxs"
    }
]

Get specific token price:

GET https://api.hubbleprotocol.io/prices?env={cluster}&source={priceSource:scope(default)|birdeye}&token={tokenName or mint}

Example requests:

[
    {
        "usdPrice": "22.382246552631578",
        "token": "SOL",
        "mint": "So11111111111111111111111111111111111111112"
    }
]

Get token price history:

GET https://api.hubbleprotocol.io/prices/history?env={cluster}&token={name or mint}&start={start}&end={end}&frequency={frequency}&type={type}

Query params:

  • env: solana cluster, e.g. "mainnet-beta" (default) | "devnet"
  • token: name (deprecated soon) or mint (use of mint recommended!) pubkey, e.g. "SOL" or "So11111111111111111111111111111111111111112"
  • start: start date (inclusive), e.g. 2023-05-01T00:55:00.000Z (optional, default 1 day ago)
  • end: end date (inclusive), e.g. 2023-05-01T00:55:00.000Z (optional, default now)
  • frequency: frequency of the prices, e.g. "minute" (default) | "hour" | "day" for price every minute/hour/day for the specified timeseries
  • type: price type, e.g. "spot" (default) | "TWAP"

Example requests:

Example response:

[
    [
        "17.35422124",  // <-- token price
        1668162327      // <-- seconds since epoch
    ],
    [
        "16.51238765",
        1668172327
    ]
]

Get token price moving averages:

GET https://api.hubbleprotocol.io/prices/moving-averages?env={cluster:optional, default mainnet}&token={tokenName:required}&durationInSec={duration:optional, default 3600}

Example request: https://api.hubbleprotocol.io/prices/moving-averages?env=mainnet-beta&token=SOL&durationInSec=3600

Example response:

[
    {
        "pair": "SOL/USD",
        "sma": "21.8084071408819895",
        "priceCount": "2",
        "start": "2023-02-14T15:36:42.498Z",
        "end": "2023-02-14T15:39:03.759Z",
        "ema": "21.8084071408819895",
        "source": "birdeye"
    }
]

Borrowing Market State

Borrowing market state = BMS

Get BMS history

Please note: This route is not exposed to the public and requires basic authentication.

You can specify start/end date range with query params start and end. Otherwise, it will return 24 hours of BMS by default.

// GET https://api.hubbleprotocol.io/bms/:bmsPubkey/history?env={cluster}&start={startDate}&end={endDate}
GET https://api.hubbleprotocol.io/bms/FqkHHpETrpfgcA5SeH7PKKFDLGWM4tM7ZV31HfutTXNV/history?env=mainnet-beta&start=2020-01-01&end=2023-01-01

Get BMS loans closest to a snapshot timestamp

Please note: This route is not exposed to the public and requires basic authentication.

// GET https://api.hubbleprotocol.io/bms/:bmsPubkey/closest-loans?env={cluster}&timestamp={timestamp}
GET https://api.hubbleprotocol.io/bms/FqkHHpETrpfgcA5SeH7PKKFDLGWM4tM7ZV31HfutTXNV/closest-loans?env=mainnet-beta&timestamp=2022-11-22T12:00:00.000Z

Debug

Endpoints to help with debugging by using the Carpool service.

Get program accounts

// GET https://api.hubbleprotocol.io/debug/accounts/:programId/:accountName?env={cluster}
GET https://api.hubbleprotocol.io/debug/accounts/HubbLeXBb7qyLHt3x7gvYaRrxQmmgExb7fCJgDqFuB6T/BorrowingMarketState?env=mainnet-beta

Transactions

Get all kamino transactions v2

Get all instructions for the specified Kamino (liquidity) shareholder.

// GET https://api.hubbleprotocol.io/v2/shareholders/:shareholderPubkey/transactions?env={cluster}
GET https://api.hubbleprotocol.io/v2/shareholders/7QnXf4d1YQ6k8oTzCLXjEiikGFm3KRZgmFJmry9vZxdW/transactions?env=mainnet-beta

Example response:

{
  "transactions": [
    {
      "createdOn": "2024-02-02T12:07:19.000Z",
      "timestamp": "1706875639000",
      "transactionSignature": "DyUW9Rhkis65Y4RAoD6Xj3C2iZQigZn67ZJt5P11Uk8kZxC9Zx8r84bsAKYMgfvzows1LNPDmB3hD5kimHqjufF",
      "transactionName": "deposit",
      "strategy": "HBuYwvq67VKnLyKxPzDjzskyRMk7ps39gwHdvaPGwdmQ",
      "tokenA": "JUP",
      "tokenAMint": "JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN",
      "tokenAAmount": "1172.664445",
      "tokenAPrice": "1.4235452",
      "tokenB": "bSOL",
      "tokenBMint": "bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1",
      "tokenBAmount": "6.452820291",
      "tokenBPrice": "1.55343",
      "usdValue": "1345.28593",
      "numberOfShares": "5315.114625",
      "sharePrice": "0.1248459",
      "solPrice": "90.1348745894",
      "latestPosition": true
    }
  ]
}

Get all kamino transactions

⚠️ DEPRECATED, PLEASE USE V2 TRANSACTIONS (Get all kamino transactions v2) INSTEAD! ⚠️

Get shareholder's Kamino transactions (withdraw, deposit and depositAndInvest instructions). Returns the last 1000 transactions ordered by timestamp descending.

// GET https://api.hubbleprotocol.io/shareholders/:shareholderPubkey/transactions?env={cluster}
GET https://api.hubbleprotocol.io/shareholders/7QnXf4d1YQ6k8oTzCLXjEiikGFm3KRZgmFJmry9vZxdW/transactions?env=mainnet-beta

Example response:

{
  "transactions": [
    {
      "timestamp": "2023-01-12T20:39:48.758Z",
      "transactionSignature": "3Qmbxcuhc58QDe2xSsKhVQTLRACbuyisdayMTA6sCpMVqX34fPFnqiB8d1BSYCqbNNGxZ5ekdrMk3CsZ4cV7gUqf",
      "transactionName": "depositAndInvest",
      "strategy": "HWg7yB3C1BnmTKFMU3KGD7E96xx2rUhv4gxrwbZLXHBt",
      "tokenA": "SOL",
      "tokenAAmount": "0.162654437",
      "tokenAPrice": "0",
      "tokenB": "BONK",
      "tokenBAmount": "2854564.78389",
      "tokenBPrice": "0",
      "usdValue": "0",
      "numberOfShares": "7.879718"
    },
    {
      "timestamp": "2023-01-17T18:00:07.820Z",
      "transactionSignature": "3GruXM2CJtpeoP9rbG8QGAEqeCCAGcpyVmD6k5A4ezAuZpSDgLB5HPKAWFWDa6bPiDKiWDYk7mmLoF4w3ZKRhpsU",
      "transactionName": "withdraw",
      "strategy": "Cfuy5T6osdazUeLego5LFycBQebm9PP3H7VNdCndXXEN",
      "tokenA": "USDH",
      "tokenAAmount": "3.928922",
      "tokenAPrice": "10",
      "tokenB": "USDC",
      "tokenBAmount": "2.738213",
      "tokenBPrice": "0",
      "usdValue": "39.28922",
      "numberOfShares": "6.604654"
    }
  ],
  "lastUpdatedOn": "2023-01-18T14:49:31.344Z"
}

Kamino Lending

Get All Kamino Markets config

⚠️ DEPRECATED, PLEASE USE /v2/kamino-market/ INSTEAD! ⚠️

GET https://api.hubbleprotocol.io/kamino-market?env={cluster}

Example: https://api.hubbleprotocol.io/kamino-market?env=mainnet-beta

Get Kamino Market config

⚠️ DEPRECATED, PLEASE USE /v2/kamino-market/:marketPubkey INSTEAD! ⚠️

GET https://api.hubbleprotocol.io/kamino-market/:marketPubkey?env={cluster}

Example: https://api.hubbleprotocol.io/kamino-market/J5ndTP1GJe6ZWzGiZQR2UKJmWWMJojbWxCxZ2yUXwakR?env=mainnet-beta

Get All Kamino Markets config V2

GET https://api.hubbleprotocol.io/kamino-market?programId={programId}

Example: https://api.hubbleprotocol.io/kamino-market?programId=KLend2g3cP87fffoy8q1mQqGKjrxjC8boSyAYavgmjD

Get Kamino Market config V2

GET https://api.hubbleprotocol.io/kamino-market/:marketPubkey?programId={programId}

Example: https://api.hubbleprotocol.io/kamino-market/6WVSwDQXrBZeQVnu6hpnsRZhodaJTZBUaC334SiiBKdb?programId=SLendK7ySfcEzyaFqy93gDnD3RtrpXJcnRwb6zFHJSh

Get KLend Market metrics history

GET https://api.hubbleprotocol.io/kamino-market/:marketPubkey/metrics/history?env={cluster}&start={date}&end={date}'

Example: https://api.hubbleprotocol.io/kamino-market/9pMFoVgsG2cNiUCSBEE69iWFN7c1bz9gu9TtPeXkAMTs/metrics/history?env=mainnet-beta&start=2023-01-01&end=2023-01-02

Example response:

[
  {
    "market": "9pMFoVgsG2cNiUCSBEE69iWFN7c1bz9gu9TtPeXkAMTs",
    "timestamp": "2023-06-29T15:15:26.464Z",
    "metrics": { "tvl": 234.14377328764223, "obligations": 38 }
  },
  {
    "market": "9pMFoVgsG2cNiUCSBEE69iWFN7c1bz9gu9TtPeXkAMTs",
    "timestamp": "2023-06-29T16:50:08.601Z",
    "metrics": { "tvl": "234.14377328764223401824", "obligations": 38 }
  },
  {
    "market": "9pMFoVgsG2cNiUCSBEE69iWFN7c1bz9gu9TtPeXkAMTs",
    "timestamp": "2023-06-30T18:02:39.430Z",
    "metrics": { "tvl": "234.14377328764223401824", "obligations": 38 }
  }
]

Get KLend reserve history

GET https://api.hubbleprotocol.io/kamino-market/:marketPubkey/reserves/:reservePubkey/metrics/history?env={cluster}&start={date}&end={date}&frequency={frequency}'

Query params:

  • env: solana cluster, e.g. "mainnet-beta" (default) | "devnet"
  • start: start date (inclusive), e.g. 2023-05-01T00:00:00.000Z (optional, default since beginning of strategy)
  • end: end date (exclusive), e.g. 2023-05-02T00:00:00.000Z (optional, default now)
  • frequency: frequency of the snapshots, e.g. "hour" (default) | "day"

Example: https://api.hubbleprotocol.io/kamino-market/9pMFoVgsG2cNiUCSBEE69iWFN7c1bz9gu9TtPeXkAMTs/reserves/HcHkvZEDechu7bruV8zvMN11v9yHg3iY4QHNgrYUATmm/metrics/history?env=mainnet-beta&start=2023-01-01&end=2023-01-02&frequency=hour

{
  "reserve": "5ZQCZt4UV3b7SzR3nPRgqbFE1XAUmo1yVfNanGM7qFVj",
  "market": "9pMFoVgsG2cNiUCSBEE69iWFN7c1bz9gu9TtPeXkAMTs",
  "history": [
    {
      "metrics": {
        "tvl": "21.58894844114247816444",
        "symbol": "USDH",
        "decimals": 6,
        "borrowCurve": [
          [0, 0.0001],
          [0.7, 0.1],
          [1, 1.5]
        ],
        "mintAddress": "USDH1SM1ojwWUga67PGrgFWUHibbjqMvuMaDkRJTgkX",
        "borrowFactor": 0,
        "exchangeRate": 0.9749784180009508,
        "assetPriceUSD": 0.9971944372197178,
        "mintTotalSupply": "21.833854",
        "totalSupplyWads": "22.411148742143389807977042",
        "liquidationBonus": 0,
        "loanToValueRatio": 0.75,
        "protocolTakeRate": 0.1,
        "totalBorrowsWads": "0.761460742143389807977042",
        "utilizationRatio": 0.033976872444360214,
        "borrowInterestAPY": 0.004961253732466142,
        "supplyInterestAPY": 0.00016816974038857957,
        "reserveBorrowLimit": "10000000000",
        "totalLiquidityWads": "21.649688",
        "borrowFeePercentage": 0.001,
        "reserveDepositLimit": "10000000000",
        "liquidationThreshold": 0.8,
        "borrowLimitCrossedSlot": 0,
        "flashLoanFeePercentage": 0.003,
        "accumulatedProtocolFees": "0.01695662785321651304",
        "depositLimitCrossedSlot": 0,
        "cumulativeBorrowRateWads": "1033653581204157935"
      }
    }
  ]
}

Get KLend reserve borrow APY and staking APY history

Get history of klend reserve borrow interest APY and staking APY. This will only return data for reserves that contain a LST token with staking yield.

GET https://api.hubbleprotocol.io/kamino-market/:marketPubkey/reserves/:reservePubkey/borrow-and-staking-apys/history?env={cluster}&start={date}&end={date}'

Median:

GET https://api.hubbleprotocol.io/kamino-market/:marketPubkey/reserves/:reservePubkey/borrow-and-staking-apys/history/median?env={cluster}&start={date}&end={date}'

Query params:

  • env: solana cluster, e.g. "mainnet-beta" (default) | "devnet"
  • start: start date (inclusive), e.g. 2023-05-01T00:00:00.000Z
  • end: end date (exclusive), e.g. 2023-05-02T00:00:00.000Z

Examples:

[
  {
    "createdOn": "2023-10-17T15:00:06.009Z",
    "borrowInterestApy": "0.027610992938039702",
    "stakingApy": "0.066527842899023711405366628964490454572"
  },
  {
    "createdOn": "2023-10-17T15:05:06.009Z",
    "borrowInterestApy": "0.017610992938039702",
    "stakingApy": "0.078527842899023711405366628964490454572"
  }
]

Get KLend obligation history

GET https://api.hubbleprotocol.io/kamino-market/:marketPubkey/obligations/:obligationPubkey/metrics/history?env={cluster}&start={date}&end={date}&frequency={frequency}'

Query params:

  • env: solana cluster, e.g. "mainnet-beta" (default) | "devnet"
  • start: start date (inclusive), e.g. 2023-05-01T00:00:00.000Z (optional, default since beginning of strategy)
  • end: end date (exclusive), e.g. 2023-05-02T00:00:00.000Z (optional, default now)
  • frequency: frequency of the snapshots, e.g. "hour" (default) | "day"

Example: https://api.hubbleprotocol.io/kamino-market/9pMFoVgsG2cNiUCSBEE69iWFN7c1bz9gu9TtPeXkAMTs/obligations/63QrAB1okxCc4FpsgcKYHjYTp1ua8ch6mLReyKRdc22o/metrics/history?env=mainnet-beta&start=2023-01-01&end=2023-01-02&frequency=day

Example response:

{
  "obligation": "63QrAB1okxCc4FpsgcKYHjYTp1ua8ch6mLReyKRdc22o",
  "market": "9pMFoVgsG2cNiUCSBEE69iWFN7c1bz9gu9TtPeXkAMTs",
  "history": [
    {
      "timestamp": "2023-07-11T09:51:40.498Z",
      "stats": {
        "leverage": 1.8849400779844114,
        "positions": 2,
        "borrowLimit": 0.20884206942858852,
        "loanToValue": 0.46947915656326233,
        "netAccountValue": 0.14772676109110466,
        "userTotalBorrow": 0.13072933148034668,
        "userTotalDeposit": 0.2784560925714514,
        "borrowUtilization": 0.6259722087510164,
        "liquidationThreshold": 0.22276487405716108
      },
      "deposits": [
        {
          "amount": "11442889",
          "marketValue": "0.27845609257145136",
          "mintAddress": "mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So"
        }
      ],
      "borrows": [
        {
          "amount": "6024369",
          "marketValue": "0.13072933148034669",
          "mintAddress": "So11111111111111111111111111111111111111112"
        }
      ],
      "tag": 1
    }
  ]
}

Get KLend obligation history V2

GET https://api.hubbleprotocol.io/v2/kamino-market/:marketPubkey/obligations/:obligationPubkey/metrics/history?env={cluster}&start={date}&end={date}&useStakeRateForObligation={true|false}'

Query params:

  • env: solana cluster, e.g. "mainnet-beta" (default) | "devnet"
  • start: start date (inclusive), e.g. 2023-05-01T00:00:00.000Z (optional, default since beginning of strategy)
  • end: end date (exclusive), e.g. 2023-05-02T00:00:00.000Z (optional, default now)
  • useStakeRateForObligation: uses stake rate to calc net sol value

Example: https://api.hubbleprotocol.io/v2/kamino-market/9pMFoVgsG2cNiUCSBEE69iWFN7c1bz9gu9TtPeXkAMTs/obligations/63QrAB1okxCc4FpsgcKYHjYTp1ua8ch6mLReyKRdc22o/metrics/history?env=mainnet-beta&start=2023-01-01&end=2023-01-02&frequency=day&useStakeRateForObligation=true

Example response:

{
  "obligation": "63QrAB1okxCc4FpsgcKYHjYTp1ua8ch6mLReyKRdc22o",
  "market": "9pMFoVgsG2cNiUCSBEE69iWFN7c1bz9gu9TtPeXkAMTs",
  "history": [
    {
      "timestamp": "2023-07-11T09:51:40.498Z",
      "stats": {
        "leverage": 1.8849400779844114,
        "positions": 2,
        "borrowLimit": 0.20884206942858852,
        "loanToValue": 0.46947915656326233,
        "netAccountValue": 0.14772676109110466,
        "userTotalBorrow": 0.13072933148034668,
        "userTotalDeposit": 0.2784560925714514,
        "borrowUtilization": 0.6259722087510164,
        "liquidationThreshold": 0.22276487405716108
      },
      "deposits": [
        {
          "amount": "11442889",
          "marketValue": "0.27845609257145136",
          "mintAddress": "mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So"
        }
      ],
      "borrows": [
        {
          "amount": "6024369",
          "marketValue": "0.13072933148034669",
          "mintAddress": "So11111111111111111111111111111111111111112"
        }
      ],
      "tag": 1
    }
  ]
}

Get all user obligations

GET https://api.hubbleprotocol.io/kamino-market/:marketPubkey/users/:userPubkey/obligations?env={cluster}'

Query params:

  • env: solana cluster, e.g. "mainnet-beta" (default) | "devnet"

Example: https://api.hubbleprotocol.io/kamino-market/7u3HeHxYDLhnCoErrtycNokbQYbWGzLs6JSDqGAv5PfF/users/AcNSmd5CxwLs21TYUmhWt7CW2v159TdYRkvQxb1iBYRj/obligations

Get KLend tx history per user (for all obligations)

GET https://api.hubbleprotocol.io/kamino-market/:marketPubkey/users/:userPubkey/transactions/

Example response:

{
  "allTransactions": {
    "8th5rmiEfHUdPRs1fFRzxisjhHMTPmotAeBsAGGvFGG": {
      "transactions": [
        {
          "createdOn": "2023-05-12T11:41:31.818Z",
          "timestamp": 1683891691818,
          "transactionSignature": "5xtF68Ra53aqYvrCZnXQ2bRVUaR2BiiKLvSsZhEXLr2F2fRbeJMR6FaxWCDRcxUzetBrod8i7kre3651L7ohxRDL",
          "transactionName": "initObligation",
          "reserve": "",
          "liquidityToken": "",
          "liquidityTokenAmount": "0",
          "liquidityTokenPrice": "0",
          "solPrice": "0",
          "liquidityUsdValue": "0",
          "isLiquidationWithdrawal": false
        },
        {
          "createdOn": "2023-05-12T11:41:31.818Z",
          "timestamp": 1683891691818,
          "transactionSignature": "5xtF68Ra53aqYvrCZnXQ2bRVUaR2BiiKLvSsZhEXLr2F2fRbeJMR6FaxWCDRcxUzetBrod8i7kre3651L7ohxRDL",
          "transactionName": "depositReserveLiquidityAndObligationCollateral",
          "reserve": "455pvamji39kgFkiZScbLFnqFuReFQJLvv8pd1nmzfRp",
          "liquidityToken": "JITOSOL",
          "liquidityTokenAmount": "2",
          "liquidityTokenPrice": "20.99153922345559845933295",
          "solPrice": "20.28813173",
          "liquidityUsdValue": "41.9830784469111969186659",
          "isLiquidationWithdrawal": false
        },
        {
          "createdOn": "2023-05-12T11:41:31.818Z",
          "timestamp": 1683891691818,
          "transactionSignature": "5xtF68Ra53aqYvrCZnXQ2bRVUaR2BiiKLvSsZhEXLr2F2fRbeJMR6FaxWCDRcxUzetBrod8i7kre3651L7ohxRDL",
          "transactionName": "initObligation",
          "reserve": "",
          "liquidityToken": "",
          "liquidityTokenAmount": "0",
          "liquidityTokenPrice": "0",
          "solPrice": "0",
          "liquidityUsdValue": "0",
          "isLiquidationWithdrawal": false
        },
        {
          "createdOn": "2023-05-12T11:41:31.818Z",
          "timestamp": 1683891691818,
          "transactionSignature": "5xtF68Ra53aqYvrCZnXQ2bRVUaR2BiiKLvSsZhEXLr2F2fRbeJMR6FaxWCDRcxUzetBrod8i7kre3651L7ohxRDL",
          "transactionName": "depositReserveLiquidityAndObligationCollateral",
          "reserve": "455pvamji39kgFkiZScbLFnqFuReFQJLvv8pd1nmzfRp",
          "liquidityToken": "JITOSOL",
          "liquidityTokenAmount": "2",
          "liquidityTokenPrice": "20.99153922345559845933295",
          "solPrice": "20.28813173",
          "liquidityUsdValue": "41.9830784469111969186659",
          "isLiquidationWithdrawal": false
        }
      ],
      "lastUpdatedOn": "2023-08-04T06:55:07.391Z"
    },
    "8th5rmiEfHUdPRs1fFRzxisjhHMTPmotAeBsAGGvFGJ": {
      "transactions": [
        {
          "createdOn": "2023-07-26T03:10:32.190Z",
          "timestamp": 1690341032190,
          "transactionSignature": "5xtF68Ra53aqYvrCZnXQ2bRVUaR2BiiKLvSsZhEXLr2F2fRbeJMR6FaxWCDRcxUzetBrod8i7kre3651L7ohxRDL",
          "transactionName": "initObligation",
          "reserve": "",
          "liquidityToken": "",
          "liquidityTokenAmount": "0",
          "liquidityTokenPrice": "0",
          "solPrice": "0",
          "liquidityUsdValue": "0",
          "isLiquidationWithdrawal": false
        },
        {
          "createdOn": "2023-07-28T00:03:15.368Z",
          "timestamp": 1690502595368,
          "transactionSignature": "5xtF68Ra53aqYvrCZnXQ2bRVUaR2BiiKLvSsZhEXLr2F2fRbeJMR6FaxWCDRcxUzetBrod8i7kre3651L7ohxRDL",
          "transactionName": "depositReserveLiquidityAndObligationCollateral",
          "reserve": "FdSLxHXZLDrAxTwQ9ztWBw6Djueu6KbCvViJvf1Ck5Av",
          "liquidityToken": "BSOL",
          "liquidityTokenAmount": "2",
          "liquidityTokenPrice": "0",
          "solPrice": "25.07601599",
          "liquidityUsdValue": "0",
          "isLiquidationWithdrawal": false
        },
        {
          "createdOn": "2023-07-26T03:10:32.190Z",
          "timestamp": 1690341032190,
          "transactionSignature": "5xtF68Ra53aqYvrCZnXQ2bRVUaR2BiiKLvSsZhEXLr2F2fRbeJMR6FaxWCDRcxUzetBrod8i7kre3651L7ohxRDL",
          "transactionName": "depositReserveLiquidityAndObligationCollateral",
          "reserve": "FdSLxHXZLDrAxTwQ9ztWBw6Djueu6KbCvViJvf1Ck5Av",
          "liquidityToken": "BSOL",
          "liquidityTokenAmount": "0.396843479",
          "liquidityTokenPrice": "0",
          "solPrice": "23.62",
          "liquidityUsdValue": "0",
          "isLiquidationWithdrawal": false
        },
        {
          "createdOn": "2023-07-26T03:10:32.190Z",
          "timestamp": 1690341032190,
          "transactionSignature": "5xtF68Ra53aqYvrCZnXQ2bRVUaR2BiiKLvSsZhEXLr2F2fRbeJMR6FaxWCDRcxUzetBrod8i7kre3651L7ohxRDL",
          "transactionName": "initObligation",
          "reserve": "",
          "liquidityToken": "",
          "liquidityTokenAmount": "0",
          "liquidityTokenPrice": "0",
          "solPrice": "0",
          "liquidityUsdValue": "0",
          "isLiquidationWithdrawal": false
        },
        {
          "createdOn": "2023-07-28T00:03:15.368Z",
          "timestamp": 1690502595368,
          "transactionSignature": "5xtF68Ra53aqYvrCZnXQ2bRVUaR2BiiKLvSsZhEXLr2F2fRbeJMR6FaxWCDRcxUzetBrod8i7kre3651L7ohxRDL",
          "transactionName": "depositReserveLiquidityAndObligationCollateral",
          "reserve": "FdSLxHXZLDrAxTwQ9ztWBw6Djueu6KbCvViJvf1Ck5Av",
          "liquidityToken": "BSOL",
          "liquidityTokenAmount": "2",
          "liquidityTokenPrice": "0",
          "solPrice": "25.07601599",
          "liquidityUsdValue": "0",
          "isLiquidationWithdrawal": false
        },
        {
          "createdOn": "2023-07-26T03:10:32.190Z",
          "timestamp": 1690341032190,
          "transactionSignature": "5xtF68Ra53aqYvrCZnXQ2bRVUaR2BiiKLvSsZhEXLr2F2fRbeJMR6FaxWCDRcxUzetBrod8i7kre3651L7ohxRDL",
          "transactionName": "depositReserveLiquidityAndObligationCollateral",
          "reserve": "FdSLxHXZLDrAxTwQ9ztWBw6Djueu6KbCvViJvf1Ck5Av",
          "liquidityToken": "BSOL",
          "liquidityTokenAmount": "0.396843479",
          "liquidityTokenPrice": "0",
          "solPrice": "23.62",
          "liquidityUsdValue": "0",
          "isLiquidationWithdrawal": false
        }
      ],
      "lastUpdatedOn": "2023-08-04T06:55:04.134Z"
    },
    "8th5rmiEfHUdPRs1fFRzxisjhHMTPmotAeBsAGGvFGH": {
      "transactions": [
        {
          "createdOn": "2023-05-12T12:10:48.695Z",
          "timestamp": 1683893448695,
          "transactionSignature": "5xtF68Ra53aqYvrCZnXQ2bRVUaR2BiiKLvSsZhEXLr2F2fRbeJMR6FaxWCDRcxUzetBrod8i7kre3651L7ohxRDL",
          "transactionName": "initObligation",
          "reserve": "",
          "liquidityToken": "",
          "liquidityTokenAmount": "0",
          "liquidityTokenPrice": "0",
          "solPrice": "0",
          "liquidityUsdValue": "0",
          "isLiquidationWithdrawal": false
        },
        {
          "createdOn": "2023-07-23T13:45:58.881Z",
          "timestamp": 1690119958881,
          "transactionSignature": "5xtF68Ra53aqYvrCZnXQ2bRVUaR2BiiKLvSsZhEXLr2F2fRbeJMR6FaxWCDRcxUzetBrod8i7kre3651L7ohxRDL",
          "transactionName": "depositReserveLiquidityAndObligationCollateral",
          "reserve": "7SsmK3wj4V6cg4hqKFrSAdRYirUU5UyJPY2oQ2Bjgvcw",
          "liquidityToken": "STSOL",
          "liquidityTokenAmount": "-0.002682361",
          "liquidityTokenPrice": "27.4789254927168",
          "solPrice": "24.57688671",
          "liquidityUsdValue": "-0.0737083980635693283648",
          "isLiquidationWithdrawal": false
        }
      ],
      "lastUpdatedOn": "2023-07-23T13:46:56.790"
    }
  }
}

Get KLend tx history per obligation

GET https://api.hubbleprotocol.io/kamino-market/:marketPubkey/obligations/:obligationPubkey/transactions/

Query params:

  • env: solana cluster, e.g. "mainnet-beta" (default) | "devnet"
  • useLogPrices: scans logs for token prices instead of using scope prices

Example response:

{
  "transactions": [
    {
      "createdOn": "2023-07-24T06:30:53.785Z",
      "timestamp": 1690180253785,
      "transactionSignature": "5AHBE2oupPNnwQnpzHSqyfW2xMKhkvR8bduBDqbRtuuLRKRMhscKAPv8pwxx75Na6KNMJUCKvhw7EXDz9XLnc4Xp",
      "transactionName": "depositReserveLiquidityAndObligationCollateral",
      "reserve": "3zqgH952VPgRWw9Xwa9q9Smt4cPwPaF5LTqHGGxYEYgi",
      "kTokenAmount": "0",
      "liquidityToken": "USDC",
      "liquidityTokenAmount": "1",
      "liquidityTokenPrice": "0.9999",
      "solPrice": "24.3694875",
      "liquidityUsdValue": "0.9999"
    },
    {
      "createdOn": "2023-07-24T06:10:43.489Z",
      "timestamp": 1690179043489,
      "transactionSignature": "2MRCGnGQcgRmzgkmp48C4ngkSwUxFSXujEVJXt4zxjb3BJ23i3QEtcZTVpe396nULHKBNXvbiGwCmkSyojLvRwgi",
      "transactionName": "depositReserveLiquidityAndObligationCollateral",
      "reserve": "3zqgH952VPgRWw9Xwa9q9Smt4cPwPaF5LTqHGGxYEYgi",
      "kTokenAmount": "0",
      "liquidityToken": "USDC",
      "liquidityTokenAmount": "2",
      "liquidityTokenPrice": "0.9999",
      "solPrice": "24.3694875",
      "liquidityUsdValue": "1.9998"
    }
  ]
}

Bulk get Klend transactions

This endpoint is not open to the public, it is private for analytical purposes only, add authorization headers to the request.

POST https://api.hubbleprotocol.io/v2/kamino-market/:marketPubkey/transactions?programId={programId}?includeRawJson={true|false, false by default}
{
    "start": "2024-01-01T00:00Z",
    "end": "2024-01-02T00:00Z",
    "instruction": "depositReserveLiquidityAndObligationCollateral",
    "paginationToken": ""
}

Example cURL request:

curl --location 'https://api.hubbleprotocol.io/v2/kamino-market/7u3HeHxYDLhnCoErrtycNokbQYbWGzLs6JSDqGAv5PfF/transactions?programId=KLend2g3cP87fffoy8q1mQqGKjrxjC8boSyAYavgmjD' --header 'Content-Type: application/json' --header 'Authorization: Basic ENTER_CREDENTIALS' --data '{
    "start": "2024-01-01",
    "end": "2024-01-02",
    "instruction": "depositReserveLiquidityAndObligationCollateral",
    "paginationToken": ""
}'

Example Python request:

import requests
import json

url = "https://api.hubbleprotocol.io/v2/kamino-market/7u3HeHxYDLhnCoErrtycNokbQYbWGzLs6JSDqGAv5PfF/transactions?programId=KLend2g3cP87fffoy8q1mQqGKjrxjC8boSyAYavgmjD"

payload = json.dumps({
  "start": "2024-01-01",
  "end": "2024-01-02",
  "instruction": "depositReserveLiquidityAndObligationCollateral",
  "paginationToken": ""
})
headers = {
  'Content-Type': 'application/json',
  'Authorization': 'Basic ADD-CREDENTIALS-HERE'
}

response = requests.request("POST", url, headers=headers, data=payload)

print(response.text)

Example response:

{
    "result": [
        {
            "ixs": [
                {
                    "solPrice": "100.123",
                    "liquidityToken": "SOL",
                    "liquidityUsdValue": "100.123",
                    "liquidityTokenMint": "So11111111111111111111111111111111111111112",
                    "liquidityTokenPrice": "100.123",
                    "liquidityTokenAmount": "1",
                    "isLiquidationWithdrawal": false
                }
            ],
            "timestamp": "2024-02-19T00:20:45.000Z",
            "signature": "NysWUiARXCRntcCmbyyRv43aLv2m4rKF39nCTJKsaV59ASu9cDLVpxuMVWn9HujorM81iXHUYtRYw29jNnAHhTD",
            "obligation": "7vbVt9y3dtajhwgbrbSb7RR3SuainvcpLAJYGge9fRco",
            "wallet": "3YFyQwu7rSQmxvSrGawxr3fq4CyFT6NQkYry8jkCSQuk"
        }
    ],
    "paginationToken": "eyJsYXN0SWQiOjIwNzh9"
}

Get PnL per obligation (DEPRECATED)

You can specify pnl mode with query param positionMode with one of these values: {obligation_all_time, current_obligation}. By default, pnl mode is set to current_obligation position

These parameters specify whether we return the current position PnL or the accumulated PnL throughout the lifetime of the obligation (even before it was closed).

GET https://api.hubbleprotocol.io/kamino-market/:marketPubkey/obligations/:obligationPubkey/pnl/?positionMode=current_obligation

Example response:

{
  "usd": "25.21",
  "sol": "1.0"
}

⚠️ DEPRECATED, PLEASE USE v2 version (wo useStakeRate to get similar result) ⚠️

Get PnL per obligation v2

You can specify pnl mode with query param positionMode with one of these values: {obligation_all_time, current_obligation}. By default, pnl mode is set to current_obligation position For xSOL pairs, useStakeRate query param can be set to true to calculate the PnL using the stake rate. By default, it is set to false.

These parameters specify whether we return the current position PnL or the accumulated PnL throughout the lifetime of the user's obligation (even before they were closed).

GET https://api.hubbleprotocol.io/v2/kamino-market/:marketPubkey/obligations/:obligationPubkey/pnl/?positionMode=current_obligation&useStakeRate=true

Example response:

{
  "usd": "25.21",
  "sol": "1.0"
}

Get PnL per user

You can specify pnl mode with query param positionMode with one of these values: {user_all_time, user_all_current_positions}. By default, pnl mode is set to user_all_current_positions position

These parameters specify whether we return the current position PnL or the accumulated PnL throughout the lifetime of the user's obligation (even before they were closed).

GET https://api.hubbleprotocol.io/kamino-market/:marketPubkey/users/:userPubkey/pnl/?positionMode=user_all_current_positions

Get interest fees earned per obligation

GET https://api.hubbleprotocol.io/kamino-market/:marketPubkey/obligations/:obligationPubkey/interest-fees/

Query params:

  • env: solana cluster, e.g. "mainnet-beta" (default) | "devnet"
  • start: start date (inclusive), e.g. 2023-05-01T00:55:00.000Z
  • end: end date (exclusive), e.g. 2023-05-01T00:55:00.000Z
  • frequency: frequency of the snapshots, e.g. "hour" (default) | "day"
  • positionMode: position mode, e.g. "obligation_all_time" | "current_obligation (default)"

Example response:

{
  "totalFeesEarnedObligation": {
    "5QvxCCLUnmxgoAF8kuUsyPjKd6RV2XPGivsqq773TzjK": {
      "ts": 1695200400000,
      "solFees": "0.06313669856513711976206400769604439360579",
      "usdFees": "1.269225847264109025064706147202735158871",
      "nativeFees": "1.261001541373388353921537172595541265214"
    }
  },
  "feesObligation": {
    "5QvxCCLUnmxgoAF8kuUsyPjKd6RV2XPGivsqq773TzjK": [
      {
        "USDH": { "ts": 1695117600000, "solFees": "0", "usdFees": "0", "nativeFees": "0" },
        "STSOL": { "ts": 1695117600000, "solFees": "0", "usdFees": "0", "nativeFees": "0" },
        "UXD": { "ts": 1695117600000, "solFees": "0", "usdFees": "0", "nativeFees": "0" },
        "USDC": { "ts": 1695117600000, "solFees": "0", "usdFees": "0", "nativeFees": "0" },
        "MSOL": { "ts": 1695117600000, "solFees": "0", "usdFees": "0", "nativeFees": "0" },
        "SOL": { "ts": 1695117600000, "solFees": "0", "usdFees": "0", "nativeFees": "0" },
        "JITOSOL": { "ts": 1695117600000, "solFees": "0", "usdFees": "0", "nativeFees": "0" },
        "kUXDUSDCOrca": { "ts": 1695117600000, "solFees": "0", "usdFees": "0", "nativeFees": "0" }
      },
      {
        "USDH": {
          "ts": 1695200400000,
          "solFees": "0.009127930668530089532008568492476558595633",
          "usdFees": "0.1835061678794232293068324983297403016265",
          "nativeFees": "0.1840858688969978660085239011713265619735"
        },
        "STSOL": { "ts": 1695200400000, "solFees": "0", "usdFees": "0", "nativeFees": "0" },
        "UXD": { "ts": 1695200400000, "solFees": "0", "usdFees": "0", "nativeFees": "0" },
        "USDC": {
          "ts": 1695200400000,
          "solFees": "0.05354646057380662740920466718071105954604",
          "usdFees": "1.076487775841993410013844914006083239768",
          "nativeFees": "1.07645428734911397907795579880118253498"
        },
        "MSOL": {
          "ts": 1695200400000,
          "solFees": "0.0000000002729669118503462954743437138234390588713",
          "usdFees": "0.00000000548767445443401462031404881729929319511",
          "nativeFees": "0.0000000002409057587721427566924936757882938254622"
        },
        "SOL": {
          "ts": 1695200400000,
          "solFees": "0.00004161517214718125325688557874458751446175",
          "usdFees": "0.0008366234411376726934711156672714631160833",
          "nativeFees": "0.00004161517214718125325688557874458751446176"
        },
        "JITOSOL": {
          "ts": 1695200400000,
          "solFees": "0.00001637958277767565995674794591594066633801",
          "usdFees": "0.0003292919913773938484626639982754417744366",
          "nativeFees": "0.00001545746301911876686717846158351857411716"
        },
        "kUXDUSDCOrca": { "ts": 1695200400000, "solFees": "0", "usdFees": "0", "nativeFees": "0" }
      }
    ]
  }
}

Get interest fees earned per user

GET https://api.hubbleprotocol.io/kamino-market/:marketPubkey/users/:userPubkey/interest-fees/

Query params:

  • env: solana cluster, e.g. "mainnet-beta" (default) | "devnet"
  • start: start date (inclusive), e.g. 2023-05-01T00:55:00.000Z
  • end: end date (exclusive), e.g. 2023-05-01T00:55:00.000Z
  • frequency: frequency of the snapshots, e.g. "hour" (default) | "day"
  • positionMode: position mode, e.g. "user_all_time" | "user_all_current_positions (default)"

Example response:

{
  "totalFeesEarnedObligation": {
    "MX68wMfQRkQA13SrKnSX47wwjiV2TDBak7NMb4Qfg5g": {
      "ts": 1695200400000,
      "solFees": "0.000000001697888184902321902172852546261584381586",
      "usdFees": "0.0000000341340184992168245010582859455671467486",
      "nativeFees": "0.000000001602302340966625236782497000842808190647"
    },
    "598TqTp5HfFQcNwWhgXyxE5zFYgFUYnRJSAADdfVXm2N": {
      "ts": 1695200400000,
      "solFees": "0.00001252855751062609254654040779155507638912",
      "usdFees": "0.0002501232156778048715929059083302644728593",
      "nativeFees": "0.00001252855751062609254654040779155507638912"
    }
  },
  "feesObligation": {
    "MX68wMfQRkQA13SrKnSX47wwjiV2TDBak7NMb4Qfg5g": [
      { "JITOSOL": { "ts": 1695117600000, "solFees": "0", "usdFees": "0", "nativeFees": "0" } },
      { "JITOSOL": { "ts": 1695121200000, "solFees": "0", "usdFees": "0", "nativeFees": "0" } },
      { "JITOSOL": { "ts": 1695124800000, "solFees": "0", "usdFees": "0", "nativeFees": "0" } },
      { "JITOSOL": { "ts": 1695128400000, "solFees": "0", "usdFees": "0", "nativeFees": "0" } },
      { "JITOSOL": { "ts": 1695132000000, "solFees": "0", "usdFees": "0", "nativeFees": "0" } },
      { "JITOSOL": { "ts": 1695135600000, "solFees": "0", "usdFees": "0", "nativeFees": "0" } },
      { "JITOSOL": { "ts": 1695139200000, "solFees": "0", "usdFees": "0", "nativeFees": "0" } },
      { "JITOSOL": { "ts": 1695142800000, "solFees": "0", "usdFees": "0", "nativeFees": "0" } },
      { "JITOSOL": { "ts": 1695146400000, "solFees": "0", "usdFees": "0", "nativeFees": "0" } },
      { "JITOSOL": { "ts": 1695150000000, "solFees": "0", "usdFees": "0", "nativeFees": "0" } },
      { "JITOSOL": { "ts": 1695153600000, "solFees": "0", "usdFees": "0", "nativeFees": "0" } },
      { "JITOSOL": { "ts": 1695157200000, "solFees": "0", "usdFees": "0", "nativeFees": "0" } },
      { "JITOSOL": { "ts": 1695160800000, "solFees": "0", "usdFees": "0", "nativeFees": "0" } },
      { "JITOSOL": { "ts": 1695164400000, "solFees": "0", "usdFees": "0", "nativeFees": "0" } },
      { "JITOSOL": { "ts": 1695168000000, "solFees": "0", "usdFees": "0", "nativeFees": "0" } },
      { "JITOSOL": { "ts": 1695171600000, "solFees": "0", "usdFees": "0", "nativeFees": "0" } },
      { "JITOSOL": { "ts": 1695175200000, "solFees": "0", "usdFees": "0", "nativeFees": "0" } },
      { "JITOSOL": { "ts": 1695178800000, "solFees": "0", "usdFees": "0", "nativeFees": "0" } },
      { "JITOSOL": { "ts": 1695182400000, "solFees": "0", "usdFees": "0", "nativeFees": "0" } },
      { "JITOSOL": { "ts": 1695186000000, "solFees": "0", "usdFees": "0", "nativeFees": "0" } },
      { "JITOSOL": { "ts": 1695189600000, "solFees": "0", "usdFees": "0", "nativeFees": "0" } },
      { "JITOSOL": { "ts": 1695193200000, "solFees": "0", "usdFees": "0", "nativeFees": "0" } },
      { "JITOSOL": { "ts": 1695196800000, "solFees": "0", "usdFees": "0", "nativeFees": "0" } },
      {
        "JITOSOL": {
          "ts": 1695200400000,
          "solFees": "0.000000001697888184902321902172852546261584381586",
          "usdFees": "0.0000000341340184992168245010582859455671467486",
          "nativeFees": "0.000000001602302340966625236782497000842808190647"
        }
      }
    ],
    "598TqTp5HfFQcNwWhgXyxE5zFYgFUYnRJSAADdfVXm2N": [
      { "SOL": { "ts": 1695117600000, "solFees": "0", "usdFees": "0", "nativeFees": "0" } },
      { "SOL": { "ts": 1695121200000, "solFees": "0", "usdFees": "0", "nativeFees": "0" } },
      { "SOL": { "ts": 1695124800000, "solFees": "0", "usdFees": "0", "nativeFees": "0" } },
      {
        "SOL": {
          "ts": 1695128400000,
          "solFees": "0.000001799717797858716590338358835351733653603",
          "usdFees": "0.00003596415275114428523179196620477162156107",
          "nativeFees": "0.000001799717797858716590338358835351733653604"
        }
      },
      { "SOL": { "ts": 1695132000000, "solFees": "0", "usdFees": "0", "nativeFees": "0" } },
      { "SOL": { "ts": 1695135600000, "solFees": "0", "usdFees": "0", "nativeFees": "0" } },
      { "SOL": { "ts": 1695139200000, "solFees": "0", "usdFees": "0", "nativeFees": "0" } },
      { "SOL": { "ts": 1695142800000, "solFees": "0", "usdFees": "0", "nativeFees": "0" } },
      { "SOL": { "ts": 1695146400000, "solFees": "0", "usdFees": "0", "nativeFees": "0" } },
      { "SOL": { "ts": 1695150000000, "solFees": "0", "usdFees": "0", "nativeFees": "0" } },
      { "SOL": { "ts": 1695153600000, "solFees": "0", "usdFees": "0", "nativeFees": "0" } },
      { "SOL": { "ts": 1695157200000, "solFees": "0", "usdFees": "0", "nativeFees": "0" } },
      { "SOL": { "ts": 1695160800000, "solFees": "0", "usdFees": "0", "nativeFees": "0" } },
      { "SOL": { "ts": 1695164400000, "solFees": "0", "usdFees": "0", "nativeFees": "0" } },
      {
        "SOL": {
          "ts": 1695168000000,
          "solFees": "0.000006064101667947088381984925284168149623453",
          "usdFees": "0.0001209912293028143483368695347715114560122",
          "nativeFees": "0.000006064101667947088381984925284168149623456"
        }
      },
      { "SOL": { "ts": 1695171600000, "solFees": "0", "usdFees": "0", "nativeFees": "0" } },
      { "SOL": { "ts": 1695175200000, "solFees": "0", "usdFees": "0", "nativeFees": "0" } },
      { "SOL": { "ts": 1695178800000, "solFees": "0", "usdFees": "0", "nativeFees": "0" } },
      { "SOL": { "ts": 1695182400000, "solFees": "0", "usdFees": "0", "nativeFees": "0" } },
      { "SOL": { "ts": 1695186000000, "solFees": "0", "usdFees": "0", "nativeFees": "0" } },
      {
        "SOL": {
          "ts": 1695189600000,
          "solFees": "0.000003084857420134046011686340063997035617416",
          "usdFees": "0.00006146691096373786754851793467830291215417",
          "nativeFees": "0.000003084857420134046011686340063997035617417"
        }
      },
      {
        "SOL": {
          "ts": 1695193200000,
          "solFees": "0.0000004106794248750007481729916324997687533188",
          "usdFees": "0.000008195525933433248949303575906066025362104",
          "nativeFees": "0.0000004106794248750007481729916324997687533189"
        }
      },
      { "SOL": { "ts": 1695196800000, "solFees": "0", "usdFees": "0", "nativeFees": "0" } },
      {
        "SOL": {
          "ts": 1695200400000,
          "solFees": "0.000001169201199811240814357791975538388741346",
          "usdFees": "0.00002350539672667512152642289676961245776999",
          "nativeFees": "0.000001169201199811240814357791975538388741347"
        }
      }
    ]
  }
}

Get metrics for market reserves

GET https://api.hubbleprotocol.io/kamino-market/:marketPubkey/reserves/metrics

Query params:

  • env: solana cluster, e.g. "mainnet-beta" (default) | "devnet"

Example response:

[
    {
        "reserve": "d4A2prbA2whesmvHaL88BH6Ewn5N4bTSU2Ze8P6Bc4Q",
        "liquidityToken": "SOL",
        "liquidityTokenMint": "So11111111111111111111111111111111111111112",
        "maxLtv": "0.65",
        "borrowApy": "0.05450988511483601",
        "supplyApy": "0.038266801210808055",
        "totalSupply": "3270.370813041054416388850832278062044876",
        "totalBorrow": "2314.442149604473429941074038490263985018",
        "totalBorrowUsd": "132328.2299036357776146495065685745631077",
        "totalSupplyUsd": "186983.4512356222993385157984997158629711"
    },
    {
        "reserve": "G31zKdH2SkDZPhmoQraep5xbTSPyk3VZxAeBdC3nmq5J",
        "liquidityToken": "STEP",
        "liquidityTokenMint": "StepAscQoEioFxxWGnh2sLBDFp9d8rvKz2Yp39iDpyT",
        "maxLtv": "0",
        "borrowApy": "0.00009999925246972907",
        "supplyApy": "0",
        "totalSupply": "14.957139738",
        "totalBorrow": "0",
        "totalBorrowUsd": "0",
        "totalSupplyUsd": "0.5941041438503336806162179231"
    }
]

Get metrics for leverage/multiply vaults

GET https://api.hubbleprotocol.io/kamino-market/:marketPubkey/leverage/metrics?env={cluster}

Query params:

  • env: solana cluster, e.g. "mainnet-beta" (default) | "devnet"

Example request:

Example response:

[
  {
    "avgLeverage": "2.757170327410913560319220040749227783417",
    "totalBorrowed": "154395.1202118977930406687953589698645807",
    "totalDeposited": "193096.379305039",
    "totalBorrowedUsd": "16739712.70542562946167548855378444003952",
    "totalObligations": "1836",
    "totalDepositedUsd": "23093580.44995144380237321675219340108242",
    "tvl": "23093580.44995144380237321675219340108242",
    "updatedOn": "2023-12-29T10:29:30.896Z",
    "depositReserve": "H9vmCVd77N1HZa36eBn3UnftYmg4vQzPfm1RxabHAMER",
    "borrowReserve": "d4A2prbA2whesmvHaL88BH6Ewn5N4bTSU2Ze8P6Bc4Q",
    "tag": "Multiply"
  },
  {
    "avgLeverage": "2.604314516472810767833910368870052572746",
    "totalBorrowed": "26112.30734890929199125495560713880090385",
    "totalDeposited": "34303.490774368",
    "totalBorrowedUsd": "2831129.134758960612809682991545473977498",
    "totalObligations": "1168",
    "tvl": "23093580.44995144380237321675219340108242",
    "totalDepositedUsd": "4315255.85162694588194992120445036586528",
    "updatedOn": "2023-12-29T10:29:30.896Z",
    "depositReserve": "FBSyPnxtHKLBZ4UeeUyAnbtFuAmTHLtso9YtsqRDRWpM",
    "borrowReserve": "d4A2prbA2whesmvHaL88BH6Ewn5N4bTSU2Ze8P6Bc4Q",
    "tag": "Leverage"
  }
]

Trades

Get trade history

POST https://api.hubbleprotocol.io/trades?env=mainnet-beta&source=hellomoon

Example POST request:

# obtain the first page of 10 trades
curl --location 'https://api.hubbleprotocol.io/trades?env=mainnet-beta&source=hellomoon' --header 'Content-Type: application/json' --data '{
    "tokenAMint": "So11111111111111111111111111111111111111112",
    "tokenBMint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
    "start": "2023-01-01T00:00Z",
    "end": "2023-02-01T00:00Z"
}'
# use "paginationToken" property in response in the next request to get next 10 trades:
curl --location 'https://api.hubbleprotocol.io/trades?env=mainnet-beta&source=hellomoon' --header 'Content-Type: application/json' --data '{
    "tokenAMint": "So11111111111111111111111111111111111111112",
    "tokenBMint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
    "start": "2023-01-01T00:00Z",
    "end": "2023-02-01T00:00Z",
    "paginationToken": "MzQ3OTQzMQ=="
}' 

Query params:

  • env: solana cluster, e.g. "mainnet-beta" (default) | "devnet"
  • source: trades fetched from source"hellomoon" (default)

Body params:

  • tokenAMint: public key of the first mint, e.g. SOL mint: "So11111111111111111111111111111111111111112"
  • tokenBMint: public key of the second mint, e.g. USDC mint: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"
  • start: start of the date range to fetch trades from, e.g. date ISO string: "2023-01-01T00:00Z" or epoch in ms: 1678381747854
  • end: end of the date range to fetch trades to, e.g. date ISO string: "2023-01-01T00:00Z" or epoch in ms: 1678381747854
  • paginationToken: pagination token to use for retrieving results. If the response contains a paginationToken JSON property, you can use that in the next request to fetch more data from the last trade onwards. If the property does not exist, you've reached the end.

Please note that the response will contain both "directions" (buys, sells) of the trade. For example, if you input tokenA/tokenB mints for SOL/USDC in the request body, the response will contain trades with (source = SOL, destination = USDC) or (source = USDC, destination = SOL).

Example response:

{
    "trades": [
        {
            "transactionId": "67enaV7ufBGu5quuzZFwn4B2kqpNiqRunAwXbytt6TCkVkEJzUmNRyCYnDPvPi8yP8aDpHL16oVecqrqa3rvvbv9",
            "sourceAmount": "30.202777503",
            "destinationAmount": "704.59445",
            "tradedOn": "2023-01-16T12:54:49.000Z",
            "aggregator": "Jupiter v3",
            "programId": "whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc",
            "sourceMint": "So11111111111111111111111111111111111111112",
            "destinationMint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"
        },
        {
            "transactionId": "4rZRGF8P667EjprBZomP7MiwHhUDwa6Dnuw2i5MvLn8jbVfVdzBg9DcvoHpkuykrRJpf4LTbPMaFiTR13QCgMxPb",
            "sourceAmount": "30.202526264",
            "destinationAmount": "704.766755",
            "tradedOn": "2023-01-16T12:54:49.000Z",
            "aggregator": "Jupiter v3",
            "programId": "whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc",
            "sourceMint": "So11111111111111111111111111111111111111112",
            "destinationMint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"          
        },
        {
            "transactionId": "3PXDTVaYKoDcMdyyyxGu4pMLbv2ApAx9biapEJv1rjPZdePTdGgqK6LstV8MBiAWtA3zaYJDJ86fT8hveNUN2VEN",
            "sourceAmount": "0.04293291",
            "destinationAmount": "1.001095",
            "tradedOn": "2023-01-16T12:54:42.000Z",
            "aggregator": "Jupiter v3",
            "programId": "whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc",
            "sourceMint": "So11111111111111111111111111111111111111112",
            "destinationMint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"
        }
    ],
    "source": "hellomoon",
    "start": "2023-01-01T00:00:00.000Z",
    "end": "2023-02-01T00:00:00.000Z",
    "paginationToken": "MTQ2MTAzMA=="
}

Simulator

Get simulator pool history processed data

// GET https://api.hubbleprotocol.io/simulator/pools/:poolPubkey/history?env={cluster}&start={start}&end={end}
GET https://api.hubbleprotocol.io/simulator/pools/7qbRF6YsyGuLUVs6Y1q64bdVrfe4ZcUUz1JRdoVNUJnm/history?env=mainnet-beta&start=2023-05-01T00%3A55%3A00.000Z&end=2023-05-03T00%3A00%3A00.000Z'

Query params:

  • env: solana cluster, e.g. "mainnet-beta" (default) | "devnet"
  • start: start date (inclusive), e.g. 2023-05-01T00:55:00.000Z
  • end: end date (exclusive), e.g. 2023-05-01T00:55:00.000Z

Example request:

https://api.hubbleprotocol.io/simulator/pools/7qbRF6YsyGuLUVs6Y1q64bdVrfe4ZcUUz1JRdoVNUJnm/history?env=mainnet-beta&start=2023-05-01T00%3A55%3A00.000Z&end=2023-05-03T00%3A00%3A00.000Z'

Sample response:

[
  {
    "date": "2023-05-01T00:00:00.000Z",
    "liquidity": "128579835037512.1296149423008288059642304",
    "tokenAPrice": "22.8225",
    "tokenBPrice": "0.999899925",
    "priceAToB": "22.80281142119161469576395863338884312471",
    "priceBToA": "0.04381507266239798735733225736404509709275",
    "sourceAmountAToB": "2254.958720845",
    "sourceAmountBToA": "127153.433494",
    "destinationAmountAToB": "51419.398474",
    "destinationAmountBToA": "5571.236927813"
  },
  {
    "date": "2023-05-01T01:00:00.000Z",
    "liquidity": "118590788019032.7258026104877490267918479",
    "tokenAPrice": "22.18812871",
    "tokenBPrice": "0.999922935",
    "priceAToB": "22.35004452461559675442332082035821547892",
    "priceBToA": "0.04489632573185525843575517883550659203986",
    "sourceAmountAToB": "25052.494904219",
    "sourceAmountBToA": "288330.780462",
    "destinationAmountAToB": "559924.376562",
    "destinationAmountBToA": "12944.992638142"
  }
]

Leaderboard

Get strategy leaderboard

GET https://api.hubbleprotocol.io/strategies/leaderboard?env={cluster}&period={24h/7d/30d/90d/180d/1y}

Example requests:

Query params:

  • env: solana cluster, e.g. "mainnet-beta" (default) | "devnet"
  • period: leaderboard time period "24h" | "7d" (default) | "30d" | "90d" | "180d" | "1y"

Example response:

{
  "period": "24h",
  "strategies": [
    {
      "strategy": "AepjvYK4QfGhV3UjSRkZviR2AJAkLGtqdyKJFCf9kpz9",
      "apy": "0.615191615489133766348795004255205034784",
      "pnl": "0.001035403769",
      "volume": "15763.8054565617",
      "fees": "35.6656098455"
    },
    {
      "strategy": "5QgwaBQzzMAHdxpaVUgb4KrpXELgNTaEYXycUvNvRxr6",
      "apy": "0.03826440591163673741072800936266385589",
      "pnl": "0.000726162458",
      "volume": "90454.9846990331",
      "fees": "8.1861761153"
    }
  ]
}

Leaderboard response is always ordered by profit and loss (PnL) descending.

APY and PNL properties are in decimal form, to convert to percentage multiply it by 100. Volume and fees are both in USD.

Get user leaderboard

GET https://api.hubbleprotocol.io/users/leaderboard?env={cluster}&period={24h/7d/30d/90d/180d/1y/all-time}

Example requests:

Query params:

  • env: solana cluster, e.g. "mainnet-beta" (default) | "devnet"
  • period: leaderboard time period "24h" | "7d" (default) | "30d" | "90d" | "180d" | "1y" | "all-time"

Example response:

{
  "period": "24h",
  "users": [
    {
      "user": "7QnXf4d1YQ6k8oTzCLXjEiikGFm3KRZgmFJmry9vZxdW",
      "totalReturns": {
        "sol": "200",
        "usd": "2000"
      },
      "pnl": {
        "sol": "0.6896551724137931034482758620689655172416",
        "usd": "0.606060606060606060606060606060606060606"
      },
      "totalPositionsValue": {
        "sol": "350",
        "usd": "3500"
      }
    },
    {
      "user": "5HDpYuGtrmdRe49r48BoasoZ66Fsz74xShc4DQYDhNii",
      "totalReturns": {
        "sol": "200",
        "usd": "2000"
      },
      "pnl": {
        "sol": "0.6896551724137931034482758620689655172416",
        "usd": "0.606060606060606060606060606060606060606"
      },
      "totalPositionsValue": {
        "sol": "350",
        "usd": "3500"
      }
    }
  ]
}

Leaderboard response is always ordered by USD profit and loss (PnL) descending.

PNL is in decimal form, to convert to percentage multiply it by 100. Total positions value and total returns are both in USD.

Raydium

⚠️ DEPRECATED, PLEASE USE /v2/raydium INSTEAD! ⚠️

These endpoints use Raydium's API directly and cache their responses to avoid rate-limits.

Get AMM Pools

GET https://api.hubbleprotocol.io/raydium/ammPools

Example request: https://api.hubbleprotocol.io/raydium/ammPools

Get pool liquidity distribution

GET https://api.hubbleprotocol.io/raydium/positionLine/:poolPubkey

Example request: https://api.hubbleprotocol.io/raydium/positionLine/2QdhepnKRTLjjSqPL1PtKNwqrUkoLee5Gqs8bvZhRdMv

Raydium V2

This is a backwards compatible v2 endpoint that uses the new Raydium API.

These endpoints use Raydium's API directly and cache their responses to avoid rate-limits.

Get AMM Pools

GET https://api.kamino.finance/v2/raydium/ammPools

Example request: https://api.kamino.finance/v2/raydium/ammPools

Get pool liquidity distribution

GET https://api.kamino.finance/v2/raydium/positionLine/:poolPubkey

Example request: https://api.kamino.finance/v2/raydium/positionLine/2QdhepnKRTLjjSqPL1PtKNwqrUkoLee5Gqs8bvZhRdMv

Points

Get points leaderboard

GET https://api.hubbleprotocol.io/points/leaderboard?offset={offset}&limit=${limit}&source={source}

Example requests:

To implement pagination fetch the first page (offset = 0, limit = 20 for example) and then look at the property totalLeaderboardCount to calculate the amount of pages you will display.

Example response:

{
  "totalLeaderboardCount": "90129",
  "leaderboard": [
    {
      "leaderboardRank": "1",
      "ownerPubkey": "7tH1k4PsMu3sNUYJxD5ezxhAmYYXyVVZz5c3dbaxcvUV",
      "lastCalculatedStrategies": "2024-01-10T16:00:00.000Z",
      "lastCalculatedBorrowLend": "2024-01-10T15:00:00.000Z",
      "lastCalculatedMultiply": null,
      "lastCalculatedLeverage": null,
      "pointsEarnedStrategies": "122367620435.3735191599063727893014010360341",
      "pointsEarnedBorrowLend": "1267843473.82435611251081561593395418572529",
      "pointsEarnedMultiply": "0",
      "pointsEarnedLeverage": "0",
      "totalPointsEarned": "123635463909.19787527241718840523535522175939",
      "currentPointsPerSecondStrategies": "560.478391755217855861526657236069466256",
      "currentPointsPerSecondBorrowLend": "89.41877886905689864601546998888888888885",
      "currentPointsPerSecondMultiply": "0",
      "currentPointsPerSecondLeverage": "0",
      "totalCurrentPointsPerSecond": "649.89717062427475450754212722495835514485"
    },
    {
      "leaderboardRank": "2",
      "ownerPubkey": "HZYHFagpyCqXuQjrSCN2jWrMHTVHPf9VWP79UGyvo95L",
      "lastCalculatedStrategies": "2024-01-10T16:00:00.000Z",
      "lastCalculatedBorrowLend": null,
      "lastCalculatedMultiply": null,
      "lastCalculatedLeverage": null,
      "pointsEarnedStrategies": "54903470324.3054572407658617493510029034321",
      "pointsEarnedBorrowLend": "0",
      "pointsEarnedMultiply": "0",
      "pointsEarnedLeverage": "0",
      "totalPointsEarned": "54903470324.3054572407658617493510029034321",
      "currentPointsPerSecondStrategies": "6.48961815479786922528593823056190322725",
      "currentPointsPerSecondBorrowLend": "0",
      "currentPointsPerSecondMultiply": "0",
      "currentPointsPerSecondLeverage": "0",
      "totalCurrentPointsPerSecond": "6.48961815479786922528593823056190322725"
    }
  ]
}

Get points user breakdown

GET https://api.hubbleprotocol.io/points/users/:userPubkey/breakdown?env={solana cluster}&source={source}

Example requests:

Example response:

{
  "leaderboardRank": "1271",
  "updatedOnStrategies": "2024-01-10T16:00:00.000Z",
  "updatedOnBorrowLend": "2024-01-10T15:00:00.000Z",
  "updatedOnMultiply": null,
  "updatedOnLeverage": null,
  "pointsEarnedStrategies": "22761790.71117315449263523732644006896670425",
  "pointsEarnedBorrowLend": "10442477.186904250407027339999999999999982264",
  "pointsEarnedMultiply": "201389.4329133435694562408780984881999283067",
  "pointsEarnedLeverage": "0",
  "totalPointsEarned": "33405657.3309907484691188182045385571666148207",
  "currentPointsPerSecondStrategies": "2.966637247762797453716544976431414311005",
  "currentPointsPerSecondBorrowLend": "1.219000935252249471499999999999999999999",
  "currentPointsPerSecondMultiply": "0.1646297171217158133378010918910399701269",
  "currentPointsPerSecondLeverage": "0",
  "totalCurrentPointsPerSecond": "4.3502679001367627385543460683224542811309",
  "avgBoost": "1",
  "strategiesBreakdown": [
    {
      "strategy": "5EfeGn1h7m6Rx9mGEmamDoxMtdhRmUh2N9fYRiDQqteS",
      "lastCalculated": "2023-08-10T12:00:00.000Z",
      "pointsEarned": "3038.752099688225508715680139338092961558",
      "currentPointsPerSecond": "0",
      "boost": "0"
    },
    {
      "strategy": "5QgwaBQzzMAHdxpaVUgb4KrpXELgNTaEYXycUvNvRxr6",
      "lastCalculated": "2024-01-10T16:00:00.000Z",
      "pointsEarned": "2184181.274912947035496797367836501158876",
      "currentPointsPerSecond": "1.673149451222033829527709343420742693505",
      "boost": "1"
    },
    {
      "strategy": "8DRToyNBUTR4MxqkKAP49s9z1JhotQWy3rMQKEw1HHdu",
      "lastCalculated": "2024-01-10T16:00:00.000Z",
      "pointsEarned": "723051.1325021971074900781555286204179783",
      "currentPointsPerSecond": "0.2045374909997805147118103015547306358167",
      "boost": "1"
    }
  ],
  "klendBreakdown": [
    {
      "lastCalculated": "2024-01-10T15:00:00.000Z",
      "pointsEarned": "4196615.002722601454031089999999999999992",
      "currentPointsPerSecond": "1.219000935252249471499999999999999999999",
      "boost": "1",
      "obligationTag": "Vanilla",
      "obligation": "J3UBd95TrkWVb9d6moomMwEoAsHYcrRPprZX2vf3YG75",
      "market": "7u3HeHxYDLhnCoErrtycNokbQYbWGzLs6JSDqGAv5PfF"
    },
    {
      "lastCalculated": "2024-01-10T15:00:00.000Z",
      "pointsEarned": "200704.9350075835765854408408010038433802",
      "currentPointsPerSecond": "0.1646297171217158133378010918910399701269",
      "boost": "1",
      "obligationTag": "Multiply",
      "obligation": "BnNMMQdhytPsQYambAeX8LZCDfcA3Q72Uo7tV5TWvYcR",
      "market": "7u3HeHxYDLhnCoErrtycNokbQYbWGzLs6JSDqGAv5PfF"
    }
  ],
  "boosts": [
    {
      "boost": "0.07",
      "name": "loyalty_bonus"
    }
  ]
}

Get rules for points

GET https://api.hubbleprotocol.io/points/rules?env={solana cluster}

Example request:

Example response:

{
    "strategies": {
        "defaultRate": 2,
        "defaultBoost": 2,
        "strategyRates": {
            "Cfuy5T6osdazUeLego5LFycBQebm9PP3H7VNdCndXXEN": 2
        },
        "strategyBoosts": {
            "Cfuy5T6osdazUeLego5LFycBQebm9PP3H7VNdCndXXEN": 2
        },
        "tokenRates": {
            "So11111111111111111111111111111111111111112": 2
        },
        "tokenBoosts": {
            "So11111111111111111111111111111111111111112": 2
        }
    },
    "lending": [
        {
            "market": "7u3HeHxYDLhnCoErrtycNokbQYbWGzLs6JSDqGAv5PfF",
            "defaultRates": {
                "borrowRate": 2,
                "depositRate": 2
            },
            "defaultBoosts": {
                "borrowBoost": 2,
                "depositBoost": 2
            },
            "tokenRates": {
                "So11111111111111111111111111111111111111112": {
                    "depositRate": 1,
                    "borrowRate": 3
                }
            },
            "tokenBoosts": {
                "So11111111111111111111111111111111111111112": {
                    "depositBoost": 1,
                    "borrowBoost": 3
                }
            }
        }
    ]
}

Get metrics for points

GET https://api.hubbleprotocol.io/points/metrics?source={source}

Example request:

Example response:

{
  "totalPointsEarned": "5984999924.493912541433019214995884898855713422508120471697",
  "totalCurrentPointsPerSecond": "3578.637988920129679710443661281444597259705465236233671",
  "currentPointsPerSecondLeverage": "52.040770416817290492365834856421461150509848186708961",
  "currentPointsPerSecondBorrowLend": "2891.05947353323817434578242345116583467662686554546471",
  "currentPointsPerSecondMultiply": "635.53774497007421487229540297385730143256875150406",
  "currentPointsPerSecondStrategies": "12354.58",
  "updatedOnLeverage": "2024-01-10T15:00:00.000Z",
  "updatedOnMultiply": "2024-01-10T15:00:00.000Z",
  "updatedOnStrategies": "2024-01-10T15:00:00.000Z",
  "updatedOnBorrowLend": "2024-01-10T15:00:00.000Z",
  "numberOfUsers": "91309"
}

Airdrop

Get user airdrop allocation

GET https://api.hubbleprotocol.io/airdrop/users/:pubkey/allocations?source={source}

Example requests:

Example response:

[
  {
    "quantity": "0.38493976366798",
    "name": "main_allocation"
  },
  {
    "quantity": "5.2414259465036",
    "name": "OG_allocation"
  }
]

Example empty response when user has 0 airdrop allocations to claim:

[]

Get airdrop metrics

GET https://api.hubbleprotocol.io/airdrop/metrics?source={source}

Example requests:

Example response:

{
  "totalAllocation": "800000000",
  "totalUsers": "251284",
  "claimDate": "2024-04-15T00:00:00.000Z"
}

Example response when no metrics are found (404 Not Found):

{
  "metadata": "Airdrop metrics for source not found"
}

Tokens

Get solflare token infos

Fetches all token infos from Solflare that are used by Kamino Liquidity/Lending/Farms.

GET https://api.hubbleprotocol.io/tokens

Example request:

Example response:

[
    {
      "address": "27G8MtK7VtTcCHkpASjSDdkWWYfoqT6ggEuKidVJidD4",
      "chainId": 101,
      "name": "Jupiter Perpetuals Liquidity Provider Token",
      "symbol": "JLP",
      "verified": true,
      "decimals": 6,
      "holders": null,
      "logoURI": "https://assets.coingecko.com/coins/images/33094/large/jlp.png?1700631386",
      "tags": [],
      "extensions": {
        "coingeckoId": "jupiter-perpetuals-liquidity-provider-token"
      }
    }
]

Example empty response when user has 0 airdrop allocations to claim:

[]

KVaults

Get all kvault user transactions

Get all instructions for the specified KVault shareholder.

// GET https://api.kamino.finance/kvaults/shareholders/:shareholderPubkey/transactions?env={cluster}

Example request:

Example response:

[
  {
    "createdOn": "2024-10-30T11:49:03.000Z",
    "instruction": "invest",
    "tokenMint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
    "tokenAmount": "1.531763",
    "usdValue": "1.53167261066537",
    "transaction": "3w1DghgGN8jJ2nhdYMXtjPPqBS3qf7ohcfazWwQH9qfeq53Gh7RNkJZwvezxqUg68PYnscqVz1xtMvZR4j2HboCZ"
  },
  {
    "createdOn": "2024-10-30T08:49:57.000Z",
    "instruction": "deposit",
    "tokenMint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
    "tokenAmount": "1",
    "usdValue": "0.99994099",
    "transaction": "57KvZHPjcRunvw3HHBgCPbDyxaZubyfFhAGr5idkQiEmtQuNu9nJyoyJ7KBdHkZTVxXUPVSuD3vWQqgaMgoepCLC"
  },
  {
    "createdOn": "2024-10-30T08:04:58.000Z",
    "instruction": "withdraw",
    "tokenMint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
    "tokenAmount": "6.09",
    "usdValue": "6.0896406291",
    "transaction": "3YhSNJPqpmXYUw76fr7ZkWSkgXcTkgKLNTxKhb4dMhXmZi69NTP8BTdZ96Z6fvMqK5GdFMbR1nUDbjLg6edNAEYw"
  }
]

Get kvault metrics

GET https://api.kamino.finance/kvaults/:vaultPubkey/metrics

Example request:

Example response:

{
  "apy7d": "0.12",
  "apy24h": "0.1",
  "apy30d": "0.11",
  "apy90d": "0.15",
  "apy180d": "0.12525",
  "apy365d": "0.12458939831489045",
  "tokenPrice": "0.99951785",
  "solPrice": "176.16243353",
  "tokensAvailable": "5",
  "tokensAvailableUsd": "4.99758925",
  "tokensInvested": "0",
  "tokensInvestedUsd": "0",
  "sharePrice": "0.99951785",
  "tokensPerShare": "1",
  "apy": "0.060121900226019375",
  "numberOfHolders": 1,
  "sharesIssued": "5",
  "cumulativeInterestEarned": "8",
  "cumulativeInterestEarnedUsd": "6",
  "cumulativeInterestEarnedSol": "4",
  "interestEarnedPerSecond": "10",
  "interestEarnedPerSecondUsd": "2",
  "interestEarnedPerSecondSol": "11",
  "cumulativePerformanceFees": "1",
  "cumulativePerformanceFeesUsd": "7",
  "cumulativePerformanceFeesSol": "5",
  "cumulativeManagementFees": "12",
  "cumulativeManagementFeesUsd": "9",
  "cumulativeManagementFeesSol": "3"
}

Get kvault metrics history

GET https://api.kamino.finance/kvaults/:vaultPubkey/metrics/history?start={date}&end=${date}

Example request:

Example response:

[
  {
    "timestamp": "2024-10-20T11:30:00.000Z",
    "tvl": "4.99758925",
    "apy": "0.060121900226019375"
  },
  {
    "timestamp": "2024-10-20T11:35:00.000Z",
    "tvl": "5.23758925",
    "apy": "0.070121900226019375"
  }
]

Limo

Get all limo user transactions

Get all instructions for the specified Limo user (maker).

// GET https://api.kamino.finance/limo/makers/:makerPubkey/transactions?env={cluster}&in={inTokenMint}&out={outTokenMint}

Query params:

  • env: solana cluster, e.g. "mainnet-beta" (default) | "devnet"
  • in: input token mint of the order, e.g. So11111111111111111111111111111111111111112
  • out: output token mint of the order, e.g. EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v

Example requests:

Example response:

[
  {
    "transactionSignature": "3DA1t96dsHaTjvDm9w6Z1dnBL5G21uq21wYK1mYxbDaBfxQnau2yCEkinn5LoaJPW3Ud12iPBQdfj7cuNtXzJ7qQ",
    "ixName": "closeOrderAndClaimTip",
    "order": "Bh5fXLmfh9WNZPfL3sp1RCa7itrV1BXQGoJcqRfkz3Hh",
    "orderStatus": "Cancelled",
    "orderType": "ExactIn",
    "updatedOn": "2024-11-19T19:12:22.000Z",
    "inMint": "So11111111111111111111111111111111111111112",
    "outMint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
    "initialInAmount": "0.01",
    "remainingInAmount": "0.01",
    "expectedOutAmount": "2.41",
    "filledOutAmount": "0",
    "numberOfFills": "0",
    "totalFilled": "0",
    "orderPriceInOut": "0.00414937759336099585",
    "orderPriceOutIn": "241",
    "executionPriceInOut": "0",
    "executionPriceOutIn": "0",
    "surplus": "0",
    "tipAmount": "0",
    "networkFee": "0.001138901",
    "solPrice": "240.123"
  },
  {
    "transactionSignature": "5Szg5BFsF8XCRCCN6NobRzSxBqoKEJXzkFs9L9473GRN21fm9d5zsdHpT4saPDgjuj4gxRW7CrJC3aFgvPDYdEAN",
    "ixName": "createOrder",
    "order": "Bh5fXLmfh9WNZPfL3sp1RCa7itrV1BXQGoJcqRfkz3Hh",
    "orderStatus": "Active",
    "orderType": "ExactIn",
    "updatedOn": "2024-11-19T19:12:22.000Z",
    "inMint": "So11111111111111111111111111111111111111112",
    "outMint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
    "initialInAmount": "0.01",
    "remainingInAmount": "0.01",
    "expectedOutAmount": "2.41",
    "filledOutAmount": "0",
    "numberOfFills": "0",
    "totalFilled": "0",
    "orderPriceInOut": "0.00414937759336099585",
    "orderPriceOutIn": "241",
    "executionPriceInOut": "0",
    "executionPriceOutIn": "0",
    "surplus": "0",
    "tipAmount": "0",
    "networkFee": "0.001125865",
    "solPrice": "240.123"
  }
]

Get limo maker metrics

// GET https://api.kamino.finance/limo/makers/:makerPubkey/metrics

Example request:

Example response:

{
  "totalVolumeUsd": "500.123",
  "totalOrders": 3,
  "totalTipsSol": "0.000043296",
  "totalTipsUsd": "1.24585",
  "totalSurplusUsd": "38.385940",
  "favoritePair": {
    "inTokenPubkey": "So11111111111111111111111111111111111111112",
    "outTokenPubkey": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
    "tradeCount": 6
  }
}

Get limo maker pair metrics

// GET https://api.kamino.finance/limo/makers/:makerPubkey/metrics/pair?in={inTokenMint}&out={outTokenMint}

Query params:

  • in: input token mint of the order, e.g. So11111111111111111111111111111111111111112
  • out: output token mint of the order, e.g. EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v

Example request:

Example response:

{
  "totalVolumeUsd": "100.123",
  "totalOrders": 2,
  "totalTipsSol": "0.000043296",
  "totalTipsUsd": "0.3248",
  "totalSurplusUsd": "0.1"
}

Get limo global metrics

Get metrics for all trades

// GET https://api.kamino.finance/limo/metrics

Example request:

Example response:

{
  "allTime": {
    "totalVolumeUsd": "32179.204554150009005121121",
    "totalSurplus": "0.01794400389018700094",
    "totalSurplusUsd": "4.3134619210239461983798395146",
    "totalTipAmount": "0.002224553",
    "totalTipAmountUsd": "0.5417640091257365",
    "totalTrades": "10"
  },
  "daily": {
    "totalVolumeUsd": "1.598927244",
    "totalSurplus": "0",
    "totalSurplusUsd": "0",
    "totalTipAmount": "0.000730568",
    "totalTipAmountUsd": "0.182642",
    "totalTrades": "1"
  }
}

Get limo pair metrics

Get metrics for a specific token pair

// GET https://api.kamino.finance/limo/metrics/pair?in={inTokenMint}&out={outTokenMint}

Query params:

  • in: input token mint of the order, e.g. So11111111111111111111111111111111111111112
  • out: output token mint of the order, e.g. EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v

Example request:

Example response:

{
  "allTime": {
    "totalVolumeUsd": "32179.204554150009005121121",
    "totalSurplus": "0.01794400389018700094",
    "totalSurplusUsd": "4.3134619210239461983798395146",
    "totalTipAmount": "0.002224553",
    "totalTipAmountUsd": "0.5417640091257365",
    "totalTrades": "10"
  },
  "daily": {
    "totalVolumeUsd": "1.598927244",
    "totalSurplus": "0",
    "totalSurplusUsd": "0",
    "totalTipAmount": "0.000730568",
    "totalTipAmountUsd": "0.182642",
    "totalTrades": "1"
  }
}

Get limo weekly leaderboard metrics

// GET https://api.kamino.finance/limo/leaderboard/weekly/metrics

Example request:

Example response:

{
  "weeklyVolumeUsd": "1.598927244",
  "weeklyTickets": "0.001598927244",
  "weeklyTipsUsd": "0.182642",
  "weeklySurplusUsd": "0"
}

Get limo weekly leaderboard

GET https://api.kamino.finance/limo/weekly/leaderboard?offset={offset}&limit=${limit}

Example requests:

To implement pagination fetch the first page (offset = 0, limit = 20 for example) and then look at the property totalLeaderboardCount to calculate the amount of pages you will display.

Example response:

{
  "totalLeaderboardCount": 9,
  "leaderboard": [
    {
      "rank": 1,
      "maker": "tsTSFNQsjqKArV5SvtEVePkZ6Crbkf65KhgmniyrFkV",
      "volumeUsd": "23.57484499976425155",
      "tickets": "0.02357484499976425155",
      "tipsUsd": "0",
      "surplusUsd": "0"
    },
    {
      "rank": 2,
      "maker": "4RHjaQ2c6mFVsjyu7nR4o69QTVn8hS6yn4WTspwR2R19",
      "volumeUsd": "1.59892724398401072756",
      "tickets": "0.00159892724398401073",
      "tipsUsd": "0.1754275283464144",
      "surplusUsd": "0"
    },
    {
      "rank": 3,
      "maker": "AoDMpV5zPYP9trk6d52ZU5nqpYRKHtHYmnoABxapDXQR",
      "volumeUsd": "0.09549704199904502958",
      "tickets": "0.00009549704199904502958",
      "tipsUsd": "0.0044768876250952",
      "surplusUsd": "0.000000003151099999968489"
    }
  ]
}

Get last 500 limo trades

Get last 500 limo trades (fills)

// GET https://api.kamino.finance/limo/trades?in={inTokenMint:optional}&out={outTokenMint:optional}

Query params:

  • in (optional): input token mint of the order, e.g. So11111111111111111111111111111111111111112
  • out (optional): output token mint of the order, e.g. EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v

If no query params are used, it will return trades for all pairs.

Example request:

Example response:

[
  {
    "updatedOn": "2024-11-26T09:30:33.000Z",
    "inMint": "So11111111111111111111111111111111111111112",
    "outMint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
    "sizeUsd": "23.94585489",
    "tipAmountUsd": "0.001",
    "surplusUsd": "0.01",
    "order": "FqWpdGoN1CS21FVQG4weL9ndon9cfzhWDZmrScfALN8x"
  },
  {
    "updatedOn": "2024-11-22T14:44:18.000Z",
    "inMint": "So11111111111111111111111111111111111111112",
    "outMint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
    "sizeUsd": "119.72927445",
    "tipAmountUsd": "0.0021632847358122",
    "surplusUsd": "0.48982",
    "order": "G1VtPA6y7EMWQSgRUv13L9LSTSgFtcZYij8cXNQddXue"
  }
]

Bulk get Limo transactions

This endpoint is not open to the public, it is private for analytical purposes only, add authorization headers to the request.

POST https://api.kamino.finance/limo/transactions
{
    "start": "2024-01-01T00:00Z",
    "end": "2024-01-02T00:00Z",
    "paginationToken": ""
}

Example cURL request:

curl --location 'https://api.kamino.finance/limo/transactions' --header 'Content-Type: application/json' --header 'Authorization: Basic ENTER_CREDENTIALS' --data '{
    "start": "2024-01-01",
    "end": "2024-01-02",
    "paginationToken": ""
}'

Example Python request:

import requests
import json

url = "https://api.kamino.finance/limo/transactions"

payload = json.dumps({
  "start": "2024-01-01",
  "end": "2024-01-02",
  "paginationToken": ""
})
headers = {
  'Content-Type': 'application/json',
  'Authorization': 'Basic ADD-CREDENTIALS-HERE'
}

response = requests.request("POST", url, headers=headers, data=payload)

print(response.text)

Example response:

{
  "result": [
    {
      "maker": "DAnimibJrqNQd8NEjEWKwcB8VZzTKT3DWvFvfHjufDF",
      "taker": null,
      "transactionSignature": "3DYGcEUzzzyYXX7sHEM5Ras7CDzdRdEnMdzEjayqZXJMH6a7KGqaV8jw6SN15PAkM2pPBhqGT7N5DRSDXhyqcfUL",
      "ixName": "createOrder",
      "initialInAmount": "0.001",
      "remainingInAmount": "0.001",
      "expectedOutAmount": "0.000004062",
      "cumulativeFilledOutAmount": "0",
      "lastFilledOutAmount": "0",
      "numberOfFills": "0",
      "volumeUsd": "0",
      "fillRatio": "0",
      "orderPriceInOut": "246.1841457410142787",
      "orderPriceOutIn": "0.004062",
      "executionPriceInOut": "0",
      "executionPriceOutIn": "0",
      "surplus": "0",
      "tipAmount": "0",
      "networkFee": "0.000288189",
      "solPrice": "0",
      "inTokenPrice": "0",
      "outTokenPrice": "0",
      "updatedOn": "2024-11-28T12:01:25.000Z",
      "orderStatus": "Active",
      "inMint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
      "outMint": "So11111111111111111111111111111111111111112",
      "orderPubkey": "BvaSkA7RN3XW3ApxxouZtZNCb6yKdBtSir3xncCsCMCV",
      "orderType": "ExactIn"
    },
    {
      "maker": "DAnimibJrqNQd8NEjEWKwcB8VZzTKT3DWvFvfHjufDF",
      "taker": "76qh9UEKv8We4Um5bznSPvn2jkNrckq2hKeNQt8JNNKQ",
      "transactionSignature": "5tPfMkqgZd6QA8sCnR9mmcnFMu9z1qCLwevUmkAszN61QxPMepSdBeEX39pZqKJvhAXtNi2A7SKgQrJiQSdv1WQt",
      "ixName": "takeOrder",
      "initialInAmount": "0.001",
      "remainingInAmount": "0",
      "expectedOutAmount": "0.000004062",
      "cumulativeFilledOutAmount": "0.000004062",
      "lastFilledOutAmount": "0.000004062",
      "numberOfFills": "1",
      "volumeUsd": "0",
      "fillRatio": "1",
      "orderPriceInOut": "246.1841457410142787",
      "orderPriceOutIn": "0.004062",
      "executionPriceInOut": "246.1841457410142787",
      "executionPriceOutIn": "0.004062",
      "surplus": "0",
      "tipAmount": "0.000000047",
      "networkFee": "0.00025",
      "solPrice": "0",
      "inTokenPrice": "0",
      "outTokenPrice": "0",
      "updatedOn": "2024-11-28T13:03:36.000Z",
      "orderStatus": "Filled",
      "inMint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
      "outMint": "So11111111111111111111111111111111111111112",
      "orderPubkey": "HtT3sFFRC1ScVzxLfXURu3sRha8TBwZbuYVrV8EBSn18",
      "orderType": "ExactIn"
    }
  ],
  "paginationToken": "eyJsYXN0SWQiOjEwNjU3fQ=="
}