# List a server's event history

Returns what happened to the server, newest first: created, started, parked, resumed, deleted and every step between, each with a sentence to show. It feeds the history list of a server's detail page.

Each event is one move of the server through its [lifecycle](/docs/api-reference/forge-compute/introduction#server-lifecycle). The `sentence` is English. It is built from the move itself, from who asked for it (you, another member, or Forge automatically) and from a fixed set of automatic reasons; it never contains an address, a provider name or id, or a credential, and never repeats a reason someone typed.

A server is visible to the person who created it and to members with `manage_forge`; anyone else is told it does not exist. Requires a bearer token (or API key) whose principal holds the `use_forge` capability in the acting organization. It works while Forge cloud compute is switched off.

#### Path Parameters

**`host_id`** string required

The server's id: the `fchost_` id returned in `id`, or the UUID sent when the server was created (any letter case, with or without hyphens).

#### Query Parameters

**`limit`** integer optional

Events per page, from 1 to 200. Defaults to 50.

**`before`** string optional

The `next_cursor` of the previous page, to read the next (older) page. Omit it for the newest events. Treat it as opaque: do not parse or build it.

**`organization_id`** string optional

The organization the server belongs to: send its `organization.id` (from [List your servers in every organization](/docs/api-reference/forge-compute/list-my-hosts)). Defaults to your current organization, where a server of another organization is not found. You must be an active member of it, or the request is refused with `403 ORGANIZATION_ACCESS_DENIED`.

#### Headers

**`X-Organization-Id`** string optional

The same as `organization_id`, as a header. When both are sent, the query parameter wins.

## Returns

- **`host_id`** string — the server's `fchost_` id.
- **`events`** array — up to `limit` events, newest first. Events that happened at the same moment always come back in the same order, so paging never skips or repeats one. Each has:
  - **`id`** string — the event's id, `fchev_` followed by 32 hex characters.
  - **`at`** string — when it happened (UTC, ISO 8601 with a `Z` suffix).
  - **`kind`** string — what happened: `created`, `ready`, `parked`, `resumed`, `failed`, `revoked`, `deleted`, or `cap_reached` (parking started because a spending limit was reached). A step without one of those kinds has its own snake_case value — `booting`, `awaiting_client`, `securing`, `installing`, `pairing`, `parking`, `park_undone`, `resuming`, `resume_failed`, `deleting`, `revoking` — and more may be added: show `sentence` for any value you do not know.
  - **`tone`** string — how to present it: `neutral`, `success`, `warning` or `error`.
  - **`sentence`** string — what happened, in English, e.g. "Resumed. The server is running again." or "Parking after a period with no activity."
- **`next_cursor`** string or `null` — send it as `before` for the next page; `null` on the last page.



```json
{
  "host_id": "fchost_5d0c2b9e7a414f3c9e8b1a6d2f4c7e90",
  "events": [
    {"id": "fchev_9b2e4c7a1d3f4e5a8c6b0d2e4f6a8b1c", "at": "2026-10-02T07:15:00Z", "kind": "ready", "tone": "success", "sentence": "Ready."},
    {"id": "fchev_7a1d3f4e5a8c6b0d2e4f6a8b1c9b2e4c", "at": "2026-10-02T07:12:00Z", "kind": "resumed", "tone": "success", "sentence": "Resumed. The server is running again."}
  ],
  "next_cursor": "MjAyNi0xMC0wMlQwNzoxMjowMFp8ZmNoZXZfN2ExZDNmNGU1YThjNmIwZDJlNGY2YThiMWM5YjJlNGM"
}
```

## Errors

| Status | Code | When |
|  --- | --- | --- |
| 401 | `AUTHENTICATION_REQUIRED` | No valid credential. |
| 403 | `ORGANIZATION_ACCESS_DENIED` | `organization_id` or `X-Organization-Id` names an organization you are not an active member of. |
| 403 | `INSUFFICIENT_PERMISSIONS` | The caller does not hold `use_forge` in the acting organization. |
| 404 | `FORGE_COMPUTE_HOST_NOT_FOUND` | No server with this id in the acting organization, or it was created by someone else and the caller does not hold `manage_forge`. |
| 422 | `INVALID_CURSOR` | `before` is not a cursor this endpoint returned. Start again from the first page. |
| 422 | `VALIDATION_ERROR` | `limit` is outside 1 to 200. |
| 422 | `INVALID_ID_FORMAT` | `host_id` is neither a UUID nor `fchost_<32 hex>`. |



```bash cURL
curl "https://api.aitronos.com/v1/forge/compute/hosts/fchost_5d0c2b9e7a414f3c9e8b1a6d2f4c7e90/events?limit=50" \
  -H "Authorization: Bearer $ACCESS_TOKEN"
```


```python Python SDK
# pip install aitronos-sdk
#
# The Python SDK does not expose a typed `forge_compute` namespace yet, so call
# the endpoint directly with the same credential you would pass to `Aitronos(...)`
# — an API key or a bearer token, both sent as `Authorization: Bearer <value>`.
import httpx

API_KEY = "your-api-key"
url = "https://api.aitronos.com/v1/forge/compute/hosts/fchost_5d0c2b9e7a414f3c9e8b1a6d2f4c7e90/events"
headers = {"Authorization": f"Bearer {API_KEY}"}

params = {"limit": 50}
while True:
    page = httpx.get(url, params=params, headers=headers).json()
    for event in page["events"]:
        print(event["at"], event["tone"], event["sentence"])
    if page["next_cursor"] is None:
        break
    params["before"] = page["next_cursor"]
```


```python Python
import os
import requests

token = os.environ["AITRONOS_TOKEN"]
page = requests.get(
    "https://api.aitronos.com/v1/forge/compute/hosts/fchost_5d0c2b9e7a414f3c9e8b1a6d2f4c7e90/events",
    params={"limit": 20},
    headers={"Authorization": f"Bearer {token}"},
).json()
print([event["kind"] for event in page["events"]])
```


```javascript JavaScript
const url = new URL(
  "https://api.aitronos.com/v1/forge/compute/hosts/fchost_5d0c2b9e7a414f3c9e8b1a6d2f4c7e90/events",
);
url.searchParams.set("limit", "50");
const response = await fetch(url, {
  headers: { Authorization: `Bearer ${process.env.AITRONOS_TOKEN}` },
});
const { events, next_cursor } = await response.json();
events.forEach((event) => console.log(event.kind, event.sentence));
```

**Response:**

200 OK

```json
{
  "host_id": "fchost_5d0c2b9e7a414f3c9e8b1a6d2f4c7e90",
  "events": [
    {"id": "fchev_9b2e4c7a1d3f4e5a8c6b0d2e4f6a8b1c", "at": "2026-10-02T07:15:00Z", "kind": "ready", "tone": "success", "sentence": "Ready."},
    {"id": "fchev_7a1d3f4e5a8c6b0d2e4f6a8b1c9b2e4c", "at": "2026-10-02T07:12:00Z", "kind": "resumed", "tone": "success", "sentence": "Resumed. The server is running again."},
    {"id": "fchev_5a8c6b0d2e4f6a8b1c9b2e4c7a1d3f4e", "at": "2026-10-02T07:00:00Z", "kind": "resuming", "tone": "neutral", "sentence": "Resume requested by you."},
    {"id": "fchev_2e4f6a8b1c9b2e4c7a1d3f4e5a8c6b0d", "at": "2026-10-01T03:00:00Z", "kind": "parked", "tone": "neutral", "sentence": "Parked. The server is saved and not running."},
    {"id": "fchev_6a8b1c9b2e4c7a1d3f4e5a8c6b0d2e4f", "at": "2026-10-01T02:50:00Z", "kind": "parking", "tone": "neutral", "sentence": "Parking after a period with no activity."}
  ],
  "next_cursor": "MjAyNi0xMC0wMVQwMjo1MDowMFp8ZmNoZXZfNmE4YjFjOWIyZTRjN2ExZDNmNGU1YThjNmIwZDJlNGY"
}
```

200 Spending limit

```json
{
  "host_id": "fchost_5d0c2b9e7a414f3c9e8b1a6d2f4c7e90",
  "events": [
    {"id": "fchev_1c9b2e4c7a1d3f4e5a8c6b0d2e4f6a8b", "at": "2026-10-02T17:00:04Z", "kind": "cap_reached", "tone": "warning", "sentence": "Parking because the organization reached a spending limit."}
  ],
  "next_cursor": null
}
```

422 Invalid cursor

```json
{
  "success": false,
  "error": {
    "code": "INVALID_CURSOR",
    "message": "The page cursor is not valid. Start again from the first page.",
    "system_message": "the events cursor is not one this endpoint returned",
    "type": "validation_error",
    "status": 422,
    "details": {"field": "before"},
    "trace_id": "3f1c9a52-7d4e-4b8a-9c21-6e0d5f7a8b34",
    "timestamp": "2026-10-02T12:30:00Z"
  }
}
```

404 Not Found

```json
{
  "success": false,
  "error": {
    "code": "FORGE_COMPUTE_HOST_NOT_FOUND",
    "message": "This server could not be found. It may have been deleted.",
    "system_message": "Forge compute host not found",
    "type": "client_error",
    "status": 404,
    "details": {"resource": "forge_compute_host"},
    "trace_id": "3f1c9a52-7d4e-4b8a-9c21-6e0d5f7a8b34",
    "timestamp": "2026-10-02T12:30:00Z"
  }
}
```

## Related Resources

- [Forge cloud compute overview](/docs/api-reference/forge-compute/introduction)
- [Get a server](/docs/api-reference/forge-compute/get-host)
- [Get a server's daily cost and uptime](/docs/api-reference/forge-compute/get-host-usage)
- [List a server's running intervals](/docs/api-reference/forge-compute/list-host-intervals)
- [Park a server](/docs/api-reference/forge-compute/park-host)
- [Resume a server](/docs/api-reference/forge-compute/resume-host)
- [Delete a server](/docs/api-reference/forge-compute/delete-host)
- [Revoke a server](/docs/api-reference/forge-compute/revoke-host)