Skip to main content

Base URLs

Decibel API supports two environments: Mainnet:
https://api.mainnet.aptoslabs.com/decibel
Testnet:
https://api.testnet.aptoslabs.com/decibel
Note about the API URL: The base URLs provide access to all Decibel markets and trading functionality. This includes perpetual futures markets, spot markets, and more.

Package Addresses

Each environment has its own package address: Mainnet Package Address:
0x50ead22afd6ffd9769e3b3d6e0e64a2a350d68e8b102c4e72e33d0b8cfdfdb06
Testnet Package Address:
0xe7da2794b1d8af76532ed95f38bfdf1136abfd8ea3a240189971988a83101b7f
No authentication required: The endpoints in this guide are public and don’t require authentication headers like OAuth or JWT. However, you do still need a Decibel Node API key to access the node; simply pass it as the Authorization header on your requests, in the format:
Authorization: Bearer <NODE_API_KEY>
Base URL Variable: In the code examples below, BASE_URL refers to either: - https://api.mainnet.aptoslabs.com/decibel for Mainnet - https://api.testnet.aptoslabs.com/decibel for Testnet Make sure to set this variable in your code before making requests.

Step 1: Get Available Markets

Let’s start by fetching the list of available markets. We’ll use the Get Markets endpoint to retrieve all active trading markets.
import requests

BASE_URL = "https://api.mainnet.aptoslabs.com/decibel"
NODE_API_KEY = "YOUR_NODE_API_KEY"
headers = {"Authorization": f"Bearer {NODE_API_KEY}"}

# Make a GET request to the markets endpoint

response = requests.get(f"{BASE_URL}/api/v1/markets", headers=headers)

# Check if the request was successful

if response.status_code == 200:
    markets = response.json()
    print(f"Found {len(markets)} markets") # Print first 5 markets
    for market in markets[:5]:
        print(f"- {market.get('market_name', 'N/A')} (leverage: {market.get('max_leverage', 'N/A')}x, addr: {market.get('market_addr', 'N/A')})")
else:
    print(f"Error: {response.status_code}")
    print(response.text)

Step 2: Get Market Prices

After obtaining the list of markets, you can query price information for a specific market—including Oracle price, mark price, mid price, funding rate, and open interest—using its market address.
import requests

BASE_URL = "https://api.mainnet.aptoslabs.com/decibel"
NODE_API_KEY = "YOUR_NODE_API_KEY"
headers = {"Authorization": f"Bearer {NODE_API_KEY}"}

# Replace 'market_address' with an actual market address from Step 1
# Example: "BTC/USD: 0x5e0e16f34adfb4b316f8d532d68acbfa206826feaaa418d3938046bdc2044861"
market_address = "0x5e0e16f34adfb4b316f8d532d68acbfa206826feaaa418d3938046bdc2044861"

# Get market details

response = requests.get(f"{BASE_URL}/api/v1/prices?market={market_address}", headers=headers)

if response.status_code == 200:
    data = response.json()
    if data:
        market = data[0]
        print(f"Market: {market.get('market', 'N/A')}")
        print(f"Oracle Price: {market.get('oracle_px', 'N/A')}")
        print(f"Mark Price: {market.get('mark_px', 'N/A')}")
        print(f"Mid Price: {market.get('mid_px', 'N/A')}")
        print(f"Funding Rate (bps): {market.get('funding_rate_bps', 'N/A')}")
        print(f"Open Interest: {market.get('open_interest', 'N/A')}")
    else:
        print("No data returned")
else:
    print(f"Error: {response.status_code}")
    print(response.text)

Step 3: Get Order Book Data

Now let’s retrieve the order book for a market, which shows the current buy and sell orders with their prices and sizes.
import requests

BASE_URL = "https://api.mainnet.aptoslabs.com/decibel"
NODE_API_KEY = "YOUR_NODE_API_KEY"
headers = {"Authorization": f"Bearer {NODE_API_KEY}"}

ticker_id = "BTC-PERP"

# Get order book
response = requests.get(
    f"{BASE_URL}/api/v1/orderbook",
    params={"ticker_id": ticker_id},
    headers=headers,
)

if response.status_code == 200:
    orderbook = response.json()
    print("Bids (Buy Orders):")
    for bid in orderbook.get("bids", [])[:5]:
        print(f"  Price: {bid[0]}, Size: {bid[1]}")

    print("\nAsks (Sell Orders):")
    for ask in orderbook.get("asks", [])[:5]:
        print(f"  Price: {ask[0]}, Size: {ask[1]}")
else:
    print(f"Error: {response.status_code}")


Step 4: Get Recent Trades

Finally, let’s fetch recent trades for a market to see the latest trading activity.
import requests

BASE_URL = "https://api.mainnet.aptoslabs.com/decibel"
NODE_API_KEY = "YOUR_NODE_API_KEY"
headers = {"Authorization": f"Bearer {NODE_API_KEY}"}

# Replace 'market_address' with an actual market address from Step 1
# Example: "BTC/USD: 0x5e0e16f34adfb4b316f8d532d68acbfa206826feaaa418d3938046bdc2044861"
market_address = "0x5e0e16f34adfb4b316f8d532d68acbfa206826feaaa418d3938046bdc2044861"

# Get recent trades
response = requests.get(
    f"{BASE_URL}/api/v1/trades",
    params={"market": market_address, "limit": 20, "offset": 0},
    headers=headers,
)

if response.status_code == 200:
    data = response.json()
    trades = data.get("items", [])
    total_count = data.get("total_count", 0)
    print(f"Recent Trades (Total: {total_count}):")
    for trade in trades[:10]:
        print(
            f"  Action: {trade.get('action')}, Price: {trade.get('price')}, "
            f"Size: {trade.get('size')}, PnL: {trade.get('realized_pnl_amount')}, "
            f"Fee: {trade.get('fee_amount')}"
        )
else:
    print(f"Error: {response.status_code}")
    print(response.text)