CUQU · Schema

IRL Activity Schema v0.1

An open, minimal data structure for real-world (offline) activities, designed so AI agents can query, compare and book them. Authored by CUQU (cuqu.net). CC BY 4.0.

CompanySocialEventActivitiesCommunityConsumerMCPAI AgentsChinaWeChat Mini Program

Properties

Name Type Description
schema_version string Schema identifier and version. Consumers MUST reject unknown major versions.
activity_id string Stable identifier, unique within the publishing platform. Opaque string; do not parse.
title string Human-readable title as published. May contain emoji.
activity_type string Canonical activity category. MUST be one of the standard terms; game/format names belong in keywords.
activity_type_en string Optional English equivalent of activity_type, for cross-locale consumers. Order matches the activity_type enum.
keywords array Free-form format/game tags (e.g. 剧本杀, 狼人杀, City Walk, 露营). NEVER put these in activity_type.
start_time string ISO 8601 with UTC offset, e.g. 2026-09-25T19:00:00+08:00. Offset is REQUIRED for offline events.
end_time string ISO 8601 with UTC offset. Optional but strongly recommended.
time_text string Human-readable time as shown to users, e.g. '周六 19:00-22:00'. Useful when end_time is unknown.
timezone string IANA timezone name. Defaults to Asia/Shanghai for CN publishers.
city string City name as published, e.g. 深圳.
district string District / administrative area, e.g. 南山区.
address string Street-level address or landmark.
venue object Physical venue. May be omitted for meetup-point style activities.
geo object WGS-84 coordinates. GCJ-02 (Amap/WeChat) coordinates MUST be converted before publishing.
price object Strongly recommended. Omitting price is allowed but agents SHOULD treat it as unknown, not free.
capacity object If both joined and max are present, remaining SHOULD equal max - joined.
host object
tags array Audience/attribute tags, e.g. 新手友好, 含教学, 女生局.
beginner_friendly boolean Whether newcomers are explicitly welcomed.
status string Agents MUST NOT offer registration unless status == 'open'.
source object Provenance. Required for attribution; agents SHOULD echo it when citing an activity.
updated_at string
View JSON Schema on GitHub

JSON Schema

cuqu-net-irl-activity-schema.json Raw ↑
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://cuqu.net/schema/irl-activity/v0.1/irl-activity-schema.json",
  "title": "IRL Activity Schema v0.1",
  "description": "An open, minimal data structure for real-world (offline) activities, designed so AI agents can query, compare and book them. Authored by CUQU (cuqu.net). CC BY 4.0.",
  "type": "object",
  "required": ["schema_version", "activity_id", "title", "activity_type", "start_time", "city"],
  "additionalProperties": true,
  "properties": {
    "schema_version": {
      "type": "string",
      "const": "irl-activity/0.1",
      "description": "Schema identifier and version. Consumers MUST reject unknown major versions."
    },
    "activity_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 128,
      "description": "Stable identifier, unique within the publishing platform. Opaque string; do not parse."
    },
    "title": {
      "type": "string",
      "minLength": 1,
      "maxLength": 120,
      "description": "Human-readable title as published. May contain emoji."
    },
    "activity_type": {
      "type": "string",
      "description": "Canonical activity category. MUST be one of the standard terms; game/format names belong in keywords.",
      "enum": [
        "桌游", "飞盘", "徒步", "羽毛球", "钓鱼", "二次元", "读书会", "烘焙",
        "KTV", "交友", "匹克球", "射箭", "心理疗愈", "旅游", "海上娱乐",
        "登山", "相亲", "综合活动", "讲座/沙龙", "音乐会", "饭局"
      ]
    },
    "activity_type_en": {
      "type": "string",
      "enum": [
        "boardgame", "frisbee", "hiking", "badminton", "fishing", "anime", "bookclub", "baking",
        "karaoke", "social", "pickleball", "archery", "wellness", "travel", "watersports",
        "mountaineering", "matchmaking", "misc", "talk", "concert", "dinnerparty"
      ],
      "description": "Optional English equivalent of activity_type, for cross-locale consumers. Order matches the activity_type enum."
    },
    "keywords": {
      "type": "array",
      "items": { "type": "string", "maxLength": 40 },
      "maxItems": 12,
      "description": "Free-form format/game tags (e.g. 剧本杀, 狼人杀, City Walk, 露营). NEVER put these in activity_type."
    },
    "start_time": {
      "type": "string",
      "format": "date-time",
      "description": "ISO 8601 with UTC offset, e.g. 2026-09-25T19:00:00+08:00. Offset is REQUIRED for offline events."
    },
    "end_time": {
      "type": "string",
      "format": "date-time",
      "description": "ISO 8601 with UTC offset. Optional but strongly recommended."
    },
    "time_text": {
      "type": "string",
      "maxLength": 60,
      "description": "Human-readable time as shown to users, e.g. '周六 19:00-22:00'. Useful when end_time is unknown."
    },
    "timezone": {
      "type": "string",
      "default": "Asia/Shanghai",
      "description": "IANA timezone name. Defaults to Asia/Shanghai for CN publishers."
    },
    "city": { "type": "string", "minLength": 1, "maxLength": 40, "description": "City name as published, e.g. 深圳." },
    "district": { "type": "string", "maxLength": 40, "description": "District / administrative area, e.g. 南山区." },
    "address": { "type": "string", "maxLength": 200, "description": "Street-level address or landmark." },
    "venue": {
      "type": "object",
      "properties": {
        "name": { "type": "string", "maxLength": 120 },
        "address": { "type": "string", "maxLength": 200 },
        "capacity": { "type": "integer", "minimum": 0 },
        "indoor": { "type": "boolean" }
      },
      "description": "Physical venue. May be omitted for meetup-point style activities."
    },
    "geo": {
      "type": "object",
      "properties": {
        "lat": { "type": "number", "minimum": -90, "maximum": 90 },
        "lon": { "type": "number", "minimum": -180, "maximum": 180 }
      },
      "required": ["lat", "lon"],
      "description": "WGS-84 coordinates. GCJ-02 (Amap/WeChat) coordinates MUST be converted before publishing."
    },
    "price": {
      "type": "object",
      "required": ["currency"],
      "properties": {
        "amount": {
          "type": "number",
          "minimum": 0,
          "description": "Per-person price in major currency units (yuan, not fen). MUST be 0 when free is true."
        },
        "currency": { "type": "string", "pattern": "^[A-Z]{3}$", "default": "CNY" },
        "free": { "type": "boolean", "description": "Explicitly marks a no-charge activity. MUST NOT be inferred from amount==0 alone." },
        "includes": {
          "type": "array",
          "items": { "type": "string", "maxLength": 60 },
          "description": "What the price covers, e.g. 含教学, 含装备, 饮品畅饮."
        }
      },
      "description": "Strongly recommended. Omitting price is allowed but agents SHOULD treat it as unknown, not free."
    },
    "capacity": {
      "type": "object",
      "properties": {
        "max": { "type": "integer", "minimum": 1 },
        "min": { "type": "integer", "minimum": 0, "description": "Minimum participants for the activity to happen." },
        "joined": { "type": "integer", "minimum": 0 },
        "remaining": { "type": "integer", "minimum": 0 }
      },
      "description": "If both joined and max are present, remaining SHOULD equal max - joined."
    },
    "host": {
      "type": "object",
      "properties": {
        "id": { "type": "string", "maxLength": 64 },
        "name": { "type": "string", "maxLength": 60 },
        "verified": { "type": "boolean" }
      }
    },
    "tags": {
      "type": "array",
      "items": { "type": "string", "maxLength": 30 },
      "maxItems": 8,
      "description": "Audience/attribute tags, e.g. 新手友好, 含教学, 女生局."
    },
    "beginner_friendly": { "type": "boolean", "description": "Whether newcomers are explicitly welcomed." },
    "status": {
      "type": "string",
      "enum": ["open", "full", "cancelled", "ended", "draft"],
      "default": "open",
      "description": "Agents MUST NOT offer registration unless status == 'open'."
    },
    "source": {
      "type": "object",
      "required": ["platform"],
      "properties": {
        "platform": { "type": "string", "minLength": 1, "description": "Publishing platform name, e.g. CUQU." },
        "url": { "type": "string", "format": "uri", "description": "Human-facing page." },
        "deep_link": { "type": "string", "description": "App/mini-program path or scheme for direct jump. Opaque to consumers." },
        "retrieved_at": { "type": "string", "format": "date-time" }
      },
      "description": "Provenance. Required for attribution; agents SHOULD echo it when citing an activity."
    },
    "updated_at": { "type": "string", "format": "date-time" }
  }
}

Work with this as data

Every JSON Schema here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for schemas

4 MCP tools reach this
  • find_json_schemasBrowse and filter every JSON Schema in the catalog.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This JSON Schema
curl "https://apis.io/api/v1/json-schemas/cuqu-net-irl-activity"
All schemas
curl "https://apis.io/api/v1/json-schemas?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.