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

# List arbitrage scanner opportunities

> Returns cross-exchange funding-arbitrage opportunities grouped by coin. Each market pair appears in both trade directions. fundingSpread1h, priceSpread and priceSpreadAtSize are signed and direction-specific, so the two directions of a pair carry roughly opposite values; the maxFundingSpread and maxPriceSpread fields are each a maximum taken over that direction alone, so one direction value is not the negation of the other. Each leg keeps its own signed funding rate. Prices, funding rates and open interest are current live values. Each coin carries the `category` of its underlying; `GET /exchange/markets/categories` lists the categories available to filter by.



## OpenAPI

````yaml https://vooi-api-app.fly.dev/swagger/json get /arbitrage-scanner
openapi: 3.1.0
info:
  title: VOOI API
  description: Unified perps API
  version: '1.0'
  contact: {}
servers:
  - url: https://perps-api.vooi.io
security: []
tags: []
paths:
  /arbitrage-scanner:
    get:
      tags:
        - Arbitrage Scanner
      summary: List arbitrage scanner opportunities
      description: >-
        Returns cross-exchange funding-arbitrage opportunities grouped by coin.
        Each market pair appears in both trade directions. fundingSpread1h,
        priceSpread and priceSpreadAtSize are signed and direction-specific, so
        the two directions of a pair carry roughly opposite values; the
        maxFundingSpread and maxPriceSpread fields are each a maximum taken over
        that direction alone, so one direction value is not the negation of the
        other. Each leg keeps its own signed funding rate. Prices, funding rates
        and open interest are current live values. Each coin carries the
        `category` of its underlying; `GET /exchange/markets/categories` lists
        the categories available to filter by.
      operationId: ArbitrageScannerController_getArbitrageScanner
      parameters:
        - name: exchanges
          required: false
          in: query
          schema:
            anyOf:
              - type: string
                enum:
                  - aster
                  - binance
                  - bybit
                  - extended
                  - gate
                  - hyperliquid
                  - lighter
                  - mexc
                  - ondo
                  - robinhood
                description: Supported perpetual exchange
              - type: array
                items:
                  type: string
                  enum:
                    - aster
                    - binance
                    - bybit
                    - extended
                    - gate
                    - hyperliquid
                    - lighter
                    - mexc
                    - ondo
                    - robinhood
                  description: Supported perpetual exchange
        - name: categories
          required: false
          in: query
          schema:
            anyOf:
              - type: string
                enum:
                  - commodities
                  - crypto
                  - etf-index
                  - forex
                  - pre-ipo
                  - stocks-asia
                  - stocks-us
                description: Asset class of the market
              - type: array
                items:
                  type: string
                  enum:
                    - commodities
                    - crypto
                    - etf-index
                    - forex
                    - pre-ipo
                    - stocks-asia
                    - stocks-us
                  description: Asset class of the market
          description: >-
            Keep only coins whose asset class is one of these (repeat the query
            param to pass several); omit to keep every category. A coin has a
            single category because both legs are the same underlying.
        - name: excludeSymbols
          required: false
          in: query
          schema:
            anyOf:
              - type: string
                minLength: 1
                description: >-
                  Asset identifier: base symbol (e.g. "ETH") or full pair (e.g.
                  "ETHUSDC").
                example: ETH
              - type: array
                items:
                  type: string
                  minLength: 1
                  description: >-
                    Asset identifier: base symbol (e.g. "ETH") or full pair
                    (e.g. "ETHUSDC").
                  example: ETH
          description: >-
            Exclude these base symbols from the results (repeat the query param
            to pass several); a pair is dropped when at least one of its legs
            matches. Alias keys are not accepted.
        - name: limit
          required: false
          in: query
          schema:
            default: 15
            type: integer
            minimum: 1
            maximum: 100
          description: Number of coins to return per page (1–100).
        - name: minFundingSpread
          required: false
          in: query
          schema:
            type: string
            pattern: \d+(\.\d+)?
            example: '0.001'
          description: >-
            Keep only coins with at least one pair whose hourly funding spread
            is at least this decimal fraction.
        - name: minOpenInterest
          required: false
          in: query
          schema:
            type: number
            minimum: 0
          description: >-
            Keep only coins with at least one pair whose thinner leg has open
            interest of at least this USD notional (one-sided).
        - name: minPriceSpread
          required: false
          in: query
          schema:
            type: string
            pattern: \d+(\.\d+)?
            example: '0.001'
          description: >-
            Keep only coins with at least one pair whose price spread is at
            least this decimal fraction.
        - name: minVolume
          required: false
          in: query
          schema:
            type: string
            pattern: \d+(\.\d+)?
            example: '0.001'
          description: >-
            Keep only coins with at least one pair whose combined 24h volume in
            USD is at least this value.
        - name: notionalUsd
          required: false
          in: query
          schema:
            default: 1000
            type: number
            exclusiveMinimum: 0
          description: >-
            Notional in USD used to estimate per-leg slippage from the live
            order book.
        - name: offset
          required: false
          in: query
          schema:
            default: 0
            type: integer
            minimum: 0
            maximum: 9007199254740991
          description: Number of coins to skip.
        - name: orderBy
          required: false
          in: query
          schema:
            default: fundingSpread1h
            type: string
            enum:
              - fundingSpread1h
              - maxFundingSpread1h
              - maxFundingSpread24h
              - maxPriceSpread1h
              - maxPriceSpread24h
              - openInterest
              - priceSpread
              - volume24h
          description: >-
            Pair-level numeric field to rank coins by; each coin ranks by its
            best pair. `openInterest` ranks by the thinner leg of the pair and
            `volume24h` by both legs combined; the spread fields rank by the
            pair value itself.
        - name: orderDirection
          required: false
          in: query
          schema:
            default: desc
            type: string
            enum:
              - asc
              - desc
          description: Sort direction over the ranked coins.
        - name: query
          required: false
          in: query
          schema:
            type: string
            minLength: 1
          description: >-
            Case-insensitive substring search over the coin asset key (alias
            keys match by their name without the `alias:` prefix) and each leg's
            symbols.
        - name: symbol
          required: false
          in: query
          schema:
            type: string
          description: >-
            Return only the coin with this exact case-insensitive alias (if
            exists for market) or base symbol; combine with two exchanges to
            fetch a single cross-market pair in both trade directions.
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetArbitrageScannerResponseDto'
components:
  schemas:
    GetArbitrageScannerResponseDto:
      type: object
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/ScannerCoinDto'
          description: Coins for the requested page, in sorted order.
        total:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: Total number of coins matching the filters.
      required:
        - items
        - total
      title: GetArbitrageScannerResponse
    ScannerCoinDto:
      type: object
      properties:
        asset:
          type: string
          description: >-
            Coin grouping key: the cross-venue alias key (e.g. `alias:gold`)
            when defined, otherwise the base symbol shared by the paired markets
            across exchanges. Pass this value back as the `symbol` filter to
            fetch a single coin.
          example: alias:gold
        category:
          type: string
          enum:
            - commodities
            - crypto
            - etf-index
            - forex
            - pre-ipo
            - stocks-asia
            - stocks-us
          description: >-
            Asset class of the coin. It belongs to the underlying rather than
            the venue, so every pair and every leg of this coin carries the same
            value.
          example: commodities
        exchangeCount:
          type: number
          description: Number of distinct exchanges this coin trades on.
          example: 4
        pairs:
          type: array
          items:
            $ref: '#/components/schemas/ScannerPairDto'
          description: Every cross-exchange pair for this coin, in both trade directions.
      required:
        - asset
        - category
        - exchangeCount
        - pairs
      title: ScannerCoin
    ScannerPairDto:
      type: object
      properties:
        fundingSpread1h:
          type: string
          description: >-
            Hourly funding spread as a signed decimal fraction (short − long
            funding); opposite sign for the inverse direction.
          example: '0.0000215'
        long:
          $ref: '#/components/schemas/ScannerMarketLegDto'
          description: Leg you go long in this pair direction.
        maxFundingSpread1h:
          description: >-
            Highest funding spread over the last hour, signed (short − long
            funding); null when no precomputed data.
          example: '0.0000318'
          type:
            - string
            - 'null'
        maxFundingSpread24h:
          description: >-
            Highest funding spread over the last 24 hours, signed (short − long
            funding); null when no precomputed data.
          example: '0.0000512'
          type:
            - string
            - 'null'
        maxPriceSpread1h:
          description: >-
            Highest price spread over the last hour, signed ((short bid − long
            ask) / mid); null when no precomputed data.
          example: '0.0231'
          type:
            - string
            - 'null'
        maxPriceSpread24h:
          description: >-
            Highest price spread over the last 24 hours, signed ((short bid −
            long ask) / mid); null when no precomputed data.
          example: '0.0417'
          type:
            - string
            - 'null'
        priceSpread:
          description: >-
            Latest price spread as a signed decimal fraction ((short bid − long
            ask) / mid); null when no precomputed data.
          example: '0.0184'
          type:
            - string
            - 'null'
        priceSpreadAtSize:
          description: >-
            priceSpread recomputed at the requested notional from both legs fill
            prices, as a signed decimal fraction; it reads the live order books
            while priceSpread comes from a periodic snapshot, so the two can
            disagree by more than depth alone; null when either leg has no
            estimate at the requested notional.
          example: '0.0121'
          type:
            - string
            - 'null'
        short:
          $ref: '#/components/schemas/ScannerMarketLegDto'
          description: Leg you go short in this pair direction.
      required:
        - fundingSpread1h
        - long
        - maxFundingSpread1h
        - maxFundingSpread24h
        - maxPriceSpread1h
        - maxPriceSpread24h
        - priceSpread
        - priceSpreadAtSize
        - short
      title: ScannerPair
    ScannerMarketLegDto:
      type: object
      properties:
        baseSymbol:
          type: string
          description: Base currency symbol on this exchange.
          example: BTC
        bestAsk:
          description: >-
            Best ask on this exchange when the spread was last computed; null
            when no top of book is available.
          example: '65001.0'
          type:
            - string
            - 'null'
        bestBid:
          description: >-
            Best bid on this exchange when the spread was last computed; null
            when no top of book is available.
          example: '65000.0'
          type:
            - string
            - 'null'
        depthImpact:
          description: >-
            Price impact past the top of book for the leg side at the requested
            notional, as a percentage that excludes the half-spread; null when
            no estimate is available at the requested notional.
          example: 0.08
          type:
            - number
            - 'null'
        exchange:
          type: string
          enum:
            - aster
            - binance
            - bybit
            - extended
            - gate
            - hyperliquid
            - lighter
            - mexc
            - ondo
            - robinhood
          description: Perpetual exchange
        fundingRate:
          type: string
          description: Current funding rate normalized to 1 hour, as a decimal fraction.
          example: '0.0000125'
        marketId:
          type: string
          description: Venue-specific market identifier on this exchange.
          example: BTCUSDT
        maxLeverage:
          type: number
          description: Maximum leverage available on this exchange.
          example: 20
        nextFundingTime:
          description: Timestamp of the next funding settlement.
          example: '2026-07-17T12:00:00.000Z'
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z))$
        openInterest:
          type: string
          description: >-
            Open interest as USD notional, one-sided. Multiply by 2 for
            two-sided.
          example: '12345678.9'
        price:
          type: string
          description: >-
            Latest price the exchange reported for this market, in the quote
            currency.
          example: '65000.5'
        price24hPercent:
          type: number
          description: Price change over the last 24 hours as a percentage.
          example: -1.23
        quoteSymbol:
          type: string
          description: Quote currency symbol on this exchange.
          example: USDT
        slippage:
          description: >-
            Estimated slippage against the local mid price as a percentage for
            the leg side at the requested notional; null when no estimate is
            available at that notional.
          example: 0.12
          type:
            - number
            - 'null'
        volume24h:
          type: number
          description: 24-hour trading volume for this market on this exchange in USD.
          example: 3400000
      required:
        - baseSymbol
        - bestAsk
        - bestBid
        - depthImpact
        - exchange
        - fundingRate
        - marketId
        - maxLeverage
        - nextFundingTime
        - openInterest
        - price
        - price24hPercent
        - quoteSymbol
        - slippage
        - volume24h
      title: ScannerMarketLeg

````

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