# Events

> https://meetkeely.com/developers/api/events · Updated 2026-11-06 · Keely, by Metrica Fit LLC

## GET /v1/events

- **Scope:** any; only the events in your scopes, plus the `connection.*` and `test.ping` addressed to your app
- **Query:** `since`, the number of the last event you saw (`123` for `evt_123`; `0`, the default, for everything kept); `limit`, 1 to 500

The events Keely wrote for this person in the last 30 days, the same ones [the webhooks](https://meetkeely.com/developers/webhooks) deliver: what changed, typed, with links to fetch it, and never a number from a summary. For an app that polls, or to replay what a webhook missed.

```bash Request
curl "https://meetkeely.com/api/v1/events?since=122" \
  -H "Authorization: Bearer ACCESS_TOKEN"
```

```json Response
{
  "since": 122,
  "next": 124,
  "has_more": false,
  "events": [
    { "id": "evt_123", "type": "night.created", "person_id": "0b8f1a52-7e3c-4d0a-9c1b-2e6f3a4b5c6d",
      "occurred_at": "2026-09-27T06:30:00Z", "data": { "date": "2026-09-27", "recovery_status": "scored" },
      "links": { "day": "https://meetkeely.com/api/v1/days/2026-09-27" } },
    { "id": "evt_124", "type": "day.created", "person_id": "0b8f1a52-7e3c-4d0a-9c1b-2e6f3a4b5c6d",
      "occurred_at": "2026-09-27T06:30:00Z", "data": { "date": "2026-09-27" },
      "links": { "day": "https://meetkeely.com/api/v1/days/2026-09-27" } }
  ]
}
```

Events come in order of `id`; when `has_more` is true, call again with `since=next`. [The event types](https://meetkeely.com/developers/webhooks#the-event-types) say what each `data` holds. [`/v1/changes`](https://meetkeely.com/developers/api/changes) and `/v1/events` answer different questions: changes are rows by their `updated_at`, at any age, for catching up; events are typed, buffered and kept 30 days, for reacting.
