ReportMeStats report.me-stats@1
Generated at from
openvibe-contracts v0.419.0 and
openvibe-sdk v0.161.0.
- Version
- 1.0.0
- Owner
- report
- Visibility
- public
- Status
- active
- Compatibility
- backward
- Schema
https://openvibe.network/contracts/report/me-stats.v1.json
report.me-stats@1: one person's numbers across OpenVibe, on OpenVibe.Report (the owner, 2026-11-09: 'a section for most used, your most used platforms across all of them, with OpenVibe.Report analysis for you… show your stats… you can make them public if you want, but private by default'). GET /api/v1/me/stats answers the person their session names, with every section; GET /api/v1/u/:name/stats answers only the sections they published, and never a section they did not. A section a source did not answer for is absent, never an invented zero. The document is the same on both routes so the menu, the page and the public page read one shape.
Fields
| Field | Type | Required | Description | Constraints |
|---|---|---|---|---|
generated_at | string | yes | When the snapshot was counted. A public answer may be older than the request: it is the owner's last computed snapshot, so the page says when. |
|
person | https://openvibe.network/contracts/report/me-stats.v1.json#/$defs/person | yes | ||
window | object | yes | The window the counts were taken over. days is 7, 30 or 90; from and to are UTC calendar days. |
|
window.days | enum | yes |
| |
window.from | string | yes |
| |
window.to | string | yes |
| |
published | object | yes | Which sections the person made public. All false is the default: their /u/<name> page then shows none of their numbers. |
|
published.sites | boolean | yes | ||
published.activity | boolean | yes | ||
published.made | boolean | yes | ||
published.ai | boolean | yes | ||
published.money | boolean | yes | ||
sections | object | yes | The counts, one key per publishable section. On GET /api/v1/me/stats every section a source answered for is here; on GET /api/v1/u/:name/stats only the published ones are. |
|
sections.sites | https://openvibe.network/contracts/report/me-stats.v1.json#/$defs/sites | |||
sections.activity | https://openvibe.network/contracts/report/me-stats.v1.json#/$defs/activity | |||
sections.made | https://openvibe.network/contracts/report/me-stats.v1.json#/$defs/made | |||
sections.ai | https://openvibe.network/contracts/report/me-stats.v1.json#/$defs/ai | |||
sections.money | https://openvibe.network/contracts/report/me-stats.v1.json#/$defs/money | |||
note | string | One plain line about what is not in the counts, when a source could not answer. Never a count and never a claim that a number is zero. |
|
Examples
From the contract's own test fixtures: valid ones validate, rejected ones must fail.
Valid: full
{
"generated_at": "2026-11-09T12:00:00.000Z",
"person": {
"username": "goosely",
"display_name": "Goosely",
"avatar_url": "https://openvibe.network/avatar/goosely?s=160"
},
"window": {
"days": 30,
"from": "2026-10-11",
"to": "2026-11-09"
},
"published": {
"sites": true,
"activity": true,
"made": true,
"ai": false,
"money": false
},
"sections": {
"sites": {
"week": [
{
"service": "live",
"label": "Live",
"url": "https://openvibe.live/",
"icon": "live",
"visits": 9
},
{
"service": "community",
"label": "Community",
"url": "https://openvibe.community/",
"icon": "community",
"visits": 4
}
],
"month": [
{
"service": "live",
"label": "Live",
"url": "https://openvibe.live/",
"icon": "live",
"visits": 31
},
{
"service": "community",
"label": "Community",
"url": "https://openvibe.community/",
"icon": "community",
"visits": 17
},
{
"service": "chat",
"label": "Chat",
"url": "https://openvibe.chat/",
"icon": "chat",
"visits": 12
}
],
"top": [
{
"service": "live",
"label": "Live",
"url": "https://openvibe.live/",
"icon": "live",
"visits": 31
},
{
"service": "community",
"label": "Community",
"url": "https://openvibe.community/",
"icon": "community",
"visits": 17
},
{
"service": "chat",
"label": "Chat",
"url": "https://openvibe.chat/",
"icon": "chat",
"visits": 12
}
]
},
"activity": {
"weeks": [
{
"week_start": "2026-10-26",
"days": [
3,
0,
1,
4,
2,
0,
0
]
},
{
"week_start": "2026-11-02",
"days": [
1,
2,
0,
5,
0,
3,
1
]
}
],
"active_days": 9,
"streak_days": 2
},
"made": {
"items": [
{
"key": "streams",
"label": "Streams",
"count": 3,
"unit": "streams",
"href": "https://openvibe.live/@goosely"
},
{
"key": "stream_hours",
"label": "Hours streamed",
"count": 4.5,
"unit": "hours"
},
{
"key": "agent_reports",
"label": "Agent reports",
"count": 2,
"unit": "reports",
"href": "https://openvibe.report/you"
}
]
},
"ai": {
"calls": 21,
"tokens": 48000,
"cost_usd": 0.42,
"daily": [
{
"day": "2026-11-08",
"calls": 12
},
{
"day": "2026-11-09",
"calls": 9
}
]
},
"money": {
"currency": "vibes-bits",
"settled_bits": 1200,
"transactions": 2
}
}
}Valid: private
{
"generated_at": "2026-11-09T12:00:00.000Z",
"person": {
"username": "quiet",
"display_name": "Quiet"
},
"window": {
"days": 7,
"from": "2026-11-03",
"to": "2026-11-09"
},
"published": {
"sites": false,
"activity": false,
"made": false,
"ai": false,
"money": false
},
"sections": {}
}Rejected: no-money-switch
{
"generated_at": "2026-11-09T12:00:00.000Z",
"person": {
"username": "goosely",
"display_name": "Goosely"
},
"window": {
"days": 30,
"from": "2026-10-11",
"to": "2026-11-09"
},
"published": {
"sites": true,
"activity": true,
"made": true,
"ai": false
},
"sections": {}
}Rejected: zero-visits
{
"generated_at": "2026-11-09T12:00:00.000Z",
"person": {
"username": "goosely",
"display_name": "Goosely"
},
"window": {
"days": 30,
"from": "2026-10-11",
"to": "2026-11-09"
},
"published": {
"sites": true,
"activity": true,
"made": true,
"ai": true,
"money": true
},
"sections": {
"sites": {
"week": [],
"month": [],
"top": [
{
"service": "live",
"label": "Live",
"url": "https://openvibe.live/",
"visits": 0
}
]
}
}
}Validate
const contracts = require('openvibe-contracts');
contracts.validate('report.me-stats@1', value); // { valid, errors: [{ path, message }] }