Read the event stream (catch-up)
GEThttps://api.evora.lol/api/developer-api/apps/{appId}/events
Requires scopelogs:read
Every event is recorded here whether or not a webhook is configured, so this is how you recover anything a webhook delivery missed.
Poll it with a cursor instead of reconciling by walking your users: one request returns only what changed, rather than re-fetching every subscription on a timer.
GET /apps/{appId}/events?since=10432&limit=100 -> { events: [...], next_cursor: "10530", has_more: false }
Order is by seq, a monotonic integer. Do not page by created_at — two events can share a millisecond and a clock adjustment can make a timestamp cursor skip or repeat rows.
Events age out on the platform retention window (90 days by default).
Path parameters
| appIdrequired string (uuid) | Application UUID. App-scoped keys may only use their own application. |
Query parameters
| since string | Cursor. Pass the next_cursor from your previous call. Exclusive, so you can store and resend it verbatim. |
| limit integer | Maximum events to return in this page. Default: 100 · Range: 1–500 |
| types string | Comma-separated event names to filter by. |
Responses
200Events in ascending cursor order.
json
{ "events": [ { "id": "b1c2...", "seq": "10530", "type": "subscription.extended", "payload": { "event": "subscription.extended", "user_id": "4a28...", "expiry": "2026-10-01T00:00:00.000Z" }, "created_at": "2026-08-06T19:44:02.113Z" } ], "next_cursor": "10530", "has_more": false }
400
since was not a numeric cursor.json
{ "error": "since must be a numeric cursor returned as next_cursor", "code": "INVALID_CURSOR" }
403Key lacks the required scope, or the resource belongs to another tenant.
json
{ "error": "API key missing required scope: users:write" }
More in Webhooks
Base URL https://api.evora.lol/api/developer-api · full spec at developer-api.yaml · back to the docs