Query Reactor Logs
Query the runtime-log records a Reactor produced. See Runtime Logs for what is captured and how to enable it.
List Reactor Logs
Get a page of individual runtime-log records for one Reactor, newest first.
reactor.log events returned by List Events contain batches of records. This endpoint returns individual records for one Reactor, so you can search by message without receiving the neighboring records in the same batch. Records come from the same search backend as events, so searchable history, consistency, and availability work as described for Events.
Permissions
log:read
A Basis Theory user token with log:read and tenant:read is also accepted. See Events authentication for the credential rules.
Request
- cURL
- Node
- C#
- Java
- Python
- Go
curl --globoff "https://api.basistheory.com/reactors/<REACTOR_ID>/logs?message[search_words]=payment%20failed" \
-H "BT-API-KEY: <PRIVATE_API_KEY>"
const logs = await client.reactorLogs.list("<REACTOR_ID>", {
messageSearchWords: "payment failed",
});
for await (const log of logs) {
console.log(log);
}
await client.ReactorLogs.ListAsync(
"<REACTOR_ID>",
new ReactorLogsListRequest { MessageSearchWords = "payment failed" }
);
client.reactorLogs().list(
"<REACTOR_ID>",
ReactorLogsListRequest.builder().messageSearchWords("payment failed").build());
for log in client.reactor_logs.list("<REACTOR_ID>", message_search_words="payment failed"):
print(log)
logs, err := client.ReactorLogs.List(ctx, "<REACTOR_ID>", &basistheory.ReactorLogsListRequest{
MessageSearchWords: basistheory.String("payment failed"),
})
URI Parameters
| Parameter | Required | Type | Default | Description |
|---|---|---|---|---|
id | true | uuid | null | The ID of the Reactor. A Reactor that does not exist or belongs to another Tenant returns an empty page. |
Query Parameters
| Parameter | Required | Type | Default | Description |
|---|---|---|---|---|
start_date | false | date | 24 hours before end_date | Returns records whose occurred_at is greater than or equal to this value. Same format and clamping as List Events. |
end_date | false | date | Time of the request | Returns records whose occurred_at is less than this value. A future value is lowered to the time of the request. |
size | false | integer | 20 | Maximum number of unique records to return, from 1 to 100. |
start | false | string | null | Cursor from a previous response's pagination.next. |
source | false | string | null | Exact record origin: application or platform. |
record_type | false | string | null | Exact record kind: log or lifecycle. |
trace_id | false | string | null | Exact, case-sensitive trace ID. |
level | false | string | null | Exact, case-sensitive level, such as error. |
event | false | string | null | Exact, case-sensitive lifecycle event, such as execution.completed. |
outcome | false | string | null | Exact, case-sensitive outcome, such as timeout. |
message | false | string | null | Exact, case-sensitive message. An empty string is a valid value. |
message[search_words] | false | string | null | Returns records whose message contains all of these words, in any order, ignoring case. Leading and trailing whitespace is trimmed and repeated whitespace collapsed; the result must not be empty and is limited to 256 characters. Punctuation-only input matches nothing. |
All filters combine with AND, and message and message[search_words] can be used together. transform_type is rejected on this endpoint. Each parameter accepts a single value; unknown or repeated parameters return 400. A request accepts at most 36 query parameters. Values are limited to 1,024 characters, except start, which allows 12,000.
Ordering and Pagination
Records are sorted by occurred_at, newest first, then by the record's position within its invocation, then by id. Responses use the cursor paginated object. pagination.page_size is the number of records returned, pagination.next is null when there are no more results, and no total count is returned.
To get the next page, send pagination.next as the start parameter. The cursor carries the original filters, dates, and size, so start alone is enough; if you send those parameters again, they must match. Cursors are opaque and bound to your Tenant, this endpoint, and the Reactor that issued them. A short page can still have a next cursor, so keep paging until next is null. Each page re-checks your permissions and current searchable history. An invalid or expired cursor returns 400 with errors.start set; restart the query without start.
Each page suppresses repeated record IDs, but polling for late-arriving records can return a record more than once; deduplicate by id. Records written before runtime-log search was activated for your Tenant's region are not available.
Response
Returns a cursor paginated object with the data property containing an array of runtime-log records. Returns an error if the records could not be retrieved; the statuses and formats are the same as for Events.
{
"data": [
{
"id": "3e23e8160039594a33894f6564e1b1348bbd7a0088d42c4acb73eeaed59c009d",
"occurred_at": "2026-09-16T12:00:00.450Z",
"source": "platform",
"record_type": "lifecycle",
"event": "execution.completed",
"trace_id": "example-trace",
"outcome": "application_error",
"duration_ms": 412
},
{
"id": "ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb",
"occurred_at": "2026-09-16T12:00:00.310Z",
"source": "application",
"record_type": "log",
"level": "error",
"trace_id": "example-trace",
"message": "payment failed",
"attributes": {
"order": "order-1"
}
}
],
"pagination": {
"next": null,
"page_size": 2
}
}
Runtime Log Object
A field is omitted when it does not apply to the record. See Runtime Logs for the values each field can take.
| Attribute | Type | Description |
|---|---|---|
id | string | Stable identifier of the record, 64 hexadecimal characters. It stays the same across retries and repeated delivery; use it to deduplicate. Not filterable. |
occurred_at | date | When the record occurred, in ISO 8601 format. start_date and end_date filter on this field. |
source | string | application for records from your code or platform for lifecycle records. |
record_type | string | log for application records or lifecycle for platform records. |
level | string | (Optional) Level of an application record. |
event | string | (Optional) Lifecycle event, such as execution.started or execution.completed. |
trace_id | string | (Optional) Trace ID of the invocation. |
transform_type | string | (Optional) request_transform or response_transform. Proxy records only. |
message | string | (Optional) Message of an application record. May be null. |
outcome | string | (Optional) Outcome of a completed invocation. |
duration_ms | number | (Optional) Execution time of a completed invocation, in milliseconds. |
error | object | (Optional) Error details from an application record. Returned for display only; not searchable. |
attributes | object | (Optional) Structured attributes from an application record. Returned for display only; not searchable. |