Skip to main content
No official Python SDK is required — the REST API works directly with requests or httpx.

Setup

pip install requests
import requests

BASE_URL = "https://api.marketdataset.ai"
API_KEY = "sk_your_key_here"
HEADERS = {"X-API-KEY": API_KEY}

Fetch forex OHLCV

response = requests.get(
    f"{BASE_URL}/forex/prices",
    params={
        "pair": "EURUSD",
        "interval": "hour",
        "start_date": "2024-01-01",
        "end_date": "2024-01-31",
        "limit": 500,
    },
    headers=HEADERS,
)
data = response.json()
print(f"Fetched {len(data['forex_prices'])} candles")

Paginate through all results

def fetch_all(endpoint: str, params: dict) -> list:
    """Fetch all pages from a MarketDataset endpoint."""
    all_results = []
    url = f"{BASE_URL}/{endpoint}"

    while url:
        response = requests.get(url, params=params, headers=HEADERS)
        response.raise_for_status()
        data = response.json()

        # Get the first result key (forex_prices, funding_rates, etc.)
        result_key = [k for k in data if k not in ("next_page_url", "meta")][0]
        all_results.extend(data[result_key])

        url = data.get("next_page_url")
        params = {}  # params are encoded in next_page_url

    return all_results

candles = fetch_all("forex/prices", {"pair": "GBPUSD", "interval": "day"})
print(f"Total candles: {len(candles)}")

Convert to pandas DataFrame

import pandas as pd

response = requests.get(
    f"{BASE_URL}/crypto/prices",
    params={"symbol": "BTC", "interval": "day", "limit": 365},
    headers=HEADERS,
)
df = pd.DataFrame(response.json()["crypto_prices"])
df["time"] = pd.to_datetime(df["time"])
df = df.set_index("time").sort_index()
print(df.tail())

Fetch with retry on rate limit

import time

def fetch_with_retry(url: str, params: dict, max_retries: int = 3) -> dict:
    for attempt in range(max_retries):
        response = requests.get(url, params=params, headers=HEADERS)
        if response.status_code == 429:
            wait = 2 ** attempt
            print(f"Rate limited. Waiting {wait}s...")
            time.sleep(wait)
            continue
        response.raise_for_status()
        return response.json()
    raise Exception("Max retries exceeded")