---
title: "Get access event"
method: GET
path: "/access/events/{id}"
tags: ["Access"]
---

# Get access event

`GET /access/events/{id}`

## Request

- Base URL: `https://api.tatum.io/v4/logs`
- URL: `https://api.tatum.io/v4/logs/access/events/{id}`
- Auth: API key in header `x-api-key`

Returns a single access event by its `event_id`, plus the error logs the
same request produced.

`event_id` comes from the `/access/events` list. A raw `req_id` is not a
valid key — it is producer-generated and collides with unrelated requests
— and yields 400.

`has_errors` is tri-state: `true`/`false` answer the question, and `null`
means the error lookup did not complete. `null` is not "no errors".

## Path parameters

- `id` string, required

## Response `200`

The access event for the given event id, with its paired errors.

- AccessEventDetail: A single access event plus its error-log pairing. A distinct schema from {@link AccessEvent} on purpose: the pairing costs one extra ClickHouse lookup per row, and only the drawer — which fetches this endpoint — consults it. Putting it on the list row would compute it for up to 1000 rows and be read by nothing.
  - `errors` AccessEventErrorRef[], required: Errors this request emitted, oldest first. Empty when there were none.
    - `event_id` string, required: Opaque identifier of the **error** row, not of the access row this detail describes. Pass it to `GET /errors/events/{id}`.
    - `json_rpc_id` string, required: JSON-RPC `id` of the failing batch member. Empty for a non-batched call.
    - `error_code` number, required: Error / status code. **Negative for JSON-RPC** codes, which arrive inside an HTTP 200 — so a 2xx access row can carry errors.
    - `operation` string, required: RPC method / operation that failed.
    - `error_message` string, required: Error message, truncated server-side to `SIBLING_MESSAGE_MAX` (160) chars.
    - `request_context_preview` string, required: Request context, truncated server-side to `SIBLING_CONTEXT_PREVIEW_MAX` (120) chars. Present because `json_rpc_id` alone does not separate members of an ambiguous batch.
  - `errors_truncated` boolean, required: True when the request produced more errors than `errors` carries — the `EVENT_SIBLINGS_LIMIT` (512) cap bit.
  - `has_errors` boolean, nullable, required: Whether this request emitted error-log rows. **`null` means the lookup did not complete — NOT "no errors".** The lookup is deliberately non-fatal: a cross-reference is worth less than the request detail it decorates, so a ClickHouse failure degrades this field instead of failing the request. A client must render `null` as unknown; rendering it as "no errors" would assert something the service did not check.
  - `event_id` string, required: Opaque identifier for this individual access row, and the only stable address for it. `req_id` is producer-generated rather than Envoy-injected, so it is not unique — it collides with unrelated requests. Pass this to `GET /access/events/{id}` or `filter[event_id][in]`.
  - `req_id` string, required: Request identifier, and the join key across access and error logs. **Not unique** — see `event_id`.
  - `timestamp` string, required: When the request was received, ISO-8601 UTC.
  - `method` string, required: HTTP method of the request.
  - `uri` string, required: Request path, API keys masked (`t-0123****abcdef`).
  - `status_code` number, required: HTTP response status code.
  - `req_time_ms` number, required: Upstream response time in milliseconds.
  - `source` string, required: Traffic source / attribution channel.
  - `trace_id` string, required: Distributed-trace identifier for correlating across services.
  - `gateway_id` string, required: Gateway that served the request.
  - `interface_id` string, required: Interface (chain-network endpoint) that handled the request.
  - `chain` string, required: Blockchain the request targeted.
  - `network` string, required: Chain-qualified network the request targeted.
  - `region` string, required: Serving region.
  - `bytes_sent` number, required: Response payload size in bytes.
  - `bytes_read` number, required: Request payload size in bytes.
  - `remote_ip` string, required: Client IP as seen by the edge (proxy-aware).
  - `ua` string, required: Client user-agent string.
  - `batch_size` number, required: Number of sub-requests when the call was a JSON-RPC batch (1 for non-batched calls).
  - `host` string, required: Host header the request was sent to.
  - `error_reason` string, required: Why the gateway rejected the request before forwarding it, e.g. `ip_not_allowed`, `origin_not_allowed`, `origin_missing`, `credits_exhausted`, `rate_limit_exceeded`, `api_key_invalid`. Empty when the request was not rejected by the gateway, and on rows logged before the gateway started recording a reason (for Envoy Gateway `blockchain-rpc` rows, until 2026-10-25).

## Other responses

- `400`: Bad Request
- `401`: Unauthorized
- `404`: Not Found

---

[API](https://skmtc.dev/tatum/apis/logs-api.md) - [All operations](https://skmtc.dev/tatum/apis/logs-api/llms.txt) - [OpenAPI document](https://skmtc.dev/tatum/apis/logs-api/revisions/e47603e0f75f?raw)
