rtcStats · Schema

AnalyzeResponseData

Session payload peer-connections, observations and scores.

WebRTCObservabilityMonitoringDebuggingReal-Time CommunicationVideoVoiceArtificial IntelligenceMCPDeveloper Tools

Properties

Name Type Description
callStart string First observed call activity timestamp.
callEnd string Last observed call activity timestamp.
durationMs integer Total call duration in milliseconds.
userAgentData object Browser, platform, hardware and screen information.
pConnectionsNumber integer Number of RTCPeerConnections observed during the session.
pConnections object Per-PeerConnection details keyed by peer connection id.
streams object Peer-stream metrics (audio, video, data) keyed by stream id.
transports object ICE transport and candidate-pair information per PeerConnection.
aggregatedStats object Session-wide aggregated metrics with self-describing keys ___: metric = jitter|rtt|bitrate|packetLoss|mos; scope = in_audio|out_audio|in_video|out_video; agg = avg|min|max|p5
metadata object Client protocol and custom flags.
connectivity string Resolved connectivity type for the session.
connectionIPType string IP family of the selected connection. Absent when it could not be resolved.
uploadTimestamp string When the dump was analyzed/processed (ISO 8601).
title string Human-readable session title (often derived from the call URL).
fileName string Internal name of the stored dump file.
fileSize integer Size of the uploaded dump in bytes.
experienceScore number Overall experience score (0-100). 0 when there is no media data to score against.
audioScore numbernull Audio quality score (1-5). Null when no audio stream is present.
videoScore numbernull Video quality score (1-5). Null when no video stream is present.
connectivityScore numbernull Connectivity score (1-5). Null when no peer connection produced a connectivity score (e.g. no valid candidate pair).
observationsScore integer Aggregated severity score derived from observations. Maximum (40) when no observations were produced; lower as severity penalties are applied.
tagClouds array Tag-cloud entries derived from the session.
id string Session identifier (same as rtcstatsId).
created_at stringnull Row creation timestamp. Null on `POST /analyze` without `?save=true` (the dump is not persisted).
uploaded_by stringnull Identifier of the account/user that uploaded the dump. Null on `POST /analyze` without `?save=true`.
uploaded_by_email stringnull Email of the uploader. Null on `POST /analyze` without `?save=true`.
public_link stringnull Share token for the public viewer.
description stringnull Optional free-text description.
tags array User-defined tags attached to the session.
observations array Detected issues and insights. Each entry is an observation with a type, a severity, a category, a source object identifying what it concerns, and optional supporting values/indicators.
features object Boolean and value flags about devices, network and capabilities used during the session.
observationsCount object Counts of observations grouped by severity (critical, high, medium, low, info).
aiSummary objectnull AI-generated session summary. Always `null` on `POST /analyze` responses and while background generation is pending or plan-gated. Stable `summary` fields: `highlight`, `network`, `media`, `user` (mar
View JSON Schema on GitHub

JSON Schema

rtcstats-analyze-response-data-schema.json Raw ↑
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://raw.githubusercontent.com/api-evangelist/rtcstats/main/json-schema/rtcstats-analyze-response-data-schema.json",
  "title": "AnalyzeResponseData",
  "description": "Session payload peer-connections, observations and scores.",
  "x-generated": "2026-09-28",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/rtcstats-rtcstats-api-api-openapi.yml#/components/schemas/AnalyzeResponseData",
  "type": "object",
  "additionalProperties": true,
  "properties": {
    "callStart": {
      "type": "string",
      "format": "date-time",
      "description": "First observed call activity timestamp."
    },
    "callEnd": {
      "type": "string",
      "format": "date-time",
      "description": "Last observed call activity timestamp."
    },
    "durationMs": {
      "type": "integer",
      "description": "Total call duration in milliseconds."
    },
    "userAgentData": {
      "type": "object",
      "description": "Browser, platform, hardware and screen information."
    },
    "pConnectionsNumber": {
      "type": "integer",
      "description": "Number of RTCPeerConnections observed during the session."
    },
    "pConnections": {
      "type": "object",
      "description": "Per-PeerConnection details keyed by peer connection id.",
      "additionalProperties": {
        "type": "object"
      }
    },
    "streams": {
      "type": "object",
      "description": "Peer-stream metrics (audio, video, data) keyed by stream id.",
      "additionalProperties": {
        "type": "object"
      }
    },
    "transports": {
      "type": "object",
      "description": "ICE transport and candidate-pair information per PeerConnection.",
      "additionalProperties": {
        "type": "object"
      }
    },
    "aggregatedStats": {
      "type": "object",
      "description": "Session-wide aggregated metrics with self-describing keys <metric>_<scope>_<agg>_<unit>: metric = jitter|rtt|bitrate|packetLoss|mos; scope = in_audio|out_audio|in_video|out_video; agg = avg|min|max|p5|p95|stddev; unit = ms (jitter, rtt), kbps (bitrate), percent (packetLoss), score (mos, 0-4.5, where 0 means unusable transport). Example: rtt_out_audio_avg_ms. Session-level weighted averages: jitter_avg_ms, rtt_avg_ms. Stream counts: in_audio_count, out_audio_count, in_video_count, out_video_count. Since schema 6.9 the former unitless keys (e.g. rtt_out_audio, in_audio) are no longer present."
    },
    "metadata": {
      "type": "object",
      "description": "Client protocol and custom flags."
    },
    "connectivity": {
      "type": "string",
      "description": "Resolved connectivity type for the session."
    },
    "connectionIPType": {
      "type": "string",
      "enum": [
        "IPv4",
        "IPv6"
      ],
      "description": "IP family of the selected connection. Absent when it could not be resolved."
    },
    "uploadTimestamp": {
      "type": "string",
      "format": "date-time",
      "description": "When the dump was analyzed/processed (ISO 8601)."
    },
    "title": {
      "type": "string",
      "description": "Human-readable session title (often derived from the call URL)."
    },
    "fileName": {
      "type": "string",
      "description": "Internal name of the stored dump file."
    },
    "fileSize": {
      "type": "integer",
      "description": "Size of the uploaded dump in bytes."
    },
    "experienceScore": {
      "type": "number",
      "format": "float",
      "description": "Overall experience score (0-100). 0 when there is no media data to score against."
    },
    "audioScore": {
      "type": [
        "number",
        "null"
      ],
      "format": "float",
      "description": "Audio quality score (1-5). Null when no audio stream is present."
    },
    "videoScore": {
      "type": [
        "number",
        "null"
      ],
      "format": "float",
      "description": "Video quality score (1-5). Null when no video stream is present."
    },
    "connectivityScore": {
      "type": [
        "number",
        "null"
      ],
      "format": "float",
      "description": "Connectivity score (1-5). Null when no peer connection produced a connectivity score (e.g. no valid candidate pair)."
    },
    "observationsScore": {
      "type": "integer",
      "description": "Aggregated severity score derived from observations. Maximum (40) when no observations were produced; lower as severity penalties are applied."
    },
    "tagClouds": {
      "type": "array",
      "description": "Tag-cloud entries derived from the session.",
      "items": {
        "type": "object",
        "required": [
          "tag",
          "total"
        ],
        "properties": {
          "tag": {
            "type": "string"
          },
          "total": {
            "type": "number"
          },
          "severity": {
            "type": "string",
            "description": "Optional severity bucket for the tag."
          }
        }
      }
    },
    "id": {
      "type": "string",
      "format": "uuid",
      "description": "Session identifier (same as rtcstatsId)."
    },
    "created_at": {
      "type": [
        "string",
        "null"
      ],
      "format": "date-time",
      "description": "Row creation timestamp. Null on `POST /analyze` without `?save=true` (the dump is not persisted)."
    },
    "uploaded_by": {
      "type": [
        "string",
        "null"
      ],
      "format": "uuid",
      "description": "Identifier of the account/user that uploaded the dump. Null on `POST /analyze` without `?save=true`."
    },
    "uploaded_by_email": {
      "type": [
        "string",
        "null"
      ],
      "format": "email",
      "description": "Email of the uploader. Null on `POST /analyze` without `?save=true`."
    },
    "public_link": {
      "type": [
        "string",
        "null"
      ],
      "description": "Share token for the public viewer."
    },
    "description": {
      "type": [
        "string",
        "null"
      ],
      "description": "Optional free-text description."
    },
    "tags": {
      "type": "array",
      "description": "User-defined tags attached to the session.",
      "items": {
        "type": "string"
      }
    },
    "observations": {
      "type": "array",
      "description": "Detected issues and insights. Each entry is an observation with a type, a severity, a category, a source object identifying what it concerns, and optional supporting values/indicators.",
      "items": {
        "type": "object",
        "description": "A single detected observation.",
        "properties": {
          "type": {
            "type": "string",
            "description": "Observation type key, e.g. 'turnNoConfig', 'unusedStream', 'framesDropped'. The full catalog (with possible severities and tags) is available from GET /v1.0/observations."
          },
          "severity": {
            "type": "string",
            "enum": [
              "critical",
              "high",
              "medium",
              "low",
              "info"
            ],
            "description": "Severity of the observation."
          },
          "category": {
            "type": "string",
            "enum": [
              "connections",
              "streams",
              "devices",
              "datachannels",
              "logs",
              "pairs"
            ],
            "description": "Category the observation belongs to."
          },
          "source": {
            "type": "object",
            "description": "Identifies what the observation concerns. Which properties are present depends on the category (connections: pid; pairs: pid+cpid; streams: pid+sid+ssrcId; datachannels: pid+sid; devices: did+rid+timestamp+labelId; logs: pid). Routing/matching uses pid/sid/cpid/did+timestamp; ssrcId and labelId are display identifiers.",
            "properties": {
              "pid": {
                "type": "string",
                "description": "Peer-connection id."
              },
              "sid": {
                "type": "string",
                "description": "Stream or datachannel report id (the W3C stats report dictionary id)."
              },
              "cpid": {
                "type": "string",
                "description": "Candidate-pair id."
              },
              "did": {
                "type": "string",
                "description": "Device entry id."
              },
              "rid": {
                "type": "string",
                "description": "Device row index, as a string."
              },
              "timestamp": {
                "type": "string",
                "description": "Device entry time, an ISO-like date string."
              },
              "ssrcId": {
                "type": "integer",
                "format": "int64",
                "description": "Stream SSRC (W3C RTCRtpStreamStats.ssrc, unsigned long)."
              },
              "labelId": {
                "type": "string",
                "description": "Device human name."
              }
            }
          },
          "label": {
            "deprecated": true,
            "description": "DEPRECATED, removed in the next schema version. Overloaded legacy identifier whose runtime type is polymorphic: a number (the numeric SSRC) for stream observations, a string (the datachannel report id) for datachannels, a string (the device name) for device observations. No fixed type is declared because the runtime type varies by category. Read source.ssrcId / source.sid / source.labelId instead."
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Tags attached to the observation (e.g. network, audio, video, connectivity, security)."
          },
          "url": {
            "type": "string",
            "description": "Related URL when applicable (e.g. the TURN server URL)."
          },
          "firstSeenAt": {
            "type": "integer",
            "format": "int64",
            "description": "Epoch timestamp (ms) of the first occurrence of the observation, truncated to a whole millisecond."
          },
          "valueInCount": {
            "type": "number",
            "description": "Observation value as a count (e.g. number of duplicated lines or occurrences)."
          },
          "averageInMs": {
            "type": "number",
            "description": "Average value in milliseconds (e.g. jitter, rtt, encode/decode time)."
          },
          "maxInMs": {
            "type": "number",
            "description": "Maximum value in milliseconds."
          },
          "valueInPercent": {
            "type": "number",
            "description": "Observation value as a percentage (e.g. audio/video loss, frames dropped)."
          },
          "durationInPercent": {
            "type": "number",
            "description": "Duration of the observation as a percentage of the call."
          },
          "durationInMs": {
            "type": "number",
            "description": "Duration in milliseconds (e.g. TURN/STUN delay, signaling time)."
          },
          "durationInSeconds": {
            "type": "number",
            "description": "Duration in seconds."
          },
          "indicators": {
            "type": "object",
            "description": "Supporting indicators (e.g. min, max, average, stddev)."
          },
          "meaning": {
            "type": "string",
            "description": "Human-readable meaning of the observation (used by the AI summary)."
          },
          "property": {
            "type": "string",
            "description": "The specific property the observation refers to (e.g. audioLevel)."
          }
        }
      }
    },
    "features": {
      "type": "object",
      "description": "Boolean and value flags about devices, network and capabilities used during the session."
    },
    "observationsCount": {
      "type": "object",
      "description": "Counts of observations grouped by severity (critical, high, medium, low, info)."
    },
    "aiSummary": {
      "type": [
        "object",
        "null"
      ],
      "description": "AI-generated session summary. Always `null` on `POST /analyze` responses and while background generation is pending or plan-gated. Stable `summary` fields: `highlight`, `network`, `media`, `user` (markdown strings) and `networkScore`, `mediaScore`, `userScore` (one of excellent, good, acceptable, poor, bad, mediocre). Other fields may appear and are subject to change without notice. Use them with care.",
      "properties": {
        "model": {
          "type": "string",
          "description": "Model id used for generation (e.g. anthropic/claude-haiku-4.5)."
        },
        "summary": {
          "type": "object",
          "description": "AI-authored summary. Extra undocumented fields may appear and are subject to change.",
          "additionalProperties": true,
          "properties": {
            "highlight": {
              "type": "string",
              "description": "One-line overall summary (markdown)."
            },
            "network": {
              "type": "string",
              "description": "Network and connectivity analysis (markdown)."
            },
            "networkScore": {
              "type": "string",
              "description": "Qualitative network rating: excellent, good, acceptable, poor, bad or mediocre."
            },
            "media": {
              "type": "string",
              "description": "Audio/video quality analysis (markdown)."
            },
            "mediaScore": {
              "type": "string",
              "description": "Qualitative media rating (same values as networkScore)."
            },
            "user": {
              "type": "string",
              "description": "Device and local-user analysis (markdown)."
            },
            "userScore": {
              "type": "string",
              "description": "Qualitative user-side rating (same values as networkScore)."
            }
          }
        },
        "version": {
          "type": "string",
          "description": "AI prompt configuration version used for generation."
        }
      }
    }
  }
}

Work with this as data

Every JSON Schema here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for schemas

4 MCP tools reach this
  • find_json_schemasBrowse and filter every JSON Schema in the catalog.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This JSON Schema
curl "https://apis.io/api/v1/json-schemas/rtcstats-analyze-response-data"
All schemas
curl "https://apis.io/api/v1/json-schemas?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.