September Updates v1.10: Long-Call Charts, New Observations and Trust Center
rtcStats v1.10 rebuilds the session charts for calls that run for hours, adds 11 new connectivity and audio observations, and expands the documentation area.
Posted by
Related reading
August Updates v1.9: Self-Hosted Enrichment, New Observations & Open-Source Guides
rtcStats v1.9 brings self-hosted enrichment via the rtcstats-enrichment server, four new observations, and a new Open Source section in the Knowledge Base.
July Updates v1.8: Dark & Light Themes and Richer Overview Statistics
rtcStats v1.8: Dark and Light themes, a redesigned Overview with min/max, P95 and standard deviation, and Streams timelines anchored to call start.
June Updates v1.7: Client Insights, a Dedicated API Host & Smoother Onboarding
rtcStats v1.7: a client-focused Devices page with summary widgets, a dedicated api.rtcstats.com host with an observations catalog, and smoother onboarding.

Welcome to v1.10.0 of rtcStats! This release makes the analysis of longer calls a breeze. From now on, sessions running for hours stay as readable as a two minute one, 11 new observations join the engine on the connectivity and audio side, and a new Trust center answers all your security review questions.
Let's dive in.
🚀 Major Improvements
> Charts for Long Calls 📈
Real calls are not two minutes long. They run from ten minutes up to several hours, and until now the session charts drew every single sample they had. The longer the call, the denser the line became, until past a certain point it could not be read at all. What we wanted is the same level of detail whatever the duration, without a line so dense it stops meaning anything.
The Streams, Pairs and Channels charts were rebuilt around that challenge. A long call now reads like a short one: a clean line for the trend with the range drawn around it, so the peaks and the quiet stretches are both still visible instead of buried in pixels. When something looks off, drag across the time axis to zoom into that window and look closer.
The tooltips were reworked at the same time. They are shorter, and each unit now carries its own decimal precision, so milliseconds, kilobits per second and percentages each read the way they should instead of sharing one arbitrary rounding. Makes it way easier to understand the numbers.
The rebuilt session chart staying readable across a 31 minute stream
> Eleven New Observations 🔍 (Developer and Enterprise Plans)
Eleven new observations were added this month, all on the connectivity and audio side, all aimed at failures that raw stats will happily hide from you.
- Media that never arrives. We now look for inbound streams that were negotiated but never received any incoming packets. Then there's the check if media arrived but was never played (and yes, it can happen).
- Audio that is mostly invented. Flagging streams where most of the audio is synthesized by WebRTC itself as filler packets instead of actual packets that were received.
- Remote candidates that come too late, or never. These observations give more insights into how ICE candidates are negotiated.
- Calls that never connected. As we're moving towards better root cause analysis, we're beefing up the way we look at sessions that never start.
The end result is your ability to discern faster what went wrong in the session without the need to read the logs.
The session viewer Observations panel showing the new ICE connection failed observation
> Trust Center, Compare and the Knowledge Base 🛡️
Two new pages say out loud what we usually end up saying in email threads.
The Trust center is where a security or vendor review finds its answers without having to start one: security, privacy, compliance, availability and API lifecycle, gathered in a single page. The compliance page sits next to it for the data questions.
The Compare page does the other half of the job: where rtcStats sits next to the alternatives out there.
The Knowledge Base kept improving too. Article pages were redesigned with a persistent section rail, a table of contents and a last-updated date, so you can tell at a glance whether what you are reading is still current. On the open source side, there is a new IT specifications and requirements page for rtcstats-server, written for the review that happens before a deployment gets approved, and the requirements and operations guide was rewritten around a before-production checklist and a production readiness path.
The section grid on the new rtcStats Trust center page
🛠️ Other Enhancements
> A Better Fit on Laptops 💻
The dashboard sessions table and the detailed views were redesigned for higher information density, so a 1440 by 900 laptop screen shows meaningfully more before you start scrolling. The Connections panel lost its "Error type" row, which was repeating what Observations already say better, and the Quick start checklist moved into the sidebar instead of taking a slice of the main area. In the Pair Information block, the traffic rows are now labelled Bitrate (Outgoing) and Bitrate (Incoming), which is what they always were.
> Last Packet Times per Pair 📮
Each ICE candidate pair in the Connections panel now shows its last packet sent and last packet received time. On a call that went quiet, those two timestamps tell you which direction stopped first and exactly when, which is often the whole diagnosis.
> Tighter Bot Protection 🔐
Seems like we're getting noticed... bots are now trying to create users on our service, which is nice as a vanity metric but not something we want. So we strengthened protection against such abuse. The solution we came up with shouldn't add friction to real users.
📦 Ecosystem Updates
> API & MCP ⚙️ (Developer and Enterprise Plans)
The public API and the MCP tools now come with rate limits. They are counted per account over a one minute window and they are the same on every plan that includes the API: 30 uploads or analyses per minute, 120 read calls per minute (sessions, quota and the MCP tools). That is well above what a normal integration does, so you should only ever meet a limit if something is looping. If you do, the response tells you how many seconds to wait, and every response tells you how many calls are left in the current minute, so a client can pace itself instead of discovering the ceiling by hitting it.
The OpenAPI specification also got a serious pass on errors. Every error the API can return is now described there: what it means, which endpoint returns it, and an example of the response. Generated clients pick that up on their own, so your integration can react to the exact error instead of reading the message. The full list is in the API documentation, and llms.txt now opens with a quickstart for the coding agents that read it.
> rtcstats-server (main) 🛠️
Here is what landed on main:
- A guarded database migration adds a partial index on pending dumps, so the polling loop costs scale with the backlog rather than with the whole table. Read the migration filename before applying it: it deliberately refuses to run unattended on a large table.
- The features indexer now claims pending dumps with a row-level skip-locked lock, so several workers take different dumps instead of serializing on the same one.
- The WebSocket URL stored with a dump no longer keeps the
rtcstats-tokenvalue. The token is validated as before, then obfuscated out of the metadata, so a credential does not end up sitting next to the data it protected. - Extracted features got richer: TURN allocation times per transport (UDP, TCP and TLS),
timeToFirstFrameon inbound tracks, astatsTruncatedmarker for long connections that lost the beginning of theirgetStatsseries in webrtc-internals dumps, the configuredbundlePolicyandalwaysNegotiateDataChannels, and the USB id ofgetUserMediadevices. - Reading is more forgiving: gzipped dumps are uncompressed on read, a
webrtc-internalsdump carrying a nulltrack_infono longer breaks extraction, and storage filename extraction stopped assuming one URL style.
> rtcstats-js (main) 📡
No new release in this window. Here is what is planned for the next version:
- tracing calls to
HTMLMediaElement.setSinkIdwhich allows you to check which output devices were used.
🐞 Bug Fixes
- The Experience Score now reads as unavailable on a session that never made a real call, instead of showing a low value that read like a bad call.
- The connectivity score is no longer skipped or computed incorrectly when a session carries invalid timestamps.
- Candidate-pair charts and observation badges no longer resolve to the wrong peer connection when two peer connections reused the same pair ID.
- Streams that stall right after capture starts are no longer misreported.
- Streams already flagged as stalled stopped producing extra, noisy observations.
- The Logs tab no longer crashes when expanding an SDP event whose audio or video section carries no resolvable codec.
- The Logs tab scrolls smoothly on sessions with many events.
- Inbound media byte counts are recorded for received streams again.
- The sessions table Title column no longer collapses.
- Broken links across the Knowledge Base are fixed.
- The web site, Knowledge Base and blog pages are cacheable at the edge instead of being re-rendered on every request.
We're excited to see how you use the rebuilt long-call charts and the new connectivity and audio observations to get to the bottom of the calls that used to be unreadable! As always, the latest version of rtcstats-js is available in npm. Make sure you're up to date to get the best out of these new features.
Happy debugging! 💎