---
title: "Detected alert events feed"
method: GET
path: "/api/v1/alerts/events"
tags: ["Workspace"]
---

# Detected alert events feed

`GET /api/v1/alerts/events`

## Request

- Base URL: `https://api.trysonar.app`
- URL: `https://api.trysonar.app/api/v1/alerts/events`
- Auth: HTTP bearer

The org's detected alert events, newest first — the same feed as the in-app Recent alerts panel and the email digest. Events only exist for alert types with enabled rules; detection runs once daily, except new_review events, which arrive within minutes of a review syncing. Poll with `since` (your last poll time) to react to changes programmatically. Requires the Indie plan.

## Query parameters

- `type` 'rank_drop' | 'rank_gain' | 'entered_top10' | 'left_top10' | 'new_ranking' | 'rating_drop' | 'review_spike' | 'competitor_change' | 'top_chart' | 'new_review'
- `app_id` string
- `since` string, date-time
- `limit` integer

## Response `200`

Alert events: { id, type, app_id, keyword_id, measured_at, payload (type-specific), emailed_at, created_at }

- object
  - `data` object, required: Result payload — full field reference at https://trysonar.app/docs/api

## Other responses

- `400`: Missing or invalid request parameters
- `401`: Missing or invalid API key
- `403`: Plan or scope insufficient (workspace endpoints need the Indie plan; writes also need a write-scope key)
- `429`: Rate limited — see `error.reason`: daily_limit (Indie plan: 1,000 requests/day, resets 00:00 UTC; see `reset_at`), anonymous_daily_limit / batch_too_large (keyless free tier), store_rate_limited or concurrency_limit (transient, honor `retry_after_seconds`)
- `500`: Unexpected server error

---

[API](https://skmtc.dev/trysonar/apis/sonar-api.md) · [All operations](https://skmtc.dev/trysonar/apis/sonar-api/llms.txt) · [OpenAPI document](https://skmtc.dev/trysonar/apis/sonar-api/revisions/73fe8bc46522?raw)
