Skip to Content
API ReferenceData Format

Data Format

EEG Frame

Every frame from the WebSocket is a JSON object:

{ "t": 1711234567.123, "n": 42, "channels": [12.34, -5.67, 8.90, ...] }
FieldTypeDescription
tfloatUnix timestamp (seconds, 6-decimal precision)
nintSample number (monotonic, incremental)
channelsfloat[]µV per channel — 8 elements for pieeg8 / ironbci8, 16 for pieeg16 (default)

Frequency Bands

BandRangeColor
Delta (δ)0.5–4 Hz#8b5cf6 purple
Theta (θ)4–8 Hz#06b6d4 cyan
Alpha (α)8–13 Hz#22c55e green
Beta (β)13–30 Hz#f59e0b amber
Gamma (γ)30–100 Hz#ef4444 red

FFT Output

256-point Cooley-Tukey radix-2 FFT with Hanning window:

  • FFT Size: 256 samples ≈ 1.024 seconds at 250 Hz
  • Frequency resolution: 250 Hz / 256 = ~0.977 Hz per bin
  • Output bins: 129 frequency bins (0 to 125 Hz)
  • Output PSD: µV²/Hz (absolute units, not dB)

TypeScript Types

Core EEG

interface EEGData { buffers: MutableRefObject<Float32Array[]>; writeIndex: MutableRefObject<number>; samplesInBuffer: MutableRefObject<number>; bufferSize: number; numChannels: number; gridSuspended: boolean; } interface FFTResult { frequencies: Float64Array; psd: Float64Array; bandPowers: BandPowers; dominantFrequency: number; totalPower: number; } type BandPowers = Record<"Delta" | "Theta" | "Alpha" | "Beta" | "Gamma", number>;

Webhook Types

type TriggerType = | "band_power_above" | "band_power_below" | "amplitude_above" | "amplitude_below" | "band_ratio_above" | "band_ratio_below"; type Band = "delta" | "theta" | "alpha" | "beta" | "gamma"; interface WebhookRule { id: string; name: string; enabled: boolean; trigger_type: TriggerType; params: Record<string, unknown>; url: string; method: string; headers: Record<string, string>; cooldown: number; last_fired: number; fire_count: number; } interface WebhookEvent { rule_id: string; rule_name: string; trigger_type: string; value: number; threshold: number; ts: number; }