Alerts

Updated

The chaos.alerts namespace provides programmatic access to the Chaos AI alerts system. Create alert subscriptions that monitor on-chain and market conditions, poll your inbox for triggered events, stream alerts in real-time via WebSocket, and register webhooks for push delivery.

alerts-namespace.ts
import { Chaos } from '@chaoslabs/ai-sdk';
 
const chaos = new Chaos({ apiKey: process.env.CHAOS_API_KEY! });
 
// Sub-resources
chaos.alerts.subscriptions  // Manage alert subscriptions
chaos.alerts.inbox          // Triggered alert events
chaos.alerts.templates      // Predefined alert templates
chaos.alerts.settings       // Notification preferences
 
// Top-level methods
chaos.alerts.connect()                   // Real-time WebSocket stream
chaos.alerts.fromQuery({ ... })          // Create alert from natural language
chaos.alerts.getOnboarding()             // Get onboarding state
chaos.alerts.completeOnboarding({ ... }) // Complete onboarding

Sub-Resources

ResourceAccessDescription
Subscriptionschaos.alerts.subscriptionsCreate, list, update, delete, snooze, and mute alert subscriptions
Inboxchaos.alerts.inboxList triggered alerts, filter, mark read, archive
Templateschaos.alerts.templatesBrowse predefined alert templates by category
Settingschaos.alerts.settingsGet and update notification preferences

Subscriptions

Full CRUD for alert subscriptions.

subscriptions-api.ts
// Create a subscription
const sub = await chaos.alerts.subscriptions.create({
  alert: { alert_type: 'price_change', asset: 'ETH', target_price: 4000, condition: 'above' },
});
 
// List all subscriptions
const subs = await chaos.alerts.subscriptions.list();
 
// Get a specific subscription
const sub = await chaos.alerts.subscriptions.get('ua-abc123');
 
// Get detailed view with resolved parameters
const detail = await chaos.alerts.subscriptions.getDetail('ua-abc123');
 
// Get trigger history
const { events, total } = await chaos.alerts.subscriptions.getEvents('ua-abc123');
 
// Update
const updated = await chaos.alerts.subscriptions.update('ua-abc123', {
  channels: { inApp: true, push: true, telegram: false, email: false },
});
 
// Snooze for 1 hour, 1 day, or 1 week
await chaos.alerts.subscriptions.snooze('ua-abc123', '1d');
 
// Mute until manually resumed
await chaos.alerts.subscriptions.mute('ua-abc123');
 
// Mark all events as read
const { markedCount } = await chaos.alerts.subscriptions.markRead('ua-abc123');
 
// Delete
await chaos.alerts.subscriptions.delete('ua-abc123');

Subscriptions Method Reference

MethodHTTPEndpointReturns
create(params)POST/v1/alerts/subscriptionsUserAlert
list()GET/v1/alerts/subscriptionsUserAlert[]
get(alertId)GET/v1/alerts/subscriptions/{alertId}UserAlert
getDetail(alertId)GET/v1/alerts/subscriptions/{alertId}/detailSubscriptionDetailResponse
getEvents(alertId)GET/v1/alerts/subscriptions/{alertId}/eventsSubscriptionEventsResponse
update(alertId, updates)PATCH/v1/alerts/subscriptions/{alertId}UserAlert
delete(alertId)DELETE/v1/alerts/subscriptions/{alertId}SuccessResponse
snooze(alertId, duration)POST/v1/alerts/subscriptions/{alertId}/snoozeSuccessResponse
mute(alertId)POST/v1/alerts/subscriptions/{alertId}/muteSuccessResponse
markRead(alertId)POST/v1/alerts/subscriptions/{alertId}/mark-readMarkReadResponse

Inbox

Query and manage triggered alert events.

inbox-api.ts
// List triggered alerts with filters
const { events, hasMore } = await chaos.alerts.inbox.list({
  readState: 'unread',
  severity: ['warning', 'critical'],
  limit: 20,
});
 
// Get unread count
const { unreadCount } = await chaos.alerts.inbox.unreadCount();
 
// Mark an event as read
await chaos.alerts.inbox.markRead('ta-abc123');
 
// Archive an event
await chaos.alerts.inbox.archive('ta-abc123');

Inbox Method Reference

MethodHTTPEndpointReturns
list(filters?)GET/v1/alerts/inboxInboxResponse
unreadCount()GET/v1/alerts/inbox/unread-countUnreadCountResponse
markRead(eventId)POST/v1/alerts/events/{eventId}/readSuccessResponse
archive(eventId)POST/v1/alerts/events/{eventId}/archiveSuccessResponse

Templates

Browse predefined alert configurations.

templates-api.ts
// List all templates
const { templates, supportedChains } = await chaos.alerts.templates.list();
 
// Filter by category
const whaleTemplates = await chaos.alerts.templates.list('whales');
 
// Search by keyword
const results = await chaos.alerts.templates.list(undefined, 'price');

Templates Method Reference

MethodHTTPEndpointReturns
list(category?, query?)GET/v1/alerts/templatesTemplatesResponse

Settings

Manage notification channel preferences and routing.

settings-api.ts
// Get current settings
const settings = await chaos.alerts.settings.get();
 
// Update notification channels
const updated = await chaos.alerts.settings.update({
  channels: { inApp: true, push: true, telegram: false, email: true },
  dnd: { enabled: true, startTime: '22:00', endTime: '08:00', timezone: 'UTC' },
});

Settings Method Reference

MethodHTTPEndpointReturns
get()GET/v1/alerts/settingsAlertSettings
update(updates)PATCH/v1/alerts/settingsAlertSettings

Top-Level Methods

MethodHTTPEndpointReturns
connect()WebSocket/v1/alerts/wsAlertStream
fromQuery(params)POST/v1/alerts/from-queryAlertFromQueryResponse
getOnboarding()GET/v1/alerts/onboardingOnboardingState
completeOnboarding(params)POST/v1/alerts/onboarding/completeOnboardingState

connect()

Open a WebSocket connection for real-time alert delivery. Returns an AlertStream that emits events as alerts fire. See the Real-time Alerts guide.

connect.ts
const stream = chaos.alerts.connect();
 
stream.on('alert', (event) => {
  console.log(`${event.severity}: ${event.title}`);
});
 
stream.on('connected', () => console.log('Listening for alerts'));
stream.on('error', (err) => console.error(err));
 
// Later: disconnect
stream.close();

fromQuery(params)

Create an alert from a natural language description. The AI workflow parses the intent and creates a typed subscription.

from-query.ts
const result = await chaos.alerts.fromQuery({
  query: 'Alert me when ETH drops below $3000',
  userId: 'user-123',
});
 
if (result.mode === 'created') {
  console.log('Alert created:', result.alert?.name);
} else if (result.mode === 'interactive') {
  // Needs user confirmation — result.blocks contains the UI
} else if (result.mode === 'form') {
  // Needs additional parameters
}

Alert Types

Eight alert types are supported, each with a different configuration shape.

TypeDescriptionKey Parameters
price_changePrice threshold or percentage moveasset, target_price/condition or change_percent/direction
volumeTrading volume spikeasset, threshold_percent, time_window
dormant_walletInactive wallet re-activatesdormant_days, wallet
whale_watchLarge wallet movementsmin_balance, profit_type, top_holder_rank
market_screenerNew token launch detectionplatform, min_curve_percent
twapTime-weighted average price ordersasset, amount, duration, direction
token_transferToken transfer monitoringsymbol, min_amount
balance_changeWallet balance changes in USDmin_usd_value, max_usd_value

AlertConfig

Alert configurations are a discriminated union keyed by alert_type:

alert-configs.ts
// Price threshold
const priceAlert = {
  alert_type: 'price_change' as const,
  asset: 'ETH',
  target_price: 4000,
  condition: 'above' as const,
};
 
// Price percentage change
const percentAlert = {
  alert_type: 'price_change' as const,
  asset: 'BTC',
  change_percent: 10,
  direction: 'down' as const,
};
 
// Volume spike
const volumeAlert = {
  alert_type: 'volume' as const,
  asset: 'SOL',
  threshold_percent: 200,
  time_window: '1h',
};
 
// Whale watch
const whaleAlert = {
  alert_type: 'whale_watch' as const,
  chain: 'ethereum',
  min_balance: 1000000,
  profit_type: 'realized' as const,
};
 
// Dormant wallet
const dormantAlert = {
  alert_type: 'dormant_wallet' as const,
  wallet: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045',
  dormant_days: 90,
};
 
// Token transfer
const transferAlert = {
  alert_type: 'token_transfer' as const,
  symbol: 'USDC',
  min_amount: 1000000,
  chain: 'ethereum',
};

Core Types

UserAlert

Represents an alert subscription.

user-alert-type.ts
interface UserAlert {
  id: string;                    // "ua-d7309261..."
  userId: string;
  templateId: string | null;
  name: string;
  alertType: AlertType;
  alertConfig: AlertConfig;
  scope: AlertScope;
  severityPolicy: SeverityPolicy;
  channels: ChannelRouting;
  status: AlertStatus;           // 'active' | 'paused' | 'snoozed'
  cooldownSeconds: number;
  debounceConfig: DebounceConfig;
  createdFrom: AlertCreatedFrom; // 'chat' | 'library'
  createdAt: string;             // ISO 8601
  updatedAt: string;
  lastFiredAt: string | null;
  fireCount7d: number;
  webhook?: WebhookConfig;
}

TriggeredAlert

Represents an alert event that fired.

triggered-alert-type.ts
interface TriggeredAlert {
  id: string;                    // "ta-60a5a3feae3b"
  userId: string;
  subscriptionId: string;        // matches UserAlert.id
  alert: AlertConfig;
  chain: string;
  severity: AlertSeverity;       // 'watch' | 'warning' | 'critical'
  title: string;
  summary: string;
  evidence: EvidencePayload;
  transactionContext: TransactionContext | null;
  readState: ReadState;          // 'unread' | 'read'
  archived: boolean;
  triggeredAt: string;           // ISO 8601
  createdAt: string;
}

Supporting Types

supporting-types.ts
interface AlertScope {
  assets: string[];
  chains: string[];
  wallets: string[];
  positions?: string[] | null;
}
 
interface SeverityPolicy {
  watch?: SeverityCondition;
  warning?: SeverityCondition;
  critical?: SeverityCondition;
}
 
interface SeverityCondition {
  condition: string;
  description: string;
}
 
interface ChannelRouting {
  inApp: boolean;
  push: boolean;
  telegram: boolean;
  email: boolean;
}
 
interface DebounceConfig {
  cooldownSeconds: number;
  recurring: boolean;
}
 
interface WebhookConfig {
  url: string;
  secret?: string;  // for HMAC-SHA256 signing
}
 
interface EvidencePayload {
  dataPoints: EvidenceDataPoint[];
  chartData: ChartData | null;
  sourceLinks: SourceLink[] | null;
}
 
interface EvidenceDataPoint {
  label: string;
  value: string;
  unit: string | null;
}
 
interface ChartData {
  timestamps: string[];
  values: number[];
  threshold_line?: number;
}
 
interface SourceLink {
  label: string;
  url: string;
}
 
interface TransactionContext {
  transactionHash: string;
  blockNumber: number;
  blockTimestamp: string;
  fromAddress: string;
  toAddress: string;
}

AlertSettings

alert-settings-types.ts
interface AlertSettings {
  channels: ChannelRouting;
  severityRouting?: SeverityRoutingMatrix;
  chatPings?: ChatPingConfig;
  dnd?: DndConfig;
}
 
interface SeverityRoutingMatrix {
  watch: ChannelRouting;
  warning: ChannelRouting;
  critical: ChannelRouting;
}
 
interface ChatPingConfig {
  enabled: boolean;
  warningAndCriticalOnly: boolean;
}
 
interface DndConfig {
  enabled: boolean;
  startTime?: string;
  endTime?: string;
  timezone?: string;
}

AlertTemplate

alert-template-types.ts
interface AlertTemplate {
  id: string;
  name: string;
  category: AlertCategory;
  description: string;
  bestFor?: string;
  requiredParams: ParamSchema[];
  defaultParams?: Record<string, unknown>;
  severityPolicy: SeverityPolicy;
  allowedScopes?: string[];
  defaultChannels?: ChannelRouting;
  rateCost?: number;
}
 
interface ParamSchema {
  key: string;
  label: string;
  type: 'string' | 'number' | 'currency' | 'select';
  required: boolean;
  options?: string[];
  default?: string | number;
}

OnboardingState

onboarding-types.ts
interface OnboardingState {
  userId: string;
  completed: boolean;
  goal?: string;
  riskProfile?: string;
}

Request/Response Types

request-response-types.ts
interface CreateSubscriptionParams {
  alert: AlertConfig;
  webhook?: WebhookConfig;
}
 
interface UpdateSubscriptionParams {
  alertConfig?: AlertConfig;
  channels?: Partial<ChannelRouting>;
  severityPolicy?: Partial<SeverityPolicy>;
  status?: AlertStatus;
  cooldownSeconds?: number;
  webhook?: WebhookConfig | null;  // null to remove
}
 
interface InboxFilters {
  readState?: 'all' | 'unread';
  severity?: AlertSeverity[];
  category?: AlertCategory[];
  includeArchived?: boolean;
  limit?: number;
  offset?: number;
}
 
interface InboxResponse {
  events: TriggeredAlert[];
  hasMore: boolean;
  cursor?: string;
}
 
interface UnreadCountResponse {
  unreadCount: number;
}
 
interface TemplatesResponse {
  templates: AlertTemplate[];
  supportedChains: string[];
}
 
interface SubscriptionDetailResponse {
  subscription: UserAlert;
  params: Record<string, unknown>;
}
 
interface SubscriptionEventsResponse {
  events: TriggeredAlert[];
  total: number;
}
 
interface AlertFromQueryParams {
  query: string;
  userId: string;
  sessionId?: string;
  walletAddress?: string;
  chain?: string;
}
 
interface AlertFromQueryResponse {
  mode: 'created' | 'interactive' | 'form' | 'error';
  alert?: UserAlert;
  blocks?: unknown[];
  error?: string;
}
 
interface SuccessResponse {
  success: boolean;
}
 
interface MarkReadResponse {
  markedCount: number;
}

Enums

TypeValues
AlertType'price_change' | 'volume' | 'dormant_wallet' | 'whale_watch' | 'market_screener' | 'twap' | 'token_transfer' | 'balance_change'
AlertSeverity'watch' | 'warning' | 'critical'
AlertStatus'active' | 'paused' | 'snoozed'
SnoozeDuration'1h' | '1d' | '1w'
ReadState'unread' | 'read'
AlertCategory'portfolio-risk' | 'yield' | 'stablecoin' | 'market-moves' | 'wallet-activity' | 'whales' | 'news' | 'screeners'
AlertCreatedFrom'chat' | 'library'

Next Steps

Was this helpful?