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:
{
  "event_id": "01JABCDE…",
  "team_uid": "team_abc",
  "user_id": "114504",
  "session_uid": "5YX76pz7Dga3yztNVw97Dh",
  "event_name": "TOOL_CALL",
  "outcome": "SUCCESS",
  "occurred_at": "2026-06-09T12:00:00Z",
  "metadata": { "eventId": "01JABCDE…", "eventName": "EVENT_NAME_TOOL_CALL", "genAiToolName": "shell_exec" },
  "payload": { "gen_ai_tool_call_arguments_json": { "command": "ls" } }
}
  • 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:
PartValue
Resource service.namemanus-agent
Resource tenant.team_uidTeam the event belongs to
Resource tenant.regionTenant data-residency region
Scopemanus.audit.tier1 (metadata) or manus.audit.tier2 (metadata + payload)
TimeEvent time (occurred_at)
Observed timeIngestion time (ingested_at)
SeverityINFO (9), WARN (13), or ERROR (17)
BodyEmpty for Tier 1; the payload for Tier 2

Metadata fields

These are the keys inside the export line’s metadata object, and the matching attribute on a streamed OTLP record:
MeaningOTLP attributemetadata key
Event ID (ULID)event.ideventId
Schema versionschema.versionschemaVersion
Event typeevent.nameeventName
Outcomeoutcomeoutcome
User IDuser.iduserId
Session (task) UIDsession.idsessionUid
Request / turn IDrequest.idrequestId
Source channelsource_channelsourceChannel
Team UIDresource tenant.team_uidteamUid
Tenant namespacetenantNamespace
Tenant regionresource tenant.regiontenantRegion
Event timerecord timeoccurredAt
Ingestion timeobserved timeingestedAt
Severityseverity number / textseverity
Tool namegen_ai.tool.namegenAiToolName
Tool call IDgen_ai.tool.call.idgenAiToolCallId
Tool subtypegen_ai.tool.subtypegenAiToolSubtype
Connector namegen_ai.tool.connector.namegenAiToolConnectorName
Connector IDgen_ai.tool.connector.idgenAiToolConnectorId
Connector typegen_ai.tool.connector.typegenAiToolConnectorType
Agent reply kindagent.reply.kindagentReplyKind
Client addressclient.addressclientAddress
User agentuser_agent.originaluserAgent
Geo countrygeo.country_iso_codegeoCountry
Input bytesinput.bytesinputBytes
Output bytesoutput.bytesoutputBytes
Message countmessage.countmessageCount
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:
FieldEvent typesDescription
chat_textUSER_CHAT, AGENT_REPLYMessage content (plain text or a rich-content array, passed through unchanged)
attachmentsUSER_CHAT, AGENT_REPLYAttached files, if any
agent_reply_kindAGENT_REPLYnotify or ask
gen_ai_tool_call_arguments_jsonTOOL_CALLThe tool’s input arguments
gen_ai_tool_call_result_jsonTOOL_RESULTThe tool’s output
gen_ai_tool_call_statusTOOL_RESULTExecution status of the tool call
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.