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

# Observed native wallet-token PnL

> Public Solana chain facts from OceanX's fee-inclusive ledger, falling back to its observed swap index. No SolanaTracker reads. Partial coverage is explicit; missing basis, unpriced holdings and absent positions are null. Sold more than observed bought invalidates basis; no zero-basis profit or raw mode. USD is supported; SOL/EUR return 503 until qualified FX is available. No account data or transaction authority.



## OpenAPI

````yaml https://www.oceanx.trade/api/v1/openapi.json get /api/v1/wallets/{wallet}/tokens/{token}
openapi: 3.1.0
info:
  title: OceanX Developer API
  version: 1.0.0
  description: >-
    Public API for the OceanX trading platform. Currently in beta and free to
    use while in beta.


    This spec covers the **spot quote** domain. The wallet **tracker** and
    **perps** domains are documented at https://docs.oceanx.trade/api/overview
    and are not yet described here.
  contact:
    url: https://docs.oceanx.trade
  termsOfService: https://www.oceanx.trade/legal/terms
  license:
    name: Proprietary
    url: https://www.oceanx.trade/legal/terms
servers:
  - url: https://www.oceanx.trade
    description: Production
security:
  - bearerAuth: []
tags:
  - name: Router
    description: >-
      Read-only Raptor route quotes and public Solana transaction status. Build
      and execution remain separately gated.
  - name: Market Data
    description: Read-only OceanX market context sourced and cached by VM producers.
  - name: Spot
    description: >-
      Executable Solana swap quotes off OceanX's own router, and the exit
      checker that reports whether a whole position can be sold.
  - name: Callouts
    description: >-
      Public token callouts — user-posted token calls with live click/volume
      attribution stats. Read-only.
  - name: Copy Trading
    description: Key-owner follow, fill and PnL reads; no execution authority.
  - name: Price Alerts
    description: Key-owner alert management through the existing evaluator; no webhooks.
paths:
  /api/v1/wallets/{wallet}/tokens/{token}:
    get:
      tags:
        - Market Data
      summary: Observed native wallet-token PnL
      description: >-
        Public Solana chain facts from OceanX's fee-inclusive ledger, falling
        back to its observed swap index. No SolanaTracker reads. Partial
        coverage is explicit; missing basis, unpriced holdings and absent
        positions are null. Sold more than observed bought invalidates basis; no
        zero-basis profit or raw mode. USD is supported; SOL/EUR return 503
        until qualified FX is available. No account data or transaction
        authority.
      operationId: walletTokenPnl
      parameters:
        - name: wallet
          in: path
          required: true
          schema:
            type: string
            pattern: ^[1-9A-HJ-NP-Za-km-z]{32,44}$
        - name: token
          in: path
          required: true
          schema:
            type: string
            pattern: ^[1-9A-HJ-NP-Za-km-z]{32,44}$
        - name: currency
          in: query
          schema:
            type: string
            enum:
              - usd
              - sol
              - eur
            default: usd
        - name: pnlMode
          in: query
          schema:
            type: string
            enum:
              - unknown-basis-null
            default: unknown-basis-null
      responses:
        '200':
          description: Observed position or explicit unknown; never lifetime completeness.
          content:
            application/json:
              schema:
                type: object
                required:
                  - data
                properties:
                  data:
                    type: object
                    required:
                      - wallet
                      - token
                      - currency
                      - pnlMode
                      - source
                      - status
                      - complete
                      - position
                      - coverage
                    properties:
                      wallet:
                        type: string
                      token:
                        type: string
                      currency:
                        const: usd
                      pnlMode:
                        const: unknown-basis-null
                      source:
                        type: string
                      status:
                        enum:
                          - partial
                          - unknown
                      complete:
                        const: false
                      coverage:
                        type: string
                      position:
                        type:
                          - object
                          - 'null'
                        properties:
                          balance:
                            type:
                              - number
                              - 'null'
                          value:
                            type:
                              - number
                              - 'null'
                          invested:
                            type:
                              - number
                              - 'null'
                          proceeds:
                            type:
                              - number
                              - 'null'
                          realized:
                            type:
                              - number
                              - 'null'
                          unrealized:
                            type:
                              - number
                              - 'null'
                          roiPct:
                            type:
                              - number
                              - 'null'
                          buys:
                            type:
                              - number
                              - 'null'
                          sells:
                            type:
                              - number
                              - 'null'
                          basisCoverage:
                            type:
                              - string
                              - 'null'
        '400':
          description: Failed validation before reaching the engine.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Missing, malformed or revoked API key.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: The key is valid but lacks the required scope.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: Rate limited. Honour `Retry-After`.
          headers:
            X-RateLimit-Limit:
              schema:
                type: integer
              description: Requests allowed per window.
            X-RateLimit-Remaining:
              schema:
                type: integer
              description: Requests left.
            X-RateLimit-Reset:
              schema:
                type: integer
              description: Unix seconds when the window resets.
            Retry-After:
              schema:
                type: integer
              description: Seconds to wait.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '503':
          description: Native source or requested FX unavailable; no vendor fallback.
      security:
        - bearerAuth: []
components:
  schemas:
    Error:
      type: object
      required:
        - error
      properties:
        requestId:
          type: string
          description: Request identifier on new token endpoints.
        error:
          type: object
          required:
            - code
            - message
          properties:
            code:
              type: string
              description: Stable machine-readable code. Branch on this, not the message.
              example: no_route
            message:
              type: string
              description: Human-readable detail. May change.
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >-
        An OceanX API key, created in the app under Settings → Developer API.
        Send it as `Authorization: Bearer ox_live_…`. Required scopes are
        operation-specific: market reads use md.read, tracker uses tracker.read,
        copy reads use copy.read, and alert operations use alerts.read or
        alerts.write. New scopes require explicit selection and grant no trading
        authority. Existing perps operations retain their documented scopes.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.