Skip to content

Alerts API

Set a rule on a token — a price move, a liquidity drop, holder concentration — and read what it fired. What each alert type means for a reader rather than an integrator is in Alerts & Notifications.

A rule is not a buy alert. A buy alert reports every trade above a floor and is delivered to a Discord channel or Telegram group. A rule watches a metric and fires once when it crosses your threshold, through your own notification channels.

Endpoints

MethodPathAuthDescription
GET/api/v2/alerts/rulesSessionYour rules
POST/api/v2/alerts/rulesSessionCreate a rule on one token
PUT/api/v2/alerts/rules/{id}SessionChange a rule
DELETE/api/v2/alerts/rules/{id}SessionDelete a rule
POST/api/v2/alerts/rules/{id}/toggleSessionTurn a rule on or off
GET/api/v2/alerts/activeSessionAlerts currently firing
GET/api/v2/alerts/historySessionPast alerts, paginated
GET/api/v2/alerts/summarySessionCounts by status
POST/api/v2/alerts/{id}/acknowledgeSessionMark one as seen
POST/api/v2/alerts/{id}/resolveSessionClose one
POST/api/v2/alerts/bulk-acknowledgeSessionMark many as seen
POST/api/v2/alerts/bulk-resolveSessionClose many

Every endpoint acts on your own wallet's rules and alerts. Buy-alert feeds are a different resource: /api/v2/alerts/feeds.

When rules are evaluated

Every 15 minutes. A rule fires once per breach, clears when the metric recovers, and a data gap never clears one — if we cannot read the metric, a firing alert stays firing rather than silently resolving.

Alert types

alertTypePlanOperatorsNotes
heartbeat_scoreFreeanyEVM only. Reads your crown's health score. Needs a crown on the token.
holder_count_dropProany
liquidity_dropProany
volume_anomalyProany
price_changeProany
top10_concentrationPro+gt, pct_spikeTop ten holders' share of supply. Only evaluated against a recent holder reading, never an estimate.
copycat_detectedPro+anyNeeds a crown on the token.

The plan requirement is a floor, not a match: Pro+ satisfies a Pro requirement.

Operators are gt, lt, pct_drop and pct_spike. A type that accepts only some of them rejects the rest and names the ones it takes.

Create a rule

bash
curl -X POST https://api.chaindaddy.io/api/v2/alerts/rules \
  -H "Authorization: Bearer $JWT" \
  -H "Content-Type: application/json" \
  -d '{
    "chainId": "eip155:8453",
    "tokenAddress": "0xYourToken",
    "alertType": "price_change",
    "thresholdValue": 20,
    "thresholdOperator": "pct_drop",
    "timeWindowMinutes": 60
  }'
FieldRequiredNotes
chainIdYesCAIP-2, e.g. eip155:8453
tokenAddressYesThe token's contract address
alertTypeYesFrom the table above
thresholdValueYesMust be positive
thresholdOperatorYesgt, lt, pct_drop, pct_spike
timeWindowMinutesNo5 or more
cooldownMinutesNo5 or more. Defaults to 60
enabledNoDefaults to true

Returns 201 with the created rule.

If it is refused

A rule that could never fire is refused before the plan check, so you are never sold one that does nothing:

StatusErrorMeans
400chain_unsupportedThat alert type has no data source on that chain — heartbeat_score on Solana, for instance.
400crown_requiredA crown-bound type on a token with no registered crown.
400invalid alertType / invalid thresholdOperatorNot in the catalog, or an operator the type refuses.
403Tier subscription requiredNames the plan to buy, with an upgrade_url.
403Free tier limited to 3 alert rulesFree accounts hold up to 3 rules.
403Your plan is limited to 50 alert rulesEvery paid plan holds up to 50. Delete one to add another — no paid plan raises it.
503could not check this token's pageThe crown lookup failed. Retry shortly.
503could not check how many rules you have / another rule from this wallet is still being createdYour rule count could not be read, or another create from the same wallet was still in flight. Nothing was created — retry.

Read your rules

bash
curl "https://api.chaindaddy.io/api/v2/alerts/rules?chainId=eip155:8453&tokenAddress=0xYourToken" \
  -H "Authorization: Bearer $JWT"

Pass chainId and tokenAddress together to narrow to one token, or neither for all of them. symbol is not accepted — a symbol can name more than one token, so filtering by it would quietly return every token's rules.

Read what is firing

GET /api/v2/alerts/active takes the same token filter and returns the firing alerts, each with the metric_value that breached and the threshold_value it broke:

json
{
  "success": true,
  "data": {
    "alerts": [
      {
        "id": "…",
        "rule_id": "…",
        "symbol": "TOKEN",
        "alert_type": "liquidity_drop",
        "status": "active",
        "severity": "high",
        "metric_value": 41.2,
        "threshold_value": 50,
        "triggered_at": "2026-09-17T10:00:00Z",
        "notification_sent": true
      }
    ]
  }
}

GET /api/v2/alerts/history is the same shape, paginated: limit defaults to 20 and caps at 100, offset caps at 100000. Both are echoed back with the results.

Acknowledge and resolve

Acknowledging records that you saw an alert; resolving closes it.

bash
curl -X POST https://api.chaindaddy.io/api/v2/alerts/bulk-resolve \
  -H "Authorization: Bearer $JWT" \
  -H "Content-Type: application/json" \
  -d '{"ids": ["alert-1", "alert-2"]}'