Skip to main content

Unified Alerts

The Unified Alerts API provides a single interface for managing all alert types: gas, monitoring, performance, price, and system alerts.

Alert Types

TypeDescriptionUse Case
gasGas price threshold alertsNotify when gas drops below target
monitoringSystem health alertsService degradation notifications
performanceMetrics monitoring alertsLatency or throughput thresholds
priceToken/asset price alertsPrice movement notifications
systemCritical system alertsInfrastructure issues

Endpoints

Create Alert

POST /v1/alerts

Create an alert of any supported type.

Request

{
"name": "Low Gas Alert",
"alert_type": "gas",
"threshold": 25.0,
"chain_id": "1",
"condition": "below",
"email": "user@example.com",
"enabled": true
}

Parameters

FieldTypeRequiredDescription
namestringYesAlert name
alert_typestringYesType: gas, monitoring, performance, price, system
thresholdfloatYesThreshold value
chain_idstringNoChain ID (for gas/price alerts)
conditionstringNoabove or below (default: above)
emailstringNoNotification email
webhook_urlstringNoWebhook for notifications
enabledbooleanNoEnable alert (default: true)

Response

{
"id": "alert_abc123",
"name": "Low Gas Alert",
"alert_type": "gas",
"threshold": 25.0,
"chain_id": "1",
"condition": "below",
"email": "user@example.com",
"enabled": true,
"created_at": "2026-01-15T10:30:00Z",
"last_triggered": null,
"trigger_count": 0
}

Get Alerts

GET /v1/alerts

Retrieve all alerts for the current user.

Query Parameters

ParameterTypeDescription
alert_typestringFilter by type
enabled_onlybooleanOnly enabled alerts
limitintMax results (1-200, default: 100)
offsetintPagination offset

Response

[
{
"id": "alert_abc123",
"name": "Low Gas Alert",
"alert_type": "gas",
"threshold": 25.0,
"chain_id": "1",
"condition": "below",
"enabled": true,
"last_triggered": "2026-01-15T08:15:00Z",
"trigger_count": 5
},
{
"id": "alert_def456",
"name": "ETH Price Alert",
"alert_type": "price",
"threshold": 4000.0,
"condition": "above",
"enabled": true,
"last_triggered": null,
"trigger_count": 0
}
]

Delete Alert

DELETE /v1/alerts/{alert_id}

Delete an alert.

Response

{
"message": "Alert alert_abc123 deleted successfully"
}

Acknowledge Alert

POST /v1/alerts/{alert_id}/acknowledge

Acknowledge an active alert to stop further notifications until the condition changes.

Request

{
"notes": "Investigating high gas prices"
}

Response

{
"alert_id": "alert_abc123",
"acknowledged": true,
"acknowledged_by": "user@example.com",
"notes": "Investigating high gas prices"
}

Resolve Alert

POST /v1/alerts/{alert_id}/resolve

Resolve an alert and move it to history.

Request

{
"resolution": "Gas prices normalized after network congestion cleared"
}

Response

{
"alert_id": "alert_abc123",
"resolved": true,
"resolved_by": "user@example.com",
"resolution": "Gas prices normalized after network congestion cleared"
}

Get Alert Types

GET /v1/alerts/types

Returns list of supported alert types.

["gas", "monitoring", "performance", "price", "system"]

Get Alert Summary

GET /v1/alerts/summary

Get summary statistics for your alerts.

{
"total_alerts": 15,
"enabled_alerts": 12,
"by_type": {
"gas": {"total": 5, "enabled": 4},
"price": {"total": 6, "enabled": 5},
"monitoring": {"total": 3, "enabled": 2},
"performance": {"total": 1, "enabled": 1}
},
"recent_activity": 8
}

Alert Type Examples

Gas Price Alert

Get notified when Ethereum gas drops below 25 gwei:

{
"name": "ETH Low Gas",
"alert_type": "gas",
"threshold": 25.0,
"chain_id": "1",
"condition": "below",
"email": "user@example.com"
}

Price Alert

Get notified when ETH exceeds $4000:

{
"name": "ETH Price Target",
"alert_type": "price",
"threshold": 4000.0,
"condition": "above",
"webhook_url": "https://your-server.com/webhook"
}

Monitoring Alert

Get notified on system health degradation:

{
"name": "System Health",
"alert_type": "monitoring",
"threshold": 0.8,
"condition": "below",
"email": "ops@example.com"
}

Performance Alert

Get notified when latency exceeds threshold:

{
"name": "High Latency",
"alert_type": "performance",
"threshold": 500.0,
"condition": "above",
"email": "dev@example.com"
}

Code Examples

Python - Alert Manager

import requests
from dataclasses import dataclass
from enum import Enum
from typing import Optional

class AlertType(str, Enum):
GAS = "gas"
MONITORING = "monitoring"
PERFORMANCE = "performance"
PRICE = "price"
SYSTEM = "system"

@dataclass
class Alert:
id: str
name: str
alert_type: AlertType
threshold: float
enabled: bool
trigger_count: int

class AlertManager:
def __init__(self, api_key: str):
self.api_key = api_key
self.base_url = "https://api.axol.io/api/v1/alerts"
self.headers = {"X-API-Key": api_key}

def create_gas_alert(
self,
name: str,
chain_id: str,
threshold: float,
condition: str = "below",
email: Optional[str] = None
) -> dict:
"""Create a gas price alert."""
return self._create_alert({
"name": name,
"alert_type": "gas",
"chain_id": chain_id,
"threshold": threshold,
"condition": condition,
"email": email,
"enabled": True
})

def create_price_alert(
self,
name: str,
threshold: float,
condition: str = "above",
webhook_url: Optional[str] = None
) -> dict:
"""Create a price alert."""
return self._create_alert({
"name": name,
"alert_type": "price",
"threshold": threshold,
"condition": condition,
"webhook_url": webhook_url,
"enabled": True
})

def _create_alert(self, data: dict) -> dict:
response = requests.post(
self.base_url,
headers=self.headers,
json={k: v for k, v in data.items() if v is not None}
)
response.raise_for_status()
return response.json()

def get_alerts(
self,
alert_type: Optional[AlertType] = None,
enabled_only: bool = False
) -> list[Alert]:
"""Get all alerts with optional filtering."""
params = {"enabled_only": enabled_only}
if alert_type:
params["alert_type"] = alert_type.value

response = requests.get(
self.base_url,
headers=self.headers,
params=params
)
response.raise_for_status()

return [
Alert(
id=a["id"],
name=a["name"],
alert_type=AlertType(a["alert_type"]),
threshold=a["threshold"],
enabled=a["enabled"],
trigger_count=a["trigger_count"]
)
for a in response.json()
]

def delete_alert(self, alert_id: str) -> bool:
"""Delete an alert."""
response = requests.delete(
f"{self.base_url}/{alert_id}",
headers=self.headers
)
return response.status_code == 200

def acknowledge_alert(self, alert_id: str, notes: str = None) -> dict:
"""Acknowledge an alert."""
response = requests.post(
f"{self.base_url}/{alert_id}/acknowledge",
headers=self.headers,
json={"notes": notes} if notes else {}
)
response.raise_for_status()
return response.json()

def get_summary(self) -> dict:
"""Get alert summary statistics."""
response = requests.get(
f"{self.base_url}/summary",
headers=self.headers
)
response.raise_for_status()
return response.json()

# Usage
manager = AlertManager(api_key="YOUR_KEY")

# Create gas alert for low Ethereum gas
gas_alert = manager.create_gas_alert(
name="ETH Low Gas",
chain_id="1",
threshold=25.0,
condition="below",
email="user@example.com"
)
print(f"Created alert: {gas_alert['id']}")

# Create price alert
price_alert = manager.create_price_alert(
name="ETH $4K Target",
threshold=4000.0,
condition="above"
)

# Get all gas alerts
gas_alerts = manager.get_alerts(alert_type=AlertType.GAS)
print(f"Active gas alerts: {len(gas_alerts)}")

# Get summary
summary = manager.get_summary()
print(f"Total alerts: {summary['total_alerts']}")
print(f"Enabled: {summary['enabled_alerts']}")

TypeScript - Alert System

interface AlertConfig {
name: string;
alert_type: 'gas' | 'monitoring' | 'performance' | 'price' | 'system';
threshold: number;
chain_id?: string;
condition?: 'above' | 'below';
email?: string;
webhook_url?: string;
enabled?: boolean;
}

interface Alert extends AlertConfig {
id: string;
created_at: string;
last_triggered: string | null;
trigger_count: number;
}

interface AlertSummary {
total_alerts: number;
enabled_alerts: number;
by_type: Record<string, { total: number; enabled: number }>;
recent_activity: number;
}

class AlertClient {
private apiKey: string;
private baseUrl = 'https://api.axol.io/api/v1/alerts';

constructor(apiKey: string) {
this.apiKey = apiKey;
}

private async request<T>(
method: string,
path = '',
body?: object
): Promise<T> {
const response = await fetch(`${this.baseUrl}${path}`, {
method,
headers: {
'X-API-Key': this.apiKey,
'Content-Type': 'application/json'
},
body: body ? JSON.stringify(body) : undefined
});

if (!response.ok) {
throw new Error(`Alert API error: ${response.statusText}`);
}

return response.json();
}

async createAlert(config: AlertConfig): Promise<Alert> {
return this.request<Alert>('POST', '', config);
}

async getAlerts(options?: {
alertType?: string;
enabledOnly?: boolean;
limit?: number;
}): Promise<Alert[]> {
const params = new URLSearchParams();
if (options?.alertType) params.set('alert_type', options.alertType);
if (options?.enabledOnly) params.set('enabled_only', 'true');
if (options?.limit) params.set('limit', options.limit.toString());

const query = params.toString();
return this.request<Alert[]>('GET', query ? `?${query}` : '');
}

async deleteAlert(alertId: string): Promise<void> {
await this.request('DELETE', `/${alertId}`);
}

async acknowledgeAlert(
alertId: string,
notes?: string
): Promise<{ acknowledged: boolean }> {
return this.request('POST', `/${alertId}/acknowledge`, { notes });
}

async resolveAlert(
alertId: string,
resolution?: string
): Promise<{ resolved: boolean }> {
return this.request('POST', `/${alertId}/resolve`, { resolution });
}

async getSummary(): Promise<AlertSummary> {
return this.request<AlertSummary>('GET', '/summary');
}

async getTypes(): Promise<string[]> {
return this.request<string[]>('GET', '/types');
}
}

// Usage
const client = new AlertClient(process.env.AXOL_API_KEY!);

// Create alerts for MEV trading
async function setupTradingAlerts() {
// Gas alert - notify when gas is low enough for profitable trades
const gasAlert = await client.createAlert({
name: 'Low Gas for Trading',
alert_type: 'gas',
threshold: 20,
chain_id: '1',
condition: 'below',
webhook_url: 'https://your-bot.com/webhook/gas'
});
console.log(`Gas alert created: ${gasAlert.id}`);

// Price alert - ETH price movement
const priceAlert = await client.createAlert({
name: 'ETH Volatility',
alert_type: 'price',
threshold: 3500,
condition: 'below',
email: 'trader@example.com'
});
console.log(`Price alert created: ${priceAlert.id}`);

// Performance alert - API latency
const perfAlert = await client.createAlert({
name: 'API Latency High',
alert_type: 'performance',
threshold: 300,
condition: 'above',
webhook_url: 'https://your-bot.com/webhook/performance'
});
console.log(`Performance alert created: ${perfAlert.id}`);
}

// Monitor alerts
async function monitorAlerts() {
const summary = await client.getSummary();
console.log(`Total alerts: ${summary.total_alerts}`);
console.log(`Recently triggered: ${summary.recent_activity}`);

// Check for triggered gas alerts
const gasAlerts = await client.getAlerts({ alertType: 'gas' });
const triggered = gasAlerts.filter(a => a.last_triggered !== null);

if (triggered.length > 0) {
console.log(`${triggered.length} gas alerts have triggered`);
}
}

setupTradingAlerts();

Webhook Notifications

When an alert triggers, webhooks receive a POST request:

{
"event": "alert_triggered",
"alert": {
"id": "alert_abc123",
"name": "Low Gas Alert",
"alert_type": "gas",
"threshold": 25.0,
"condition": "below"
},
"current_value": 22.5,
"triggered_at": "2026-01-15T10:30:00Z",
"chain_id": "1"
}

Best Practices

1. Use Appropriate Thresholds

Alert TypeRecommended Approach
GasSet based on your average transaction cost tolerance
PriceUse percentage change rather than absolute values for volatile assets
PerformanceSet above P95 latency to avoid noise
Monitoring0.8-0.9 health score threshold

2. Combine Alerts with Actions

# Example: Auto-execute when gas is low
def handle_gas_webhook(payload: dict):
if payload["current_value"] < 20:
execute_pending_transactions()

3. Clean Up Old Alerts

# Remove alerts that haven't triggered in 30 days
alerts = manager.get_alerts()
for alert in alerts:
if alert.trigger_count == 0:
manager.delete_alert(alert.id)

See Also