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")