Skip to main content
Questions or issues? Contact us at api-support@manus.ai.

Record format

Every audit event is one record with a single schema, delivered two ways:
  • Streamed (push): an OpenTelemetry LogRecord sent over OTLP. Attribute keys follow the OpenTelemetry GenAI semantic conventions, with a few Manus extensions.
  • Exported (API): one JSON object per line (NDJSON) inside the export archive’s events.ndjson.
The values are identical; only the field names differ.

Export line (NDJSON)

Each line in events.ndjson is one event:
  • Top-level fields are convenience columns in snake_case.
  • metadata is the full record (keys in camelCase; see Metadata fields). Present on every line.
  • payload is present only when the export was created with include_payload=true (keys in snake_case; see Payload).

OTLP envelope (streamed records)

A streamed record is an OTel LogRecord with:

Metadata fields

These are the keys inside the export line’s metadata object, and the matching attribute on a streamed OTLP record: Notes on specific fields:
  • event.name / eventName — one of USER_CHAT, AGENT_REPLY, TOOL_CALL, TOOL_RESULT. Streamed records and the export’s top-level event_name use the short form (TOOL_CALL); the metadata object uses the full proto enum (EVENT_NAME_TOOL_CALL). The same short-vs-full difference applies to outcome (SUCCESS vs OUTCOME_SUCCESS) and agentReplyKind (notify / ask vs AGENT_REPLY_KIND_NOTIFY).
  • request.id — shared by every event in one agent turn; use it to group a user message with the replies and tool calls it triggered.
  • source_channel — how the interaction reached Manus: in_app (the Manus web app) or instant_messaging (an IM integration such as Slack).
  • Tool attributes — present on TOOL_CALL / TOOL_RESULT. gen_ai.tool.name is the high-level tool (e.g. shell_exec); gen_ai.tool.subtype is the model-facing name (e.g. shell). The gen_ai.tool.connector.* keys are Manus extensions, present only when the tool is a connector (e.g. Slack) — its name, UUID, and type (mcp, native, …).
  • agent.reply.kind — on AGENT_REPLY only: notify (a notification) or ask (a question to the user).
  • SizesinputBytes / outputBytes count the content bytes; messageCount is the number of messages. In metadata, 64-bit integers (inputBytes, outputBytes) are serialized as strings per protobuf JSON convention; messageCount is a number.
  • Reserved — LLM request/response fields (gen_ai.request.model, gen_ai.usage.*, …) are reserved for a future version and are not emitted today.

Payload (Tier 2)

The payload — the payload object in an export (when include_payload=true), or the body of a streamed Tier 2 record — is a JSON object whose fields depend on the event type. Keys are snake_case: Only the fields relevant to an event’s type are present.
Inside tool arguments and results, values under secret-like keys (containing token, password, secret, api_key, credential, …) are replaced with [REDACTED] before the payload is stored, streamed, or exported.