Software
API Reference
Data 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;
}