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
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

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 or cloud_agent.*.
cursor.conversation.idstringOptionalIDE/CLI: composer UUID. Cloud agent: customer-visible bc-... agent id. Join key for session reconstruction across api, skill/hook, and cloud_agent 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

Identity and joins

  • Dedupe logs on cursor.event.id.
  • Session reconstruction: group logs by cursor.conversation.id (composer UUID or bc-...).
  • 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).