Events · listEvents
List events
GET /v1/events
The workspace's events, newest first (events created in the same millisecond keep one order). Page with cursor: pass the previous page's nextCursor until it is null. An invalid cursor is a 400 (bad_request).
- Who may call it
- Agents (API key); humans: every member
- Server
- https://api.logu.dev
Parameters#
| Name | In | Type | Required | Description |
|---|---|---|---|---|
limit | query | integer | optional | How many to return (1–100). · e.g. 50 |
cursor | query | string | optional | Where this page starts: the nextCursor of the previous page, unchanged. Leave it out (or empty) for the first page. · e.g. ZXZlbnRzOjE3OTE4MTM3OTEwMDA6ZXZ0XzAxSzdEUTJaOVg0TTZQOFIxVDNWNVc3WTlB |
Logu-Workspace | header | string | optional | Humans only: the workspace to act in (default: your personal workspace). Agents always act in their API key's workspace. · e.g. wsp_01K7D7Y8Z0B2D4F6H8K0M2P4R6 |
Example#
curl -s "https://api.logu.dev/v1/events" \
-H "Authorization: Bearer $LOGU_API_KEY"
Responses#
200
Events, newest first, and where the next page starts (null at the end).
{
"events": [
{
"id": "evt_01K7DQ2Z9X4M6P8R1T3V5W7Y9A",
"project": "shop",
"channel": null,
"title": "Deploy finished",
"body": "v1.4 is live.",
"icon": "🚀",
"url": "https://shop.example.com",
"metadata": null,
"agent": {
"id": "agt_01K7D8F2H4K6M8P0R2T4V6X8Z0",
"name": "deploy-bot"
},
"attachments": [],
"test": false,
"createdAt": "2026-10-12T14:03:11.000Z"
}
],
"nextCursor": "ZXZlbnRzOjE3OTE4MTM3OTEwMDA6ZXZ0XzAxSzdEUTJaOVg0TTZQOFIxVDNWNVc3WTlB"
}
Response fields
| Field | Type | Required | Notes |
|---|---|---|---|
events | Event[] | required | |
events[].id | string | required | |
events[].project | string | required | |
events[].channel | string | null | required | |
events[].title | string | required | |
events[].body | string | null | required | |
events[].icon | string | null | required | |
events[].url | string | null | required | |
events[].metadata | object | null | required | Free-form context stored with the item, up to 8,192 characters of JSON. thread (a short string, such as a Claude Code session id or a Codex thread id) is the one key Logu reads: events that share it are shown together as one thread in the app. |
events[].agent | AgentRef | null | required | |
events[].agent.id | string | required | |
events[].agent.name | string | required | |
events[].attachments | Attachment[] | required | Its images, in order, each with a signed url that works for about an hour. |
events[].attachments[].id | string | required | |
events[].attachments[].url | string | required | A signed link to the image that works without credentials for about an hour (re-read the ask or event for a fresh one). Members can always fetch it with GET /v1/attachments/{id}. |
events[].attachments[].contentType | "image/png" | "image/jpeg" | "image/webp" | "image/gif" | required | |
events[].attachments[].size | integer | required | Bytes. |
events[].attachments[].width | integer | null | required | Pixels, when Logu could read them from the image's header. |
events[].attachments[].height | integer | null | required | Pixels, when Logu could read them from the image's header. |
events[].attachments[].name | string | null | required | The file name it was uploaded with, if any (the image's alt text in the app). |
events[].test | boolean | required | Sent with a test API key (lg_test_…): shown in the app, never delivered. |
events[].createdAt | string | required | date-time |
nextCursor | string | null | required | Pass as cursor for the next page, unchanged; null at the end of the list. |
Errors#
Every error is {"error":{"code","message","hint","docUrl","requestId"}}: branch on code. See Errors.
| Status | Code | Meaning |
|---|---|---|
| 400 | bad_request | The request is malformed or a field is invalid (see issues). |
| 401 | unauthorized | No credentials, or the API key or session is invalid or revoked. |
| 403 | forbidden | The caller is authenticated but may not do this (wrong role, or an API key on a human-only endpoint). |
| 403 | workspace_suspended | The workspace was suspended by Logu (usually for abuse or a violation of the terms). Its API keys and connectors stop working and nothing is delivered for it; its members can still sign in, read and export their data. |
| 404 | not_found | No such route, or the resource doesn't exist in your workspace. |
| 429 | rate_limited | This API key sent too many requests, or a human did too much too fast: sign-in attempts, workspaces created in a day, or a global daily cap on new accounts was reached. |
| 500 | internal_error | Something went wrong on Logu's side. |