GET /api/v1/alerts
Requires API key.
| Name | Type | Required | Description |
|---|---|---|---|
severity | string | critical, warning, or info | |
type | string | sanctions_match, river_level, dark_fleet | |
unacknowledged | string | true to only show unread alerts | |
cursor | string | ISO timestamp for cursor pagination | |
limit | number | Default 20, capped by your access tier |
GET /api/v1/alerts/unified
Requires API key.
| Name | Type | Required | Description |
|---|---|---|---|
product | string | all (default), overwatch, or locus | |
severity | string | critical, warning, or info | |
watchlist | string | true to only include watched vessels | |
portfolio | string | Locus portfolio id filter | |
state | string | all (default), open, read, resolved, snoozed | |
cursor | string | ISO timestamp for cursor pagination | |
limit | number | Default 25, max 100 |
POST /api/v1/alerts/unified/state
Requires API key.
| Name | Type | Required | Description |
|---|---|---|---|
alert_id | string | ✓ | Alert id in source:id format (e.g. dark_event:456) |
action | string | ✓ | read, resolve, snooze, or open |
snooze_until | string | ISO timestamp; defaults to +24 hours for snooze |
Alert rules
Define custom rules that filter the unified alert stream using boolean expressions. Rules support nestedand/or groups and can match on product, severity, event type, vessel IMO, or any metadata field. Every rule change is versioned so you can audit who changed what and when.
GET /api/v1/alerts/rules
Requires API key.
POST /api/v1/alerts/rules
Requires API key.
| Name | Type | Required | Description |
|---|---|---|---|
name | string | ✓ | Rule name |
description | string | Human-readable description | |
expression | object | ✓ | Boolean expression tree (see below) |
severity_override | string | Override the alert’s severity when this rule matches | |
dedupe_window_minutes | number | Suppress duplicate matches within this window (1–1440, default 60) | |
active | boolean | Whether the rule is active (default true) |
Expression format
Expressions are recursive trees of groups and conditions:| Field | Description |
|---|---|
product | overwatch or locus |
severity | critical, warning, or info |
source | platform, dark_event, spoofing_alert, locus_alert |
event_type | Alert event type string |
entity_id | Entity identifier |
imo_number | 7-digit IMO number |
metadata.* | Any key in the alert’s metadata object (e.g. metadata.gap_hours) |
eq, neq, in, contains, gte, lte
Example
PATCH /api/v1/alerts/rules
Requires API key.
notes field to record why the change was made.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
id | number | ✓ | Rule id |
name | string | Updated name | |
expression | object | Updated expression | |
active | boolean | Enable or disable the rule | |
notes | string | Version history note |
DELETE /api/v1/alerts/rules
Requires API key.
| Name | Type | Required | Description |
|---|---|---|---|
id | number | ✓ | Rule id (query param) |
POST /api/v1/alerts/rules/dry-run
Requires API key.
| Name | Type | Required | Description |
|---|---|---|---|
expression | object | ✓ | Rule expression to test |
product | string | all (default), overwatch, or locus | |
severity | string | Filter by severity before evaluation | |
watchlistOnly | boolean | Only test against watchlisted vessel alerts | |
portfolioId | string | Scope to a Locus portfolio | |
limit | number | Max alerts to evaluate (1–200, default 100) |
Alert channels
Configure where alert notifications are delivered. You can enable multiple channels simultaneously—each channel is independently toggled and tested. Supported channels: Slack, Microsoft Teams, email, and custom webhook.GET /api/v1/alerts/channels
Requires API key.
PUT /api/v1/alerts/channels
Requires API key.
| Name | Type | Required | Description |
|---|---|---|---|
channel | string | ✓ | slack, email, teams, or webhook |
enabled | boolean | ✓ | Whether the channel is active |
config | object | ✓ | Channel-specific configuration (see below) |
| Channel | Config fields |
|---|---|
slack | webhook_url — must be a https://hooks.slack.com/services/... URL |
teams | webhook_url — any valid HTTPS URL |
email | to — comma-separated email addresses |
webhook | url — HTTPS endpoint; secret (optional) — HMAC-SHA256 signing key, sent as X-Axiom-Signature header |
DELETE /api/v1/alerts/channels
Requires API key.
| Name | Type | Required | Description |
|---|---|---|---|
channel | string | ✓ | Channel to remove (query param) |
POST /api/v1/alerts/channels/test
Requires API key.
| Name | Type | Required | Description |
|---|---|---|---|
channel | string | ✓ | slack, email, teams, or webhook |
Alert deliveries
Track the status of every alert notification sent through your configured channels. The delivery ledger records each attempt, retries with exponential backoff, and moves permanently failed deliveries to a dead-letter queue.GET /api/v1/alerts/deliveries
Requires API key.
| Name | Type | Required | Description |
|---|---|---|---|
channel | string | Filter by channel type | |
status | string | Filter by delivery status | |
limit | number | Default 50, max 200 |