curl -s \
"https://engine.example.com/v1/events?limit=100" \
-H "Authorization: Bearer $TOKEN"
# The feed's next is never null: poll with the last.// A client from OpenAPI Generator: see Build a client.
import {
Configuration,
EventsApi,
ProblemFromJSON,
ResponseError,
} from "./nodeasset-client";
const api = new EventsApi(new Configuration({
basePath: "https://engine.example.com",
accessToken: process.env.TOKEN,
}));
try {
// The feed's next is never null: poll with the last.
let after: string | undefined;
for (;;) {
const page = await api.listEvents({ limit: 100, after });
for (const event of page.value ?? []) {
console.log(event);
}
after = page.next ?? after;
if (!page.value?.length) {
await new Promise((resolve) => setTimeout(resolve, 5000));
}
}
} catch (e) {
if (!(e instanceof ResponseError)) throw e;
// A refusal is a problem; its type ends in the slug.
const problem = ProblemFromJSON(await e.response.json());
const slug = problem.type.split(":").pop();
console.error(e.response.status, slug, problem.detail);
}
# A client from OpenAPI Generator: see Build a client.
import os
import sys
import time
import nodeasset_client
config = nodeasset_client.Configuration(
host="https://engine.example.com",
access_token=os.environ["TOKEN"],
)
with nodeasset_client.ApiClient(config) as client:
api = nodeasset_client.EventsApi(client)
try:
# The feed's next is never null: poll with the last.
after = None
while True:
page = api.list_events(limit=100, after=after)
for event in page.value or []:
print(event)
after = page.next or after
if not page.value:
time.sleep(5)
except nodeasset_client.ApiException as e:
# A refusal is a problem; its type ends in the slug.
problem = nodeasset_client.Problem.from_json(e.body)
slug = problem.type.rsplit(":", 1)[-1]
print(e.status, slug, problem.detail, file=sys.stderr)
// A client from OpenAPI Generator: see Build a client.
import nodeasset.client.ApiClient;
import nodeasset.client.ApiException;
import nodeasset.client.api.EventsApi;
import nodeasset.client.model.Problem;
public class ListEvents {
public static void main(String[] args) throws Exception {
ApiClient client = new ApiClient();
client.updateBaseUri("https://engine.example.com");
client.setRequestInterceptor(builder ->
builder.header("Authorization", "Bearer " + System.getenv("TOKEN")));
EventsApi api = new EventsApi(client);
try {
// The feed's next is never null: poll with the last.
String after = null;
while (true) {
var request = EventsApi.APIListEventsRequest.newBuilder()
.limit(100)
.after(after)
.build();
var page = api.listEvents(request);
for (var event : page.getValue()) {
System.out.println(event);
}
if (page.getNext() != null) after = page.getNext();
if (page.getValue().isEmpty()) Thread.sleep(5000);
}
} catch (ApiException e) {
// A refusal is a problem; its type ends in the slug.
Problem problem = client.getObjectMapper()
.readValue(e.getResponseBody(), Problem.class);
String type = problem.getType();
String slug = type.substring(type.lastIndexOf(':') + 1);
System.err.println(e.getCode() + " " + slug + " " + problem.getDetail());
}
}
}
{
"offset": 0,
"now": "2026-10-03T13:26:37.664465130Z",
"value": [
{
"kind": "control",
"type": "holder.restricted",
"at": "2026-10-03T13:26:35.309748Z",
"offset": null,
"instrumentId": null,
"party": null,
"resourceKind": "holder",
"resourceId": "alpha",
"payload": {
"mode": "freeze",
"reason": "investigation",
"holderId": "alpha",
"orderCited": false,
"operationId": "op-eaeb5c06-471d-4e82-9414-a90ae5f4a52f",
"autoReleaseAt": null,
"restrictionId": "r-58650cfb15a94217b9cf"
},
"seq": 213
}
],
"next": "104"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"requestId": "<string>",
"gate": "<string>",
"check": "<string>",
"recovery": "<string>",
"retryAfter": 123,
"retryable": true,
"packageName": "<string>",
"party": "<string>",
"contractId": "<string>",
"projectionOffset": 123,
"ledgerEnd": 123,
"code": 123,
"reason": "<string>",
"policyVersion": 123,
"errors": [
{
"pointer": "<string>",
"detail": "<string>"
}
]
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"requestId": "<string>",
"gate": "<string>",
"check": "<string>",
"recovery": "<string>",
"retryAfter": 123,
"retryable": true,
"packageName": "<string>",
"party": "<string>",
"contractId": "<string>",
"projectionOffset": 123,
"ledgerEnd": 123,
"code": 123,
"reason": "<string>",
"policyVersion": 123,
"errors": [
{
"pointer": "<string>",
"detail": "<string>"
}
]
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"requestId": "<string>",
"gate": "<string>",
"check": "<string>",
"recovery": "<string>",
"retryAfter": 123,
"retryable": true,
"packageName": "<string>",
"party": "<string>",
"contractId": "<string>",
"projectionOffset": 123,
"ledgerEnd": 123,
"code": 123,
"reason": "<string>",
"policyVersion": 123,
"errors": [
{
"pointer": "<string>",
"detail": "<string>"
}
]
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"requestId": "<string>",
"gate": "<string>",
"check": "<string>",
"recovery": "<string>",
"retryAfter": 123,
"retryable": true,
"packageName": "<string>",
"party": "<string>",
"contractId": "<string>",
"projectionOffset": 123,
"ledgerEnd": 123,
"code": 123,
"reason": "<string>",
"policyVersion": 123,
"errors": [
{
"pointer": "<string>",
"detail": "<string>"
}
]
}List events
Lists the event feed, oldest or newest first: the ledger’s facts and the engine’s own acts. The monitor reads control events only, redacted.
curl -s \
"https://engine.example.com/v1/events?limit=100" \
-H "Authorization: Bearer $TOKEN"
# The feed's next is never null: poll with the last.// A client from OpenAPI Generator: see Build a client.
import {
Configuration,
EventsApi,
ProblemFromJSON,
ResponseError,
} from "./nodeasset-client";
const api = new EventsApi(new Configuration({
basePath: "https://engine.example.com",
accessToken: process.env.TOKEN,
}));
try {
// The feed's next is never null: poll with the last.
let after: string | undefined;
for (;;) {
const page = await api.listEvents({ limit: 100, after });
for (const event of page.value ?? []) {
console.log(event);
}
after = page.next ?? after;
if (!page.value?.length) {
await new Promise((resolve) => setTimeout(resolve, 5000));
}
}
} catch (e) {
if (!(e instanceof ResponseError)) throw e;
// A refusal is a problem; its type ends in the slug.
const problem = ProblemFromJSON(await e.response.json());
const slug = problem.type.split(":").pop();
console.error(e.response.status, slug, problem.detail);
}
# A client from OpenAPI Generator: see Build a client.
import os
import sys
import time
import nodeasset_client
config = nodeasset_client.Configuration(
host="https://engine.example.com",
access_token=os.environ["TOKEN"],
)
with nodeasset_client.ApiClient(config) as client:
api = nodeasset_client.EventsApi(client)
try:
# The feed's next is never null: poll with the last.
after = None
while True:
page = api.list_events(limit=100, after=after)
for event in page.value or []:
print(event)
after = page.next or after
if not page.value:
time.sleep(5)
except nodeasset_client.ApiException as e:
# A refusal is a problem; its type ends in the slug.
problem = nodeasset_client.Problem.from_json(e.body)
slug = problem.type.rsplit(":", 1)[-1]
print(e.status, slug, problem.detail, file=sys.stderr)
// A client from OpenAPI Generator: see Build a client.
import nodeasset.client.ApiClient;
import nodeasset.client.ApiException;
import nodeasset.client.api.EventsApi;
import nodeasset.client.model.Problem;
public class ListEvents {
public static void main(String[] args) throws Exception {
ApiClient client = new ApiClient();
client.updateBaseUri("https://engine.example.com");
client.setRequestInterceptor(builder ->
builder.header("Authorization", "Bearer " + System.getenv("TOKEN")));
EventsApi api = new EventsApi(client);
try {
// The feed's next is never null: poll with the last.
String after = null;
while (true) {
var request = EventsApi.APIListEventsRequest.newBuilder()
.limit(100)
.after(after)
.build();
var page = api.listEvents(request);
for (var event : page.getValue()) {
System.out.println(event);
}
if (page.getNext() != null) after = page.getNext();
if (page.getValue().isEmpty()) Thread.sleep(5000);
}
} catch (ApiException e) {
// A refusal is a problem; its type ends in the slug.
Problem problem = client.getObjectMapper()
.readValue(e.getResponseBody(), Problem.class);
String type = problem.getType();
String slug = type.substring(type.lastIndexOf(':') + 1);
System.err.println(e.getCode() + " " + slug + " " + problem.getDetail());
}
}
}
{
"offset": 0,
"now": "2026-10-03T13:26:37.664465130Z",
"value": [
{
"kind": "control",
"type": "holder.restricted",
"at": "2026-10-03T13:26:35.309748Z",
"offset": null,
"instrumentId": null,
"party": null,
"resourceKind": "holder",
"resourceId": "alpha",
"payload": {
"mode": "freeze",
"reason": "investigation",
"holderId": "alpha",
"orderCited": false,
"operationId": "op-eaeb5c06-471d-4e82-9414-a90ae5f4a52f",
"autoReleaseAt": null,
"restrictionId": "r-58650cfb15a94217b9cf"
},
"seq": 213
}
],
"next": "104"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"requestId": "<string>",
"gate": "<string>",
"check": "<string>",
"recovery": "<string>",
"retryAfter": 123,
"retryable": true,
"packageName": "<string>",
"party": "<string>",
"contractId": "<string>",
"projectionOffset": 123,
"ledgerEnd": 123,
"code": 123,
"reason": "<string>",
"policyVersion": 123,
"errors": [
{
"pointer": "<string>",
"detail": "<string>"
}
]
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"requestId": "<string>",
"gate": "<string>",
"check": "<string>",
"recovery": "<string>",
"retryAfter": 123,
"retryable": true,
"packageName": "<string>",
"party": "<string>",
"contractId": "<string>",
"projectionOffset": 123,
"ledgerEnd": 123,
"code": 123,
"reason": "<string>",
"policyVersion": 123,
"errors": [
{
"pointer": "<string>",
"detail": "<string>"
}
]
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"requestId": "<string>",
"gate": "<string>",
"check": "<string>",
"recovery": "<string>",
"retryAfter": 123,
"retryable": true,
"packageName": "<string>",
"party": "<string>",
"contractId": "<string>",
"projectionOffset": 123,
"ledgerEnd": 123,
"code": 123,
"reason": "<string>",
"policyVersion": 123,
"errors": [
{
"pointer": "<string>",
"detail": "<string>"
}
]
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"requestId": "<string>",
"gate": "<string>",
"check": "<string>",
"recovery": "<string>",
"retryAfter": 123,
"retryable": true,
"packageName": "<string>",
"party": "<string>",
"contractId": "<string>",
"projectionOffset": 123,
"ledgerEnd": 123,
"code": 123,
"reason": "<string>",
"policyVersion": 123,
"errors": [
{
"pointer": "<string>",
"detail": "<string>"
}
]
}app, approver, auditor, monitor, operator, risk.Authorizations
A JWT from the deployment's identity provider, whose roles claim names the caller's roles and whose holder claim names an investor's holder.
Headers
A signed request's key id, as venue.api.signing.clients configures it for the bearer's subject.
Seconds since the epoch, within venue.api.signing.window of the engine's clock, 5 minutes by default.
^[0-9]+$At least 16 random bytes in base64url, never reused within twice the window.
22 - 128^[A-Za-z0-9_-]+={0,2}$The base64 HMAC-SHA256, under the key's secret, of the method, the path and query, the timestamp, the nonce and the body's SHA-256.
Your id for this request, 1 to 128 printable characters, repeated in the answer; absent, the engine makes one.
128^[\x21-\x7E]+$A W3C trace context, which the engine joins and passes on.
^[0-9a-f]{2}-[0-9a-f]{32}-[0-9a-f]{16}-[0-9a-f]{2}$Query Parameters
asc, the default, for oldest first, or desc for newest first.
Which end of the feed a page starts from.
asc, desc Only events of these kinds; repeat it for several. Absent, both.
Which feed an event belongs to.
journal, control Only events of these types; repeat it for several. Absent, every type.
What an event announces: the record and what happened to it, <record>.<event>.
reconciliation.run, reconciliation.finding, reconciliation.hold, hold.released, statement.received, statement.overdue, distribution.payable, distribution.held, distribution.paid, holder.restricted, holder.unrestricted, holder.forced-transfer, holder.recovered, instrument.paused, distribution.rate-changed, distribution.carried, distribution.due, standing-approval.granted, standing-approval.revoked, reserve.minted, reserve.redeemed, reserve.cover-low, reserve.reported, reserve.amended, retention.pruned, operation.succeeded, operation.failed, approval.requested, approval.signed, approval.approved, approval.rejected, subscription.priced, subscription.delivered, subscription.ended, redemption.priced, redemption.funded, redemption.burned, redemption.settled, redemption.withdrawn, dealing-cycle.settled, dealing-cycle.released, webhook.test, settlement.proposed, price.point, subscription.created, admission.offered, admission.granted Only this instrument's records.
Only events about this holder: its records, the moves in or out of it, and its party's ledger facts; refused to the monitor.
Only events about these kinds of record; repeat it for several. Absent, every kind.
A kind of record an operation, an action or an event concerns.
instrument, holder, subscription, redemption, dealing-cycle, standing-settlement, reserve, lock-agreement, mint, reserve-redemption, amendment, distribution, standing-approval, reconciliation-run, external-statement, primary-market, restriction, hold, webhook, external-account, external-source, issuer-powers-agreement, scheduled-distribution, contract, exercise Only events about this record; the monitor names with it a resourceKind whose ids its feed keeps.
Only events whose at is this instant or later.
Only events whose at is before this instant; an event with no at is then left out.
The most records a page holds, 1 to 1000; 100 by default.
1 <= x <= 1000The previous page's next; absent, the first page.
Response
A page of events.
The ledger offset the answer was read at; 0 for an answer from the engine's own records.
The engine's clock when it answered, an ISO-8601 instant.
What the read answers; for a list, the page's records in the list's order.
Show child attributes
Show child attributes
The cursor for the next page, sent back as after; null on a list's last page, never on a feed.

