> ## Documentation Index
> Fetch the complete documentation index at: https://docs.getmcpulse.com/llms.txt
> Use this file to discover all available pages before exploring further.

# List Events

> Individual calls, newest first — the live feed.

The only read in the API that touches the call log rather than the metrics table, because a counter has no rows to point at and cannot answer "did the call I just made land". Rows are kept 30 days; the numbers built from them are not.

Paged by `id`, not by time, so a cursor is exact: poll with `after=<newest_id>` and you can neither miss a call nor see one twice. Page backwards with `before=<oldest_id>`, which is stable under a live feed in a way an offset is not.

`total` counts every call matching the filter and ignores the cursor, so it is the size of the feed rather than what is left of it — divide by `limit` for a page count.

Every field is a size, a duration or a hash. Arguments and results are never stored, so there are none here to return.



## OpenAPI

````yaml https://api.getmcpulse.com/docs/openapi.json get /v1/mcps/{id}/events
openapi: 3.1.0
info:
  title: MCPulse API
  version: 1.0.0
  description: >-
    Analytics for MCP servers.


    The API is the product — the dashboard is one client and an MCP server will
    be another. Every number here is computed server-side so that both get the
    same answer.


    **Two kinds of auth.** Ingest uses an MCP API key (`mp_live_…`). Everything
    else uses a Supabase access token from the browser session.
servers:
  - url: https://mcpulse-production.up.railway.app
    description: MCPulse API
security: []
tags:
  - name: ingest
    description: What the customer's server sends
  - name: mcps
    description: MCPs and ownership
  - name: metrics
    description: Everything the dashboard reads
  - name: keys
    description: Ingest API keys
  - name: account
    description: Account, team and usage
paths:
  /v1/mcps/{id}/events:
    get:
      tags:
        - metrics
      summary: List Events
      description: >-
        Individual calls, newest first — the live feed.


        The only read in the API that touches the call log rather than the
        metrics table, because a counter has no rows to point at and cannot
        answer "did the call I just made land". Rows are kept 30 days; the
        numbers built from them are not.


        Paged by `id`, not by time, so a cursor is exact: poll with
        `after=<newest_id>` and you can neither miss a call nor see one twice.
        Page backwards with `before=<oldest_id>`, which is stable under a live
        feed in a way an offset is not.


        `total` counts every call matching the filter and ignores the cursor, so
        it is the size of the feed rather than what is left of it — divide by
        `limit` for a page count.


        Every field is a size, a duration or a hash. Arguments and results are
        never stored, so there are none here to return.
      parameters:
        - schema:
            type: string
            format: uuid
          required: true
          name: id
          in: path
        - schema:
            type: integer
            nullable: true
            description: >-
              Only calls newer than this id. Use `newest_id` from the last
              response.
          required: false
          description: >-
            Only calls newer than this id. Use `newest_id` from the last
            response.
          name: after
          in: query
        - schema:
            type: integer
            nullable: true
            description: Only calls older than this id. Use `oldest_id` to page back.
          required: false
          description: Only calls older than this id. Use `oldest_id` to page back.
          name: before
          in: query
        - schema:
            type: integer
            minimum: 1
            maximum: 100
            default: 50
          required: false
          name: limit
          in: query
        - schema:
            type: string
            minLength: 1
          required: false
          name: tool
          in: query
        - schema:
            type: string
            enum:
              - ok
              - empty
              - bad_args
              - tool_error
              - crashed
            description: '`empty` is an `ok` call that returned nothing useful.'
          required: false
          description: '`empty` is an `ok` call that returned nothing useful.'
          name: outcome
          in: query
        - schema:
            type: string
            minLength: 1
          required: false
          name: client
          in: query
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                nullable: true
        '401':
          description: Invalid or missing token
        '404':
          description: Not found, or not yours

````