curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/analytics/?start_date=2026-10-01&end_date=2026-10-15' \
-H 'x-api-key: YOUR_API_KEY'import os
import requests
org_id = '11111111-2222-3333-4444-555555555555'
app_id = 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee'
resp = requests.get(
f'https://verification.didit.me/v3/organization/{org_id}/application/{app_id}/analytics/',
headers={'x-api-key': os.environ['DIDIT_API_KEY']},
params={'start_date': '2026-10-01', 'end_date': '2026-10-15'},
timeout=10,
)
resp.raise_for_status()
data = resp.json()
print(data['request_breakdown']['total_approved'], data['conversion_rate'])const orgId = '11111111-2222-3333-4444-555555555555';
const appId = 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee';
const params = new URLSearchParams({ start_date: '2026-10-01', end_date: '2026-10-15' });
const resp = await fetch(
`https://verification.didit.me/v3/organization/${orgId}/application/${appId}/analytics/?${params}`,
{ headers: { 'x-api-key': process.env.DIDIT_API_KEY } },
);
if (!resp.ok) throw new Error(`Analytics failed: ${resp.status}`);
const data = await resp.json();
console.log(data.request_breakdown.total_approved, data.conversion_rate);<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://verification.didit.me/v3/organization/{organization_id}/application/{application_id}/analytics/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://verification.didit.me/v3/organization/{organization_id}/application/{application_id}/analytics/"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://verification.didit.me/v3/organization/{organization_id}/application/{application_id}/analytics/")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://verification.didit.me/v3/organization/{organization_id}/application/{application_id}/analytics/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"grouping_mode": "day",
"data_points": [
{
"rounded_date": "2026-10-14",
"total": 12,
"approved": 8,
"declined": 1,
"canceled": 1,
"pending": 2,
"in_review": 1,
"expired": 1,
"abandoned": 0,
"in_progress": 1,
"not_started": 0,
"manually_approved": 1,
"manually_declined": 0
},
{
"rounded_date": "2026-10-15",
"total": 10,
"approved": 6,
"declined": 2,
"canceled": 0,
"pending": 2,
"in_review": 2,
"expired": 0,
"abandoned": 0,
"in_progress": 0,
"not_started": 0,
"manually_approved": 0,
"manually_declined": 1
}
],
"request_breakdown": {
"total_approved": 14,
"total_in_review": 3,
"total_declined": 3,
"total_canceled": 1,
"total_pending": 4,
"total_expired": 1,
"total_abandoned": 0,
"total_in_progress": 1,
"total_not_started": 0,
"total_manually_approved": 1,
"total_manually_declined": 1
},
"conversion_rate": 70,
"location_stats": {
"countries": [
{
"session_count": 15,
"country": "Spain",
"country_code": "ES"
},
{
"session_count": 7,
"country": "Portugal",
"country_code": "PT"
}
],
"ip_countries": [
{
"session_count": 15,
"country": "Spain",
"country_code": "ES"
},
{
"session_count": 7,
"country": "Portugal",
"country_code": "PT"
}
],
"id_countries": [
{
"country": "Spain",
"country_code": "ES",
"session_count": 14
},
{
"country": "Portugal",
"country_code": "PT",
"session_count": 6
}
],
"conversion_by_country": [
{
"country": "Spain",
"country_code": "ES",
"finished": 13,
"approved": 10
},
{
"country": "Portugal",
"country_code": "PT",
"finished": 6,
"approved": 4
}
],
"cities": [
{
"session_count": 9,
"location": "Madrid, Spain",
"latitude": 40.4168,
"longitude": -3.7038
}
]
},
"demographic_stats": {
"age_distribution": {
"under_18": 0,
"18_24": 5,
"25_34": 8,
"35_44": 4,
"45_64": 2,
"65_plus": 1
},
"gender_distribution": {
"M": 11,
"F": 9
}
},
"device_details": {
"device_models": [
{
"device": "Apple",
"count": 12
},
{
"device": "Android",
"count": 10
}
],
"browsers": [
{
"browser": "Safari",
"count": 12
},
{
"browser": "Chrome",
"count": 10
}
],
"operating_systems": [
{
"os": "iOS",
"count": 12
},
{
"os": "Android",
"count": 10
}
]
},
"workflow_funnel_stats": {
"33333333-4444-5555-6666-777777777777": {
"total": 22,
"steps": {
"OCR": {
"reached": 21
},
"LIVENESS": {
"reached": 19
},
"FACE_MATCH": {
"reached": 19
},
"AML": {
"reached": 18
}
}
}
},
"verification_time_stats": {
"overall_avg_seconds": 64,
"overall_count": 18,
"per_feature": {
"OCR": {
"avg_seconds": 41.2,
"total_seconds": 741.6,
"count": 18
},
"LIVENESS": {
"avg_seconds": 22.8,
"total_seconds": 410.4,
"count": 18
}
},
"per_sub_step": {
"OCR": {
"front_id_photo": {
"avg_seconds": 18.3,
"total_seconds": 329.4,
"count": 18
}
}
}
},
"resubmission_stats": {
"first_pass": 17,
"second": 2,
"third_plus": 1,
"abandoned": 0
},
"warning_stats": {
"ID_VERIFICATION": {
"total": 21,
"risks": {
"DOCUMENT_EXPIRED": {
"error": 1,
"warning": 0,
"information": 0
}
}
},
"LIVENESS": {
"total": 19,
"risks": {
"LOW_LIVENESS_SCORE": {
"error": 0,
"warning": 2,
"information": 0
}
}
}
},
"original_status_stats": {
"approved": 13,
"in_review": 5,
"declined": 2
},
"demographic_time_series": [
{
"date": "2026-10-14",
"age_distribution": {
"under_18": 0,
"18_24": 3,
"25_34": 4,
"35_44": 2,
"45_64": 1,
"65_plus": 0
},
"gender_distribution": {
"M": 6,
"F": 4
}
},
{
"date": "2026-10-15",
"age_distribution": {
"under_18": 0,
"18_24": 2,
"25_34": 4,
"35_44": 2,
"45_64": 1,
"65_plus": 1
},
"gender_distribution": {
"M": 5,
"F": 5
}
}
],
"device_time_series": [
{
"date": "2026-10-14",
"devices": {
"Apple": 7,
"Android": 5
},
"browsers": {
"Safari": 7,
"Chrome": 5
},
"operating_systems": {
"iOS": 7,
"Android": 5
}
},
{
"date": "2026-10-15",
"devices": {
"Apple": 5,
"Android": 5
},
"browsers": {
"Safari": 5,
"Chrome": 5
},
"operating_systems": {
"iOS": 5,
"Android": 5
}
}
],
"verification_time_time_series": [
{
"date": "2026-10-14",
"overall_avg": 66.1,
"per_feature": {
"OCR": 42,
"LIVENESS": 24.1
}
},
{
"date": "2026-10-15",
"overall_avg": 61.5,
"per_feature": {
"OCR": 40.2,
"LIVENESS": 21.3
}
}
],
"resubmission_time_series": [
{
"date": "2026-10-14",
"first_pass": 9,
"second": 1,
"third_plus": 0,
"abandoned": 0
},
{
"date": "2026-10-15",
"first_pass": 8,
"second": 1,
"third_plus": 1,
"abandoned": 0
}
],
"original_status_time_series": [
{
"date": "2026-10-14",
"approved": 7,
"in_review": 3,
"declined": 1
},
{
"date": "2026-10-15",
"approved": 6,
"in_review": 2,
"declined": 1
}
],
"previous_data_points": [
{
"rounded_date": "2026-10-12",
"total": 9,
"approved": 6,
"declined": 1,
"canceled": 1,
"pending": 1
},
{
"rounded_date": "2026-10-13",
"total": 11,
"approved": 7,
"declined": 2,
"canceled": 0,
"pending": 2
}
],
"previous_request_breakdown": {
"total_approved": 13,
"total_in_review": 2,
"total_declined": 3,
"total_canceled": 1,
"total_pending": 3
}
}Get Application Analytics
Read the verification analytics of your application for a date range: KYC session totals, conversion, funnels, or KYB and transaction dashboard widgets.
curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/analytics/?start_date=2026-10-01&end_date=2026-10-15' \
-H 'x-api-key: YOUR_API_KEY'import os
import requests
org_id = '11111111-2222-3333-4444-555555555555'
app_id = 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee'
resp = requests.get(
f'https://verification.didit.me/v3/organization/{org_id}/application/{app_id}/analytics/',
headers={'x-api-key': os.environ['DIDIT_API_KEY']},
params={'start_date': '2026-10-01', 'end_date': '2026-10-15'},
timeout=10,
)
resp.raise_for_status()
data = resp.json()
print(data['request_breakdown']['total_approved'], data['conversion_rate'])const orgId = '11111111-2222-3333-4444-555555555555';
const appId = 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee';
const params = new URLSearchParams({ start_date: '2026-10-01', end_date: '2026-10-15' });
const resp = await fetch(
`https://verification.didit.me/v3/organization/${orgId}/application/${appId}/analytics/?${params}`,
{ headers: { 'x-api-key': process.env.DIDIT_API_KEY } },
);
if (!resp.ok) throw new Error(`Analytics failed: ${resp.status}`);
const data = await resp.json();
console.log(data.request_breakdown.total_approved, data.conversion_rate);<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://verification.didit.me/v3/organization/{organization_id}/application/{application_id}/analytics/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://verification.didit.me/v3/organization/{organization_id}/application/{application_id}/analytics/"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://verification.didit.me/v3/organization/{organization_id}/application/{application_id}/analytics/")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://verification.didit.me/v3/organization/{organization_id}/application/{application_id}/analytics/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"grouping_mode": "day",
"data_points": [
{
"rounded_date": "2026-10-14",
"total": 12,
"approved": 8,
"declined": 1,
"canceled": 1,
"pending": 2,
"in_review": 1,
"expired": 1,
"abandoned": 0,
"in_progress": 1,
"not_started": 0,
"manually_approved": 1,
"manually_declined": 0
},
{
"rounded_date": "2026-10-15",
"total": 10,
"approved": 6,
"declined": 2,
"canceled": 0,
"pending": 2,
"in_review": 2,
"expired": 0,
"abandoned": 0,
"in_progress": 0,
"not_started": 0,
"manually_approved": 0,
"manually_declined": 1
}
],
"request_breakdown": {
"total_approved": 14,
"total_in_review": 3,
"total_declined": 3,
"total_canceled": 1,
"total_pending": 4,
"total_expired": 1,
"total_abandoned": 0,
"total_in_progress": 1,
"total_not_started": 0,
"total_manually_approved": 1,
"total_manually_declined": 1
},
"conversion_rate": 70,
"location_stats": {
"countries": [
{
"session_count": 15,
"country": "Spain",
"country_code": "ES"
},
{
"session_count": 7,
"country": "Portugal",
"country_code": "PT"
}
],
"ip_countries": [
{
"session_count": 15,
"country": "Spain",
"country_code": "ES"
},
{
"session_count": 7,
"country": "Portugal",
"country_code": "PT"
}
],
"id_countries": [
{
"country": "Spain",
"country_code": "ES",
"session_count": 14
},
{
"country": "Portugal",
"country_code": "PT",
"session_count": 6
}
],
"conversion_by_country": [
{
"country": "Spain",
"country_code": "ES",
"finished": 13,
"approved": 10
},
{
"country": "Portugal",
"country_code": "PT",
"finished": 6,
"approved": 4
}
],
"cities": [
{
"session_count": 9,
"location": "Madrid, Spain",
"latitude": 40.4168,
"longitude": -3.7038
}
]
},
"demographic_stats": {
"age_distribution": {
"under_18": 0,
"18_24": 5,
"25_34": 8,
"35_44": 4,
"45_64": 2,
"65_plus": 1
},
"gender_distribution": {
"M": 11,
"F": 9
}
},
"device_details": {
"device_models": [
{
"device": "Apple",
"count": 12
},
{
"device": "Android",
"count": 10
}
],
"browsers": [
{
"browser": "Safari",
"count": 12
},
{
"browser": "Chrome",
"count": 10
}
],
"operating_systems": [
{
"os": "iOS",
"count": 12
},
{
"os": "Android",
"count": 10
}
]
},
"workflow_funnel_stats": {
"33333333-4444-5555-6666-777777777777": {
"total": 22,
"steps": {
"OCR": {
"reached": 21
},
"LIVENESS": {
"reached": 19
},
"FACE_MATCH": {
"reached": 19
},
"AML": {
"reached": 18
}
}
}
},
"verification_time_stats": {
"overall_avg_seconds": 64,
"overall_count": 18,
"per_feature": {
"OCR": {
"avg_seconds": 41.2,
"total_seconds": 741.6,
"count": 18
},
"LIVENESS": {
"avg_seconds": 22.8,
"total_seconds": 410.4,
"count": 18
}
},
"per_sub_step": {
"OCR": {
"front_id_photo": {
"avg_seconds": 18.3,
"total_seconds": 329.4,
"count": 18
}
}
}
},
"resubmission_stats": {
"first_pass": 17,
"second": 2,
"third_plus": 1,
"abandoned": 0
},
"warning_stats": {
"ID_VERIFICATION": {
"total": 21,
"risks": {
"DOCUMENT_EXPIRED": {
"error": 1,
"warning": 0,
"information": 0
}
}
},
"LIVENESS": {
"total": 19,
"risks": {
"LOW_LIVENESS_SCORE": {
"error": 0,
"warning": 2,
"information": 0
}
}
}
},
"original_status_stats": {
"approved": 13,
"in_review": 5,
"declined": 2
},
"demographic_time_series": [
{
"date": "2026-10-14",
"age_distribution": {
"under_18": 0,
"18_24": 3,
"25_34": 4,
"35_44": 2,
"45_64": 1,
"65_plus": 0
},
"gender_distribution": {
"M": 6,
"F": 4
}
},
{
"date": "2026-10-15",
"age_distribution": {
"under_18": 0,
"18_24": 2,
"25_34": 4,
"35_44": 2,
"45_64": 1,
"65_plus": 1
},
"gender_distribution": {
"M": 5,
"F": 5
}
}
],
"device_time_series": [
{
"date": "2026-10-14",
"devices": {
"Apple": 7,
"Android": 5
},
"browsers": {
"Safari": 7,
"Chrome": 5
},
"operating_systems": {
"iOS": 7,
"Android": 5
}
},
{
"date": "2026-10-15",
"devices": {
"Apple": 5,
"Android": 5
},
"browsers": {
"Safari": 5,
"Chrome": 5
},
"operating_systems": {
"iOS": 5,
"Android": 5
}
}
],
"verification_time_time_series": [
{
"date": "2026-10-14",
"overall_avg": 66.1,
"per_feature": {
"OCR": 42,
"LIVENESS": 24.1
}
},
{
"date": "2026-10-15",
"overall_avg": 61.5,
"per_feature": {
"OCR": 40.2,
"LIVENESS": 21.3
}
}
],
"resubmission_time_series": [
{
"date": "2026-10-14",
"first_pass": 9,
"second": 1,
"third_plus": 0,
"abandoned": 0
},
{
"date": "2026-10-15",
"first_pass": 8,
"second": 1,
"third_plus": 1,
"abandoned": 0
}
],
"original_status_time_series": [
{
"date": "2026-10-14",
"approved": 7,
"in_review": 3,
"declined": 1
},
{
"date": "2026-10-15",
"approved": 6,
"in_review": 2,
"declined": 1
}
],
"previous_data_points": [
{
"rounded_date": "2026-10-12",
"total": 9,
"approved": 6,
"declined": 1,
"canceled": 1,
"pending": 1
},
{
"rounded_date": "2026-10-13",
"total": 11,
"approved": 7,
"declined": 2,
"canceled": 0,
"pending": 2
}
],
"previous_request_breakdown": {
"total_approved": 13,
"total_in_review": 2,
"total_declined": 3,
"total_canceled": 1,
"total_pending": 3
}
}| You send | You get |
|---|---|
Neither scope nor widget_keys | The user verification (KYC) summary for the range |
scope, widget_keys, or both | Dashboard widgets for one tab: kyc, kyb, transactions, or home (any mix of the three) |
kind and a title; the rest of its fields depend on the kind. Send scope without widget_keys once to read available_widget_keys, then request only the widgets you need.
403 whatever access it holds, and so does a key of another application. See API keys.Related
Authorizations
Your application's API key, from Developers -> API keys in the Business Console. The primary key has full access. A named key can be scoped: none, read or write per resource, limited to some workflows or to approved sessions, to a list of IP addresses, and to an expiry date. 401 means the key is missing, wrong, revoked or expired; 403 means the key has no access to this resource or action, or the request came from an address outside its IP list; 404 on a session route means the session is outside the key's workflows or statuses. A key without media access receives image, video and PDF URLs as null, and a key without sessions write receives session links and tokens as null. See https://docs.didit.me/console/api-keys.
Path Parameters
Organization UUID.
Application UUID. Must be the application the API key belongs to: a key used on any other application gets 403.
Query Parameters
First day of the range, YYYY-MM-DD, inclusive (UTC). Send it together with end_date: when either is missing, both are ignored and the range runs from 30 days before today through today.
"2026-10-01"
Last day of the range, YYYY-MM-DD, inclusive (UTC). A future date counts as today. The range may not exceed 730 days.
"2026-10-15"
Dashboard tab to return widgets for (case-insensitive). Omit it, together with widget_keys, for the KYC summary. Sending only widget_keys implies kyc. home accepts any KYC, KYB or transaction widget and defaults to the application's saved home layout.
home, kyc, kyb, transactions Comma-separated widget keys, answered in this order. Keys the scope does not accept are dropped; when none is left you get the scope's defaults. KYC: kyc_sessions_volume, kyc_warning_insights, kyc_id_locations, kyc_ip_locations, kyc_workflow_funnel, kyc_average_verification_time, kyc_conversion_rate, kyc_conversion_by_country, kyc_resubmission_insights, kyc_original_status_distribution, kyc_database_validation_coverage, kyc_database_validation_latency, kyc_demographics, kyc_device_details. KYB: kyb_sessions_volume, kyb_workflow_funnel, kyb_average_verification_time, kyb_ip_locations, kyb_business_country_distribution, kyb_warning_insights, kyb_conversion_rate, kyb_conversion_by_country, kyb_industry_breakdown, kyb_resubmission_insights, kyb_original_status_distribution, kyb_registry_coverage, kyb_registry_data_completeness, kyb_device_details. Transactions: tx_count_total, tx_count_daily, tx_volume_total_preferred_currency, tx_volume_daily_preferred_currency, tx_average_amount, tx_average_amount_daily, tx_transaction_category_breakdown, tx_action_type_breakdown, tx_status_volume_trend, tx_user_ip_or_country_distribution, tx_tag_breakdown, tx_top_rules_triggered, tx_team_member_performance, tx_score_histogram.
"tx_count_total,tx_count_daily"
Comma-separated workflow IDs. Limits the KYC summary and the KYC and KYB widgets to those workflows. Values that are not UUIDs are ignored; when none is valid the filter is dropped. The summary also accepts workflow_id.
"33333333-4444-5555-6666-777777777777"
Comma-separated workflow version numbers. Applies only together with workflow_ids; values that are not whole numbers are ignored. version is accepted as an alias.
"3,4"
Comma-separated branch path IDs. Applies only together with workflow_ids, and only to KYC figures. Figures are currently recorded only for default (all paths combined), so any other value returns empty figures. branch_path_id is accepted as an alias.
"default"
Transaction widgets only: comma-separated tag UUIDs or tag names.
Transaction widgets only: comma-separated transaction categories.
"finance"
Transaction widgets only: comma-separated action types (case-insensitive).
"withdrawal"
Response
The KYC summary, or the requested widgets when scope or widget_keys is sent.
- Option 1
- Option 2
User verification (KYC) summary, returned when neither scope nor widget_keys is sent.
One point per day, from the first day with sessions in the range to end_date. Always daily, whatever grouping_mode says.
Show child attributes
Show child attributes
Status totals for the range. The previous-period breakdown carries at least the required fields.
Show child attributes
Show child attributes
Daily points for the period of the same length right before start_date.
Show child attributes
Show child attributes
Status totals for the range. The previous-period breakdown carries at least the required fields.
Show child attributes
Show child attributes
total_approved / (total_approved + total_declined + total_in_review) x 100, one decimal. null when nothing finished.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Top five of each, most sessions first.
Show child attributes
Show child attributes
Keyed by workflow ID. total is the sessions started on that workflow; steps counts the sessions that reached each step (OCR, LIVENESS, FACE_MATCH, AML, POA, PHONE, EMAIL, NFC, DATABASE_VALIDATION, QUESTIONNAIRE, IP_ANALYSIS, AGE_ESTIMATION, KYB_REGISTRY, KYB_DOCUMENTS, KYB_KEY_PEOPLE). Reaching a step is not passing it.
Show child attributes
Show child attributes
Active time users spent verifying, ignoring idle gaps. An empty object when there is no data.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Keyed by feature (ID_VERIFICATION, LIVENESS, FACEMATCH, AML, PROOF_OF_ADDRESS, PHONE, EMAIL, NFC, LOCATION, DATABASE_VALIDATION, QUESTIONNAIRE and the KYB features). total is the sessions that reached the feature; risks counts sessions per warning code and level.
Show child attributes
Show child attributes
The workflow's automatic verdict, before any reviewer changed it.
Show child attributes
Show child attributes
How the *_time_series lists are grouped: day for up to 14 days, week up to 90, month beyond. Measured from the first day with sessions in the range.
day, week, month Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes