---
name: lseg-delayed-market-data-ingestion
description: "How to get LSEG Delayed Market Data (London Stock Exchange, Turquoise, TRADEcho) data into a pandas DataFrame and Parquet: access, the request, the format, limits, quirks and terms."
---

# Pull an LSE delayed post-trade minute file into pandas and Parquet

Source entry: https://signal-lab-jet.vercel.app/datasets/lseg-delayed-market-data
Provider: https://dmd.lseg.com/
Checked against the provider's documentation: 2026-11-05

## Access
- No account or key; the dmd.lseg.com portal shows Terms & Conditions you accept by using the data.
- The portal page lists files from https://dmd.lseg.com/api/web/files and hands out short-lived signed download links from https://dmd.lseg.com/api/web/download?fileName=<fileKey>. These are the JSON calls the portal itself makes, not a documented API, so they can change.

## Request
```bash
curl 'https://dmd.lseg.com/api/web/files'
```

## Format
File list: JSON with result.initialPayloadResponse.fileDetails keyed by venue list (for example "LSE Post-Trade Documents"), each item with fileName, fileKey, type and fileDate. Each file is a semicolon-delimited CSV for one minute (for example XLON-post-2026-11-05T12_00.csv) with UTC timestamps.

## Load into pandas and Parquet
Needs Python 3 with requests, pandas and pyarrow.
```python
"""LSEG Delayed Market Data: one LSE (XLON) post-trade minute file -> pandas -> Parquet. No key."""
import io
import requests
import pandas as pd

API = "https://dmd.lseg.com/api/web/"
files = requests.get(API + "files", timeout=60).json()["result"]["initialPayloadResponse"]["fileDetails"]
item = next(f for f in files["LSE Post-Trade Documents"] if "T12_00" in f["fileName"])
signed = requests.get(API + "download", params={"fileName": requests.utils.unquote(item["fileKey"])}, timeout=60).json()["result"]["preSignedUrl"]
r = requests.get(signed, timeout=120)
r.raise_for_status()
df = pd.read_csv(io.StringIO(r.text), sep=";", dtype=str)  # semicolon-delimited, UTC timestamps
df.to_parquet("lseg_xlon_posttrade.parquet", index=False)
print(item["fileName"], len(df), "trades;", ", ".join(df.columns[:5]))
```
Run by us on 2026-11-05 (python 3.13 | pandas | pyarrow | requests (box probe)). Result: XLON-post-2026-11-05T12_00.csv 6279 trades; distributionTime, sourceVenue, instrumentId, transactionIdentificationCode, mifidPrice

## Limits
- Data is published 15 minutes after initial publication; one file per minute per venue and flow.
- Only recent days are listed (about 1,000 to 1,600 files per venue list on Nov 5, 2026), so collect files yourself for history.
- No request or download limit stated.

## Quirks
- Files are semicolon-delimited, not comma-delimited.
- File names and timestamps are in UTC; the snippet picks the 12:00 UTC file, which exists only on trading days.
- Consolidated end-of-session gz files exist only for Turquoise Europe (TGHE) and TRADEcho EU (ECEU).
- Signed S3 download links expire quickly; request a fresh one per file.

## Terms and attribution
- Free use of the Delayed Data on LSEG's on-page terms; provided as is, for information purposes only.
- Onward distribution for a fee, or use in charged value-added services, needs an LSEG licence (marketdata@lseg.com).
- Terms page: https://dmd.lseg.com/

## Sources
- https://dmd.lseg.com/: "Files are produced every minute. The times in the names of these files, and the timestamps on the messages within the files, are all in UTC."
- https://dmd.lseg.com/: "Users will be required to enter into a licence agreement and should contact marketdata@lseg.com to discuss licencing requirements before using the Delayed Data."
- https://dmd.lseg.com/: "All files are semicolon delimited."

## Help improve this skill
Missing a source, or see something to improve? Call the MCP tool suggest_source or feedback (or POST /api/suggest or /api/feedback). Reviewed ideas: https://signal-lab-jet.vercel.app/agent-suggestions

Information for educational purposes only. Free tiers, limits and licenses belong to the providers and may change; check the provider's own terms before using the data.
