# Poll the event feed

Source: https://help.ruuster.com/api/events-feed

```http
GET https://api.ruuster.com/v1/events
```

Read the same lead events webhooks send, by polling. No subscription needed; events are kept 30 days.

- Authentication: `x-api-key` and `x-email` headers of an owner or admin
- Rate limit: 120 requests per minute per key

## Query parameters

| Name | Type | Default | Description |
|---|---|---|---|
| `kinds` | string | all | Comma-separated event kinds, or `lead.*` |
| `since` | string | | `meta.nextCursor` from the previous call. Omit it to start 24 hours back |
| `limit` | integer | `100` | Events per page, 1 to 500 |

Events come back oldest first. Save `meta.nextCursor` after each call and pass it as `since` next time; `meta.hasMore` is `true` when another page is ready now. De-duplicate on `id`. The feed counts against your normal limits.

## Response

`data.events` uses the same envelope as webhook deliveries: `id`, `kind`, `occurredAt`, `brokerageId`, `apiVersion`, `data`, `links`. See [Event catalog](https://help.ruuster.com/api/webhook-events).

## Example request

cURL:

```bash
curl -s "https://api.ruuster.com/v1/events?kinds=lead.tour_request,lead.contact_agent&limit=2" \
  -H "x-api-key: $RUUSTER_API_KEY" \
  -H "x-email: $RUUSTER_EMAIL"
```

Node.js:

```javascript
const res = await fetch("https://api.ruuster.com/v1/events?kinds=lead.tour_request,lead.contact_agent&limit=2", {
  headers: {
    "x-api-key": process.env.RUUSTER_API_KEY,
    "x-email": process.env.RUUSTER_EMAIL,
  },
});
const body = await res.json();
if (!body.ok) throw new Error(`${body.error.code}: ${body.error.message} (${body.requestId})`);
console.log(body.data);
```

Python:

```python
import os
import requests

res = requests.get(
    "https://api.ruuster.com/v1/events?kinds=lead.tour_request,lead.contact_agent&limit=2",
    headers={"x-api-key": os.environ["RUUSTER_API_KEY"], "x-email": os.environ["RUUSTER_EMAIL"]},
    timeout=30,
)
body = res.json()
if not body["ok"]:
    raise RuntimeError(f'{body["error"]["code"]}: {body["error"]["message"]} ({body.get("requestId")})')
print(body["data"])
```

## Example response

```json
{
  "ok": true,
  "data": {
    "events": [
      { "id": "evt_9a17f2c4b8e05d31", "kind": "lead.tour_request", "occurredAt": "2026-09-30T02:19:03Z", "…": "the full envelope, as in the webhook event catalog" },
      { "id": "evt_6f3a9d1c0e8b4725", "kind": "lead.contact_agent", "occurredAt": "2026-09-30T19:07:56Z", "…": "the full envelope, as in the webhook event catalog" }
    ]
  },
  "meta": { "nextCursor": "cur_ev_B3t8Wn4K", "hasMore": false }
}
```
