2026 French Stock API: Real-Time Quotes, Historical Data & Financials

In 2026, with the rapid advancement of quantitative trading and robo-advisory solutions, European equity markets—particularly France’s Euronext Paris—have become increasingly important data sources. Blue-chip names such as LVMH, L'Oréal, TotalEnergies, and Airbus are not only core constituents of global portfolios but also critical inputs for cross-market arbitrage and multi-factor models. This article provides a detailed guide on accessing French equity data through the iTick API, covering real-time quotes, historical bars, and fundamental financial metrics, complete with production-ready Python integration examples.
I. Why Professional French Equity Data APIs Are Essential
France hosts Europe’s second-largest equity market by capitalization. Its flagship CAC 40 index attracts significant global institutional and systematic capital. However, obtaining clean, low-latency, and comprehensive French market data presents three major challenges:
- Fragmented data sources — European exchange formats vary widely and require significant normalization effort
- Latency sensitivity — Most free/public APIs deliver 15-minute delayed data, unacceptable for latency-aware strategies
- Limited historical depth — Robust backtesting demands long, high-quality historical series that consumer-grade APIs rarely provide
iTick addresses these pain points by offering unified, institutional-grade coverage of Euronext Paris — from real-time Level 1 quotes to deep fundamental datasets.
II. Why iTick Remains the Leading Choice for French Equity Data in 2026
After evaluating major financial data providers, iTick consistently stands out for developers and quant teams focused on European markets.
| Dimension | iTick API | Traditional Free APIs | Institutional Data Vendors |
|---|---|---|---|
| French Market Coverage | Full Euronext Paris + CAC 40 | Partial / delayed only | Comprehensive but expensive |
| Real-time Latency | <50 ms via WebSocket | 15-minute delay | <10 ms (very high cost) |
| Historical Depth | >15 years | 1–2 years | Full history (premium) |
| Fundamental Metrics | Comprehensive key ratios & financials | Minimal or absent | Available (extra charge) |
| Free Tier | Unlimited base quotes + historical daily bars | Strict quota limits | No free tier |
Key Advantages of iTick
- True pan-European coverage — Full access to all Euronext Paris-listed securities (large-cap to mid/small-cap) through a single, consistent API.
- Developer-first experience — Clean REST + WebSocket endpoints, concise documentation, multi-language samples, rapid onboarding.
- Flexible tiers — Generous free plan suitable for research, prototyping, and light production; cost-effective paid plans for professional usage.
- Data quality & reliability — Multi-source validation, regional low-latency routing, hot failover — production-grade stability.
III. Python Integration Walkthrough: Accessing French Equity Data
The examples below use the requests, websocket-client, pandas and matplotlib libraries.
pip install requests websocket-client pandas matplotlib
Step 1: Obtain API Token
Register at https://itick.org (≈30 seconds, no credit card required). Retrieve your personal API token from the developer dashboard.
Step 2: Real-Time Quote via REST API
Example: retrieving live quote for LVMH (Euronext Paris ticker: MC)
import requests
from datetime import datetime
# Replace with your actual token
API_TOKEN = "your_api_token_here"
BASE_URL = "https://api.itick.org"
def get_french_stock_quote(symbol: str):
"""
Fetch real-time quote for a French-listed equity
:param symbol: local ticker (e.g. "MC" for LVMH)
"""
url = f"{BASE_URL}/stock/quote"
params = {
"region": "FR",
"code": symbol
}
headers = {
"accept": "application/json",
"token": API_TOKEN
}
try:
resp = requests.get(url, params=params, headers=headers, timeout=5)
resp.raise_for_status()
result = resp.json()
if result.get("code") == 0:
data = result["data"]
print(f"Name: {data.get('n', 'N/A')}")
print(f"Symbol: {data.get('s', 'N/A')}")
print(f"Last: {data.get('ld', 'N/A')} EUR")
print(f"Open: {data.get('o', 'N/A')} EUR")
print(f"High: {data.get('h', 'N/A')} EUR")
print(f"Low: {data.get('l', 'N/A')} EUR")
print(f"Volume: {data.get('v', 'N/A')} shares")
print(f"Change %: {data.get('chp', 'N/A')}%")
ts = data.get('t', 0) / 1000
dt = datetime.fromtimestamp(ts)
print(f"Timestamp: {dt.strftime('%Y-%m-%d %H:%M:%S')}")
return data
else:
print(f"API Error: {result.get('msg', 'Unknown')}")
return None
except Exception as e:
print(f"Request failed: {e}")
return None
# Example usage
quote = get_french_stock_quote("MC")
Step 3: Historical OHLCV Bars (Backtesting Foundation)
Example: downloading daily bars for TotalEnergies (TTE)
import requests
import pandas as pd
import matplotlib.pyplot as plt
def get_french_stock_kline(symbol: str, ktype: int = 8, limit: int = 100):
"""
Fetch historical bars
ktype: 1=1min, 2=5min, ..., 8=daily, 9=weekly, 10=monthly
"""
url = f"{BASE_URL}/stock/kline"
params = {
"region": "FR",
"code": symbol,
"kType": str(ktype),
"limit": str(limit)
}
headers = {"accept": "application/json", "token": API_TOKEN}
try:
resp = requests.get(url, params=params, headers=headers)
result = resp.json()
if result.get("code") == 0:
bars = result.get("data", [])
if not bars:
print("No data returned")
return None
df = pd.DataFrame(bars)
df['datetime'] = pd.to_datetime(df['t'], unit='ms')
df.set_index('datetime', inplace=True)
df.rename(columns={
'o': 'open', 'h': 'high', 'l': 'low',
'c': 'close', 'v': 'volume'
}, inplace=True)
for col in ['open','high','low','close','volume']:
df[col] = pd.to_numeric(df[col], errors='coerce')
print(f"Retrieved {len(df)} bars")
print(df[['open','high','low','close','volume']].head())
# Quick visualization
df['close'].plot(figsize=(12,6), title=f"{symbol} Closing Price")
plt.grid(True)
plt.show()
return df
else:
print(f"API Error: {result.get('msg')}")
return None
except Exception as e:
print(f"Exception: {e}")
return None
# Download last 100 daily bars of TotalEnergies
df_total = get_french_stock_kline("TTE", ktype=8, limit=100)
Step 4: Fundamental / Financial Metrics
def get_french_stock_fundamentals(symbol: str):
url = f"{BASE_URL}/stock/info"
params = {"region": "FR", "code": symbol, "type": "stock"}
headers = {"accept": "application/json", "token": API_TOKEN}
try:
resp = requests.get(url, params=params, headers=headers)
result = resp.json()
if result.get("code") == 0:
items = result.get("data", [])
print(f"Financials for {symbol}")
for item in items[:3]: # show most recent 3 periods
print(f"Market Cap: {item.get('mcb')}")
print(f"Shares Out: {item.get('tso')}")
print(f"P/E Ratio: {item.get('pet')}")
print("-" * 40)
return items
else:
print(f"API Error: {result.get('msg')}")
return None
except Exception as e:
print(f"Exception: {e}")
return None
# Example: L'Oréal fundamentals
fundamentals_or = get_french_stock_fundamentals("OR")
Step 5: Low-Latency Real-Time Streaming via WebSocket
import websocket
import json
import threading
import time
WS_URL = "wss://api.itick.org/stock"
API_TOKEN = "your_api_token_here"
def on_message(ws, message):
data = json.loads(message)
if "data" in data:
payload = data["data"]
symbol = payload.get("s")
msg_type = payload.get("type")
if msg_type == "quote":
print(f"[{symbol}] Last: {payload.get('ld')} EUR | Chg: {payload.get('chp')}%")
elif msg_type == "depth":
bids = payload.get("b", [])[:3]
asks = payload.get("a", [])[:3]
print(f"[{symbol}] Bid: {bids} | Ask: {asks}")
def on_open(ws):
print("WebSocket connected")
sub = {
"ac": "subscribe",
"params": "MC$FR,OR$FR", # LVMH + L'Oréal
"types": "quote,depth"
}
ws.send(json.dumps(sub))
print(f"Subscribed to: {sub['params']}")
def on_error(ws, error):
print(f"WS Error: {error}")
def on_close(ws, code, reason):
print(f"WS Closed: {reason}")
def heartbeat(ws):
while True:
time.sleep(30)
ws.send(json.dumps({
"ac": "ping",
"params": str(int(time.time() * 1000))
}))
print("Heartbeat sent")
# Initialize & run
ws = websocket.WebSocketApp(
WS_URL,
header={"token": API_TOKEN},
on_open=on_open,
on_message=on_message,
on_error=on_error,
on_close=on_close
)
threading.Thread(target=heartbeat, args=(ws,), daemon=True).start()
ws.run_forever()
IV. France-Specific Notes & Best Practices
- Ticker Format
Use local ticker +region=FRin REST calls. For WebSocket subscriptions:TICKER$FR(e.g.MC$FR,OR$FR). - Key French Blue-Chips Reference
| Company | Ticker | Sector |
|---|---|---|
| LVMH | MC | Luxury Goods |
| L'Oréal | OR | Cosmetics |
| TotalEnergies | TTE | Energy |
| Airbus | AIR | Aerospace & Defense |
| Sanofi | SAN | Pharmaceuticals |
| BNP Paribas | BNP | Banking |
- Trading Hours
09:00–17:30 CET (15:00–23:30 Beijing Time during summer; +1 hour in winter). Adjust timestamps accordingly.
V. Free Tier vs. Paid Plans
Free Plan Includes
• Unlimited base real-time quotes
• Daily/weekly/monthly historical bars
• WebSocket streaming support
Upgrade When You Need
• Higher frequency / Level 2 market depth
• Intraday historical bars (>1-min)
• Extended historical depth
• Priority support & dedicated channels
VI. Conclusion
In 2026, financial data competition has shifted from coverage breadth to developer experience, latency, and data depth. For teams targeting French and broader European equities, iTick delivers:
- Comprehensive Euronext Paris coverage
- Sub-50 ms real-time streaming
- Multi-decade historical depth
- Integrated fundamental metrics
- Excellent free tier + competitive paid pricing
Whether building systematic strategies, factor models, smart-beta products, or financial analytics tools, iTick provides a reliable, high-performance foundation.
Start today: register at https://itick.org and explore the official documentation.
Further Reading