# telemetry/v1 (/docs/a2a/telemetry/v1)



URI: `https://docs.nylorun.com/a2a/telemetry/v1`

```json
{
  "statusUpdate": {
    "taskId": "t1.…",
    "contextId": "ticket-4821",
    "status": { "state": "TASK_STATE_COMPLETED", "timestamp": "2026-11-02T10:03:51.870Z" },
    "metadata": {
      "https://docs.nylorun.com/a2a/telemetry/v1": {
        "totals": { "steps": 114, "tokens": 2412833, "costUsd": 18.42 },
        "traceId": "4bf92f3577b34da6a3ce929d0e0e4736"
      }
    }
  }
}
```

The terminal status update of a task (`COMPLETED`, `FAILED`, or `CANCELED`)
carries this extension, from the turn's end facts and its
[trace](/docs/run/traces). Once the task has ended, `GetTask` and `ListTasks`
carry it in the task's `metadata` too.

| Field            | Type                      | Meaning                                                               |
| ---------------- | ------------------------- | --------------------------------------------------------------------- |
| `totals.steps`   | number                    | The turn's steps.                                                     |
| `totals.tokens`  | number                    | Tokens the turn's model calls used.                                   |
| `totals.costUsd` | number                    | The turn's cost in US dollars, as the Runtime's Model Gate priced it. |
| `traceId`        | string, 32 hex characters | The turn's trace id.                                                  |

`totals` is left out when the turn recorded none.

The trace id is the caller's: send a W3C `traceparent` with the message and
the turn joins that trace, so `traceId` is your trace id. Without one, it is
the Runtime's own. See [Trace context](/docs/run/traces#trace-context).
