Quickstart
Get up and running with Pulse in under 2 minutes.
This guide walks you through installing the SDK, authenticating, and making your first data request. All new accounts start on the Free tier, which gives you access to a set of pre-run cached simulations to explore straight away.
1. Create an account
Go to pulse.simudyne.com and create an account using email, GitHub, or Google.
2. Get an API key
After signing in, go to your Dashboard and click Create new key. Copy the key as it is only shown once.
Store your API key securely. You can create multiple keys and label them for different use cases (e.g. "research", "production").
3. Install the SDK
With pip:
pip install git+https://github.com/simudyne/pulse-api.gitOr with uv:
uv pip install git+https://github.com/simudyne/pulse-api.gitRequires Python 3.10 or later.
4. Download sample data
Before exploring the full catalogue, grab a sample — 5 Monte Carlo runs of a 700.HK baseline simulation to get a feel for the data. No configuration needed beyond your API key.
from simudyne import PulseABM
client = PulseABM(api_key="pk_live_...")
# Download 5 MC runs of 700.HK as a ZIP
client.simulation.get_sample_data()
# writes simulation_sample.zip to current directoryYou can also download the sample as a ZIP from the homepage without writing any code. See Output format for a full breakdown of the L2 and Ticks DataFrames inside.
5. Browse all cached simulations
Use list_cached() to see everything available on your tier.
# List all available cached simulations
cached = client.simulation.list_cached()
for sim in cached["simulations"]:
print(f"{sim['symbol']} {sim['date']} {sim['scenario']}: {sim['n_runs']} runs")700.HK 2025-09-02 normal: 25 runs
700.HK 2025-09-02 flash_crash: 25 runs
9999.HK 2025-09-02 normal: 5 runs6. Download simulation data
# Pick a cached simulation
cached = client.simulation.list_cached(symbol="700.HK", scenario="normal")
sim_id = cached["simulations"][0]["example_sim_id"]
# Download as a Polars DataFrame
df = client.simulation.get_sim_data(sim_id)
print(df.head())
# Download mid-price by minute
mid_df = client.simulation.get_sim_data(sim_id, "mid_price_by_min.parquet")shape: (5, 68)
┌──────────┬─────────────────────────┬─────────────┬───┬──────────────┬──────┬──────┐
│ sequence ┆ timestamp ┆ bid_price_1 ┆ … ┆ message_type ┆ side ┆ size │
│ --- ┆ --- ┆ --- ┆ ┆ --- ┆ --- ┆ --- │
│ i64 ┆ datetime[ms] ┆ f64 ┆ ┆ i64 ┆ i64 ┆ i64 │
╞══════════╪═════════════════════════╪═════════════╪═══╪══════════════╪══════╪══════╡
│ 0 ┆ 2025-09-02 09:30:00.001 ┆ 315.2 ┆ … ┆ 1 ┆ 1 ┆ 500 │
│ 1 ┆ 2025-09-02 09:30:00.014 ┆ 315.2 ┆ … ┆ 2 ┆ -1 ┆ 200 │
│ … ┆ … ┆ … ┆ … ┆ … ┆ … ┆ … │
└──────────┴─────────────────────────┴─────────────┴───┴──────────────┴──────┴──────┘Example output — exact rows and the 68-column layout depend on the run.
On the Pro tier, use client.simulation.run() to submit custom simulation jobs with your own symbols, scenarios, and execution algorithms. An instrument is identified by four fields: provider, exchange, symbol, and cal_date. See Simulations for details.
Next steps
- Plans: full breakdown of Free vs Pro features
- Simulations: cached sims, custom jobs, scenarios, and execution algorithms
- Available symbols: discover symbols and calibration dates
- Authentication: environment variables and key management