> ## Documentation Index
> Fetch the complete documentation index at: https://docs.pods.finance/llms.txt
> Use this file to discover all available pages before exploring further.

# Get wallet PnL history for a strategy

> Returns a daily unrealized-PnL timeline for a wallet in a strategy, based on the wallet's deposit and withdrawal cost basis and the strategy's daily share price. The wallet query parameter is required and must be owned by the authenticated customer, who must also have the strategy enabled. Amounts are underlying-asset raw units serialized as strings. Provide either days or an explicit from/to range.



## OpenAPI

````yaml /openapi.yaml get /v2/strategies/{strategyId}/pnl
openapi: 3.0.0
info:
  version: 2.0.0
  title: Pods API
  description: >
    # Pods API Documentation


    Pods API is a comprehensive DeFi aggregation platform that enables
    cross-chain and same-chain transactions for yield strategies.


    ## Key Features


    - **Cross-Chain Swaps**: Swap tokens across different blockchain networks

    - **Same-Chain Swaps**: Optimal routing for swaps within the same network

    - **Yield Strategies**: Access to multiple DeFi protocols (Aave, Morpho,
    Lido, etc.)

    - **Wallet Tracking**: Monitor positions and yields across protocols

    - **Transaction Monitoring**: Real-time status updates for cross-chain
    transactions


    ## Authentication


    Most API endpoints require authentication using an API key in the
    `x-api-key` header:


    ```

    x-api-key: your-api-key-here

    ```


    Obtain your API key from the Pods dashboard.


    **Exceptions:**

    - `GET /health` is public and does not require authentication.

    - Customer dashboard endpoints (e.g. `GET /customers/me`,
    `/customers/:id/tokens`, `/customers/:id/token-groups`) require a **Bearer**
    token (Supabase or Magic JWT). API key alone is not sufficient for these
    routes because they enforce user role checks.


    ## Base URL


    Production: `https://api.pods.finance`


    ## Rate Limits


    - 100 requests per minute per API key

    - 1000 requests per hour per API key


    ## Quote Expiration


    Quotes expire after 5 minutes. The `deadline` field is a Unix timestamp in
    seconds and `deadlineDate` is an ISO 8601 string (UTC); request a new quote
    when the deadline has passed.


    ## Error Handling


    All errors follow a consistent format. The HTTP status line is the source of
    truth — the body does **not** include `httpStatus`:


    ```json

    {
      "error": {
        "code": "ERROR_CODE",
        "message": "Human-readable error message",
        "details": {}
      }
    }

    ```


    ## Common Error Codes


    - **QUOTE_NOT_FOUND** (404): Quote not found or expired

    - **ACTION_NOT_FOUND** (404): Action not found

    - **STRATEGY_NOT_FOUND** (404): Strategy not found

    - **INVALID_ACTION_TYPE** (400): Action type is not supported for this
    endpoint

    - **QUOTE_EXPIRED** (400): Quote has expired

    - **QUOTE_VALIDATION_ERROR** (400): Quote validation failed

    - **PROVIDER_NOT_FOUND** (404): Swap provider not found

    - **NO_ROUTE_FOUND** (400): No swap route available between specified chains

    - **INVALID_PREFERRED_PROVIDER** (400): Unknown preferredProvider name

    - **PREFERRED_PROVIDER_NOT_ELIGIBLE** (400): preferredProvider is not
    eligible for this swap route

    - **PREFERRED_PROVIDER_QUOTE_UNAVAILABLE** (400): No quote was returned for
    the requested preferredProvider

    - **QUOTE_GENERATION_FAILED** (400): Could not generate quote for specified
    parameters

    - **FEE_SPONSORSHIP_NOT_ALLOWED** (403): Fee sponsorship is not allowed for
    this customer

    - **INVALID_TX_HASH** (400): Invalid transaction hash format

    - **TX_UPDATE_FAILED** (500): Failed to update transaction status

    - **INVALID_AMOUNT_PARAMS** (400): Cannot specify both amountIn and
    amountOut simultaneously

    - **MISSING_AMOUNT_PARAMS** (400): Either amountIn or amountOut is required

    - **INVALID_SLIPPAGE** (400): slippage must be a number between 0.0001 and
    0.5 (fraction of 1, e.g. 0.01 = 1%)

    - **AMOUNT_IN_TOO_LOW** (400): AmountIn is below the minimum for this route

    - **AMOUNT_IN_TOO_HIGH** (400): AmountIn exceeds available liquidity for
    this route. Try a smaller amount.

    - **AMOUNT_IN_TOO_LOW_OFFRAMP** (400): AmountIn must be greater than 1 USDC

    - **AMOUNT_IN_TOO_HIGH_OFFRAMP** (400): AmountIn must be less than 5k USDC

    - **AMOUNT_OUT_TOO_LOW_OFFRAMP** (400): AmountOut must be greater than 5
    BRLA

    - **AMOUNT_OUT_TOO_HIGH_OFFRAMP** (400): AmountOut must be less than 26k
    BRLA

    - **AMOUNT_IN_TOO_LOW_ONRAMP** (400): AmountIn must be greater than 5 BRLA

    - **AMOUNT_IN_TOO_HIGH_ONRAMP** (400): AmountIn must be less than 75k BRLA

    - **AMOUNT_OUT_TOO_LOW_ONRAMP** (400): AmountOut must be greater than 1 USDC

    - **AMOUNT_OUT_TOO_HIGH_ONRAMP** (400): AmountOut must be less than 15k USDC

    - **TRANSFER_VALIDATION_FAILED** (400): Token transfer validation failed

    - **REFUND_PROCESSING_FAILED** (500): Failed to process refund transaction

    - **INSUFFICIENT_AMOUNT_FOR_REFUND** (400): Transferred amount insufficient
    to cover refund fee

    - **FORBIDDEN** (403): Access denied

    - **INTERNAL_SERVER_ERROR** (500): An unexpected error occurred

    - **BYTECODE_GENERATION_FAILED** (500): Failed to generate transaction
    bytecode

    - **SWAP_EXECUTION_FAILED** (500): Failed to execute swap transaction

    - **KAMINO_SERVICE_UNAVAILABLE** (503): Lending service is temporarily
    unavailable. Please try again later.

    - **KAMINO_BAD_REQUEST** (400): Invalid request to lending service

    - **DEPOSIT_NOT_FOUND** (404): Bitcoin deposit not found

    - **SYMBIOSIS_API_ERROR** (502): Error communicating with Symbiosis API


    ## Support


    - Documentation: https://docs.pods.finance

    - Support: support@pods.finance
  contact:
    name: Pods Support
    email: support@pods.finance
    url: https://pods.finance
  license:
    name: MIT
    url: https://opensource.org/licenses/MIT
servers:
  - url: https://api.pods.finance
    description: Production server
security: []
tags:
  - name: Health
    description: Health check endpoints
  - name: KYC
    description: Reusable Sumsub KYC import and status endpoints
  - name: Swap v2
    description: Token swap operations (latest version)
  - name: Tracking
    description: Execution tracking for swaps, transfers, and strategy operations
  - name: Strategies
    description: DeFi yield strategy operations
  - name: Tokens
    description: Token catalog operations
  - name: Ondo
    description: Ondo Global Markets stock status and tradability
  - name: Transfer
    description: Token transfer transaction generation
  - name: Wallets
    description: Wallet position tracking
  - name: Customers
    description: Customer account management (Bearer auth)
  - name: Quotes
    description: Quote history and management
  - name: Smart Account
    description: ERC-4337 Gnosis Safe smart account provisioning
paths:
  /v2/strategies/{strategyId}/pnl:
    get:
      tags:
        - Strategies
      summary: Get wallet PnL history for a strategy
      description: >-
        Returns a daily unrealized-PnL timeline for a wallet in a strategy,
        based on the wallet's deposit and withdrawal cost basis and the
        strategy's daily share price. The wallet query parameter is required and
        must be owned by the authenticated customer, who must also have the
        strategy enabled. Amounts are underlying-asset raw units serialized as
        strings. Provide either days or an explicit from/to range.
      parameters:
        - schema:
            type: string
            description: Strategy ID or slug
          required: true
          name: strategyId
          in: path
        - schema:
            allOf:
              - $ref: '#/components/schemas/Address'
              - description: >-
                  Wallet address to scope the PnL series to. Required for this
                  route form.
          required: true
          name: wallet
          in: query
        - schema:
            type: integer
            minimum: 7
            maximum: 365
            default: 7
            description: >-
              Rolling window size in days ending yesterday (UTC). Minimum 7,
              maximum 365. Ignored when from/to are provided.
          required: false
          name: days
          in: query
        - schema:
            type: string
            format: date
            description: Inclusive range start (YYYY-MM-DD, UTC). When set, overrides days.
          required: false
          name: from
          in: query
        - schema:
            type: string
            format: date
            description: Inclusive range end (YYYY-MM-DD, UTC). Cannot be in the future.
          required: false
          name: to
          in: query
        - schema:
            type: integer
            minimum: 1
            maximum: 500
            default: 100
            description: Results per page (maximum 500)
          required: false
          name: limit
          in: query
        - schema:
            type: integer
            minimum: 1
            default: 1
            description: Page number
          required: false
          name: page
          in: query
      responses:
        '200':
          description: PnL timeline retrieved
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StrategyPnlResponse'
        '400':
          description: Missing wallet address or invalid date range
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Strategy not found or not enabled for the customer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      security:
        - ApiKeyAuth: []
components:
  schemas:
    Address:
      type: string
      description: Ethereum address (EVM-compatible)
      example: '0xb794F5eA0ba39494cE839613fffBA74279579268'
    StrategyPnlResponse:
      type: object
      description: >-
        Paginated wallet PnL timeline for a strategy. The list key is items (not
        data).
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/StrategyPnlPoint'
        pagination:
          $ref: '#/components/schemas/Pagination'
        strategyId:
          type: string
          description: Resolved strategy ObjectId.
          example: 665f1a2b3c4d5e6f70819293
        walletAddress:
          allOf:
            - $ref: '#/components/schemas/Address'
            - description: Wallet the PnL series is scoped to.
      required:
        - items
        - pagination
        - strategyId
        - walletAddress
    Error:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
            message:
              type: string
            details:
              nullable: true
          required:
            - code
            - message
      required:
        - error
      example:
        error:
          code: QUOTE_NOT_FOUND
          message: Quote not found or expired
    StrategyPnlPoint:
      type: object
      description: >-
        One daily PnL data point for the wallet, based on its deposit and
        withdrawal cost basis and the strategy's daily share price.
      properties:
        dateString:
          type: string
          description: UTC calendar day for this point (YYYY-MM-DD).
          example: '2026-07-20'
        sharesBalance:
          allOf:
            - $ref: '#/components/schemas/BigIntLike'
            - description: Receipt/share token balance held at end of day, raw units.
        assetValue:
          allOf:
            - $ref: '#/components/schemas/BigIntLike'
            - description: >-
                Position valued in the underlying asset at the day's rate, raw
                units.
        costBasisAsset:
          allOf:
            - $ref: '#/components/schemas/BigIntLike'
            - description: >-
                Remaining cost basis of the position in underlying-asset raw
                units (reduced proportionally on withdrawals).
        pnlAsset:
          allOf:
            - $ref: '#/components/schemas/BigIntLike'
            - description: >-
                Unrealized PnL in underlying-asset raw units (assetValue -
                costBasisAsset). May be negative.
        cumulativeDeposited:
          allOf:
            - $ref: '#/components/schemas/BigIntLike'
            - description: >-
                Cumulative underlying deposited up to and including this day,
                raw units.
        cumulativeWithdrawn:
          allOf:
            - $ref: '#/components/schemas/BigIntLike'
            - description: >-
                Cumulative underlying withdrawn up to and including this day,
                raw units.
        unrealizedPnlPercentage:
          type: number
          nullable: true
          description: >-
            pnlAsset / costBasisAsset as a ratio (0.05 = 5%). Null when cost
            basis is zero.
          example: 0.0123
      required:
        - dateString
        - sharesBalance
        - assetValue
        - costBasisAsset
        - pnlAsset
        - cumulativeDeposited
        - cumulativeWithdrawn
        - unrealizedPnlPercentage
    Pagination:
      type: object
      properties:
        page:
          type: number
          example: 1
        limit:
          type: number
          example: 10
        total:
          type: number
          example: 24
        totalPages:
          type: number
          example: 3
        hasMore:
          type: boolean
          example: true
      required:
        - page
        - limit
        - total
        - totalPages
        - hasMore
      description: Standard list pagination metadata
    BigIntLike:
      type: string
      description: Large integer represented as string (for amounts with decimals)
      example: '1000000000000000000'
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: API key for authentication. Obtain from your Pods dashboard.

````