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.
Export line (NDJSON)
Each line inevents.ndjson is one event:
- Top-level fields are convenience columns in
snake_case. metadatais the full record (keys incamelCase; see Metadata fields). Present on every line.payloadis present only when the export was created withinclude_payload=true(keys insnake_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’smetadata object, and the matching attribute on a streamed OTLP record:
Notes on specific fields:
event.name/eventName— one ofUSER_CHAT,AGENT_REPLY,TOOL_CALL,TOOL_RESULT. Streamed records and the export’s top-levelevent_nameuse the short form (TOOL_CALL); themetadataobject uses the full proto enum (EVENT_NAME_TOOL_CALL). The same short-vs-full difference applies tooutcome(SUCCESSvsOUTCOME_SUCCESS) andagentReplyKind(notify/askvsAGENT_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) orinstant_messaging(an IM integration such as Slack).- Tool attributes — present on
TOOL_CALL/TOOL_RESULT.gen_ai.tool.nameis the high-level tool (e.g.shell_exec);gen_ai.tool.subtypeis the model-facing name (e.g.shell). Thegen_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— onAGENT_REPLYonly:notify(a notification) orask(a question to the user).- Sizes —
inputBytes/outputBytescount the content bytes;messageCountis the number of messages. Inmetadata, 64-bit integers (inputBytes,outputBytes) are serialized as strings per protobuf JSON convention;messageCountis 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 — thepayload 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.