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

FieldTypeRequiredDescriptionConstraints
generated_atstringyesWhen 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.
  • format date-time
personhttps://openvibe.network/contracts/report/me-stats.v1.json#/$defs/personyes
windowobjectyesThe window the counts were taken over. days is 7, 30 or 90; from and to are UTC calendar days.
  • no other fields
window.daysenumyes
  • one of 7, 30, 90
window.fromstringyes
  • format date
window.tostringyes
  • format date
publishedobjectyesWhich sections the person made public. All false is the default: their /u/<name> page then shows none of their numbers.
  • no other fields
published.sitesbooleanyes
published.activitybooleanyes
published.madebooleanyes
published.aibooleanyes
published.moneybooleanyes
sectionsobjectyesThe 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.
  • no other fields
sections.siteshttps://openvibe.network/contracts/report/me-stats.v1.json#/$defs/sites
sections.activityhttps://openvibe.network/contracts/report/me-stats.v1.json#/$defs/activity
sections.madehttps://openvibe.network/contracts/report/me-stats.v1.json#/$defs/made
sections.aihttps://openvibe.network/contracts/report/me-stats.v1.json#/$defs/ai
sections.moneyhttps://openvibe.network/contracts/report/me-stats.v1.json#/$defs/money
notestringOne 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.
  • maxLength 500

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 }] }