Getting started with IntraDB
Learn how to access intraday market data using the web app or the programmatic API.
Contents
About IntraDB
IntraDB is a research data platform operated by the Institute for Finance and Banking at LMU Munich. It provides tick-level intraday market data for European and international equity markets.
The database covers more than 25 trading venues, including Xetra, Tradegate, Nasdaq, and regional German exchanges. For each venue, data is available as Pretrade (order book snapshots) or Posttrade (trade reports), depending on the exchange. Data is identified by ISIN and can be queried for custom date ranges.
Access is available to authorised members of LMU Munich and partner institutions. Authentication is handled through your university’s identity provider (Shibboleth/SAML).
Web app or API?
| Web app | API | |
|---|---|---|
| Best for | Manual, one-off data retrieval | Automated, scripted or repeated queries |
| Output | ZIP file with Parquet files | Streaming data response |
| Tools needed | Web browser | Python, MATLAB, R or any HTTP client |
| Authentication | University login (Shibboleth) | Personal API token |
Using the web app
The web app is the easiest way to get market data. No programming required — just fill in the form and download a ZIP file.
- Sign in at /app.php with your university credentials.
- Choose your symbols — enter ISINs manually, upload a file, or select an index.
- Select the exchange and data type — pick the trading venue and choose between Pretrade (order book) or Posttrade (trade reports).
- Set the date range for the period you need.
- Click “Download data” — the ZIP file will start downloading automatically.
For large Pretrade queries, the download may be split into several files covering shorter periods. These are delivered one after another automatically.
Uploading ISINs from a file
If you have a large number of ISINs, you can upload them as a text file instead of typing them one by one. The app will recognise valid ISINs automatically.
Example file (.txt):
isins = [ DE000A1EWWW0, DE0008404005, DE0007236101, ]
The format is flexible — any text file containing valid ISIN codes will work. Duplicates are removed automatically. Up to 100 ISINs per request.
Index-based queries
Instead of entering individual ISINs, you can select a stock index (e.g. DAX, Euro Stoxx 50) and a time period. The app will automatically look up all constituents of that index during the selected period and download data for all of them.
Available exchanges
The following trading venues are available. Each exchange offers either Pretrade data (order book snapshots), Posttrade data (trade reports), or both.
| Exchange | Description | Pretrade | Posttrade |
|---|---|---|---|
Parkett |
Frankfurt floor trading | ✓ | ✓ |
Tradegate |
Tradegate equities and ETFs | ✓ | ✓ |
Xetra |
Xetra equities and ETFs | ✓ | ✓ |
EIX |
EIX equities and ETFs | ✓ | ✓ |
Bloomberg |
Bloomberg | — | ✓ |
Duesseldorf_DUSA |
Boerse Duesseldorf regulated market | — | ✓ |
Duesseldorf_DUSB |
Boerse Duesseldorf Freiverkehr | — | ✓ |
Duesseldorf_DUSC |
Quotrix regulated market | — | ✓ |
Duesseldorf_DUSD |
Quotrix MTF/Freiverkehr | — | ✓ |
Hamburg_HAMA |
Boerse Hamburg regulated market | — | ✓ |
Hamburg_HAMB |
Boerse Hamburg Freiverkehr | — | ✓ |
Hannover_HANA |
Boerse Hannover regulated market | — | ✓ |
Hannover_HANB |
Boerse Hannover Freiverkehr | — | ✓ |
Cboe_APA |
Cboe APA | — | ✓ |
Cboe_BXE |
Cboe BXE | — | ✓ |
Cboe_CXE |
Cboe CXE | — | ✓ |
Cboe_DXE |
Cboe DXE | — | ✓ |
Muenchen_MUNC |
Boerse Muenchen, MUNC | ✓ | ✓ |
Muenchen_MUND |
Boerse Muenchen, MUND | ✓ | ✓ |
LSX |
LS Exchange | ✓ | ✓ |
Nasdaq |
Nasdaq Nordic equities and ETFs | ✓ | ✓ |
Wien_OTC |
Vienna OTC | — | ✓ |
Wien_Exchange |
Vienna Exchange | ✓ | — |
Equiduct |
Equiduct equities and ETFs | ✓ | ✓ |
Aquis |
Aquis equities and ETFs | ✓ | ✓ |
Using the API
The API lets you retrieve market data programmatically from Python, MATLAB, R, or any HTTP client. You authenticate with a personal token that you generate through the web interface.
Step 1: Generate your API token
- Sign in with your university credentials.
- Go to the API token page and click Generate token.
- Copy the token immediately — it is shown only once.
Your token is valid for 30 days. If you lose it, simply generate a new one on the same page. Previously issued tokens remain valid until they expire.
INTRADB_API_TOKEN) and read it from there in your scripts.
Step 2: Make a request
Pass your token in the Authorization header and specify the symbols,
exchange, data type, and date range as URL parameters:
GET /download-json.php?symbols=DE000A1EWWW0&exchange=Tradegate&library=Pretrade&start_date=2026-04-01&end_date=2026-04-08 Authorization: Bearer <your_token>
Step 3: Process the response
The response contains your data grouped by ISIN. Each ISIN maps to an array of tick-level records with timestamps, prices, and volumes:
{
"data": {
"DE000A1EWWW0": [
{"index": "2026-04-01T09:00:00.000000000", "Price": 248.30, "Volume": 1200},
{"index": "2026-04-01T09:00:01.000000000", "Price": 248.35, "Volume": 500}
]
},
"message": "",
"start_date": "2026-04-01",
"end_date": "2026-04-08"
}
Rate limiting
The server allows up to 3 simultaneous downloads across all users. If the server is busy,
your request will receive an HTTP 429 response with a Retry-After
header telling you how many seconds to wait before trying again.
Python example
Fetch market data and convert it to a pandas DataFrame. Generate your token first on the API token page.
import os
import requests
import pandas as pd
TOKEN = os.getenv("INTRADB_API_TOKEN")
URL = "https://intradb.lmu.de.devweb.mwn.de/download-json.php"
response = requests.get(URL, params={
"symbols": "DE000A1EWWW0,DE0008404005",
"exchange": "Tradegate",
"library": "Pretrade",
"start_date": "2026-04-01",
"end_date": "2026-04-08",
}, headers={"Authorization": f"Bearer {TOKEN}"})
if response.status_code == 429:
retry = response.json().get("retry_after", 60)
print(f"Server busy. Try again in {retry} seconds.")
else:
response.raise_for_status()
result = response.json()
for isin, records in result["data"].items():
df = pd.DataFrame(records)
df["index"] = pd.to_datetime(df["index"])
df = df.set_index("index")
print(f"{isin}: {len(df)} records")
print(df.head())
MATLAB example
Fetch market data using MATLAB's webread.
Generate your token first on the API token page.
token = getenv('INTRADB_API_TOKEN');
baseUrl = 'https://intradb.lmu.de.devweb.mwn.de';
opts = weboptions( ...
'HeaderFields', {'Authorization', ['Bearer ' token]}, ...
'Timeout', 300 ...
);
data = webread([baseUrl '/download-json.php'], ...
'symbols', 'DE000A1EWWW0', ...
'exchange', 'Tradegate', ...
'library', 'Pretrade', ...
'start_date', '2026-04-01', ...
'end_date', '2026-04-08', ...
opts);
isins = fieldnames(data.data);
for i = 1:numel(isins)
records = data.data.(isins{i});
fprintf('%s: %d records\n', isins{i}, numel(records));
end
For large downloads (many ISINs or Pretrade data over long periods), use
websave instead of webread to save the data directly
to a file without holding it in memory.
API technical reference
Detailed specification for developers building integrations against the IntraDB API.
Request parameters
| Parameter | Format | Required | Description |
|---|---|---|---|
symbols | Comma-separated ISINs | Yes | Maximum 100 per request. |
exchange | String (case-sensitive) | Yes | Must match a supported exchange name exactly. |
library | Pretrade or Posttrade | Yes | Pretrade = order book (larger). Posttrade = trade reports (smaller). |
start_date | YYYY-MM-DD | Yes | Inclusive start. Cannot be in the future. |
end_date | YYYY-MM-DD | Yes | Inclusive end. Max 90-day window. |
Response fields
| Field | Type | Description |
|---|---|---|
data | Object | Map of ISIN → array of tick records. Each record has index (nanosecond timestamp), Price, Volume, etc. |
message | String | Status information. Empty if no issues. |
start_date | String | Actual start date used (may be adjusted). |
end_date | String | Actual end date used. |
changed_start | "0" / "1" | Whether the start date was adjusted. |
changed_end | "0" / "1" | Whether the end date was adjusted. |
changed_start and changed_end in
the response to detect adjustments.
The response is streamed and may not include a Content-Length header.
For large queries, stream the response to disk rather than buffering it in memory.
Individual symbols exceeding 2 GB are omitted and noted in message.
Authentication
All requests require a bearer token in the Authorization header. Tokens
are generated on the API token page and are valid for
30 days. There are no separate token scopes — every token has the same permissions.
To rotate a token, generate a new one; the old token continues to work until it expires.
Authorization: Bearer <your_token>
HTTP status codes
| Status | Meaning | Action |
|---|---|---|
400 | Invalid parameters | Check symbols, exchange, library, and dates. |
401 | Not authenticated | Token missing or expired. Generate a new one on the API token page. |
404 | No data | No data for the requested symbols, exchange, and period. |
429 | Server busy | Wait for Retry-After seconds, then retry. |
502 | Backend error | Try again in a few minutes. |
Rate limiting
Maximum 3 concurrent downloads across all users. When busy, the API returns:
HTTP/1.1 429 Too Many Requests
Retry-After: 60
{"detail": "Server busy.", "active": 3, "limit": 3, "retry_after": 60}
You can check availability before starting a download:
GET /download-queue-status.php
→ {"active": 1, "limit": 3, "available": true, "estimated_wait_seconds": 0}
Citation & contact
If you use IntraDB data in academic work, please cite it as:
Institute for Finance and Banking, LMU Munich. IntraDB — Intraday Market Data Platform. https://intradb.lmu.de.devweb.mwn.de Accessed: YYYY-MM-DD.
For questions, data issues or access requests, contact the IntraDB team at the Institute for Finance and Banking, LMU Munich.