Skip to main content

Command Palette

Search for a command to run...

Teams & Enterprise

OpenTelemetry Export Wire Reference

Companion to OpenTelemetry Export. Full wire surface: every metric, log event, attribute, enum, and presence rule.

The surface is additive. Tolerate unknown attributes, events, and enum values. Renames and removals get explicit notice.

Transport and scope

  • OTLP/HTTP binary protobuf (application/x-protobuf), POST
  • Endpoints: <base>/v1/metrics and <base>/v1/logs
  • Scope: cursor.telemetry / 0.1.0

Resource attributes

One resource per (team, user, surface, entrypoint, surface version) grouping.

AttributeTypePresenceValues / notes
service.namestringAlwaysConstant cursor
service.versionstringOptionalClient version when source is desktop/CLI; usually absent on cloud_agent / bugbot
cursor.team.idintAlwaysYour team id
cursor.surfacestringAlwaysunspecified | desktop | cli | cloud_agent | bugbot | grok_bot
cursor.entrypointstringAlwaysunspecified | desktop | cli | web | mobile | sdk_ts | sdk_py | api | automation | github_pr
cursor.user.idintOptionalOpaque team-scoped user id when the source has one. Often absent on cloud agent. Do not require presence.

Families

Family ids match the toggles in Team Settings. All default on for a new destination.

Family idSignalsCovers
model_usagemetrics + logstoken.usage, cost.usage; api.request, api.error, api.correction
tool_callsmetricstool.calls
skills_hooks_pluginslogsskill.activated, hook.execution_complete, plugin.installed
cloud_agentslogscloud_agent.pull_request, cloud_agent.setup, cloud_agent.artifact, cloud_agent.mcp_auth_error
grok_bot_agent_actionslogsgrok_bot.mcp_tool_call, grok_bot.shell_command, grok_bot.browser_navigation, grok_bot.computer_use_session

Metrics

All metrics are monotonic delta sums. Metric datapoints carry no correlation IDs; those appear on logs only.

Consume metrics as sums of deltas per series. A series is the resource, the metric name, and the exact datapoint attribute set. Windows for the same series can overlap across flushes.

cursor.token.usage

Unit {token}. Family model_usage.

AttributeTypePresenceValues / notes
cursor.token.typestringAlwaysinput | output | cache_read | cache_creation
cursor.model.namestringOptionalRequested public model after routed-intent collapse (auto: to Auto, thinking: to Thinking, pro: to Pro, premium: to Premium; else pass-through). Absent on bugbot or when the source had no model.
cursor.api.statusstringOptionalsuccess | errored | aborted
cursor.api.billableboolOptional

cursor.tool.calls

Unit {call}. Family tool_calls. Value 1 per completed tool call.

AttributeTypePresenceValues / notes
cursor.tool.kindstringAlwaysbuiltin | mcp
cursor.tool.namestringAlwaysBuiltin id (e.g. read, shell) or customer MCP tool name (open)
cursor.tool.statusstringAlwayssuccess | failure | aborted (MCP never reports aborted)
cursor.mcp.server.namestringMCP onlyCustomer-defined server display name (open)

cursor.cost.usage

Unit USD (double). Family model_usage. Best-effort estimated cost at event time, not an invoice. Subject to cursor.api.correction. For BYOK, this is the Cursor Token Rate only, not provider spend.

AttributeTypePresenceValues / notes
cursor.model.namestringOptionalSame collapse rules as token.usage

Log events

Severities: INFO=9, WARN=13, ERROR=17.

Common log attributes

AttributeTypePresenceNotes
cursor.event.idstringAlwaysDedupe key. Opaque. Deterministic across retries, worker restarts, and Cursor Kafka replay. Prefix customer-telemetry:v1:... is stable; treat the whole string as opaque.
cursor.source_event.idstringAlwaysOpaque internal source identity. Several signals may share one value.
cursor.request.idstringOptionalOn api.request, api.error, skill.activated, hook.execution_complete, plugin.installed. Never on api.correction, cloud_agent.*, or grok_bot.*.
cursor.conversation.idstringOptionalIDE/CLI: composer UUID. Cloud agent: customer-visible bc-... agent id. Grok Bot grok_bot.* events: Grok Bot conversation id. Join key for session reconstruction across api, skill/hook, cloud_agent, and grok_bot logs.
cursor.usage_event.idstringOptionalapi.request / api.error / api.correction only. Request-grain key against Cursor usage and billing exports.

cursor.api.request

INFO, body api_request. Family model_usage.

AttributeTypePresenceNotes
cursor.api.request.input_tokensintAlways
cursor.api.request.output_tokensintAlways
cursor.api.request.cache_read_tokensintAlways
cursor.api.request.cache_creation_tokensintAlways
cursor.model.namestringOptional
cursor.api.billableboolOptional

cursor.api.error

ERROR, body api_error. Family model_usage. No raw error messages. Low-cardinality kind and status attributes are planned; don't depend on them yet.

AttributeTypePresenceNotes
cursor.model.namestringOptional
cursor.api.billableboolOptional

cursor.api.correction

WARN, body api_correction_<kind>. Family model_usage. Billing finalization: the usage event was retroactively not billed. Join on cursor.usage_event.id and drop the whole group for billing. Deliberately carries no cursor.model.name.

AttributeTypePresenceValues
cursor.api.correction.kindstringAlwaysnot_billed_errored | not_billed_aborted_before_timeout

cursor.skill.activated

INFO, body skill_activated. Family skills_hooks_plugins.

AttributeTypePresenceValues / notes
cursor.skill.namestringAlwaysCustomer-authored (open)
cursor.skill.triggerstringAlwaysagent_read | manually_attached | skill_name_in_prompt
cursor.skill.sourcestringAlwaysunspecified | workspace | user | builtin | plugin | claude
cursor.plugin.namestringOptionalWhen the skill came from a plugin

cursor.hook.execution_complete

INFO (ERROR for failed / timeout), body hook_execution_complete. Family skills_hooks_plugins.

AttributeTypePresenceValues / notes
cursor.hook.namestringAlwaysCustomer-configured (open)
cursor.hook.typestringAlwayspre_tool_use | post_tool_use | post_tool_use_failure | before_submit_prompt | after_agent_response | after_agent_thought | stop | subagent_start | subagent_stop
cursor.hook.outcomestringAlwayssuccess | blocked | failed | timeout
cursor.hook.duration_msintAlways
cursor.plugin.namestringOptionalWhen the hook came from a plugin

cursor.plugin.installed

INFO, body plugin_installed. Family skills_hooks_plugins. No conversation.id (install is not conversation-scoped).

AttributeTypePresenceValues / notes
cursor.plugin.namestringAlwaysOpen
cursor.plugin.scopestringAlwaysunspecified | public | private_marketplace

cursor.cloud_agent.pull_request

INFO (opened) / WARN (creation_failed), body cloud_agent_pull_request_<kind>. Family cloud_agents. conversation.id = bc-....

AttributeTypePresenceValues / notes
cursor.cloud_agent.pull_request.kindstringAlwaysopened | creation_failed
cursor.cloud_agent.pull_request.numberintopened only
cursor.cloud_agent.pull_request.draftboolopened only

creation_failed is live. opened may be sparse while the producer rolls out.

cursor.cloud_agent.setup

INFO (started / completed) / ERROR (failed), body cloud_agent_setup_<kind>. Family cloud_agents. conversation.id = bc-....

AttributeTypePresenceValues / notes
cursor.cloud_agent.setup.kindstringAlwaysstarted | completed | failed
cursor.cloud_agent.setup.duration_msintTerminal kinds when presentcompleted / failed
cursor.cloud_agent.setup.reasonstringfailed onlyOpen vocabulary (e.g. install_command_failed)

cursor.cloud_agent.artifact

INFO, body cloud_agent_artifact_created. Family cloud_agents. conversation.id = bc-....

AttributeTypePresenceValues / notes
cursor.cloud_agent.artifact.file_namestringAlwaysOpen
cursor.cloud_agent.artifact.content_typestringOptionalMIME

cursor.cloud_agent.mcp_auth_error

ERROR, body cloud_agent_mcp_auth_error. Family cloud_agents. conversation.id = bc-....

An MCP server you connected rejected the run's credentials. That server's tool calls failed while the run continued. ERROR because only you can fix the integration; alert on this to catch Automations and Cloud Agents silently losing an MCP server.

AttributeTypePresenceValues / notes
cursor.mcp.server.namestringAlwaysCustomer-defined server display name (open), e.g. github. Same value space as the cursor.tool.calls datapoint attribute.

Shared grok_bot.* attributes

The grok_bot.* events carry Bot actions from Action Recording, secret-scrubbed before export. Family grok_bot_agent_actions. Every record has cursor.surface=grok_bot. Each event also carries:

AttributeTypePresenceValues / notes
cursor.grok_bot.provenancestringAlwaysclient (reported by the Grok Bot host) | server (observed by Cursor)
cursor.grok_bot.turn.idstringOptionalTurn id within the conversation
cursor.grok_bot.box.idstringOptionalGrok Bot computer id. Absent on server provenance

cursor.grok_bot.mcp_tool_call

INFO (ERROR for failure status), body grok_bot_mcp_tool_call. Family grok_bot_agent_actions. One MCP tool call made by a Bot. Tool arguments and results are never exported.

AttributeTypePresenceValues / notes
cursor.tool.namestringAlwaysCustomer-defined MCP tool name (open)
cursor.tool.statusstringAlwayssuccess | failure
cursor.grok_bot.mcp.transportstringAlwayshttp (server-observed) | stdio (on the computer)
cursor.grok_bot.mcp.duration_msintAlways
cursor.mcp.server.namestringOptionalCustomer-defined server display name (open)
cursor.grok_bot.tool_call.idstringOptionalGrok Bot tool-call id

cursor.grok_bot.shell_command

INFO (WARN when blocked), body grok_bot_shell_command. Family grok_bot_agent_actions. A shell command a Bot ran or was blocked from running.

AttributeTypePresenceValues / notes
cursor.grok_bot.shell.commandstringAlwaysSecret-scrubbed command text, at most 8 KiB (open)
cursor.grok_bot.shell.command_truncatedboolAlwaysTrue when the source command exceeded the cap
cursor.grok_bot.shell.kindstringAlwaysforeground | background
cursor.grok_bot.shell.targetstringAlwaysbox (the Grok Bot computer) | user_machine
cursor.grok_bot.shell.allowedboolAlwaysShell policy decision
cursor.grok_bot.shell.blocked_reasonstringOptionalPolicy reason when blocked; secret-scrubbed (open)
cursor.grok_bot.shell.classification_reasonsstring[]OptionalAt most 10 policy classification reasons; secret-scrubbed (open)

cursor.grok_bot.browser_navigation

INFO, body grok_bot_browser_navigation. Family grok_bot_agent_actions. conversation.id is the Grok Bot conversation id.

AttributeTypePresenceValues / notes
cursor.grok_bot.browser.urlstringAlwaysNormalized scheme://host/path (open). Non-hierarchical schemes never export
cursor.grok_bot.browser.page_titlestringOptionalSecret-scrubbed (open)

cursor.grok_bot.computer_use_session

INFO, body grok_bot_computer_use_session. Family grok_bot_agent_actions. Counts and wall time only. No coordinates, typed text, or screenshots.

AttributeTypePresenceValues / notes
cursor.grok_bot.computer_use.action_countintAlways
cursor.grok_bot.computer_use.duration_msintAlways
cursor.grok_bot.computer_use.screenshot_countintAlways
cursor.grok_bot.tool_call.idstringOptionalTool-call id of the subagent invocation

Identity and joins

  • Dedupe logs on cursor.event.id.
  • Session reconstruction: group logs by cursor.conversation.id (composer UUID, bc-..., or Grok Bot conversation id).
  • Billing reconcile grain: cursor.usage_event.id across api.request / api.error / api.correction.
  • Metrics do not carry these ids. Use api.request logs for per-conversation token totals.

See Joining sessions on the setup page for recipes.

Delivery semantics

  • Logs are at-least-once. Transient failures recover automatically for about 7 days; dedupe on event.id. Terminal rejections (persistent 4xx, bad payloads) are not replayed.
  • Metrics are at-most-once. Failed metric requests are not retried or replayed.
  • No ordering guarantee. Corrections can arrive after the requests they amend; order by record timestamp.
  • OTLP partial success is honored. Rejected items are not re-sent.
  • No backfill from before destination activation. Source retention upstream of export is also about 7 days (separate from the delivery retry window).