A market simulation engine for building against real-time data workflows.

ReplayPulse lets teams replay historical bars, trades, quotes, and options through WebSockets, so strategy systems can be developed and tested the same way they run during market hours.

Use the simulation engine instead of building custom fake live-data infrastructure, and still download organized datasets when research calls for files instead of a running replay.

Simulation Replay historical markets through WebSockets
Live parity Develop against the same shape as real-time feeds
Datasets Download bars, trades, quotes, and options when needed
ReplayPulse for live trading developers Trusted by prop traders developing live-market systems faster. ReplayPulse gives teams a realistic replay loop for Real Time strategies, plus clean dataset exports when they need to inspect, archive, or share market history.

API surface

Replay endpoints

Work with organized replay sessions, or create short-lived paginated datasets for HTTP downloads.
WS Aggregate bars
wss://api.replaypulse.io/aggs

Streams OHLCV aggregate bars for stocks and selected options. Bars sharing a timestamp are fanned out in parallel, one bar per WebSocket frame, just like a live feed. Timestamps are milliseconds.

WS Trades and quotes
wss://api.replaypulse.io/tape

Streams historical trades, quotes, or both for stocks and selected options. Ticks sharing a timestamp are fanned out in parallel, one event per WebSocket frame, just like a live feed. Timestamps are SIP nanoseconds.

GET Aggregate dataset
https://api.replaypulse.io/data/aggs

Creates an in-memory aggregate dataset and returns the first page. Follow nextUrl to download the rest.

GET Tape dataset
https://api.replaypulse.io/data/tape

Creates an in-memory trades/quotes dataset and returns paginated timestamp buckets.

Session lifecycle

Control flow

1 Connect

Open /aggs for bars or /tape for trades and quotes.

2 Configure

Send the replay window, tickers, speed, and option filters.

3 Ready

The server loads data and reports the timestamp count.

4 Play/Pause

Pause, resume, or replay the same loaded timeline. Ticks and bars sharing a timestamp are sent in parallel as separate messages, so consumers must fan out the same way a live market feed would.

Replay controls client to server
{ "action": "play" }
{ "action": "pause" }
{ "action": "play" }

HTTP exports

Dataset pagination

Plain GET requests use a separate pagination service. Send a URL-encoded raw config object in config and an optional limit. The service keeps the dataset in memory, returns nextUrl, deletes it after the final page, and expires it after 10 minutes.
Create dataset client to server
GET /data/aggs?limit=2&config={urlEncodedConfig}
GET /data/tape?limit=100&config={urlEncodedConfig}
Receive page server to client
{
	"datasetId": "2d01fce5c9a841f5ad41be58a44b3a92",
	"kind": "aggs",
	"limit": 2,
	"count": 2,
	"remaining": 14,
	"expiresAt": "2026-05-24T12:42:31Z",
	"nextUrl": "https://api.replaypulse.io/data/aggs/pages/2d01fce5c9a841f5ad41be58a44b3a92?limit=2",
	"data": [
		{
			"t": 1779163200000,
			"items": [
				{ "ticker": "AAPL", "t": 1779163200000, "c": 298.97 }
			]
		}
	]
}

Examples

Requests and messages

Configure stock aggregate replay client to /aggs
{
	"action": "configure",
	"config": {
		"startDate": "2025-11-03T00:00:00Z",
		"endDate": "2025-11-04T00:00:00Z",
		"tickers": ["SPY", "AAPL"],
		"multiplier": 1,
		"timespan": "minute",
		"speed": 3600,
		"rthOnly": true,
		"includeOptions": false
	}
}
Configure option aggregate replay client to /aggs
{
	"action": "configure",
	"config": {
		"startDate": "2026-05-18T00:00:00Z",
		"endDate": "2026-05-22T00:00:00Z",
		"tickers": ["AAPL"],
		"multiplier": 1,
		"timespan": "day",
		"speed": 86400,
		"rthOnly": false,
		"includeOptions": true,
		"optionFilters": {
			"expirations": ["ALL"],
			"strikesToInclude": 2
		}
	}
}
Configure trades and quotes client to /tape
{
	"action": "configure",
	"config": {
		"startDate": "2025-11-03T14:30:00Z",
		"endDate": "2025-11-03T14:35:00Z",
		"tickers": ["SPY"],
		"speed": 1000000000,
		"rthOnly": true,
		"includeOptions": true,
		"optionFilters": {
			"expirations": ["2025-12-19"],
			"strikesToInclude": 1
		},
		"includeTrades": true,
		"includeQuotes": true
	}
}
Aggregate ready event server to client
{
	"event": "ready",
	"bars": 4
}
Tick ready event server to client
{
	"event": "ready",
	"timestamps": 237
}
Aggregate bar message server from /aggs
{
	"ticker": "AAPL",
	"t": 1779163200000,
	"o": 296.97,
	"h": 300.51,
	"l": 296.35,
	"c": 298.97,
	"v": 42243633.01,
	"vw": 298.3829,
	"n": 640857
}
Trade or quote message server from /tape
{
	"type": "trade",
	"assetClass": "stock",
	"ticker": "SPY",
	"t": 1762180200123456789,
	"data": {
		"sip_timestamp": 1762180200123456789,
		"participant_timestamp": 1762180200123000000,
		"price": 685.42,
		"size": 100,
		"exchange": 11,
		"sequence_number": 721904
	}
}

Configuration

Config fields

/aggs fields
startDate ISO timestamp

Replay window start.

endDate ISO timestamp

Replay window end. Must be after startDate.

tickers string[]

Underlying stock tickers. All symbols are merged into one timestamp stream.

multiplier number

Aggregate bar multiplier.

timespan string

second, minute, hour, day, week, month, quarter, or year.

speed number

Playback speed. Higher values compress historical gaps between timestamps.

rthOnly boolean

For intraday bars, true keeps only regular market hours.

includeOptions boolean

When true, option aggregate bars are discovered and merged into the same timestamp buckets.

/tape fields
startDate ISO timestamp

Tick replay window start. The provider receives a nanosecond timestamp lower bound.

endDate ISO timestamp

Tick replay window end. The provider receives a nanosecond timestamp upper bound.

tickers string[]

Underlying stock tickers to load from stock trades and quotes endpoints.

speed number

Playback speed for nanosecond SIP timestamp gaps.

rthOnly boolean

When true, keeps only events inside regular market hours.

includeTrades boolean

Loads stock and option trade history when enabled.

includeQuotes boolean

Loads stock and option quote history when enabled. At least one of trades or quotes must be true.

Options

Option universe rules

Option filters
optionFilters.expirations string[]

Expiration dates as YYYY-MM-DD. Use ["ALL"] by itself to consider every active or expired expiration.

optionFilters.strikesToInclude number

Nearby strike levels below and above the underlying price per expiration. Calls and puts at selected strikes are included.

  • Aggregate option bars are selected from the underlying price at each historical stock bar.
  • Tick option universes reuse the same contract discovery pattern, then fetch trades and quotes for each selected option ticker.
  • Option contracts are deduped by option ticker before they are included in replay results.
  • ["ALL"] expirations must be used by itself and requires a bounded strike window.
  • ready.bars and ready.timestamps count distinct replay timestamps, not the total records inside those buckets.
  • Events sharing a timestamp are dispatched from concurrent goroutines, so messages within a timestamp arrive in parallel and in nondeterministic order; sort or batch on the client if ordering within a timestamp matters.