{
  "schema": "snappy-card/1",
  "skill": "snappy-skool",
  "tier": "public",
  "origin_tier": "base",
  "purpose": "Use `api.ts` as the only operational road. Do not recreate Skool calls with curl, guessed endpoints, or browser clicks.",
  "verbs": [
    {
      "name": "health",
      "args": [],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-skool/api.ts health"
    },
    {
      "name": "me",
      "args": [],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-skool/api.ts me"
    },
    {
      "name": "group",
      "args": [],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-skool/api.ts group"
    },
    {
      "name": "admins",
      "args": [],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-skool/api.ts admins"
    },
    {
      "name": "levels",
      "args": [],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-skool/api.ts levels"
    },
    {
      "name": "courses",
      "args": [],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-skool/api.ts courses"
    },
    {
      "name": "course",
      "args": [
        "course_id"
      ],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-skool/api.ts course <course_id>"
    },
    {
      "name": "labels",
      "args": [],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-skool/api.ts labels"
    },
    {
      "name": "links",
      "args": [],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-skool/api.ts links"
    },
    {
      "name": "posts",
      "args": [
        "page?"
      ],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-skool/api.ts posts"
    },
    {
      "name": "post-detail",
      "args": [
        "slug"
      ],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-skool/api.ts post-detail <slug>"
    },
    {
      "name": "comments",
      "args": [
        "slug"
      ],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-skool/api.ts comments <slug>"
    },
    {
      "name": "thread",
      "args": [
        "slug"
      ],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-skool/api.ts thread <slug>"
    },
    {
      "name": "members",
      "args": [
        "page?"
      ],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-skool/api.ts members"
    },
    {
      "name": "modules",
      "args": [],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-skool/api.ts modules"
    },
    {
      "name": "leaderboards",
      "args": [],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-skool/api.ts leaderboards"
    },
    {
      "name": "calendar",
      "args": [],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-skool/api.ts calendar"
    },
    {
      "name": "chats",
      "args": [
        "limit?"
      ],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-skool/api.ts chats"
    },
    {
      "name": "messages",
      "args": [
        "channel_id"
      ],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-skool/api.ts messages <channel_id>"
    },
    {
      "name": "questions",
      "args": [
        "page?"
      ],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-skool/api.ts questions"
    },
    {
      "name": "brief",
      "args": [],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-skool/api.ts brief"
    },
    {
      "name": "post",
      "args": [
        "title",
        "body",
        "category?"
      ],
      "effect": "post",
      "firstCall": "npx tsx ~/.claude/skills/snappy-skool/api.ts post \"<title>\" \"<body>\""
    },
    {
      "name": "comment",
      "args": [
        "post",
        "body"
      ],
      "effect": "post",
      "firstCall": "npx tsx ~/.claude/skills/snappy-skool/api.ts comment <post> \"<body>\""
    },
    {
      "name": "dm",
      "args": [
        "channel_id",
        "body"
      ],
      "effect": "send",
      "firstCall": "npx tsx ~/.claude/skills/snappy-skool/api.ts dm <channel_id> \"<body>\""
    }
  ],
  "faces": [],
  "agents": [],
  "uses": [],
  "used_by": [
    "snappy-course",
    "snappy-image",
    "snappy-offer"
  ],
  "checks": {
    "pass": 47,
    "fail": 7,
    "defer": 7,
    "line": "47 of 54 checks pass",
    "failing": [
      {
        "id": 5,
        "rule": "Description is valid, third-person, and says what plus when",
        "says": "no when/use marker"
      },
      {
        "id": 7,
        "rule": "Promised and declared verbs have no set difference",
        "says": "promised-only=[contract]; loader-missing=[]"
      },
      {
        "id": 9,
        "rule": "Time-sensitive prose is isolated under Old patterns",
        "says": "3 time-sensitive instruction line(s) outside Old patterns"
      },
      {
        "id": 11,
        "rule": "Each task presents one default, not a menu",
        "says": "2 line(s) present three-way alternative menus"
      },
      {
        "id": 23,
        "rule": "Responses obey hard and soft caps",
        "says": "0 hard-cap breach(es); 8 unannounced default-read soft-cap breach(es)"
      },
      {
        "id": 55,
        "rule": "Eval scenarios are multi-call with ground truth",
        "says": "eval manifest missing"
      },
      {
        "id": 57,
        "rule": "Eval manifest contains a disjoint holdout",
        "says": "0 disjoint holdout scenario(s)"
      }
    ]
  },
  "coverage": null,
  "spec": null,
  "evals": null,
  "files": [
    "AGENTS.md",
    "SKILL.md",
    "api.ts",
    "entities.json",
    "face.test.ts",
    "faces/components/skool-comment-composer.css",
    "faces/components/skool-comment-composer.tsx",
    "faces/components/skool-faces.css",
    "faces/components/skool-faces.tsx",
    "faces/components/skool-post-preview.tsx",
    "faces/family.tsx",
    "faces/fixtures/skool-classroom.json",
    "faces/fixtures/skool-comment.json",
    "faces/fixtures/skool-comments.json",
    "faces/fixtures/skool-feed.json",
    "faces/fixtures/skool-post.json",
    "refusals.test.ts"
  ],
  "total_size": 172975,
  "checksum": "sha256:fcc5f109ac501f37b735c6c9607723d5ed55fe8f40540aa13ca649f1d4ae6cd1",
  "built_at": "2026-09-09T22:10:59.680Z",
  "openapi": {
    "openapi": "3.1.0",
    "info": {
      "title": "snappy-skool",
      "version": "0.0.0",
      "description": "Master operating manual and typed API for Skool communities. Reads the live Skool account, groups, feed, posts, members, classroom, leaderboards, calendar, and chats. Posts, comments, and DMs are staged for approval."
    },
    "x-snappy-transport": "cli",
    "servers": [
      {
        "url": "npx tsx ~/.claude/skills/snappy-skool/api.ts",
        "description": "The hand itself. Every path is a verb word, every query or body key an argument."
      }
    ],
    "paths": {
      "/health": {
        "get": {
          "operationId": "snappy_skool_health",
          "summary": "snappy-skool health",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [
            {
              "name": "group",
              "in": "query",
              "required": false,
              "schema": {
                "x-snappy-flag": "--group"
              }
            },
            {
              "name": "json",
              "in": "query",
              "required": false,
              "schema": {
                "x-snappy-flag": "--json"
              }
            }
          ],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/me": {
        "get": {
          "operationId": "snappy_skool_me",
          "summary": "snappy-skool me",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [
            {
              "name": "group",
              "in": "query",
              "required": false,
              "schema": {
                "x-snappy-flag": "--group"
              }
            },
            {
              "name": "json",
              "in": "query",
              "required": false,
              "schema": {
                "x-snappy-flag": "--json"
              }
            }
          ],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/group": {
        "get": {
          "operationId": "snappy_skool_group",
          "summary": "snappy-skool group",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [
            {
              "name": "group",
              "in": "query",
              "required": false,
              "schema": {
                "x-snappy-flag": "--group"
              }
            },
            {
              "name": "json",
              "in": "query",
              "required": false,
              "schema": {
                "x-snappy-flag": "--json"
              }
            }
          ],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/admins": {
        "get": {
          "operationId": "snappy_skool_admins",
          "summary": "snappy-skool admins",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [
            {
              "name": "group",
              "in": "query",
              "required": false,
              "schema": {
                "x-snappy-flag": "--group"
              }
            },
            {
              "name": "json",
              "in": "query",
              "required": false,
              "schema": {
                "x-snappy-flag": "--json"
              }
            }
          ],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/levels": {
        "get": {
          "operationId": "snappy_skool_levels",
          "summary": "snappy-skool levels",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [
            {
              "name": "group",
              "in": "query",
              "required": false,
              "schema": {
                "x-snappy-flag": "--group"
              }
            },
            {
              "name": "json",
              "in": "query",
              "required": false,
              "schema": {
                "x-snappy-flag": "--json"
              }
            }
          ],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/courses": {
        "get": {
          "operationId": "snappy_skool_courses",
          "summary": "snappy-skool courses",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [
            {
              "name": "group",
              "in": "query",
              "required": false,
              "schema": {
                "x-snappy-flag": "--group"
              }
            },
            {
              "name": "json",
              "in": "query",
              "required": false,
              "schema": {
                "x-snappy-flag": "--json"
              }
            }
          ],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/course": {
        "get": {
          "operationId": "snappy_skool_course",
          "summary": "snappy-skool course",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [
            {
              "name": "course_id",
              "in": "query",
              "required": true,
              "schema": {
                "type": "string",
                "description": "The Skool course id, from a `courses` row's `id`",
                "x-snappy-position": 0
              }
            },
            {
              "name": "json",
              "in": "query",
              "required": false,
              "schema": {
                "x-snappy-flag": "--json"
              }
            }
          ],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/labels": {
        "get": {
          "operationId": "snappy_skool_labels",
          "summary": "snappy-skool labels",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [
            {
              "name": "group",
              "in": "query",
              "required": false,
              "schema": {
                "x-snappy-flag": "--group"
              }
            },
            {
              "name": "json",
              "in": "query",
              "required": false,
              "schema": {
                "x-snappy-flag": "--json"
              }
            }
          ],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/links": {
        "get": {
          "operationId": "snappy_skool_links",
          "summary": "snappy-skool links",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [
            {
              "name": "group",
              "in": "query",
              "required": false,
              "schema": {
                "x-snappy-flag": "--group"
              }
            },
            {
              "name": "json",
              "in": "query",
              "required": false,
              "schema": {
                "x-snappy-flag": "--json"
              }
            }
          ],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/posts": {
        "get": {
          "operationId": "snappy_skool_posts",
          "summary": "snappy-skool posts",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [
            {
              "name": "page",
              "in": "query",
              "required": false,
              "schema": {
                "type": "integer",
                "description": "Which page of the feed to read, 1-based; each page is one Skool page",
                "default": 1,
                "x-snappy-position": 0
              }
            },
            {
              "name": "group",
              "in": "query",
              "required": false,
              "schema": {
                "x-snappy-flag": "--group"
              }
            },
            {
              "name": "json",
              "in": "query",
              "required": false,
              "schema": {
                "x-snappy-flag": "--json"
              }
            }
          ],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/post-detail": {
        "get": {
          "operationId": "snappy_skool_post_detail",
          "summary": "snappy-skool post-detail",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [
            {
              "name": "slug",
              "in": "query",
              "required": true,
              "schema": {
                "type": "string",
                "description": "The post's slug, from a `posts` row's `slug` — the last segment of the post's URL",
                "x-snappy-position": 0
              }
            },
            {
              "name": "group",
              "in": "query",
              "required": false,
              "schema": {
                "x-snappy-flag": "--group"
              }
            },
            {
              "name": "json",
              "in": "query",
              "required": false,
              "schema": {
                "x-snappy-flag": "--json"
              }
            }
          ],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/comments": {
        "get": {
          "operationId": "snappy_skool_comments",
          "summary": "snappy-skool comments",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [
            {
              "name": "slug",
              "in": "query",
              "required": true,
              "schema": {
                "type": "string",
                "description": "The post's slug, from a `posts` row's `slug` — the last segment of the post's URL",
                "x-snappy-position": 0
              }
            },
            {
              "name": "group",
              "in": "query",
              "required": false,
              "schema": {
                "x-snappy-flag": "--group"
              }
            },
            {
              "name": "json",
              "in": "query",
              "required": false,
              "schema": {
                "x-snappy-flag": "--json"
              }
            }
          ],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/thread": {
        "get": {
          "operationId": "snappy_skool_thread",
          "summary": "snappy-skool thread",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [
            {
              "name": "slug",
              "in": "query",
              "required": true,
              "schema": {
                "type": "string",
                "description": "The post's slug, from a `posts` row's `slug` — the last segment of the post's URL",
                "x-snappy-position": 0
              }
            },
            {
              "name": "group",
              "in": "query",
              "required": false,
              "schema": {
                "x-snappy-flag": "--group"
              }
            },
            {
              "name": "json",
              "in": "query",
              "required": false,
              "schema": {
                "x-snappy-flag": "--json"
              }
            },
            {
              "name": "limit",
              "in": "query",
              "required": false,
              "schema": {
                "type": "integer",
                "description": "How many comments of that post to return. The count is the FLAG --limit, never a positional word; default 25, ceiling 25",
                "default": 25,
                "minimum": 1,
                "maximum": 25,
                "x-snappy-flag": "--limit"
              }
            }
          ],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/members": {
        "get": {
          "operationId": "snappy_skool_members",
          "summary": "snappy-skool members",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [
            {
              "name": "page",
              "in": "query",
              "required": false,
              "schema": {
                "type": "integer",
                "description": "Which page of the feed to read, 1-based; each page is one Skool page",
                "default": 1,
                "x-snappy-position": 0
              }
            },
            {
              "name": "group",
              "in": "query",
              "required": false,
              "schema": {
                "x-snappy-flag": "--group"
              }
            },
            {
              "name": "json",
              "in": "query",
              "required": false,
              "schema": {
                "x-snappy-flag": "--json"
              }
            }
          ],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/modules": {
        "get": {
          "operationId": "snappy_skool_modules",
          "summary": "snappy-skool modules",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [
            {
              "name": "group",
              "in": "query",
              "required": false,
              "schema": {
                "x-snappy-flag": "--group"
              }
            },
            {
              "name": "json",
              "in": "query",
              "required": false,
              "schema": {
                "x-snappy-flag": "--json"
              }
            }
          ],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/leaderboards": {
        "get": {
          "operationId": "snappy_skool_leaderboards",
          "summary": "snappy-skool leaderboards",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [
            {
              "name": "group",
              "in": "query",
              "required": false,
              "schema": {
                "x-snappy-flag": "--group"
              }
            },
            {
              "name": "json",
              "in": "query",
              "required": false,
              "schema": {
                "x-snappy-flag": "--json"
              }
            }
          ],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/calendar": {
        "get": {
          "operationId": "snappy_skool_calendar",
          "summary": "snappy-skool calendar",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [
            {
              "name": "group",
              "in": "query",
              "required": false,
              "schema": {
                "x-snappy-flag": "--group"
              }
            },
            {
              "name": "json",
              "in": "query",
              "required": false,
              "schema": {
                "x-snappy-flag": "--json"
              }
            }
          ],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/chats": {
        "get": {
          "operationId": "snappy_skool_chats",
          "summary": "snappy-skool chats",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [
            {
              "name": "limit",
              "in": "query",
              "required": false,
              "schema": {
                "type": "integer",
                "description": "How many chat channels to return. The count is the FLAG --limit, never a positional word; default 30, ceiling 300",
                "default": 30,
                "minimum": 1,
                "maximum": 300,
                "x-snappy-flag": "--limit"
              }
            },
            {
              "name": "json",
              "in": "query",
              "required": false,
              "schema": {
                "x-snappy-flag": "--json"
              }
            }
          ],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/messages": {
        "get": {
          "operationId": "snappy_skool_messages",
          "summary": "snappy-skool messages",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [
            {
              "name": "channel_id",
              "in": "query",
              "required": true,
              "schema": {
                "type": "string",
                "description": "The Skool chat channel id, from a `chats` row's `id`",
                "x-snappy-position": 0
              }
            },
            {
              "name": "json",
              "in": "query",
              "required": false,
              "schema": {
                "x-snappy-flag": "--json"
              }
            },
            {
              "name": "limit",
              "in": "query",
              "required": false,
              "schema": {
                "type": "integer",
                "description": "How many messages before the newest to return. The count is the FLAG --limit, never a positional word; default 35, ceiling 35",
                "default": 35,
                "minimum": 1,
                "maximum": 35,
                "x-snappy-flag": "--limit"
              }
            }
          ],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/questions": {
        "get": {
          "operationId": "snappy_skool_questions",
          "summary": "snappy-skool questions",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [
            {
              "name": "page",
              "in": "query",
              "required": false,
              "schema": {
                "type": "integer",
                "description": "Which page of the feed to read, 1-based; each page is one Skool page",
                "default": 1,
                "x-snappy-position": 0
              }
            },
            {
              "name": "group",
              "in": "query",
              "required": false,
              "schema": {
                "x-snappy-flag": "--group"
              }
            },
            {
              "name": "json",
              "in": "query",
              "required": false,
              "schema": {
                "x-snappy-flag": "--json"
              }
            }
          ],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/brief": {
        "get": {
          "operationId": "snappy_skool_brief",
          "summary": "snappy-skool brief",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [
            {
              "name": "group",
              "in": "query",
              "required": false,
              "schema": {
                "x-snappy-flag": "--group"
              }
            },
            {
              "name": "json",
              "in": "query",
              "required": false,
              "schema": {
                "x-snappy-flag": "--json"
              }
            }
          ],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/post": {
        "post": {
          "operationId": "snappy_skool_post",
          "summary": "snappy-skool post",
          "x-snappy-effect": "post",
          "x-snappy-annotations": {
            "readOnlyHint": false,
            "destructiveHint": true,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "requestBody": {
            "required": true,
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "title": {
                      "type": "string",
                      "description": "The post's title, verbatim",
                      "x-snappy-position": 0
                    },
                    "body": {
                      "type": "string",
                      "description": "The post's body, verbatim",
                      "x-snappy-position": 1
                    },
                    "category": {
                      "type": "string",
                      "description": "The category label to file the post under, from a `labels` row; omit for the group's default",
                      "x-snappy-position": 2
                    },
                    "group": {
                      "x-snappy-flag": "--group"
                    },
                    "json": {
                      "x-snappy-flag": "--json"
                    }
                  },
                  "required": [
                    "title",
                    "body"
                  ]
                }
              }
            }
          },
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/comment": {
        "post": {
          "operationId": "snappy_skool_comment",
          "summary": "snappy-skool comment",
          "x-snappy-effect": "post",
          "x-snappy-annotations": {
            "readOnlyHint": false,
            "destructiveHint": true,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "requestBody": {
            "required": true,
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "post": {
                      "type": "string",
                      "description": "The post's slug, from a `posts` row's `slug` — the comment lands under it",
                      "x-snappy-position": 0
                    },
                    "body": {
                      "type": "string",
                      "description": "The comment's words, verbatim",
                      "x-snappy-position": 1
                    },
                    "group": {
                      "x-snappy-flag": "--group"
                    },
                    "json": {
                      "x-snappy-flag": "--json"
                    }
                  },
                  "required": [
                    "post",
                    "body"
                  ]
                }
              }
            }
          },
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/dm": {
        "post": {
          "operationId": "snappy_skool_dm",
          "summary": "snappy-skool dm",
          "x-snappy-effect": "send",
          "x-snappy-annotations": {
            "readOnlyHint": false,
            "destructiveHint": true,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "requestBody": {
            "required": true,
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "channel_id": {
                      "type": "string",
                      "description": "The Skool chat channel id, from a `chats` row's `id`",
                      "x-snappy-position": 0
                    },
                    "body": {
                      "type": "string",
                      "description": "The message's words, verbatim",
                      "x-snappy-position": 1
                    },
                    "json": {
                      "x-snappy-flag": "--json"
                    }
                  },
                  "required": [
                    "channel_id",
                    "body"
                  ]
                }
              }
            }
          },
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      }
    },
    "components": {
      "schemas": {
        "SnappyRefusal": {
          "type": "object",
          "required": [
            "outcome",
            "code",
            "message"
          ],
          "properties": {
            "outcome": {
              "type": "string",
              "const": "refused"
            },
            "code": {
              "type": "string",
              "description": "A row of the closed refusal table."
            },
            "message": {
              "type": "string"
            },
            "fix": {
              "type": "string"
            }
          }
        }
      }
    }
  }
}