Events under one execution-graph node
GET/api/public/v1/agents/{agent_id}/execution-graph/node-events beta
Scoped evidence + timeline for one GraphNode.id, ordered by dim. node_id=agent and node_id=overflow:* are 422 (neither has an event set of its own), as is dim=value (the availability matrix does not capture it, and nothing ships a source — F8). dim=cost requires a session subject and returns model_calls with an EMPTY events; every other dimension is the inverse. dim=time orders by the per-call duration_ms (F7, slowest first); it was a 422 alongside value until that column shipped. A node with no events is an empty list, never a 404: the graph and this endpoint can legitimately disagree by one window snap.
curl --fail-with-body -X GET 'https://app.openlatch.ai/api/public/v1/agents/<agent_id>/execution-graph/node-events?node_id=<node_id>' \ -H "Authorization: Bearer $OPENLATCH_API_KEY"import jsonimport osimport urllib.request
request = urllib.request.Request( 'https://app.openlatch.ai/api/public/v1/agents/<agent_id>/execution-graph/node-events?node_id=<node_id>', method='GET', headers={ 'Authorization': 'Bearer ' + os.environ['OPENLATCH_API_KEY'], },)with urllib.request.urlopen(request) as response: text = response.read().decode() print(json.dumps(json.loads(text), indent=2) if text else response.status)#!/usr/bin/env bashset -euo pipefail
curl -sS --fail-with-body -X GET 'https://app.openlatch.ai/api/public/v1/agents/<agent_id>/execution-graph/node-events?node_id=<node_id>' \ -H "Authorization: Bearer $OPENLATCH_API_KEY" | jq .$headers = @{ Authorization = "Bearer $env:OPENLATCH_API_KEY"}Invoke-RestMethod -Method GET -Uri 'https://app.openlatch.ai/api/public/v1/agents/<agent_id>/execution-graph/node-events?node_id=<node_id>' -Headers $headers | ConvertTo-Json -Depth 20Authorization
Section titled “Authorization”| Role in the organization | This endpoint |
|---|---|
owner | Allowed |
admin | Allowed |
editor | Allowed |
viewer | Allowed |
A key carries the role its owner holds in the organization. See Authentication.
API key scope: agents:read
Path parameters
Section titled “Path parameters”| Parameter | Type | Description |
|---|---|---|
agent_id | string | Required. |
Query parameters
Section titled “Query parameters”| Parameter | Type | Description |
|---|---|---|
node_id | string | Required. |
window | string — one of 24h, 7d, 30d | Deprecated: send from (and optionally to) instead. A rolling window ending now — 24h, 7d or 30d. Ignored when from is sent. |
from | string (date-time) or null | Start of an explicit range (ISO 8601), any distance in the past. Wins over window. Snapped down to 10 seconds; the response's window.key is then custom. |
to | string (date-time) or null | End of the explicit range (ISO 8601), exclusive. Requires from, must not be before it (equal bounds are an empty window); defaults to now and is clamped to it. Snapped down to 10 seconds like from. |
dim | string — one of cost, time, security, value, frequency or null | |
page | integer | |
page_size | integer or null |
Response
Section titled “Response”- 200 OK — the call succeeded.
- 401 Unauthorized —
UNAUTHORIZED - 402 Payment Required —
license_expired - 403 Forbidden —
FEATURE_DISABLED,FORBIDDEN,INSUFFICIENT_SCOPE - 404 Not Found —
NOT_FOUND - 422 Unprocessable Content —
INVALID_ID,VALIDATION_ERROR - 429 Too Many Requests —
TOO_MANY_REQUESTS - 500 Internal Server Error —
INTERNAL_SERVER_ERROR,tenant_isolation_violation - 503 Service Unavailable —
FEATURE_STATE_UNAVAILABLE,SERVICE_UNAVAILABLE
Response fields
Section titled “Response fields”| Field | Type | Description |
|---|---|---|
events | array of object | Required. |
events[].artifact_id | string or null | Required. |
events[].artifact_label | string or null | Required. |
events[].duration_ms | integer or null | Required. |
events[].event_id | string | Required. |
events[].session_id | string or null | Required. |
events[].surface | string — one of local, shell, web, mcp or null | Required. |
events[].time | string (date-time) | Required. |
events[].tool_name | string or null | Required. |
events[].verdict | string or null | Required. |
model_calls | array of object | Required. |
model_calls[].cost_tokens | integer | Required. |
model_calls[].cost_usd | string or null | Required. |
model_calls[].model | string | Required. |
model_calls[].provider | string | Required. |
model_calls[].time | string (date-time) | Required. |
page | integer | Required. |
page_size | integer | Required. |
total | integer | Required. |
Example response
Section titled “Example response”{ "events": [ { "artifact_id": "3f6c1a2e-8b4d-4c1f-9a7e-0d5b2c8e4f10", "artifact_label": "string", "duration_ms": 3, "event_id": "evt_01jbwa2k1vfrn9y42xhgxhmzj2", "session_id": "ses_01jbwa2k1vfrn9y42xhgxhmzj2", "surface": "local", "time": "2026-01-15T14:32:05Z", "tool_name": "release-bot", "verdict": "string" } ], "model_calls": [ { "cost_tokens": 3, "cost_usd": "string", "model": "string", "provider": "string", "time": "2026-01-15T14:32:05Z" } ], "page": 1, "page_size": 3, "total": 3}