{
  "openapi": "3.1.0",
  "info": {
    "title": "Swopus swap and market data API",
    "version": "2026-10-02",
    "summary": "Quote a swap on Swopus pools on KleverChain, get the transaction to sign, and read pools, trades, candles and prices.",
    "description": "Read-only, no API key, CORS open. Guide: https://swopus.com/docs/api\n\n- Numbers are strings. Amounts ending in _raw, and amount_in / total_out / min_total_out and similar, are in the token's base units: divide by 10^decimals (precision differs per token; never assume one).\n- Token ids are KleverChain asset ids: KLV, KFI, and TICKER-XXXX for everything else (USDT-23V8, USDC-1LN4).\n- Fields are only ever added. Ignore fields you do not know; unknown values are null.\n- Rate limits, per IP: 120 requests a minute for data, 60 a minute for /api/route. Past that the answer is 429 with Retry-After (and retry_after_s in the body).\n- Signing, broadcasting and on-chain reads go through your own KleverChain node or Klever's public endpoints, not this API.\n- Endpoints not in this document are internal to the Swopus app and change without notice.",
    "contact": { "email": "contact@swopus.com", "url": "https://swopus.com/docs/api" },
    "termsOfService": "https://swopus.com/terms"
  },
  "servers": [{ "url": "https://api4.swopus.com" }],
  "security": [],
  "tags": [
    { "name": "Swap", "description": "Quote and plan a swap on Swopus pools." },
    { "name": "Market data", "description": "Pools, trades, reserves, candles, token prices. 120 requests a minute per IP." }
  ],
  "paths": {
    "/api/route": {
      "get": {
        "tags": ["Swap"],
        "operationId": "getRoute",
        "summary": "Best route through Swopus pools, with the transaction plan",
        "description": "With venue=swopus: the best route for an amount through Swopus pools (constant product and stable), on a single pool or over up to three hops through the Swopus router. A route is never split. With includeExecution=true the answer carries execution: the contract, endpoint, typed arguments and payment to sign with your own key. Sign within quote_ttl_ms; min_total_out is enforced on-chain.\n\nRate limit: 60 requests a minute per IP.",
        "parameters": [
          { "name": "token_in", "in": "query", "required": true, "description": "Asset id you pay with.", "schema": { "type": "string" }, "example": "KLV" },
          { "name": "token_out", "in": "query", "required": true, "description": "Asset id you receive.", "schema": { "type": "string" }, "example": "USDT-23V8" },
          { "name": "amount_in", "in": "query", "required": true, "description": "Base units of token_in (a positive integer, as a string).", "schema": { "type": "string", "pattern": "^[0-9]+$" }, "example": "10000000000" },
          { "name": "venue", "in": "query", "required": true, "description": "swopus: Swopus pools only. Always pass it.", "schema": { "type": "string", "enum": ["swopus"] } },
          { "name": "slippage_bps", "in": "query", "required": false, "description": "Tolerance for min_total_out, in basis points (50 = 0.5 %). Default 50.", "schema": { "type": "integer", "minimum": 0, "maximum": 10000, "default": 50 } },
          { "name": "includeExecution", "in": "query", "required": false, "description": "true adds execution, the transaction plan. Note the camelCase.", "schema": { "type": "boolean", "default": false } },
          { "name": "recipient", "in": "query", "required": false, "description": "Required with includeExecution=true. Your klv1… address; it must be the account that signs. A single-pool plan pays it explicitly; the router always pays the signer.", "schema": { "type": "string" } }
        ],
        "responses": {
          "200": { "description": "A route.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Route" } } } },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "404": { "description": "No route exists for this pair and size.", "content": { "application/json": { "schema": { "type": "object", "properties": { "error": { "type": "string" }, "token_in": { "type": "string" }, "token_out": { "type": "string" } } } } } },
          "429": { "$ref": "#/components/responses/RateLimited" }
        }
      }
    },
    "/api/public/pools": {
      "get": {
        "tags": ["Market data"],
        "operationId": "getPublicPools",
        "summary": "Every pool with reserves, fees and TVL",
        "description": "Every Swopus pool: address, kind, tokens and decimals, reserves (raw and scaled), fee, TVL. Deprecated pools are listed with deprecated: true (their history still resolves) and are not used for routing. Token order inside a pool is the pool's own: base = token0, quote = token1. Cache: 15 s.",
        "responses": {
          "200": { "description": "All pools.", "headers": { "Cache-Control": { "schema": { "type": "string" }, "example": "public, max-age=15" } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PoolsFeed" } } } },
          "429": { "$ref": "#/components/responses/RateLimited" }
        }
      }
    },
    "/api/public/trades": {
      "get": {
        "tags": ["Market data"],
        "operationId": "getPublicTrades",
        "summary": "Every swap in Swopus pools, oldest first",
        "description": "Every swap in Swopus pools, decoded from the pools' own events (direct or through a router), with how it was routed, amounts, price and reserves after. Oldest first, ordered by block and log index.\n\nPolling: page forward with cursor (take next_cursor). Now and then also re-read rescan_from_block … as_of_block with from_block / to_block and de-duplicate on (tx_hash, log_idx): a trade indexed late can land below your cursor. as_of_block is the confirmed ceiling. Cache: 5 s.",
        "parameters": [
          { "name": "since_ts", "in": "query", "required": false, "description": "Unix seconds. Not together with from_block / to_block.", "schema": { "type": "integer", "format": "int64" } },
          { "name": "from_block", "in": "query", "required": false, "schema": { "type": "integer", "format": "int64" } },
          { "name": "to_block", "in": "query", "required": false, "description": "Requires from_block; at most 50,000 blocks per request.", "schema": { "type": "integer", "format": "int64" } },
          { "name": "limit", "in": "query", "required": false, "schema": { "type": "integer", "minimum": 1, "maximum": 1000, "default": 500 } },
          { "name": "cursor", "in": "query", "required": false, "description": "The opaque next_cursor of a previous page.", "schema": { "type": "string" } }
        ],
        "responses": {
          "200": { "description": "A page of trades.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TradesFeed" } } } },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        }
      }
    },
    "/api/pools/reserves": {
      "get": {
        "tags": ["Market data"],
        "operationId": "getPoolReserves",
        "summary": "Current reserves for the pools you name — the one to poll",
        "description": "Current reserves for up to 50 pools, constant-product and stable, with the block they were last updated at and how far the indexer is behind the chain. Not cached. The reserves a bot acts on should come from the chain or from here, not from a cached feed.",
        "parameters": [
          { "name": "pair_ids", "in": "query", "required": true, "description": "Comma-separated pair ids, at most 50.", "schema": { "type": "string", "pattern": "^[0-9]+(,[0-9]+)*$" }, "example": "5,8,29" }
        ],
        "responses": {
          "200": { "description": "Reserves.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Reserves" } } } },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        }
      }
    },
    "/api/pools/{pair_id}/ohlc": {
      "get": {
        "tags": ["Market data"],
        "operationId": "getPoolOhlc",
        "summary": "Candles for one pool",
        "description": "Price candles (token1 per token0, scaled by decimals) with volume in each token and the swap count. A bucket without a reserves snapshot has unknown prices: open/high/low/close are null there, never 0. Default window: the last 7 days.",
        "parameters": [
          { "name": "pair_id", "in": "path", "required": true, "schema": { "type": "integer" } },
          { "name": "interval", "in": "query", "required": false, "schema": { "type": "string", "enum": ["1h", "1d"], "default": "1h" } },
          { "name": "from", "in": "query", "required": false, "description": "Unix seconds. Default: 7 days ago.", "schema": { "type": "integer", "format": "int64" } },
          { "name": "to", "in": "query", "required": false, "description": "Unix seconds. Default: now.", "schema": { "type": "integer", "format": "int64" } }
        ],
        "responses": {
          "200": { "description": "Candles.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Ohlc" } } } },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        }
      }
    },
    "/api/tokens/overview": {
      "get": {
        "tags": ["Market data"],
        "operationId": "getTokensOverview",
        "summary": "Per token: price, 24 h change, volume and TVL",
        "description": "Per token on Swopus pools: price_usd, price_klv, 24 h change, volume_24h_usd, volume_7d_usd, tvl_usd. The conventions object explains each figure. USD prices are pool prices × klv_usd (an external reference).",
        "responses": {
          "200": { "description": "Overview.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TokensOverview" } } } },
          "429": { "$ref": "#/components/responses/RateLimited" }
        }
      }
    },
    "/api/tokens": {
      "get": {
        "tags": ["Market data"],
        "operationId": "getTokens",
        "summary": "Every listed asset",
        "description": "Every listed asset: asset_id, ticker, decimals, price in KLV, 24 h change, whether it is tradable, logo.",
        "responses": {
          "200": { "description": "Tokens.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Tokens" } } } },
          "429": { "$ref": "#/components/responses/RateLimited" }
        }
      }
    },
    "/api/prices/reference": {
      "get": {
        "tags": ["Market data"],
        "operationId": "getReferencePrices",
        "summary": "KLV/USD and reference dollar prices",
        "description": "klv_usd and reference dollar prices from an external market source, named in source. Both are null while that source is unavailable — handle it.",
        "responses": {
          "200": { "description": "Reference prices.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ReferencePrices" } } } },
          "429": { "$ref": "#/components/responses/RateLimited" }
        }
      }
    }
  },
  "components": {
    "responses": {
      "BadRequest": {
        "description": "A parameter is missing or malformed; error says which.",
        "content": { "application/json": { "schema": { "type": "object", "required": ["error"], "properties": { "error": { "type": "string" } } } } }
      },
      "RateLimited": {
        "description": "Too many requests from this address (120 a minute for data, 60 a minute for /api/route). Wait Retry-After seconds.",
        "headers": { "Retry-After": { "description": "Seconds to wait.", "schema": { "type": "integer" } } },
        "content": { "application/json": { "schema": { "type": "object", "required": ["error", "reason", "retry_after_s"], "properties": {
          "error": { "type": "string" }, "reason": { "type": "string", "const": "RateLimited" }, "retry_after_s": { "type": "integer" } } } } }
      }
    },
    "schemas": {
      "Raw": { "type": "string", "pattern": "^[0-9]+$", "description": "An integer amount in base units, as a string." },
      "Route": {
        "type": "object",
        "required": ["found", "token_in", "token_out", "amount_in", "total_out", "min_total_out", "backend", "is_split", "paths", "quote_ttl_ms"],
        "properties": {
          "found": { "type": "boolean", "description": "false when no route exists for the pair and size." },
          "token_in": { "type": "string" },
          "token_out": { "type": "string" },
          "amount_in": { "$ref": "#/components/schemas/Raw" },
          "total_out": { "$ref": "#/components/schemas/Raw", "description": "Expected output." },
          "min_total_out": { "$ref": "#/components/schemas/Raw", "description": "The floor after slippage_bps; enforced on-chain." },
          "backend": { "type": "string", "description": "v2-pool-direct (one pool) or v2-router (several hops through the Swopus router)." },
          "is_split": { "type": "boolean", "description": "Always false with venue=swopus." },
          "price_impact_bps": { "type": "integer", "description": "How far this size moves the price." },
          "paths": { "type": "array", "items": { "$ref": "#/components/schemas/RoutePath" } },
          "router_fee": { "type": ["object", "null"], "description": "Zero on Swopus-pool routes.", "properties": {
            "allowed": { "type": "boolean" }, "fee_bps": { "type": "integer" }, "fee_amount_raw": { "$ref": "#/components/schemas/Raw" },
            "min_swap_amount_raw": { "$ref": "#/components/schemas/Raw" }, "policy_source": { "type": "integer" } } },
          "network_fee": { "type": ["object", "null"], "description": "Estimated KleverChain network fee, in KLV base units. The fee in the built transaction is the real figure.", "properties": {
            "bandwidth_fee_estimate_raw": { "$ref": "#/components/schemas/Raw" }, "k_app_fee_raw": { "$ref": "#/components/schemas/Raw" },
            "total_estimate_raw": { "$ref": "#/components/schemas/Raw" }, "confidence": { "type": "string", "examples": ["estimate"] } } },
          "savings": { "type": ["object", "null"], "description": "Zero on a single route.", "properties": {
            "token_out_raw": { "$ref": "#/components/schemas/Raw" }, "klv_equiv_raw": { "$ref": "#/components/schemas/Raw" }, "vs": { "type": "string" } } },
          "execution": { "oneOf": [{ "$ref": "#/components/schemas/Execution" }, { "type": "null" }], "description": "Present with includeExecution=true." },
          "quote_ttl_ms": { "type": "integer", "description": "How long to treat the quote as current (20000)." }
        }
      },
      "RoutePath": {
        "type": "object",
        "properties": {
          "share_bps": { "type": "integer", "description": "10000: a route is never split." },
          "amount_in": { "$ref": "#/components/schemas/Raw" },
          "amount_out": { "$ref": "#/components/schemas/Raw" },
          "legs": { "type": "array", "items": { "$ref": "#/components/schemas/RouteLeg" } }
        }
      },
      "RouteLeg": {
        "type": "object",
        "description": "One hop. Pool fees are already inside the amounts.",
        "properties": {
          "dex_source": { "type": "string", "examples": ["swopus-v2", "swopus-v2-stable"] },
          "venue": { "type": "string" },
          "pool_address": { "type": "string" },
          "route_id": { "type": ["integer", "null"] },
          "token_in": { "type": "string" },
          "token_out": { "type": "string" },
          "amount_in": { "$ref": "#/components/schemas/Raw" },
          "amount_out": { "$ref": "#/components/schemas/Raw" },
          "min_out": { "$ref": "#/components/schemas/Raw" },
          "reserves_age_sec": { "type": "integer", "description": "How old the reserves behind the quote are." }
        }
      },
      "Execution": {
        "type": "object",
        "description": "The transaction plan. Encode endpoint@arg1@arg2… (each argument hex-encoded per its type), base64 it into data, attach pay_amount of pay_token as the payment, sign with the account given as recipient. Treat args as opaque: arguments of type hex are already encoded for the contract.",
        "required": ["backend", "target", "endpoint", "args", "pay_token", "pay_amount", "min_total_out"],
        "properties": {
          "backend": { "type": "string", "enum": ["v2-pool-direct", "v2-router"] },
          "target": { "type": "string", "description": "The contract to call (a pool, or the Swopus router)." },
          "endpoint": { "type": "string", "examples": ["swapExactIn", "executePairPathPlanned"] },
          "args": { "type": "array", "items": { "type": "object", "required": ["type", "value"], "properties": {
            "type": { "type": "string", "enum": ["string", "bi", "u64", "hex", "address"], "description": "string: UTF-8 bytes; bi: minimal big-endian bytes; u64: 8 bytes big-endian; hex: pass through; address: klv1… decoded to 32 bytes." },
            "value": { "type": "string" } } } },
          "pay_token": { "type": "string" },
          "pay_amount": { "$ref": "#/components/schemas/Raw" },
          "min_total_out": { "$ref": "#/components/schemas/Raw" },
          "deadline_ts": { "type": "integer", "description": "0: neither plan carries a deadline; min_total_out is the protection." },
          "label": { "type": "string" }
        }
      },
      "PoolsFeed": {
        "type": "object",
        "properties": {
          "pools": { "type": "array", "items": { "$ref": "#/components/schemas/PublicPool" } },
          "pool_count": { "type": "integer" },
          "as_of_block": { "type": "integer", "format": "int64" },
          "as_of_ts": { "type": "integer", "format": "int64" },
          "apr_unit": { "type": "string" }
        }
      },
      "PublicPool": {
        "type": "object",
        "properties": {
          "pair_id": { "type": "integer" },
          "pool_address": { "type": "string" },
          "kind": { "type": "string", "enum": ["pool-cp", "pool-stable"] },
          "lp_asset_id": { "type": ["string", "null"] },
          "base_asset_id": { "type": "string", "description": "token0" },
          "base_ticker": { "type": "string" },
          "base_decimals": { "type": "integer" },
          "quote_asset_id": { "type": "string", "description": "token1" },
          "quote_ticker": { "type": "string" },
          "quote_decimals": { "type": "integer" },
          "reserve0_raw": { "$ref": "#/components/schemas/Raw" },
          "reserve1_raw": { "$ref": "#/components/schemas/Raw" },
          "reserve0": { "type": "string", "description": "Scaled by base_decimals." },
          "reserve1": { "type": "string", "description": "Scaled by quote_decimals." },
          "lp_total_supply": { "type": "string" },
          "fee_bps": { "type": "integer", "description": "Pool fee on the input, to liquidity providers. Read it live; it can change. Stable pools add a dynamic part when a trade worsens their balance." },
          "created_at": { "type": ["string", "null"] },
          "deprecated": { "type": "boolean" },
          "verified": { "type": "boolean" },
          "tvl_klv": { "type": ["string", "null"] },
          "tvl_usd": { "type": ["string", "null"] },
          "fee_apr_pct": { "type": ["string", "null"] },
          "farm_apr_pct": { "type": ["string", "null"] },
          "total_apr_pct": { "type": ["string", "null"] }
        }
      },
      "TradesFeed": {
        "type": "object",
        "properties": {
          "trades": { "type": "array", "items": { "$ref": "#/components/schemas/Trade" } },
          "next_cursor": { "type": ["string", "null"] },
          "from_block": { "type": "integer", "format": "int64" },
          "to_block": { "type": "integer", "format": "int64" },
          "pool_count": { "type": "integer" },
          "as_of_block": { "type": "integer", "format": "int64", "description": "The confirmed ceiling: newer trades exist but are not yet final." },
          "rescan_from_block": { "type": "integer", "format": "int64", "description": "Re-read from here to as_of_block now and then; a late-indexed trade can land below your cursor." }
        }
      },
      "Trade": {
        "type": "object",
        "description": "One swap in one pool (a multi-hop swap is one trade per hop). Unique by (tx_hash, log_idx).",
        "properties": {
          "tx_hash": { "type": "string" },
          "log_idx": { "type": "integer" },
          "block_nonce": { "type": "integer", "format": "int64" },
          "ts": { "type": "integer", "format": "int64" },
          "pair_id": { "type": "integer" },
          "pool_address": { "type": "string" },
          "token_in": { "type": "string" },
          "token_out": { "type": "string" },
          "amount_in_raw": { "$ref": "#/components/schemas/Raw" },
          "amount_out_raw": { "$ref": "#/components/schemas/Raw" },
          "amount_in": { "type": "string" },
          "amount_out": { "type": "string" },
          "token_in_decimals": { "type": "integer" },
          "token_out_decimals": { "type": "integer" },
          "side": { "type": "string", "enum": ["buy", "sell"], "description": "Relative to the pool's base (token0): buy = base bought." },
          "price": { "type": "string", "description": "Quote per base." },
          "maker": { "type": ["string", "null"] },
          "source": { "type": "string", "description": "How the trade reached the pool. Known values: direct, router, limit, aggregator, arb, zap, volume-bot, contract. New values may be added." },
          "reserve0_after_raw": { "$ref": "#/components/schemas/Raw" },
          "reserve1_after_raw": { "$ref": "#/components/schemas/Raw" },
          "reserve0_after": { "type": "string" },
          "reserve1_after": { "type": "string" }
        }
      },
      "Reserves": {
        "type": "object",
        "properties": {
          "pools": { "type": "array", "items": { "type": "object", "properties": {
            "pair_id": { "type": "integer" },
            "reserve0": { "$ref": "#/components/schemas/Raw" },
            "reserve1": { "$ref": "#/components/schemas/Raw" },
            "last_updated_block": { "type": "integer", "format": "int64" },
            "ts": { "type": "integer", "format": "int64" },
            "lp_total_supply": { "type": "string" } } } },
          "as_of": { "type": "integer", "format": "int64" },
          "indexer_lag_blocks": { "type": "integer" },
          "stale": { "type": "boolean" }
        }
      },
      "Ohlc": {
        "type": "object",
        "properties": {
          "pair_id": { "type": "integer" },
          "interval": { "type": "string", "enum": ["1h", "1d"] },
          "from": { "type": "integer", "format": "int64" },
          "to": { "type": "integer", "format": "int64" },
          "as_of": { "type": "integer", "format": "int64" },
          "candles": { "type": "array", "items": { "type": "object", "properties": {
            "ts": { "type": "integer", "format": "int64" },
            "open": { "type": ["string", "null"] },
            "high": { "type": ["string", "null"] },
            "low": { "type": ["string", "null"] },
            "close": { "type": ["string", "null"] },
            "volume_token0": { "type": "string" },
            "volume_token1": { "type": "string" },
            "swap_count": { "type": "integer" } } } }
        }
      },
      "TokensOverview": {
        "type": "object",
        "properties": {
          "as_of": { "type": "integer", "format": "int64" },
          "klv_usd": { "type": ["string", "null"] },
          "reference_usd": { "type": ["object", "null"], "additionalProperties": { "type": "string" } },
          "conventions": { "type": "object", "additionalProperties": { "type": "string" }, "description": "What each figure means." },
          "tokens": { "type": "array", "items": { "type": "object", "properties": {
            "asset_id": { "type": "string" },
            "ticker": { "type": "string" },
            "name": { "type": ["string", "null"] },
            "decimals": { "type": "integer" },
            "logo": { "type": ["string", "null"] },
            "price_usd": { "type": ["string", "null"] },
            "price_klv": { "type": ["string", "null"] },
            "delta_24h_pct": { "type": ["string", "null"] },
            "volume_24h_usd": { "type": ["string", "null"], "description": "On Swopus pools." },
            "base_volume_24h_usd": { "type": ["string", "null"] },
            "volume_24h_delta_pct": { "type": ["string", "null"] },
            "volume_7d_usd": { "type": ["string", "null"], "description": "On Swopus pools." },
            "tvl_usd": { "type": ["string", "null"], "description": "On Swopus pools." },
            "volume_24h_usd_by_venue": { "type": ["object", "null"], "additionalProperties": { "type": "string" }, "description": "Per venue; see conventions." },
            "volume_24h_usd_total": { "type": ["string", "null"], "description": "All venues; see conventions." },
            "volume_7d_usd_by_venue": { "type": ["object", "null"], "additionalProperties": { "type": "string" } },
            "volume_7d_usd_total": { "type": ["string", "null"] },
            "tvl_usd_by_venue": { "type": ["object", "null"], "additionalProperties": { "type": "string" } },
            "tvl_usd_total": { "type": ["string", "null"] },
            "pool_count": { "type": "integer" },
            "deepest_pair_id": { "type": ["integer", "null"] },
            "deepest_counterpart": { "type": ["string", "null"] },
            "superseded_by": { "type": ["string", "null"] },
            "is_legacy": { "type": "boolean" },
            "ticker_ambiguous": { "type": "boolean" } } } }
        }
      },
      "Tokens": {
        "type": "object",
        "properties": {
          "tokens": { "type": "array", "items": { "type": "object", "properties": {
            "asset_id": { "type": "string" },
            "decimals": { "type": "integer" },
            "ticker": { "type": "string" },
            "name": { "type": ["string", "null"] },
            "price_in_klv": { "type": ["string", "null"] },
            "price_change_24h_pct": { "type": ["string", "null"] },
            "price_source": { "type": ["string", "null"] },
            "tradable": { "type": "boolean" },
            "logo": { "type": ["string", "null"] },
            "superseded_by": { "type": ["string", "null"] },
            "is_legacy": { "type": "boolean" },
            "ticker_ambiguous": { "type": "boolean" } } } }
        }
      },
      "ReferencePrices": {
        "type": "object",
        "properties": {
          "klv_usd": { "type": ["string", "null"] },
          "reference_usd": { "type": ["object", "null"], "additionalProperties": { "type": "string" } },
          "source": { "type": ["string", "null"], "description": "Which external market source the figures come from." },
          "klv_usd_as_of": { "type": ["integer", "null"], "format": "int64", "description": "Unix seconds when klv_usd was fetched from that source. The last good value is served past a failed refresh: reject it by age if a stale rate would hurt you." },
          "klv_usd_source": { "type": ["string", "null"], "examples": ["kucoin", "coingecko"], "description": "The source of klv_usd (same as source)." }
        }
      }
    }
  }
}
