Playback Analytics Deep Dive
Fastevo MP2 captures a rich telemetry stream for every protected asset. This playback analytics guide shows how to interact with the stats APIs, interpret responses, and translate raw numbers into product, growth, and security decisions.
The document is intentionally exhaustive: use it when you need to onboard a new
analyst, design dashboards, or validate the semantics of the /stats API
family.
All routes described here live at
https://api.fastevo.net/api/v1/projects/mediaProtection/stats and require a
project-scoped credential. Replace sample dates, IDs, and tokens with your own
values.
1. API Quick Start
1.1 Base Path and Versioning
All endpoints share the prefix:
https://api.fastevo.net/api/v1/projects/mediaProtection/statsAppend the endpoint-specific suffix from the tables below.
1.2 Authentication
Authorization: Bearer <PROJECT_API_KEY>for server-to-server workflows.- Project-scoped user JWT for interactive dashboards.
- The token determines which project is queried; no explicit
projectIdparameter is accepted. - Invalid or missing tokens return
401 Unauthorized.
1.3 Reporting Window
startDateandendDateare mandatory ISO 8601 timestamps.- Requests covering more than 365 days produce HTTP 400 and
MEDIA_PROTECTION_QUERY_INVALID_PERIOD. - Endpoints treat the window as inclusive and compare against UTC timestamps.
1.4 Pagination, Sorting, and Limits
- List endpoints accept
page(default1) andlimit(default20, maximum100). - Sorting parameters vary per endpoint; see the relevant section below.
- Responses echo pagination metadata (
page,limit,total,pages) so you can build cursor logic.
1.5 Error Handling
- 400 responses indicate malformed filters, invalid dates, or unsupported values.
- 401 responses indicate authentication failures.
- 404 indicates the resource is not available to the authenticated project (rare for stats endpoints).
- 500 indicates an internal error; retry with exponential backoff, then contact support if the issue persists.
2. Filter Reference
Analytics endpoints share a common filter surface. Filters combine with AND logic; individual parameters that accept multiple values behave like OR clauses for that field.
2.1 Filter Inventory
| Parameter | Type | Scope | Notes |
|---|---|---|---|
viewerIdentifier | string | Sessions & consolidated stats | Exact match; use for looking up a single subscriber. |
viewerTags | comma string or repeated param | Sessions & consolidated stats | Matches sessions that contain any of the provided tags. No spaces in comma form. |
contentId | ObjectId | Consolidated stats | Maps to mediaProtectionContent. Accepts comma-separated IDs. |
contentType | enum (video, audio, image) | Both | Filters by stored content type. |
protectionLevel | enum (standard, enhanced, adaptive, qualityDependant) | Session only | Aligns with token protection level. |
device | string | Session only | Case-sensitive (e.g. iPad, AndroidTV). |
operatingSystem | string | Session only | Examples: iOS, Android, Windows. |
clientType | enum | Session only | Currently webBrowser; future-safe for additional client apps. |
clientVersion | string | Session only | Free-form client version string. |
location.country | ISO 3166-1 alpha-2 | Session only | Uppercase codes (US, FR). Multiple values allowed. |
location.region | string | Session only | State/region code (CA, NSW). |
location.city | string | Session only | Exact city name. |
location.zipCode | string | Session only | Postal/ZIP code. |
ipClassification | comma string | Session only | Values from the IP analyzer taxonomy (vpn, tor, hosting, etc.). |
isIpAssociatedWithMaliciousEventsRecently | string ("true" or "false") | Session only | Converted to boolean internally. |
appliedMediaProtectionSiemRule | ObjectId | Session only | Matches sessions that triggered a specific SIEM rule. |
Session-only filters (device, location, security, client details) require a
join with MediaProtectionPlaybackSession. Complex combinations raise query
cost on large datasets, so start broad and tighten filters gradually.
2.2 Request Patterns
- Comma-separated OR:
viewerTags=premium,VIP. - Repeated parameter OR:
viewerTags=premium&viewerTags=VIP. - Boolean: use literal strings
trueorfalse. - ObjectId: 24-character hex string. Invalid IDs are ignored (with a server warning log), so double-check values when the response looks empty.
2.3 Filter Combinations in Practice
| Goal | Example |
|---|---|
| Compare premium users in North America vs. Europe | viewerTags=premium&location.country=US,CA,MX and viewerTags=premium&location.country=GB,FR,DE |
| Detect suspicious mobile traffic | device=mobile&ipClassification=vpn,tor |
| Audit a content window launch | contentId=<ID>&startDate=<launch>&endDate=<launch+7d> |
| Focus on QA environments | isIpAssociatedWithMaliciousEventsRecently=false&viewerTags=testing |
2.4 Sample Filtered Request
curl -G \
'https://api.fastevo.net/api/v1/projects/mediaProtection/stats/general' \
-H 'Authorization: Bearer <PROJECT_API_KEY>' \
--data-urlencode 'startDate=2025-01-01T00:00:00.000Z' \
--data-urlencode 'endDate=2025-06-01T00:00:00.000Z' \
--data-urlencode 'viewerTags=premium,early-access' \
--data-urlencode 'location.country=US,CA' \
--data-urlencode 'device=AppleTV,SmartTV' \
--data-urlencode 'ipClassification=vpn,tor'3. Metrics Dictionary
Use this section as a dictionary while inspecting responses.
3.1 Experience Metrics (General Stats)
| Field | Description |
|---|---|
totalImpressions | Count of sessions matching filters (test data excluded). |
totalPlaybacks | Sessions with at least 0.5 seconds of playTime. |
totalPlayTimeInSeconds | Sum of playTime across qualifying sessions. |
totalPauseTimeInSeconds | Sum of pauseTime across qualifying sessions. |
averagePlayTimeInSeconds | Mean playTime among qualifying sessions. |
averagePauseTimeInSeconds | Mean pauseTime among qualifying sessions. |
averageCompletionPercent | Average completionPercent (0-100). |
impressionsPerCountry | Array of { country, count }. |
impressionsPerOsAndVersion | Array of { osAndVersion, count }. |
impressionsPerOS | Array of { os, count }. |
impressionsPerDevice | Array of { device, count }. |
impressionsPerBrowser | Array of { browser, count }. |
Averages such as averagePlayTimeInSeconds appear only when the query returns at
least one qualifying playback. Location or device facets may return null when
metadata is unavailable for a session; handle those buckets explicitly in your
dashboards.
3.2 Content Metrics
| Field | Description |
|---|---|
metrics.views | Total sessions for the content. |
metrics.uniqueViewers | Unique viewer identifiers per content. |
metrics.totalWatchTime | Cumulative play seconds for the content. |
metrics.avgWatchTime | Average play seconds per view. |
metrics.avgCompletion | Mean completion %. |
metrics.engagementScore | Composite score fuelled by completion, play ratio, buffering. |
metrics.bufferingRatio | Percentage of time spent buffering. |
engagementMetrics.avgPlayRatio | Mean playTime / duration. |
completionMetrics.completionRate | Percent of sessions with completion >= 95. |
completionMetrics.earlyDropoffRate | Percent of sessions with completion at or below 25. |
completionMetrics.avgDropoffPoint | Average completion % among non-finishers. |
3.3 Viewer Metrics
| Field | Description |
|---|---|
segments[].metrics.avgSessions | Mean session count per viewer in the cohort. |
segments[].metrics.avgWatchTimeMinutes | Mean watch time per viewer (minutes). |
segments[].metrics.avgContentVariety | Mean number of distinct contents watched. |
segments[].metrics.avgCompletion | Mean completion percent per cohort. |
retention.summary.repeatViewersRate | Share of viewers with >1 session. |
retention.summary.singleSessionViewersRate | Share of viewers with exactly one session. |
retention.summary.avgDaysActive | Mean days between first and last session. |
activity.data[].activity.totalWatchTimeMinutes | Total watch time per viewer (minutes). |
activity.data[].activity.avgWatchTimeMinutes | Average watch time per session (minutes). |
activity.data[].activity.contentVariety | Distinct content count per viewer. |
activity.data[].activity.daysActive | Days between firstSeen and lastSeen. |
3.4 Quality Metrics
| Field | Description |
|---|---|
summary.avgBufferingRatio | Average percentage of session time spent buffering. |
summary.sessionsWithBuffering | Count of sessions with buffering > 0. |
timeSeries[].avgBufferingRatio | Daily average buffering ratio (percentage). |
byDevice[].avgBufferingRatio | Buffering ratio for the device (percentage). |
distribution[].resolution | Human-readable resolution bucket (4K, 1080p, etc.). |
distribution[].percentage | Share of sessions for that resolution. |
summary.highDefinitionPercentage | Percent of sessions with height >= 720. |
3.5 Network Metrics
| Field | Description |
|---|---|
summary.avgEstimatedBandwidth | Average available bandwidth reported by the client (units mirror player telemetry, typically Mbps). |
summary.avgStreamBandwidth | Average bitrate requested by the player (same units as telemetry). |
summary.bandwidthEfficiency | Mean ratio of streamBandwidth to estimatedBandwidth (percentage). |
summary.totalBytesDownloaded | Total bytes transferred. |
byDevice[].avgBandwidth | Mean streamBandwidth or estimatedBandwidth (Mbps). |
3.6 Security Metrics
| Field | Description |
|---|---|
summary.vpnProxySessions | Sessions tagged as VPN or proxy. |
summary.maliciousIpSessions | Sessions from recently malicious IPs. |
summary.vpnProxyPercentage | Percent of total sessions using VPN/proxy. |
ipClassificationBreakdown[] | Counts by IP taxonomy, including unclassified. |
threatsByLocation[].threatPercentage | Share of sessions in the country that were flagged. |
4. Endpoint Catalog and Deep Dives
Each section below describes when to use the endpoint, the questions it answers, reference requests, sample responses, and interpretation tips.
4.1 Project Overview: /stats/general
Business questions
- What is the reach of my project over the selected window?
- Which countries, devices, and browsers dominate impressions?
- Are viewers actually playing content or abandoning early?
Sample request
curl -G \
'https://api.fastevo.net/api/v1/projects/mediaProtection/stats/general' \
-H 'Authorization: Bearer <PROJECT_API_KEY>' \
--data-urlencode 'startDate=2025-01-01T00:00:00.000Z' \
--data-urlencode 'endDate=2025-05-31T23:59:59.999Z' \
--data-urlencode 'contentType=video' \
--data-urlencode 'location.country=US,CA,GB'Example response
{
"totalImpressions": 15420,
"totalPlaybacks": 12350,
"totalPlayTimeInSeconds": 987650,
"totalPauseTimeInSeconds": 45230,
"averagePlayTimeInSeconds": 79.97,
"averagePauseTimeInSeconds": 3.66,
"averageCompletionPercent": 85.3,
"impressionsPerCountry": [
{ "country": "US", "count": 8520 },
{ "country": "CA", "count": 3200 },
{ "country": "GB", "count": 2100 }
],
"impressionsPerOsAndVersion": [
{ "osAndVersion": "iOS 17.5", "count": 4200 },
{ "osAndVersion": "Android 14", "count": 3800 }
],
"impressionsPerOS": [
{ "os": "iOS", "count": 7800 },
{ "os": "Android", "count": 5620 },
{ "os": "Windows", "count": 1400 }
],
"impressionsPerDevice": [
{ "device": "mobile", "count": 9800 },
{ "device": "desktop", "count": 4200 },
{ "device": "SmartTV", "count": 1420 }
],
"impressionsPerBrowser": [
{ "browser": "Safari", "count": 6200 },
{ "browser": "Chrome", "count": 5800 },
{ "browser": "Edge", "count": 560 }
]
}Interpretation tips
- Compare
totalImpressionstototalPlaybacksto estimate drop-off before playback begins. - Use
impressionsPerCountryto prioritize localization or CDN expansion. - A high
averagePauseTimeInSecondswith modestaveragePlayTimeInSecondsoften signals buffering issues—triage with the quality endpoints.
4.2 Top Content: /stats/analytics/content/top
Business questions
- Which titles drive the most views or unique viewers?
- How efficiently do they engage audiences (completion, buffering, watch time)?
Sample request
curl -G \
'https://api.fastevo.net/api/v1/projects/mediaProtection/stats/analytics/content/top' \
-H 'Authorization: Bearer <PROJECT_API_KEY>' \
--data-urlencode 'startDate=2025-01-01T00:00:00.000Z' \
--data-urlencode 'endDate=2025-05-31T23:59:59.999Z' \
--data-urlencode 'sortBy=uniqueViewers' \
--data-urlencode 'limit=5'Example response
{
"data": [
{
"contentId": "68267a1db67be4c5088a008c",
"title": "Launch Event Recap",
"type": "video",
"duration": 1865,
"createdAt": "2025-01-15T12:03:22.000Z",
"metrics": {
"views": 1842,
"uniqueViewers": 1620,
"totalWatchTime": 132450,
"avgWatchTime": 72,
"avgCompletion": 82,
"engagementScore": 87.4,
"bufferingRatio": 1.4
}
}
],
"pagination": { "page": 1, "limit": 5, "total": 42, "pages": 9 },
"appliedFilters": {
"sortBy": "uniqueViewers",
"sortOrder": "desc",
"limit": 5
}
}Interpretation tips
- Track
uniqueViewersto understand reach vs. repeat consumption. engagementScoreweights completion, play ratio, and low buffering—use it as a composite ranking when you need a single KPI.- Combine with viewer filters (e.g.
viewerTags=premium) to profile content resonance for specific cohorts.
4.3 Content Engagement: /stats/analytics/content/engagement
Business questions
- Which titles deliver sustained attention and low buffering?
- Where should editorial teams focus when improving session quality?
Sample response fragment
{
"data": [
{
"contentId": "68267a1db67be4c5088a008d",
"title": "Product Walkthrough",
"engagementMetrics": {
"avgEngagementScore": 78.5,
"avgCompletionRate": 71,
"avgPlayRatio": 0.89,
"avgBufferingRatio": 0.02,
"sessionCount": 940
}
}
],
"pagination": { "page": 1, "limit": 20, "total": 18, "pages": 1 }
}Interpretation tips
avgPlayRatioclose to 1 indicates viewers watch most of the asset; low values highlight potential pacing issues.- Set
minSessionsto exclude long-tail content with insufficient samples.
4.4 Content Completion: /stats/analytics/content/completion
Business questions
- Which titles keep viewers through the end?
- Where does early drop-off occur, and how severe is it?
Sample response fragment
{
"data": [
{
"contentId": "68267a1db67be4c5088a0099",
"title": "Season Finale",
"type": "video",
"duration": 2640,
"completionMetrics": {
"avgCompletion": 91,
"maxCompletion": 100,
"minCompletion": 52,
"completionRate": 88,
"earlyDropoffRate": 7,
"avgDropoffPoint": 63.4,
"sessionCount": 1540
}
}
],
"pagination": { "page": 1, "limit": 20, "total": 27, "pages": 2 }
}Interpretation tips
- Watch the gap between
avgCompletionandcompletionRate. High average with a low completion rate hints at bimodal behaviour (some viewers finish, others quit early). avgDropoffPoint(expressed as completion percent) shows where viewers bail, helping editors tighten pacing or insert calls-to-action.
4.5 Viewer Segments: /stats/analytics/viewer/segments
Business questions
- How are my identifiable viewers grouped by activity, watch time, completion, or variety?
- Who are the power viewers that need loyalty programs or pre-release access?
Segment definitions exposed by the API:
| Mode | Segment | Rule |
|---|---|---|
activity | power_viewers | sessions >= 20 |
activity | high_frequency_viewers | 10-19 sessions |
activity | regular_viewers | 5-9 sessions |
activity | occasional_viewers | 2-4 sessions |
activity | single_session_viewers | 1 session |
watchTime | binge_watchers | watchTime >= 7200 seconds |
watchTime | engaged_viewers | 3600-7199 seconds |
watchTime | moderate_viewers | 1800-3599 seconds |
watchTime | light_viewers | 600-1799 seconds |
watchTime | samplers | watchTime under 600 seconds |
completion | completionists | avgCompletion >= 90 |
completion | high_completion | 70-89.99 |
completion | moderate_completion | 50-69.99 |
completion | low_completion | 25-49.99 |
completion | early_dropoff | less than 25 |
variety | explorers | contentVariety >= 10 |
variety | diverse_viewers | 5-9 |
variety | selective_viewers | 2-4 |
variety | single_content | 1 |
The API returns segment identifiers in snake_case (for example power_viewers).
Map them to presentation labels in your client UI if you prefer title casing.
Example response fragment
{
"summary": {
"totalViewers": 8420,
"totalSegments": 4,
"segmentationMethod": "activity"
},
"segments": [
{
"segment": "power_viewers",
"count": 1260,
"percentage": 14.96,
"metrics": {
"avgSessions": 24.8,
"avgWatchTimeMinutes": 410.5,
"avgContentVariety": 6.4,
"avgCompletion": 93
},
"topViewers": [
{
"viewerId": "customer-4412",
"sessions": 26,
"watchTime": 15420,
"completion": 97,
"contentVariety": 9,
"lastSeen": "2025-05-28T18:42:11.000Z"
}
]
}
],
"appliedFilters": { "segmentBy": "activity" }
}Interpretation tips
power_viewersare the power users referenced in product discussions—reward them with exclusive content and monitor them for early signals of churn.topViewerssurfaces up to five sample profiles per segment, sorted by session count.watchTimeis reported in seconds (rawplayTime), whilecompletionremains a percentage; convert units in your dashboard if you prefer minutes.- Combine with
viewerTagsto compare subscribed vs. anonymous behaviour.
4.6 Viewer Retention: /stats/analytics/viewer/retention
Business questions
- Are viewers returning or churning after their first session?
- How does retention vary across cohorts (daily, weekly, monthly)?
Example response fragment
{
"summary": {
"totalViewers": 6120,
"repeatViewers": 2840,
"singleSessionViewers": 3280,
"repeatViewersRate": 46.41,
"singleSessionViewersRate": 53.59,
"avgDaysActive": 6.2,
"avgSessionsPerViewer": 3.4
},
"cohorts": [
{ "period": "2025-W18", "viewerCount": 820, "sessionCount": 2310 },
{ "period": "2025-W19", "viewerCount": 760, "sessionCount": 2140 }
],
"appliedFilters": { "cohortGranularity": "week" }
}Interpretation tips
- Pair retention cohorts with marketing campaigns to evaluate program impact.
- Track
avgDaysActiveto understand how long viewers stay engaged after their first touchpoint.
4.7 Viewer Activity Leaderboard: /stats/analytics/viewer/activity
Business questions
- Who are the top viewers by sessions, watch time, or completion?
- Which customers deserve proactive outreach from account teams?
Example response fragment
{
"data": [
{
"viewerId": "enterprise-007",
"activity": {
"sessionCount": 34,
"totalWatchTimeMinutes": 412,
"avgWatchTimeMinutes": 12.1,
"avgCompletion": 88,
"contentVariety": 14,
"firstSeen": "2025-02-04T11:02:44.000Z",
"lastSeen": "2025-05-29T08:31:16.000Z",
"daysActive": 115
}
}
],
"pagination": { "page": 1, "limit": 20, "total": 240, "pages": 12 }
}Interpretation tips
- Use
sortByto align the leaderboard with business goals (e.g. longest watch time vs. highest completion). - Combine with CRM data to personalize retention messaging.
4.8 Buffering Analytics: /stats/analytics/quality/buffering
Business questions
- Which days or devices suffer most from buffering?
- Are CDN or ISP issues localized to specific geographies?
Example response
{
"summary": {
"avgBufferingRatio": 2.8,
"sessionsWithBuffering": 4120,
"totalSessions": 9870
},
"timeSeries": [
{
"period": "2025-05-20",
"avgBufferingRatio": 3.9,
"maxBufferingRatio": 9.4,
"minBufferingRatio": 0.3,
"sessionCount": 540
}
],
"byDevice": [
{ "device": "SmartTV", "avgBufferingRatio": 5.6, "sessionCount": 920 },
{ "device": "AppleTV", "avgBufferingRatio": 4.1, "sessionCount": 610 }
]
}Interpretation tips
- Spikes in
maxBufferingRatioflag severe experiences even if the mean looks healthy. - Use
devicedrill-down to validate firmware or app release regressions.
4.9 Resolution Distribution: /stats/analytics/quality/resolution
Business questions
- What resolution do viewers actually experience?
- How much of the audience receives HD or UHD delivery?
Example response
{
"distribution": [
{
"resolution": "4K UHD",
"width": 3840,
"height": 2160,
"count": 820,
"percentage": 8.6
},
{
"resolution": "1080p",
"width": 1920,
"height": 1080,
"count": 4620,
"percentage": 48.2
},
{
"resolution": "720p",
"width": 1280,
"height": 720,
"count": 2830,
"percentage": 29.5
},
{
"resolution": "360p",
"width": 640,
"height": 360,
"count": 620,
"percentage": 6.5
}
],
"summary": {
"mostCommon": "1080p",
"highDefinitionPercentage": 56.8,
"totalSessions": 9570
}
}Interpretation tips
- Track
highDefinitionPercentageto ensure premium subscribers receive the quality they pay for. - Combine with location filters to detect ISP-level throttling.
4.10 Hourly Patterns: /stats/analytics/time/hourly
Business questions
- When do viewers watch the most content?
- Which hours combine high volume with high engagement?
Example response
{
"patterns": [
{
"time": { "hour": 20, "dayOfWeek": 5 },
"sessions": 520,
"uniqueViewers": 410,
"metrics": {
"avgWatchTimeMinutes": 9.4,
"totalWatchTimeHours": 81.3,
"avgCompletion": 86,
"avgBufferingPercent": 1.8
}
}
],
"heatmap": [
[
120, 90, 64, 22, 18, 12, 8, 10, 14, 36, 58, 72, 89, 112, 148, 196, 244,
312, 360, 402, 520, 318, 198, 140
],
[
84, 52, 40, 18, 12, 6, 5, 8, 14, 24, 48, 56, 70, 88, 120, 168, 210, 248,
284, 320, 356, 290, 180, 120
],
[
60, 42, 30, 16, 10, 6, 4, 6, 10, 20, 32, 48, 62, 74, 102, 140, 182, 210,
238, 270, 300, 240, 150, 98
],
[
72, 50, 34, 20, 14, 8, 6, 8, 12, 22, 40, 58, 80, 94, 122, 160, 204, 236,
268, 296, 320, 250, 160, 110
],
[
90, 62, 40, 22, 16, 10, 8, 10, 16, 28, 48, 68, 90, 112, 148, 186, 230,
262, 296, 330, 360, 280, 170, 120
],
[
110, 76, 52, 26, 18, 12, 10, 12, 18, 32, 54, 76, 98, 126, 160, 198, 242,
278, 312, 348, 380, 300, 188, 132
],
[
130, 88, 60, 28, 20, 14, 12, 14, 20, 36, 58, 82, 108, 138, 176, 214, 258,
296, 330, 368, 400, 320, 200, 140
]
],
"peaks": [
{ "time": { "hour": 20, "dayOfWeek": 5 }, "sessions": 520, "viewers": 410 }
],
"summary": {
"totalPeriods": 168,
"avgSessionsPerPeriod": 238,
"granularity": "hourly"
},
"appliedFilters": {}
}The heatmap array lists seven rows (Sunday index 0 through Saturday index 6), with each row containing 24 hourly buckets.
Interpretation tips
- Use the heatmap to coordinate marketing pushes or live events around peak hours.
dayOfWeekfollows MongoDB numbering (1= Sunday,7= Saturday); convert as needed for presentation.- High
avgBufferingPercentduring specific hours may indicate regional ISP congestion; combine with country filters to confirm.
4.11 Bandwidth Metrics: /stats/analytics/network/bandwidth
Business questions
- What throughput do viewers experience, and how efficient is streaming vs. available bandwidth?
- Which devices or countries suffer from low throughput?
Example response
{
"summary": {
"totalSessions": 8640,
"uniqueViewers": 5320,
"avgEstimatedBandwidth": 8.4,
"avgStreamBandwidth": 6.9,
"totalBytesDownloaded": 48237619842,
"bandwidthEfficiency": 82.1
},
"byDevice": [
{
"device": "AppleTV",
"sessionCount": 1240,
"avgBandwidth": 8.2,
"avgEstimatedBandwidth": 10.4,
"avgStreamBandwidth": 8.2,
"totalBytesDownloaded": 9823412345,
"bandwidthEfficiency": 78.8
}
],
"byLocation": [
{
"country": "US",
"sessionCount": 4020,
"avgBandwidth": 7.6,
"avgEstimatedBandwidth": 9.1,
"avgStreamBandwidth": 7.6,
"totalBytesDownloaded": 21873451234,
"bandwidthEfficiency": 83.5
}
]
}Interpretation tips
bandwidthEfficiencyunder 60% indicates the player is not saturating the connection—investigate ABR ladders or throttling.- Low
avgEstimatedBandwidthin specific countries suggests regional ISP limitations; coordinate with CDN partners.
4.12 Security Threats: /stats/analytics/security/threats
Business questions
- How much of my traffic uses VPNs, proxies, or comes from risky IP ranges?
- Which countries concentrate suspicious activity?
Example response
{
"summary": {
"totalSessions": 6420,
"vpnProxySessions": 820,
"maliciousIpSessions": 140,
"vpnProxyPercentage": 12.78,
"maliciousIpPercentage": 2.18
},
"ipClassificationBreakdown": [
{ "classification": "vpn", "count": 620, "percentage": 9.65 },
{
"classification": "iCloudPrivateRelay",
"count": 120,
"percentage": 1.87
},
{ "classification": "unclassified", "count": 4830, "percentage": 75.23 }
],
"threatsByLocation": [
{
"country": "US",
"threatCount": 320,
"totalSessions": 3120,
"threatPercentage": 10.26
}
]
}Interpretation tips
- Treat
unclassifiedas neutral—the IP analyzer simply did not label the address. - Monitor
vpnProxyPercentageandmaliciousIpPercentagealongside playback denial events to ensure access policies are working.
4.13 AI Analytics Report: /stats/analytics/ai-report
Business questions
- Need an executive-ready summary across all analytics without manual analysis?
- Want an AI-generated brief in a specific language for leadership updates?
Sample request
curl -G \
'https://api.fastevo.net/api/v1/projects/mediaProtection/stats/analytics/ai-report' \
-H 'Authorization: Bearer <PROJECT_API_KEY>' \
--data-urlencode 'startDate=2025-04-01T00:00:00.000Z' \
--data-urlencode 'endDate=2025-04-30T23:59:59.999Z' \
--data-urlencode 'lang=en'Example response
{
"report": "# Executive Snapshot...",
"metadata": {
"startDate": "2025-04-01T00:00:00.000Z",
"endDate": "2025-04-30T23:59:59.999Z",
"language": "en",
"appliedFilters": {}
}
}Interpretation tips
- The AI service runs the same analytics endpoints documented above (with fixed limits) and feeds the results into the AI prompt; ensure base data quality before sharing the report.
- Use
langfor localized leadership summaries (e.g.lang=es).
5. Use Case Playbooks
5.1 Launch Readiness Review
- Query
/stats/generalfor the first 48 hours after launch. - Pull
/analytics/content/topand/analytics/content/completionto confirm the flagship episodes are trending as expected. - Inspect
/analytics/quality/bufferingto ensure there are no device-specific regressions. - Share
/analytics/ai-reportwith leadership as the daily digest.
5.2 Premium Subscriber Health
- Filter every request with
viewerTags=premium. - Use
/analytics/viewer/segmentsto track how many premium viewers remain in thepower_viewersandengaged_viewerscohorts. - Audit
/analytics/viewer/retentionto watch repeat viewer rates. - Combine
/analytics/network/bandwidthand/analytics/quality/resolutionto ensure premium subscribers receive HD/UHD streams.
5.3 Fraud and Abuse Monitoring
- Call
/analytics/security/threatsdaily withipClassification=vpn,torfilters. - Cross-reference suspicious countries with
/analytics/network/bandwidthto see if they consume disproportionate bandwidth. - For high-risk viewers, use
/analytics/viewer/activityto enumerate the accounts and trigger additional verification in your back office.
5.4 Device Release QA
- During rollout of a new app version, filter requests with
clientVersion=<new_version>. - Compare
/analytics/quality/bufferingand/analytics/content/engagementmetrics to the previous version to evaluate regressions. - Track
/analytics/viewer/segmentsfor that version to ensure engagement remains within tolerance.
6. Best Practices and Troubleshooting
6.1 Operational Tips
- Start broad: run queries without filters to confirm data availability, then layer filters incrementally.
- Cache dashboards: heavy aggregation pipelines can take longer on large datasets. Cache results when refreshing more frequently than every few minutes.
- Coordinate with data warehouse: export analytics responses to your BI tool for historical comparisons—every endpoint returns JSON that can be flattened.
6.2 Troubleshooting Checklist
| Symptom | Diagnosis | Remedy |
|---|---|---|
| Empty response | Missing viewer identifiers, wrong date range, invalid ObjectId | Relax filters; validate viewerIdentifier spelling; check date format. |
| Boolean filter ignored | Value passed as 1 or yes | Use literal true or false. |
| Slow responses | Large date range with device/location filters triggers heavy joins | Shorten the window or remove session-specific filters; cache at the application layer. |
| Unexpected security counts | IP analyzer marks many addresses as unclassified | Treat unclassified as neutral; combine with other signals such as SIEM rule IDs. threatsByLocation will group missing geos under Unknown. |
6.3 Data Hygiene Recommendations
- Persist
viewerIdentifierconsistently so viewers can be segmented; anonymous sessions will be excluded from viewer analytics. - Keep device strings normalized (e.g.
AppleTVinstead ofapple tv) to avoid fragmented device reporting. - Maintain accurate viewer tags (
premium,trial,beta) to unlock richer cohort analysis.
Armed with this guide, you can design dashboards, debug anomalies, or brief executives without spelunking through backend code. Combine the filter recipes, metric definitions, and endpoint walkthroughs above to craft analytics pipelines that match your business goals.