{
  "info": {
    "name": "rtcStats API",
    "_postman_id": "rtcstats-api-v1-0",
    "description": "Generated from https://rtcstats.com/api/openapi. Set the `token` collection variable to an application token from the rtcStats dashboard (Developer plan and above).",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "auth": {
    "type": "bearer",
    "bearer": [
      {
        "key": "token",
        "value": "{{token}}",
        "type": "string"
      }
    ]
  },
  "variable": [
    {
      "key": "baseUrl",
      "value": "https://api.rtcstats.com",
      "type": "string"
    },
    {
      "key": "token",
      "value": "",
      "type": "string"
    }
  ],
  "item": [
    {
      "name": "Upload",
      "request": {
        "method": "POST",
        "description": "Upload and store a WebRTC dump file or a rtcstats file to your account using a chunked flow. <br/><br/>The API works in two steps: <ul><li>- First upload chunks via multipart/form-data</li><li>- Then assemble via application/json</li></ul>The API consumes one credit if successful. An assemble repeated within 24 h with the same <code>fileId</code> returns <code>200</code> with the original body and consumes no credit.",
        "header": [
          {
            "key": "Accept",
            "value": "application/json"
          },
          {
            "key": "Content-Type",
            "value": "application/json"
          }
        ],
        "url": {
          "raw": "{{baseUrl}}/v1.0/upload",
          "host": [
            "{{baseUrl}}"
          ],
          "path": [
            "v1.0",
            "upload"
          ],
          "query": [],
          "variable": []
        },
        "body": {
          "mode": "raw",
          "raw": "{}",
          "options": {
            "raw": {
              "language": "json"
            }
          }
        }
      },
      "response": []
    },
    {
      "name": "Analyze",
      "request": {
        "method": "POST",
        "description": "Upload a webrtc-internal file or a rtcstats file, process it and return summary, observations and scores. By default the session is not stored: pass query <code>save=true</code> (or <code>save=1</code>) to also persist the dump like <code>/upload</code>; with <code>save=true</code>, an assemble repeated within 24 h with the same <code>fileId</code> returns <code>200</code> with the original body and consumes no credit.<br/><br/>Send the dump the same way as <code>/upload</code>: upload the file in chunks, then send a small JSON assemble request.<br/><br/>This API consumes one credit if successful.",
        "header": [
          {
            "key": "Accept",
            "value": "application/json"
          },
          {
            "key": "Content-Type",
            "value": "application/json"
          }
        ],
        "url": {
          "raw": "{{baseUrl}}/v1.0/analyze?",
          "host": [
            "{{baseUrl}}"
          ],
          "path": [
            "v1.0",
            "analyze"
          ],
          "query": [
            {
              "key": "save",
              "value": "",
              "description": "When <code>true</code> or <code>1</code>, store the file in the account in addition to returning the analysis JSON.",
              "disabled": true
            }
          ],
          "variable": []
        },
        "body": {
          "mode": "raw",
          "raw": "{}",
          "options": {
            "raw": {
              "language": "json"
            }
          }
        }
      },
      "response": []
    },
    {
      "name": "Enrich",
      "request": {
        "method": "POST",
        "description": "For a rtcstats-server or any server that only needs the observations and scores projection. Processes a webrtc-internal file or a rtcstats file and returns just that projection: experience, audio, video, connectivity and observations scores, per-severity observation counts, flat trimmed observation records, and the user-agent data. The session is never stored.<br/><br/>Send the dump the same way as <code>/upload</code>: upload the file in chunks, then send a small JSON assemble request.<br/><br/>This API consumes one credit if successful.",
        "header": [
          {
            "key": "Accept",
            "value": "application/json"
          },
          {
            "key": "Content-Type",
            "value": "application/json"
          }
        ],
        "url": {
          "raw": "{{baseUrl}}/v1.0/enrich",
          "host": [
            "{{baseUrl}}"
          ],
          "path": [
            "v1.0",
            "enrich"
          ],
          "query": [],
          "variable": []
        },
        "body": {
          "mode": "raw",
          "raw": "{}",
          "options": {
            "raw": {
              "language": "json"
            }
          }
        }
      },
      "response": []
    },
    {
      "name": "MCP Streamable HTTP",
      "request": {
        "method": "POST",
        "description": "Model Context Protocol <b>Streamable HTTP</b> transport. <br/>Use an MCP client with this URL. <br/>Send <code>Authorization: Bearer</code> with your application JWT on every request. <br/>Exposes tools:<ul><li>- <code>get_quota</code></li><li>- <code>list_sessions</code></li><li>- <code>get_session</code></li><li>- <code>get_observation_explanation</code></li></ul> Resource: <code>rtcstats://observations/{type}</code>, the Markdown explanation of one observation type (JSON-RPC error -32002 for an unknown type, no list). Prompts: <code>what_changed_since</code>, <code>sessions_worth_opening</code>, <code>explain_session_observations</code>. <br/><br/>Every request, <code>initialize</code> included, must carry the token: a missing or invalid token is HTTP 401 with a <code>WWW-Authenticate</code> challenge, and a plan without API access is HTTP 403, both before any JSON-RPC is processed. Rate limits on <code>tools/call</code> and <code>resources/read</code> (<code>read</code> bucket, 120 per minute per account) are returned as tool results with <code>isError: true</code> or as a JSON-RPC error, never as HTTP 429. <code>initialize</code>, <code>tools/list</code>, <code>prompts/*</code> and the resource listings are never limited.",
        "header": [
          {
            "key": "Accept",
            "value": "application/json"
          },
          {
            "key": "Content-Type",
            "value": "application/json"
          }
        ],
        "url": {
          "raw": "{{baseUrl}}/v1.0/mcp",
          "host": [
            "{{baseUrl}}"
          ],
          "path": [
            "v1.0",
            "mcp"
          ],
          "query": [],
          "variable": []
        },
        "body": {
          "mode": "raw",
          "raw": "{}",
          "options": {
            "raw": {
              "language": "json"
            }
          }
        }
      },
      "response": []
    },
    {
      "name": "Quota",
      "request": {
        "method": "GET",
        "description": "Returns total allowed credits and remaining credits for the account. Include the purchased credits.",
        "header": [
          {
            "key": "Accept",
            "value": "application/json"
          }
        ],
        "url": {
          "raw": "{{baseUrl}}/v1.0/quota",
          "host": [
            "{{baseUrl}}"
          ],
          "path": [
            "v1.0",
            "quota"
          ],
          "query": [],
          "variable": []
        }
      },
      "response": []
    },
    {
      "name": "Observation explanation",
      "request": {
        "method": "GET",
        "description": "Returns the explanation of one observation type: the text behind the in-app knowledge base popup, as Markdown sections. Pass a type exactly as it appears in <code>data.observations[].type</code> (case-sensitive). There is no list of types. No credit is spent.",
        "header": [
          {
            "key": "Accept",
            "value": "application/json"
          }
        ],
        "url": {
          "raw": "{{baseUrl}}/v1.0/observations/{type}",
          "host": [
            "{{baseUrl}}"
          ],
          "path": [
            "v1.0",
            "observations",
            ":type"
          ],
          "query": [],
          "variable": [
            {
              "key": "type",
              "value": "",
              "description": "The observation type, e.g. <code>speakerDelay</code>"
            }
          ]
        }
      },
      "response": []
    },
    {
      "name": "List sessions",
      "request": {
        "method": "GET",
        "description": "Returns existing stored sessions for the token account ordered by creation date (newest first), paginated by <code>limit</code> and <code>page</code>. All filters are optional. Different filters are AND-combined; multiple values within one filter are OR-combined.",
        "header": [
          {
            "key": "Accept",
            "value": "application/json"
          }
        ],
        "url": {
          "raw": "{{baseUrl}}/v1.0/sessions?",
          "host": [
            "{{baseUrl}}"
          ],
          "path": [
            "v1.0",
            "sessions"
          ],
          "query": [
            {
              "key": "name",
              "value": "",
              "description": "Filter sessions whose title contains ANY of these substrings",
              "disabled": true
            },
            {
              "key": "observationTypes",
              "value": "",
              "description": "Filter sessions that contain ANY of these observation type strings (exact type name, e.g. `turnNoConfig`). Comma-separated. Only high/medium observations are indexed (low/info are excluded). Up to 20 values.",
              "disabled": true
            },
            {
              "key": "observationTags",
              "value": "",
              "description": "Filter sessions whose observations carry ANY of these tags. Comma-separated. Valid tags: `connectivity`, `security`, `audio`, `video`, `datachannel`, `outbound`, `inbound`, `peripheral`, `behavior`, `network`, `configuration`, `cpu`, `bug`.",
              "disabled": true
            },
            {
              "key": "os",
              "value": "",
              "description": "Filter sessions by operating system (exact match). Examples: `macOS`, `Windows`, `Linux`, `Android`, `iPhone`, `iPad`.",
              "disabled": true
            },
            {
              "key": "browser",
              "value": "",
              "description": "Filter sessions by browser (exact match). Examples: `Chrome`, `Safari`, `Firefox`, `Edge`.",
              "disabled": true
            },
            {
              "key": "browserVersion",
              "value": "",
              "description": "Filter sessions by major browser version (exact match, e.g. `142`).",
              "disabled": true
            },
            {
              "key": "userId",
              "value": "",
              "description": "Filter sessions by the end-user identifier carried in the rtcstats JWT (summary metadata user).",
              "disabled": true
            },
            {
              "key": "conferenceId",
              "value": "",
              "description": "Filter sessions by the conference identifier carried in the rtcstats JWT (summary metadata conference).",
              "disabled": true
            },
            {
              "key": "sessionId",
              "value": "",
              "description": "Filter sessions by the session identifier carried in the rtcstats JWT (summary metadata session).",
              "disabled": true
            },
            {
              "key": "hasHigh",
              "value": "",
              "description": "When `true`, only sessions with at least one high-severity observation.",
              "disabled": true
            },
            {
              "key": "hasMedium",
              "value": "",
              "description": "When `true`, only sessions with at least one medium-severity observation.",
              "disabled": true
            },
            {
              "key": "hasLowScore",
              "value": "",
              "description": "When `true`, only sessions whose experience score is low (`< 60`).",
              "disabled": true
            },
            {
              "key": "hasMediumScore",
              "value": "",
              "description": "When `true`, only sessions whose experience score is medium (`60` to `79`).",
              "disabled": true
            },
            {
              "key": "hasHighScore",
              "value": "",
              "description": "When `true`, only sessions whose experience score is high (`>= 80`).",
              "disabled": true
            },
            {
              "key": "limit",
              "value": "",
              "description": "Sessions per page, `1` to `1000` (default `100`).",
              "disabled": true
            },
            {
              "key": "page",
              "value": "",
              "description": "1-based page number (default `1`). A page past the end returns an empty <code>data</code>.",
              "disabled": true
            }
          ],
          "variable": []
        }
      },
      "response": []
    },
    {
      "name": "Retrieve Session",
      "request": {
        "method": "GET",
        "description": "Returns the session detail including summary, observations and scores.",
        "header": [
          {
            "key": "Accept",
            "value": "application/json"
          }
        ],
        "url": {
          "raw": "{{baseUrl}}/v1.0/sessions/{rtcstatsId}",
          "host": [
            "{{baseUrl}}"
          ],
          "path": [
            "v1.0",
            "sessions",
            ":rtcstatsId"
          ],
          "query": [],
          "variable": []
        }
      },
      "response": []
    },
    {
      "name": "Delete session",
      "request": {
        "method": "DELETE",
        "description": "Deletes a stored session by its identifier.",
        "header": [
          {
            "key": "Accept",
            "value": "application/json"
          }
        ],
        "url": {
          "raw": "{{baseUrl}}/v1.0/sessions/{rtcstatsId}",
          "host": [
            "{{baseUrl}}"
          ],
          "path": [
            "v1.0",
            "sessions",
            ":rtcstatsId"
          ],
          "query": [],
          "variable": []
        }
      },
      "response": []
    }
  ]
}