Kamino Portfolio API

The Portfolio API from Kamino — 2 operation(s) for portfolio.

OpenAPI Specification

kamino-portfolio-api-openapi.yml Raw ↑
openapi: 3.0.0
info:
  version: 1.0.0
  title: Kamino Public Airdrop Portfolio API
  description: 'The Kamino API provides a comprehensive way to interact with Kamino without reading directly from the blockchain.


    The API also provides the ability to fetch data that might not be available from just reading the chain.


    The API is rate-limited for unauthenticated users. If you feel you need to make more requests or run into rate-limit issues, please reach out.

    '
servers:
- url: https://api.kamino.finance
tags:
- name: Portfolio
paths:
  /portfolio/{pubkey}:
    get:
      operationId: getPortfolio
      summary: Get portfolio source data for a wallet
      description: Returns source position rows across Kamino products (lending, multiply, leverage, liquidity, earn, private credit, staking). Portfolio totals, counts, fees, historical PnL, and display-only rollups are intentionally left to client composition or their dedicated endpoints.
      tags:
      - Portfolio
      parameters:
      - schema:
          $ref: '#/components/schemas/AddressBase58'
        required: true
        description: Valid base58-encoded address
        name: pubkey
        in: path
      - schema:
          type: string
          default: KLend2g3cP87fffoy8q1mQqGKjrxjC8boSyAYavgmjD
          description: KLend program ID
          example: KLend2g3cP87fffoy8q1mQqGKjrxjC8boSyAYavgmjD
        required: false
        description: KLend program ID
        name: programId
        in: query
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PortfolioResponse'
              example:
                timestamp: '2026-06-12T11:16:12.657Z'
                sections:
                  lending:
                    indexed: true
                    positionsRefreshedOn: '2026-06-11T23:14:19.969Z'
                    pricesRefreshedOn: '2026-06-12T11:12:29.057Z'
                    errors: []
                  multiply:
                    indexed: true
                    positionsRefreshedOn: '2026-06-11T23:13:54.680Z'
                    pricesRefreshedOn: '2026-06-12T11:12:29.057Z'
                    errors: []
                  leverage:
                    indexed: true
                    positionsRefreshedOn: '2026-06-11T23:14:00.518Z'
                    pricesRefreshedOn: '2026-06-12T11:12:29.057Z'
                    errors: []
                  liquidity:
                    indexed: true
                    positionsRefreshedOn: '2026-06-11T23:11:53.211Z'
                    pricesRefreshedOn: '2026-06-11T23:14:24.861Z'
                    errors: []
                  earn:
                    indexed: true
                    positionsRefreshedOn: '2026-06-11T23:12:29.633Z'
                    pricesRefreshedOn: '2026-06-12T11:12:29.057Z'
                    errors: []
                  privateCredit:
                    indexed: true
                    positionsRefreshedOn: '2026-06-11T23:12:29.846Z'
                    pricesRefreshedOn: '2026-06-12T11:12:29.057Z'
                    errors: []
                  staking:
                    indexed: true
                    positionsRefreshedOn: '2026-06-11T23:04:34.002Z'
                    pricesRefreshedOn: '2026-06-12T11:12:29.057Z'
                    errors: []
                lending:
                - obligation: HpAQMFgpSJ3XZWEXtSQgJmuL3Fd8QepJSG79csgq3hoB
                  market: 5wJeMrUYECGq41fxRESKALVcHnNX26TAWy4W98yULsua
                  tag: Vanilla
                  netValue: '262.00710654164595037'
                  totalDepositValue: '491.89391304710577576'
                  totalBorrowValue: '229.88680650545982539'
                  ltv: '0.4673503786241097951'
                  maxLtv: '0.5727335057760832411'
                  liquidationLtv: '0.63241141170317723635'
                  leverage: '1.8774067602205262589'
                  deposits:
                  - mint: XsoCS1TfEyfFhfvj8EtZ528L3CaKBDBRqRapnBbDF2W
                    symbol: SPYx
                    amount: '0.16082255065800625522'
                    value: '119.1703926699327137'
                    price: '741.005488237479553'
                    reserve: UvXjBuC7YZYaGB9Rn1PpBD1GySmjzunXgE8Zev9ua8d
                    maxLtv: '0.73'
                    liquidationLtv: '0.75'
                  borrows:
                  - mint: EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
                    symbol: USDC
                    amount: '229.95449131043213799'
                    value: '229.88680650545982539'
                    price: '0.99970566'
                    reserve: 97zoywd8mPZsGTg8q1wdD2Wgkdrs2tqusp1Qqcxbyj7E
                    borrowFactor: '1'
                multiply:
                - obligation: 2JsWdyxA15WodMBzRY5uNUJDvL71xm9NwfMj6qdYi3SC
                  market: 7u3HeHxYDLhnCoErrtycNokbQYbWGzLs6JSDqGAv5PfF
                  tag: Multiply
                  netValue: '39.032947857306441512'
                  totalDepositValue: '124.32509095187057771'
                  totalBorrowValue: '85.292143094564136198'
                  ltv: '0.68604126843215345899'
                  maxLtv: '0.87000000000000000002'
                  liquidationLtv: '0.91999999999999999997'
                  leverage: '3.1851319917308934971'
                  deposits:
                  - mint: J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn
                    symbol: JitoSOL
                    amount: '1.4488817124626824571'
                    value: '124.32509095187057771'
                    price: '85.807619685221685924'
                    reserve: EVbyPKrHG6WBfm4dLxLMJpUDY43cCAcHSpV3KYjKsktW
                    maxLtv: '0.87'
                    liquidationLtv: '0.92'
                  borrows:
                  - mint: So11111111111111111111111111111111111111112
                    symbol: SOL
                    amount: '1.276825076608483649'
                    value: '85.292143094564136198'
                    price: '66.80017855'
                    reserve: d4A2prbA2whesmvHaL88BH6Ewn5N4bTSU2Ze8P6Bc4Q
                    borrowFactor: '1'
                  depositMint: J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn
                  borrowMint: So11111111111111111111111111111111111111112
                leverage:
                - obligation: VgtvJ1iCDAb65pWbwhvX33X6CWMWMdrYRABEhNTJ9xq
                  market: 7u3HeHxYDLhnCoErrtycNokbQYbWGzLs6JSDqGAv5PfF
                  tag: Leverage
                  netValue: '8.774498333310038026'
                  totalDepositValue: '23.724451929066735492'
                  totalBorrowValue: '14.949953595756697466'
                  ltv: '0.6301495874575001704'
                  maxLtv: '0.75'
                  liquidationLtv: '0.80000000000000000002'
                  leverage: '2.7037958214663046734'
                  deposits:
                  - mint: 7vfCXTUXx5WJV5JADk17DUJ4ksgau7utNKj4b963voxs
                    symbol: ETH
                    amount: '0.014174648995927885562'
                    value: '23.724451929066735492'
                    price: '1673.72412085'
                    reserve: febGYTnFX4GbSGoFHFeJXUHgNaK53fB23uDins9Jp1E
                    maxLtv: '0.75'
                    liquidationLtv: '0.8'
                  borrows:
                  - mint: EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
                    symbol: USDC
                    amount: '14.954355260684127232'
                    value: '14.949953595756697466'
                    price: '0.99970566'
                    reserve: D6q6wuQSrifJKZYpR1M8R4YawnLDtDsMmWM1NbBmgJ59
                    borrowFactor: '1'
                  depositMint: 7vfCXTUXx5WJV5JADk17DUJ4ksgau7utNKj4b963voxs
                  borrowMint: EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
                liquidity:
                - strategy: HBuYwvq67VKnLyKxPzDjzskyRMk7ps39gwHdvaPGwdmQ
                  shareMint: 7XB1azPg9hmD196uiGNa61EyvXbCmQhg8jSdptRGkRTZ
                  shares: '216.673457'
                  netValue: '26.383693978132575086'
                  tokenA:
                    mint: JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN
                    symbol: JUP
                    amount: '54.602417609162028891'
                    value: '9.1141301646553401798'
                    price: '0.16691807'
                  tokenB:
                    mint: bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1
                    symbol: bSOL
                    amount: '0.19898556021252914791'
                    value: '17.269563813477234906'
                    price: '86.788025196563257466'
                earn:
                - vault: 7cYGMEwQKhdYdugAyQBEqtwG6KhHyuEDcgUrdfGaV6qV
                  tokenMint: EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
                  symbol: USDC
                  name: Core+ USDC Vault
                  netValue: '102.43833649457444653'
                  shares: '97.742099'
                  amount: '102.46849707200261978'
                privateCredit:
                - vault: 91b1opzHNUQobfLZxGMNYT5qDRKoqV8FdsdQBmH4wBxy
                  tokenMint: EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
                  symbol: USDC
                  name: Kamino Institutional USDC
                  netValue: '10.357873888364687946'
                  shares: '10'
                  amount: '10.360923522594328361'
                staking:
                - mint: KMNo3nJsBXfcpJTVhZcXLW7RmTwTt4GVFE7suUBo9sS
                  symbol: KMNO
                  farm: 2sFZDpBn4sA42uNbAD6QzQ98rPSmqnPyksYe6SJKVvay
                  amount: '1700.2533519964832604'
                  value: '30.92680935374059216'
                  price: '0.01818953'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    description: High-level error message describing the failure
                    example: Invalid query params
                  details:
                    type: array
                    items:
                      type: object
                      additionalProperties:
                        nullable: true
                    description: Detailed validation issues (present only for validation errors)
                required:
                - error
                description: Bad request response (400)
                example:
                  error: Invalid query request
                  details:
                  - code: invalid_union
                    errors:
                    - - code: custom
                        path: []
                        message: Invalid date string
                    - - expected: number
                        code: invalid_type
                        path: []
                        message: 'Invalid input: expected number, received string'
                    path:
                    - start
                    message: Invalid input
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
  /portfolio/{pubkey}/rewards:
    get:
      operationId: getPortfolioRewards
      summary: Get pending farm rewards for a wallet
      description: Returns pending farm reward source rows across Kamino products. USD reward totals are composed on the client from price data.
      tags:
      - Portfolio
      parameters:
      - schema:
          $ref: '#/components/schemas/AddressBase58'
        required: true
        description: Valid base58-encoded address
        name: pubkey
        in: path
      - schema:
          type: string
          default: KLend2g3cP87fffoy8q1mQqGKjrxjC8boSyAYavgmjD
          description: KLend program ID
          example: KLend2g3cP87fffoy8q1mQqGKjrxjC8boSyAYavgmjD
        required: false
        description: KLend program ID
        name: programId
        in: query
      - schema:
          type: string
          pattern: ^\d+(,\d+)*$
          description: Comma-separated farm reward types to include. Defaults to 0,1 to match portfolio webapp rewards.
          example: 0,1
        required: false
        description: Comma-separated farm reward types to include. Defaults to 0,1 to match portfolio webapp rewards.
        name: rewardTypes
        in: query
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PortfolioRewardsResponse'
              example:
                timestamp: '2026-06-12T11:16:12.684Z'
                farms:
                - farm: A9nKRhBPVdQ2QDfzMkhpZzsAimCt59wSKxpo36bzhDiU
                  userState: JBhXSh6Zb5TPi8g6rsTpNjmuet4V7YGGtU3daou9Y2qs
                  delegatee: ARygwR6WBPvatQ2bBrSyytsyBgqrRDwxEuANWSSydfXW
                  strategy: HBuYwvq67VKnLyKxPzDjzskyRMk7ps39gwHdvaPGwdmQ
                  positionType: Liquidity
                  activeStakeAmount: '216.673457'
                  tokenMints:
                  - JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN
                  - bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1
                  rewards:
                  - mint: BLZEEuZUBVqFhj8adcCFPJvPVCiCyVmh3hkJMrU8KuJA
                    amount: '59.765598641'
                    index: 0
                    type: 0
                    tokenProgram: TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA
                - farm: 9hUeaxTE3UsRFVt46NPDszSGW76gqDwK743SvJvjYUiY
                  userState: HkPCNqo1FRo41oiCwG8Kjsg664Jamsv8TE9kU7bqVP5S
                  delegatee: 5CVMEG7NSdEDVTPiz8efwL6zbXYSVEpkHovf54n2bvoZ
                  vault: NSSESC5s9Mk7uhUg7hdRiEeNaz7FQmZveJseF62Zjbc
                  positionType: Lend
                  activeStakeAmount: '0'
                  tokenMints:
                  - CASHx9KJUStyftLFWGvEVf59SGeG9sh5FfcnZMVPCASH
                  rewards:
                  - mint: CASHx9KJUStyftLFWGvEVf59SGeG9sh5FfcnZMVPCASH
                    amount: '0.446532'
                    index: 0
                    type: 0
                    tokenProgram: TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb
                - farm: 3Dsn7mXKCxQ54QxDtogFsGqgMhhgWnVtN5MGLHvowh3E
                  userState: F8vs1tNCEdsvHB9ZgYCNRNnb2CbmDULEfQ68A6ZXHvwm
                  delegatee: 51rLRu3pvps8vWHVt6uSBeRgQ2UJgCPsw5TEdGsQSKkA
                  positionType: Borrow Markets
                  activeStakeAmount: '0'
                  tokenMints: []
                  rewards:
                  - mint: CASHx9KJUStyftLFWGvEVf59SGeG9sh5FfcnZMVPCASH
                    amount: '0.003248'
                    index: 0
                    type: 1
                    tokenProgram: TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    description: High-level error message describing the failure
                    example: Invalid query params
                  details:
                    type: array
                    items:
                      type: object
                      additionalProperties:
                        nullable: true
                    description: Detailed validation issues (present only for validation errors)
                required:
                - error
                description: Bad request response (400)
                example:
                  error: Invalid query request
                  details:
                  - code: invalid_union
                    errors:
                    - - code: custom
                        path: []
                        message: Invalid date string
                    - - expected: number
                        code: invalid_type
                        path: []
                        message: 'Invalid input: expected number, received string'
                    path:
                    - start
                    message: Invalid input
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
components:
  schemas:
    PortfolioSectionError:
      type: object
      properties:
        code:
          type: string
          description: Stable subcomponent error code
      required:
      - code
    Decimal:
      type: string
      description: Decimal value represented as string
      example: '1234.56789'
    PortfolioLendingDeposit:
      type: object
      properties:
        mint:
          allOf:
          - $ref: '#/components/schemas/AddressBase58'
          - description: Token mint address
        symbol:
          type: string
          description: Best-effort token symbol from known SQL-backed mint metadata, or UNKNOWN when unavailable
          example: SOL
        amount:
          allOf:
          - $ref: '#/components/schemas/Decimal'
          - description: Token amount
        value:
          type: string
          nullable: true
          example: '1234.56789'
          description: Current USD value for this token row
        price:
          type: string
          nullable: true
          example: '1234.56789'
          description: Current token price in USD
        reserve:
          allOf:
          - $ref: '#/components/schemas/AddressBase58'
          - description: Resolved KLend reserve address backing this token row
        maxLtv:
          allOf:
          - $ref: '#/components/schemas/Decimal'
          - description: Maximum loan-to-value ratio for the reserve as a fraction, adjusted for the obligation's elevation group
        liquidationLtv:
          allOf:
          - $ref: '#/components/schemas/Decimal'
          - description: Liquidation loan-to-value threshold for the reserve as a fraction, adjusted for the obligation's elevation group
      required:
      - mint
      - symbol
      - amount
      - value
      - price
      - maxLtv
      - liquidationLtv
    PortfolioMultiplyPosition:
      type: object
      properties:
        obligation:
          allOf:
          - $ref: '#/components/schemas/AddressBase58'
          - description: Obligation address
        market:
          allOf:
          - $ref: '#/components/schemas/AddressBase58'
          - description: Lending market address
        tag:
          type: string
          enum:
          - Vanilla
          - Lending
          - LendingFixedRate
          - Multiply
          - MultiplyFixedRate
          - Leverage
          - LeverageFixedRate
          description: Obligation type tag
          example: Lending
        netValue:
          type: string
          nullable: true
          example: '1234.56789'
          description: Net account value in USD from refreshed obligation stats
        totalDepositValue:
          type: string
          nullable: true
          example: '1234.56789'
          description: Total deposit value in USD from refreshed obligation stats
        totalBorrowValue:
          type: string
          nullable: true
          example: '1234.56789'
          description: Total borrow value in USD from refreshed obligation stats
        ltv:
          type: string
          nullable: true
          example: '1234.56789'
          description: Current loan-to-value ratio from refreshed obligation stats
        maxLtv:
          type: string
          nullable: true
          example: '1234.56789'
          description: Maximum loan-to-value ratio for the whole obligation from refreshed stats
        liquidationLtv:
          type: string
          nullable: true
          example: '1234.56789'
          description: Liquidation LTV threshold from refreshed obligation stats
        leverage:
          type: string
          nullable: true
          example: '1234.56789'
          description: Current leverage from refreshed obligation stats
        deposits:
          type: array
          items:
            $ref: '#/components/schemas/PortfolioLendingDeposit'
        borrows:
          type: array
          items:
            $ref: '#/components/schemas/PortfolioLendingBorrow'
        depositMint:
          allOf:
          - $ref: '#/components/schemas/AddressBase58'
          - description: Primary deposit token mint used for this multiply position
        borrowMint:
          allOf:
          - $ref: '#/components/schemas/AddressBase58'
          - description: Primary borrow token mint used for this multiply position
      required:
      - obligation
      - market
      - tag
      - netValue
      - totalDepositValue
      - totalBorrowValue
      - ltv
      - maxLtv
      - liquidationLtv
      - leverage
      - deposits
      - borrows
    PortfolioRewardToken:
      type: object
      properties:
        mint:
          allOf:
          - $ref: '#/components/schemas/AddressBase58'
          - description: Reward token mint
        amount:
          allOf:
          - $ref: '#/components/schemas/Decimal'
          - description: Pending reward amount
        index:
          type: integer
          description: Reward info index on the farm state used for claim instructions
          example: 0
        type:
          type: integer
          description: Farm reward type index used by farm rewards accounting
          example: 0
        tokenProgram:
          allOf:
          - $ref: '#/components/schemas/AddressBase58'
          - description: Token program ID for the reward token
      required:
      - mint
      - amount
      - index
      - type
      - tokenProgram
    PortfolioLendingBorrow:
      type: object
      properties:
        mint:
          allOf:
          - $ref: '#/components/schemas/AddressBase58'
          - description: Token mint address
        symbol:
          type: string
          description: Best-effort token symbol from known SQL-backed mint metadata, or UNKNOWN when unavailable
          example: SOL
        amount:
          allOf:
          - $ref: '#/components/schemas/Decimal'
          - description: Token amount
        value:
          type: string
          nullable: true
          example: '1234.56789'
          description: Current USD value for this token row
        price:
          type: string
          nullable: true
          example: '1234.56789'
          description: Current token price in USD
        reserve:
          allOf:
          - $ref: '#/components/schemas/AddressBase58'
          - description: Resolved KLend reserve address backing this token row
        borrowFactor:
          allOf:
          - $ref: '#/components/schemas/Decimal'
          - description: Borrow factor for the reserve as a fraction (e.g. 1.25); 1 when an elevation group is active
      required:
      - mint
      - symbol
      - amount
      - value
      - price
      - borrowFactor
    PortfolioStakingPosition:
      type: object
      properties:
        mint:
          allOf:
          - $ref: '#/components/schemas/AddressBase58'
          - description: Staked token mint address
        symbol:
          type: string
          description: Staked token symbol
          example: KMNO
        farm:
          allOf:
          - $ref: '#/components/schemas/AddressBase58'
          - description: Farm address where the staking position is held
        amount:
          allOf:
          - $ref: '#/components/schemas/Decimal'
          - description: Amount of KMNO staked
        value:
          type: string
          nullable: true
          example: '1234.56789'
          description: Current USD value of staked KMNO
        price:
          type: string
          nullable: true
          example: '1234.56789'
          description: Current staked token price in USD
      required:
      - mint
      - symbol
      - farm
      - amount
      - value
      - price
    PortfolioPrivateCreditPosition:
      type: object
      properties:
        vault:
          allOf:
          - $ref: '#/components/schemas/AddressBase58'
          - description: Vault address
        tokenMint:
          allOf:
          - $ref: '#/components/schemas/AddressBase58'
          - description: Vault underlying token mint
        symbol:
          type: string
          description: Vault underlying token symbol
          example: USDC
        name:
          type: string
          description: Vault name
          example: Maple USDC
        netValue:
          type: string
          nullable: true
          example: '1234.56789'
          description: Current position value in USD
        shares:
          allOf:
          - $ref: '#/components/schemas/Decimal'
          - description: Number of shares held
        amount:
          allOf:
          - $ref: '#/components/schemas/Decimal'
          - description: Underlying token amount for the position
      required:
      - vault
      - tokenMint
      - symbol
      - name
      - netValue
      - shares
      - amount
    PortfolioLeveragePosition:
      type: object
      properties:
        obligation:
          allOf:
          - $ref: '#/components/schemas/AddressBase58'
          - description: Obligation address
        market:
          allOf:
          - $ref: '#/components/schemas/AddressBase58'
          - description: Lending market address
        tag:
          type: string
          enum:
          - Vanilla
          - Lending
          - LendingFixedRate
          - Multiply
          - MultiplyFixedRate
          - Leverage
          - LeverageFixedRate
          description: Obligation type tag
          example: Lending
        netValue:
          type: string
          nullable: true
          example: '1234.56789'
          description: Net account value in USD from refreshed obligation stats
        totalDepositValue:
          type: string
          nullable: true
          example: '1234.56789'
          description: Total deposit value in USD from refreshed obligation stats
        totalBorrowValue:
          type: string
          nullable: true
          example: '1234.56789'
          description: Total borrow value in USD from refreshed obligation stats
        ltv:
          type: string
          nullable: true
          example: '1234.56789'
          description: Current loan-to-value ratio from refreshed obligation stats
        maxLtv:
          type: string
          nullable: true
          example: '1234.56789'
          description: Maximum loan-to-value ratio for the whole obligation from refreshed stats
        liquidationLtv:
          type: string
          nullable: true
          example: '1234.56789'
          description: Liquidation LTV threshold from refreshed obligation stats
        leverage:
          type: string
          nullable: true
          example: '1234.56789'
          description: Current leverage from refreshed obligation stats
        deposits:
          type: array
          items:
            $ref: '#/components/schemas/PortfolioLendingDeposit'
        borrows:
          type: array
          items:
            $ref: '#/components/schemas/PortfolioLendingBorrow'
        depositMint:
          allOf:
          - $ref: '#/components/schemas/AddressBase58'
          - description: Primary deposit token mint used for this leverage position
        borrowMint:
          allOf:
          - $ref: '#/components/schemas/AddressBase58'
          - description: Primary borrow token mint used for this leverage position
      required:
      - obligation
      - market
      - tag
      - netValue
      - totalDepositValue
      - totalBorrowValue
      - ltv
      - maxLtv
      - liquidationLtv
      - leverage
      - deposits
      - borrows
    PortfolioLiquidityPosition:
      type: object
      properties:
        strategy:
          allOf:
          - $ref: '#/components/schemas/AddressBase58'
          - description: Strategy address
        shareMint:
          allOf:
          - $ref: '#/components/schemas/AddressBase58'
          - description: Strategy share mint address
        shares:
          allOf:
          - $ref: '#/components/schemas/Decimal'
          - description: Total strategy shares held directly or staked in farms
        netValue:
          type: string
          nullable: true
          example: '1234.56789'
          description: Current net position value in USD
        tokenA:
          $ref: '#/components/schemas/PortfolioPositionToken'
        tokenB:
          $ref: '#/components/schemas/PortfolioPositionToken'
      required:
      - strategy
      - shareMint
      - shares
      - netValue
      - tokenA
      - tokenB
    PortfolioResponse:
      type: object
      properties:
        timestamp:
          type: string
          format: date-time
          description: Response timestamp as an ISO-8601 string
        sections:
          $ref: '#/components/schemas/PortfolioSections'
        lending:
          type: array
          items:
            $ref: '#/components/schemas/PortfolioLendingPosition'
        multiply:
          type: array
          items:
            $ref: '#/components/schemas/PortfolioMultiplyPosition'
        leverage:
          type: array
          items:
            $ref: '#/components/schemas/PortfolioLeveragePosition'
        liquidity:
          type: array
          items:
            $ref: '#/components/schemas/PortfolioLiquidityPosition'
        earn:
          type: array
          items:
            $ref: '#/components/schemas/PortfolioEarnPosition'
        privateCredit:
          type: array
          items:
            $ref: '#/components/schemas/PortfolioPrivateCreditPosition'
        staking:
          type: array
          items:
            $ref: '#/components/schemas/PortfolioStakingPosition'
      required:
      - timestamp
      - sections
      - lending
      - multiply
      - leverage
      - liquidity
      - earn
      - privateCredit
      - staking
    AddressBase58:
      type: string
      description: Valid base58-encoded address
      example: VEG1EMtttdHunMbSza8uoms1R18VXmYSph2bBpHcSJd
    PortfolioFarmReward:
      type: object
      properties:
        farm:
          allOf:
          - $ref: '#/components/schemas/AddressBase58'
          - description: Farm address
        userState:
          allOf:
          - $ref: '#/components/schemas/AddressBase58'
          - description: User state address used for claiming
        delegatee:
          allOf:
          - $ref: '#/components/schemas/AddressBase58'
          - description: Delegatee recorded on the user farm state, used to build claim instructions
        strategy:
          allOf:
          - $ref: '#/components/schemas/AddressBase58'
          - description: Liquidity strategy associated with the farm, when applicable
        vault:
          allOf:
          - $ref: '#/components/schemas/AddressBase58'
          - description: KVault associated with the farm, when applicable
        positionType:
          type: string
          enum:
          - Liquidity
          - Lend
          - Borrow Markets
          - Multiply
          - Leverage
          description: Farm position type
          example: Lend
        activeStakeAmount:
          allOf:
          - $ref: '#/components/schemas/Decimal'
          - description: Active stake amount in farm
        tokenMints:
          type: array
          items:
            $ref: '#/components/schemas/AddressBase58'
          default: []
          description: Token mints identifying the position (e.g. tokenA+tokenB for liquidity)
        rewards:
          type: array
          items:
            $ref: '#/components/schemas/PortfolioRewardToken'
      required:
      - farm
      - userState
      - delegatee
      - positionType
      - activeStakeAmount
      - rewards
      description: Farm reward row; at most one of strategy or vault is present.
    PortfolioRewardsResponse:
      type: object
      properties:
        timestamp:
          type: string
          format: date-time
          description: Response timestamp as an ISO-8601 string
        farms:
          type: array
          items:
            $ref: '#/components/schemas/PortfolioFarmReward'
        partialErrors:
          $ref: '#/components/schemas/PortfolioRewardsPartialErrors'
      required:
      - timestamp
      - farms
    Port

# --- truncated at 32 KB (38 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/kamino/refs/heads/main/openapi/kamino-portfolio-api-openapi.yml