changedOutput schema / (root)
Previous value: -nullNew value: +{
+ "description": "Curated, versioned public stats payload. Never includes verbatim member messages.",
+ "properties": {
+ "docs": {
+ "description": "Human-readable API documentation.",
+ "format": "uri",
+ "type": "string"
+ },
+ "generated_at": {
+ "format": "date-time",
+ "type": "string"
+ },
+ "group": {
+ "properties": {
+ "description": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "is_private": {
+ "description": "True when the group has no public t.me address. Private groups expose aggregates and the leaderboard only.",
+ "type": "boolean"
+ },
+ "member_count": {
+ "type": [
+ "integer",
+ "null"
+ ]
+ },
+ "plan": {
+ "enum": [
+ "free",
+ "pro",
+ "community"
+ ],
+ "type": "string"
+ },
+ "slug": {
+ "type": "string"
+ },
+ "telegram_url": {
+ "format": "uri",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "title": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "url": {
+ "description": "The human stats page for this group.",
+ "format": "uri",
+ "type": "string"
+ },
+ "username": {
+ "description": "Telegram username without @, when the group is public on t.me.",
+ "type": [
+ "string",
+ "null"
+ ]
+ }
+ },
+ "type": "object"
+ },
+ "ok": {
+ "const": true,
+ "type": "boolean"
+ },
+ "openapi": {
+ "description": "Machine-readable OpenAPI document for the REST API.",
+ "format": "uri",
+ "type": "string"
+ },
+ "range": {
+ "description": "The range actually served — compare `key` with what you requested to detect the plan fallback.",
+ "properties": {
+ "days": {
+ "description": "Length of the window in days.",
+ "type": "integer"
+ },
+ "key": {
+ "enum": [
+ "7d",
+ "30d",
+ "all"
+ ],
+ "type": "string"
+ },
+ "label": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "schema": {
+ "const": "limzo.public_stats/v1",
+ "type": "string"
+ },
+ "stats": {
+ "properties": {
+ "active_users": {
+ "description": "Unique posting members in the selected range.",
+ "type": "integer"
+ },
+ "active_users_today": {
+ "description": "Unique posting members so far today (UTC).",
+ "type": "integer"
+ },
+ "daily": {
+ "description": "Per-day series over the selected range.",
+ "items": {
+ "properties": {
+ "active_users": {
+ "type": "integer"
+ },
+ "day": {
+ "format": "date",
+ "type": "string"
+ },
+ "messages": {
+ "type": "integer"
+ },
+ "replies": {
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "lifetime_messages": {
+ "description": "Messages since Limzo started tracking the group.",
+ "type": "integer"
+ },
+ "messages": {
+ "description": "Messages in the selected range.",
+ "type": "integer"
+ },
+ "messages_today": {
+ "description": "Messages so far today (UTC).",
+ "type": "integer"
+ },
+ "mood": {
+ "description": "Group mood derived from reactions. Null when there is not enough data.",
+ "properties": {
+ "emoji": {
+ "type": "string"
+ },
+ "label": {
+ "type": "string"
+ },
+ "positive_pct": {
+ "description": "Share of positive reactions, 0–100.",
+ "type": "number"
+ }
+ },
+ "type": [
+ "object",
+ "null"
+ ]
+ },
+ "new_active_members": {
+ "description": "Members who posted for the first time in the selected range.",
+ "type": "integer"
+ },
+ "peak_hour_utc": {
+ "description": "Busiest hour of day, UTC.",
+ "maximum": 23,
+ "minimum": 0,
+ "type": [
+ "integer",
+ "null"
+ ]
+ },
+ "reaction_magnet": {
+ "description": "The member whose messages attracted the most reactions. Null when the range has no reaction data.",
+ "properties": {
+ "count": {
+ "description": "Reactions in the selected range.",
+ "type": "integer"
+ },
+ "name": {
+ "description": "Display name as shown on the public page.",
+ "type": "string"
+ },
+ "username": {
+ "description": "Telegram username without @, when public.",
+ "type": [
+ "string",
+ "null"
+ ]
+ }
+ },
+ "type": [
+ "object",
+ "null"
+ ]
+ },
+ "replies": {
+ "description": "Replies in the selected range.",
+ "type": "integer"
+ },
+ "stickers": {
+ "description": "Stickers in the selected range.",
+ "type": "integer"
+ },
+ "top_members": {
+ "description": "Member leaderboard for the selected range.",
+ "items": {
+ "properties": {
+ "messages": {
+ "type": "integer"
+ },
+ "name": {
+ "type": "string"
+ },
+ "rank": {
+ "description": "1-based position.",
+ "type": "integer"
+ },
+ "replies": {
+ "type": "integer"
+ },
+ "username": {
+ "type": [
+ "string",
+ "null"
+ ]
+ }
+ },
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "top_reactor": {
+ "description": "A member singled out by reaction activity. Null when the range has no reaction data.",
+ "properties": {
+ "count": {
+ "description": "Reactions in the selected range.",
+ "type": "integer"
+ },
+ "name": {
+ "description": "Display name as shown on the public page.",
+ "type": "string"
+ },
+ "username": {
+ "description": "Telegram username without @, when public.",
+ "type": [
+ "string",
+ "null"
+ ]
+ }
+ },
+ "type": [
+ "object",
+ "null"
+ ]
+ },
+ "tracked_since_days": {
+ "description": "Days since tracking started.",
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ }
+ },
+ "required": [
+ "ok",
+ "schema",
+ "generated_at",
+ "group",
+ "range",
+ "stats"
+ ],
+ "type": "object"
+}