# List events

> events_list — Events of the workspace in order (new DM, reply, mention, follower gained/lost, post published/failed, campaign person entered/replied, account session lost, VPS offline, your jobs finishing…).

Source: https://x.builera.app/docs/en/reference/events_list

`events_list` · Reads saved data

Events of the workspace in order (new DM, reply, mention, follower gained/lost, post published/failed, campaign person entered/replied, account session lost, VPS offline, your jobs finishing…). Pass after = the last cursor you saw to get only newer ones; kept 30 days. This is the exact path — webhooks are only faster. Message text appears only with the read-message-text right.

| | |
|---|---|
| REST | `GET /api/public/v1/events` |
| MCP tool | `events_list` |
| Permission needed | `view` — Owner, Manager, Operator, Viewer |
| Scope group | `events:read` |
| Group | Events and webhooks |
| Shown up front in profiles | Operate X accounts, Automation, Contacts & lists, Reports, Infrastructure |

## Input {#input}

| Field | Type | Required | Description |
|---|---|---|---|
| `after` | string or integer (0–9007199254740991) | No | Cursor of the last event you processed (events newer than it). Omit = the newest page. |
| `types` | array of `job.succeeded` · `job.failed` · `job.unknown` · `job.held` · `job.cancelled` · `batch.completed` · `dm.received` · `dm.request_received` · `reply.received` · `mention.received` · `follower.gained` · `follower.lost` · `post.published` · `post.failed` · `post.partial` · `campaign.person_entered` · `campaign.person_replied` · `campaign.person_completed` · `campaign.paused_auto` · `account.session_lost` · `account.session_restored` · `account.safety_changed` · `account.x_rate_limited` · `account.chat_locked` · `vps.offline` · `vps.online` · `proxy.failed` · `alert.opened` · `integration.paused` · `scan.completed` · `limit.reached` (1–31 items) | No | Only these event types. |
| `account` | string (0–100 chars) | No | Only events of this account (account_id or @handle). |
| `limit` | integer (1–200) | No |  |

## Result {#output}

Returned in the `{ data, meta }` envelope, without creating a job on X. Lists include `next_cursor` and `has_more`.

## Example {#example}

### Call over REST {#example-rest}

```bash
curl -X GET "https://reach-link-craft.lovable.app/api/public/v1/events" \
  -H "Authorization: Bearer $XBUDDY_API_KEY"
```

### Call over MCP {#example-mcp}

```json
{
  "method": "tools/call",
  "params": {
    "name": "events_list",
    "arguments": {}
  }
}
```

## Errors you may get {#errors}

| Code | HTTP | Retryable |
|---|---|---|
| [`unauthorized`](/docs/en/errors/unauthorized) | 401 | No |
| [`key_expired`](/docs/en/errors/key_expired) | 401 | No |
| [`integration_revoked`](/docs/en/errors/integration_revoked) | 401 | No |
| [`connection_not_linked`](/docs/en/errors/connection_not_linked) | 403 | No |
| [`integration_paused`](/docs/en/errors/integration_paused) | 403 | No |
| [`workspace_integrations_paused`](/docs/en/errors/workspace_integrations_paused) | 403 | No |
| [`integration_authorization_lost`](/docs/en/errors/integration_authorization_lost) | 403 | No |
| [`workspace_suspended`](/docs/en/errors/workspace_suspended) | 403 | No |
| [`forbidden`](/docs/en/errors/forbidden) | 403 | No |
| [`invalid_input`](/docs/en/errors/invalid_input) | 422 | No |
| [`rate_limited`](/docs/en/errors/rate_limited) | 429 | Yes |
| [`internal`](/docs/en/errors/internal) | 500 | Yes |
| [`ambiguous_account`](/docs/en/errors/ambiguous_account) | 409 | No |
| [`account_not_allowed`](/docs/en/errors/account_not_allowed) | 403 | No |
| [`not_found`](/docs/en/errors/not_found) | 404 | No |

[Back to all operations](/docs/en/reference)
