{
  "version": "0.5.0",
  "generated": "2026-10-21",
  "baseUrl": "https://velora.ikelene.net",
  "websocketUrl": "wss://velora.ikelene.net/",
  "scopes": {
    "PROFILE_READ": 1,
    "PROFILE_SENSITIVE": 2,
    "PROJECT_AUTH": 4,
    "ACCOUNT_WRITE": 8,
    "STORAGE_READ": 16,
    "STORAGE_WRITE": 32,
    "VMAIL_READ": 64,
    "VMAIL_SEND": 128,
    "FRIENDS_READ": 256,
    "FRIENDS_MANAGE": 512,
    "CURRENCY_PAY": 1024,
    "CHAT": 2048,
    "MEDIA_UPLOAD": 4096,
    "CURRENCY_READ": 8192,
    "VOICE": 16384,
    "SIGN_MESSAGES": 32768
  },
  "routes": [
    {
      "operationId": "post_bonfire_instance_token",
      "group": "bonfire-identity",
      "method": "POST",
      "path": "/bonfire/instance-token",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [],
      "query": [],
      "body": [
        "instance"
      ],
      "files": [],
      "errors": [
        "instance_banned",
        "invalid_instance"
      ],
      "notes": "Needs Chat (2048). Body {\"instance\": URL}. Returns {token, expires_at, aud}: an EdDSA JWT (10 minutes, single use) made for that one instance. Its scp claim lists the instance scopes the Nookara token holds: chat (Chat), voice (Voice), media (Upload Media), sign (Sign Messages). Hand the JWT to POST INSTANCE/api/v1/auth/velora. Errors: invalid_instance, instance_banned, insufficient_scope, scope_disabled.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/bonfire-identity.js:52",
      "legacy": false
    },
    {
      "operationId": "post_bonfire_keys",
      "group": "bonfire-identity",
      "method": "POST",
      "path": "/bonfire/keys",
      "auth": "none",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "device_keys_retired"
      ],
      "notes": "Retired (410 device_keys_retired). Use GET /bonfire/signing-key.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/bonfire-identity.js:76",
      "legacy": false
    },
    {
      "operationId": "get_bonfire_keys",
      "group": "bonfire-identity",
      "method": "GET",
      "path": "/bonfire/keys",
      "auth": "bearer",
      "scopes": [
        "SIGN_MESSAGES"
      ],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/bonfire-identity.js:78",
      "legacy": false
    },
    {
      "operationId": "delete_bonfire_keys_by_kid",
      "group": "bonfire-identity",
      "method": "DELETE",
      "path": "/bonfire/keys/:kid",
      "auth": "bearer",
      "scopes": [
        "SIGN_MESSAGES"
      ],
      "params": [
        {
          "name": "kid",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "key_not_found",
        "website_only"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/bonfire-identity.js:83",
      "legacy": false
    },
    {
      "operationId": "get_bonfire_keys_kid_by_kid",
      "group": "bonfire-identity",
      "method": "GET",
      "path": "/bonfire/keys/kid/:kid",
      "auth": "none",
      "scopes": [],
      "params": [
        {
          "name": "kid",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "key_not_found"
      ],
      "notes": "Public. Returns {kid, user_id, public_key, created_at, revoked_at}, or 404 key_not_found. Instances and clients use it to verify signed messages.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/bonfire-identity.js:95",
      "legacy": false
    },
    {
      "operationId": "get_bonfire_keys_user_by_userid",
      "group": "bonfire-identity",
      "method": "GET",
      "path": "/bonfire/keys/user/:userId",
      "auth": "none",
      "scopes": [],
      "params": [
        {
          "name": "userId",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "invalid_user_id"
      ],
      "notes": "Public. Every key of one account, including revoked ones.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/bonfire-identity.js:101",
      "legacy": false
    },
    {
      "operationId": "get_bonfire_instances",
      "group": "bonfire-identity",
      "method": "GET",
      "path": "/bonfire/instances",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "Needs Chat. Returns {default_instance, instances: [{url, position, added_at, muted, push, auto_join}]}: the Ember servers saved on the account. The official server (default_instance) is added once per account; auto_join is true until a client confirms with POST /bonfire/instances/default-joined.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/bonfire-identity.js:118",
      "legacy": false
    },
    {
      "operationId": "post_bonfire_instances_default_joined",
      "group": "bonfire-identity",
      "method": "POST",
      "path": "/bonfire/instances/default-joined",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [],
      "query": [],
      "body": [
        "url"
      ],
      "files": [],
      "errors": [
        "invalid_instance"
      ],
      "notes": "Needs Chat. Body {url?}. The client confirms it joined (or chose not to join) the official server; clears auto_join.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/bonfire-identity.js:123",
      "legacy": false
    },
    {
      "operationId": "put_bonfire_instances",
      "group": "bonfire-identity",
      "method": "PUT",
      "path": "/bonfire/instances",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [],
      "query": [],
      "body": [
        "instances"
      ],
      "files": [],
      "errors": [
        "invalid_instance",
        "invalid_instances"
      ],
      "notes": "Needs Chat. Replaces the whole list in this order (at most 100 normalized origins). Muted and push settings of kept entries are preserved.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/bonfire-identity.js:130",
      "legacy": false
    },
    {
      "operationId": "patch_bonfire_instances_prefs",
      "group": "bonfire-identity",
      "method": "PATCH",
      "path": "/bonfire/instances/prefs",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [],
      "query": [],
      "body": [
        "url",
        "muted",
        "push"
      ],
      "files": [],
      "errors": [
        "instance_not_in_list",
        "invalid_instance",
        "nothing_to_change"
      ],
      "notes": "Needs Chat. Body {url, muted?, push?}: per-server push consent for offline mentions. 404 instance_not_in_list.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/bonfire-identity.js:154",
      "legacy": false
    },
    {
      "operationId": "post_bonfire_instances_challenge",
      "group": "bonfire-identity",
      "method": "POST",
      "path": "/bonfire/instances/challenge",
      "auth": "none",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [
        "pubkey",
        "url"
      ],
      "files": [],
      "errors": [
        "busy",
        "invalid_pubkey",
        "invalid_url"
      ],
      "notes": "Instance-only: used by bonfire-server to register itself (single-use nonce). Not for clients.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/bonfire-identity.js:184",
      "legacy": false
    },
    {
      "operationId": "post_bonfire_instances_register",
      "group": "bonfire-identity",
      "method": "POST",
      "path": "/bonfire/instances/register",
      "auth": "none",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [
        "accounts_mode",
        "name",
        "nonce",
        "pubkey",
        "sig",
        "url"
      ],
      "files": [],
      "errors": [
        "bad_signature",
        "instance_banned",
        "invalid_accounts_mode",
        "invalid_name",
        "invalid_nonce",
        "invalid_pubkey",
        "invalid_url",
        "url_taken",
        "url_unverified"
      ],
      "notes": "Instance-only: a bonfire-server proves control of its key and URL here. Not for clients.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/bonfire-identity.js:194",
      "legacy": false
    },
    {
      "operationId": "post_bonfire_instances_payout",
      "group": "bonfire-identity",
      "method": "POST",
      "path": "/bonfire/instances/payout",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [],
      "query": [],
      "body": [
        "attestation"
      ],
      "files": [],
      "errors": [
        "instance_banned",
        "invalid_attestation",
        "not_owner",
        "unknown_instance"
      ],
      "notes": "Needs Chat. Body {attestation}: the instance owner links payouts (credits from role shops) using GET INSTANCE/api/v1/instance/owner-attestation.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/bonfire-identity.js:222",
      "legacy": false
    },
    {
      "operationId": "get_bonfire_instances_payout",
      "group": "bonfire-identity",
      "method": "GET",
      "path": "/bonfire/instances/payout",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [],
      "query": [
        "url"
      ],
      "body": [],
      "files": [],
      "errors": [
        "forbidden",
        "invalid_instance",
        "unknown_instance"
      ],
      "notes": "Needs Chat, query url. Who receives shop payments for an instance; only the registered owner can read it.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/bonfire-identity.js:234",
      "legacy": false
    },
    {
      "operationId": "get_bonfire_signing_key",
      "group": "bonfire-signing",
      "method": "GET",
      "path": "/bonfire/signing-key",
      "auth": "bearer",
      "scopes": [
        "SIGN_MESSAGES"
      ],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "Needs Sign Messages (32768). Returns {kid, public_key, private_key, created_at} (no-store). One Ed25519 key per account, created on first use. Keep the private key in memory only.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/bonfire-signing.js:87",
      "legacy": false
    },
    {
      "operationId": "post_bonfire_signing_key_rotate",
      "group": "bonfire-signing",
      "method": "POST",
      "path": "/bonfire/signing-key/rotate",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "website_only"
      ],
      "notes": "Website session only; an app or project token is refused. Revokes the active key and returns a new {kid, public_key, created_at}. Old messages stay valid.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/bonfire-signing.js:94",
      "legacy": false
    },
    {
      "operationId": "get_bonfire_signing_key_info",
      "group": "bonfire-signing",
      "method": "GET",
      "path": "/bonfire/signing-key/info",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "website_only"
      ],
      "notes": "Information about the signed-in account key without the private half.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/bonfire-signing.js:104",
      "legacy": false
    },
    {
      "operationId": "get_bonfire_import_platforms",
      "group": "bonfire-services",
      "method": "GET",
      "path": "/bonfire/import/platforms",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/bonfire-services.js:45",
      "legacy": false
    },
    {
      "operationId": "get_bonfire_import_by_platform_guilds",
      "group": "bonfire-services",
      "method": "GET",
      "path": "/bonfire/import/:platform/guilds",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "platform",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/bonfire-services.js:46",
      "legacy": false
    },
    {
      "operationId": "get_bonfire_import_by_platform_guilds_by_gid",
      "group": "bonfire-services",
      "method": "GET",
      "path": "/bonfire/import/:platform/guilds/:gid",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "platform",
          "optional": false
        },
        {
          "name": "gid",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "invalid_guild"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/bonfire-services.js:48",
      "legacy": false
    },
    {
      "operationId": "post_bonfire_import",
      "group": "bonfire-services",
      "method": "POST",
      "path": "/bonfire/import",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "bad_platform",
        "import_running",
        "invalid_guild",
        "invalid_instance",
        "invalid_selection",
        "pick_a_channel"
      ],
      "notes": "Needs Chat. Body {platform, guild_id, channels, roles, options?, instance}. Starts a background job that builds a bonfire-export-v1 zip (channels, roles, emoji; no members or messages) and returns {job_id, ticket, instance, expires_at}. The one-time ticket goes to POST INSTANCE/api/v1/import/velora.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/bonfire-services.js:53",
      "legacy": false
    },
    {
      "operationId": "get_bonfire_import_by_job_id",
      "group": "bonfire-services",
      "method": "GET",
      "path": "/bonfire/import/:job_id",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "job_id",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "not_found"
      ],
      "notes": "Needs Chat. Job state {status, progress, stage, error, instance, size, expires_at, downloaded}. Owner only.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/bonfire-services.js:111",
      "legacy": false
    },
    {
      "operationId": "get_bonfire_directory",
      "group": "bonfire-services",
      "method": "GET",
      "path": "/bonfire/directory",
      "auth": "none",
      "scopes": [],
      "params": [],
      "query": [
        "page",
        "q"
      ],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "Public, CORS open. Query q, page. Returns {page, page_size: 24, has_more, results: [{id, url, name, description, icon_url, member_count, invite_url, tags, trusted, updated_at}]}. Treat every field as untrusted text.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/bonfire-services.js:119",
      "legacy": false
    },
    {
      "operationId": "post_bonfire_pay_requests_by_id_approve",
      "group": "bonfire-services",
      "method": "POST",
      "path": "/bonfire/pay-requests/:id/approve",
      "auth": "bearer",
      "scopes": [
        "CURRENCY_PAY"
      ],
      "params": [
        {
          "name": "id",
          "optional": false
        }
      ],
      "query": [],
      "body": [
        "captcha_token"
      ],
      "files": [],
      "errors": [
        "not_found",
        "server_error",
        "wrong_account"
      ],
      "notes": "Needs Currency Pay (1024) and a CAPTCHA pass. Pays a role-shop request an instance made. Do not auto-approve for the user.",
      "staffOnly": false,
      "captcha": true,
      "source": "routes/bonfire-services.js:125",
      "legacy": false
    },
    {
      "operationId": "post_bonfire_pay_requests_by_id_decline",
      "group": "bonfire-services",
      "method": "POST",
      "path": "/bonfire/pay-requests/:id/decline",
      "auth": "bearer",
      "scopes": [
        "CURRENCY_PAY"
      ],
      "params": [
        {
          "name": "id",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "not_found",
        "server_error",
        "wrong_account"
      ],
      "notes": "Needs Currency Pay. Only the payer can decline.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/bonfire-services.js:129",
      "legacy": false
    },
    {
      "operationId": "get_bonfire_hosting_plans",
      "group": "bonfire-hosting",
      "method": "GET",
      "path": "/bonfire/hosting/plans",
      "auth": "none",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "hosting_unavailable"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/bonfire-hosting.js:41",
      "legacy": false
    },
    {
      "operationId": "get_bonfire_hosting_slug_by_slug",
      "group": "bonfire-hosting",
      "method": "GET",
      "path": "/bonfire/hosting/slug/:slug",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "slug",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "hosting_unavailable"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/bonfire-hosting.js:45",
      "legacy": false
    },
    {
      "operationId": "post_bonfire_hosting_servers",
      "group": "bonfire-hosting",
      "method": "POST",
      "path": "/bonfire/hosting/servers",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [],
      "query": [],
      "body": [
        "slug",
        "name",
        "plan",
        "weeks",
        "restore_backup"
      ],
      "files": [],
      "errors": [
        "backup_not_found",
        "busy",
        "hostd_unreachable",
        "hosting_failed",
        "hosting_unavailable",
        "insufficient_balance",
        "insufficient_scope",
        "invalid_plan",
        "invalid_weeks",
        "slug_taken",
        "starter_limit_reached"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/bonfire-hosting.js:91",
      "legacy": false
    },
    {
      "operationId": "get_bonfire_hosting_servers",
      "group": "bonfire-hosting",
      "method": "GET",
      "path": "/bonfire/hosting/servers",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "hosting_unavailable"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/bonfire-hosting.js:154",
      "legacy": false
    },
    {
      "operationId": "get_bonfire_hosting_servers_by_url",
      "group": "bonfire-hosting",
      "method": "GET",
      "path": "/bonfire/hosting/servers/by-url",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [],
      "query": [
        "url"
      ],
      "body": [],
      "files": [],
      "errors": [
        "hostd_unreachable",
        "hosting_unavailable",
        "not_found"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/bonfire-hosting.js:162",
      "legacy": false
    },
    {
      "operationId": "post_bonfire_hosting_servers_by_slug_weeks",
      "group": "bonfire-hosting",
      "method": "POST",
      "path": "/bonfire/hosting/servers/:slug/weeks",
      "auth": "bearer",
      "scopes": [],
      "params": [
        {
          "name": "slug",
          "optional": false
        }
      ],
      "query": [],
      "body": [
        "weeks"
      ],
      "files": [],
      "errors": [
        "hostd_unreachable",
        "hosting_failed",
        "hosting_unavailable",
        "insufficient_balance",
        "insufficient_scope",
        "invalid_weeks",
        "not_found",
        "pro_covers",
        "suspended"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/bonfire-hosting.js:183",
      "legacy": false
    },
    {
      "operationId": "patch_bonfire_hosting_servers_by_slug",
      "group": "bonfire-hosting",
      "method": "PATCH",
      "path": "/bonfire/hosting/servers/:slug",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "slug",
          "optional": false
        }
      ],
      "query": [],
      "body": [
        "plan"
      ],
      "files": [],
      "errors": [
        "hostd_unreachable",
        "hosting_failed",
        "hosting_unavailable",
        "invalid_plan",
        "not_found",
        "starter_limit_reached",
        "suspended",
        "use_weeks"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/bonfire-hosting.js:210",
      "legacy": false
    },
    {
      "operationId": "post_bonfire_hosting_servers_by_slug_restart",
      "group": "bonfire-hosting",
      "method": "POST",
      "path": "/bonfire/hosting/servers/:slug/restart",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "slug",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "hostd_unreachable",
        "hosting_failed",
        "hosting_unavailable",
        "not_found",
        "suspended"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/bonfire-hosting.js:225",
      "legacy": false
    },
    {
      "operationId": "post_bonfire_hosting_backups_upload",
      "group": "bonfire-hosting",
      "method": "POST",
      "path": "/bonfire/hosting/backups/upload",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [],
      "query": [],
      "body": [
        "name",
        "url",
        "slug"
      ],
      "files": [
        "file"
      ],
      "errors": [
        "file_too_large",
        "hosting_unavailable",
        "invalid_instance",
        "invalid_multipart",
        "invalid_name",
        "invalid_slug",
        "no_file"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/bonfire-hosting.js:236",
      "legacy": false
    },
    {
      "operationId": "post_bonfire_hosting_servers_by_slug_backup",
      "group": "bonfire-hosting",
      "method": "POST",
      "path": "/bonfire/hosting/servers/:slug/backup",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "slug",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "backup_failed",
        "hostd_unreachable",
        "hosting_unavailable",
        "not_found",
        "nothing_to_back_up"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/bonfire-hosting.js:266",
      "legacy": false
    },
    {
      "operationId": "get_bonfire_hosting_backups",
      "group": "bonfire-hosting",
      "method": "GET",
      "path": "/bonfire/hosting/backups",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "hosting_unavailable"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/bonfire-hosting.js:273",
      "legacy": false
    },
    {
      "operationId": "get_bonfire_hosting_backups_by_id_download",
      "group": "bonfire-hosting",
      "method": "GET",
      "path": "/bonfire/hosting/backups/:id/download",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "id",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "hosting_unavailable",
        "not_found"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/bonfire-hosting.js:282",
      "legacy": false
    },
    {
      "operationId": "delete_bonfire_hosting_backups_by_id",
      "group": "bonfire-hosting",
      "method": "DELETE",
      "path": "/bonfire/hosting/backups/:id",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "id",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "hosting_unavailable",
        "not_found"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/bonfire-hosting.js:288",
      "legacy": false
    },
    {
      "operationId": "delete_bonfire_hosting_servers_by_slug",
      "group": "bonfire-hosting",
      "method": "DELETE",
      "path": "/bonfire/hosting/servers/:slug",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "slug",
          "optional": false
        }
      ],
      "query": [],
      "body": [
        "confirm"
      ],
      "files": [],
      "errors": [
        "backup_failed",
        "confirm_required",
        "hostd_unreachable",
        "hosting_failed",
        "hosting_unavailable",
        "not_found"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/bonfire-hosting.js:291",
      "legacy": false
    },
    {
      "operationId": "get_admin_maintenance",
      "group": "maintenance",
      "method": "GET",
      "path": "/admin/maintenance",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": true,
      "captcha": false,
      "source": "maintenance.js:87",
      "legacy": false
    },
    {
      "operationId": "put_admin_maintenance",
      "group": "maintenance",
      "method": "PUT",
      "path": "/admin/maintenance",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "invalid_message",
        "invalid_on",
        "server_error"
      ],
      "notes": "",
      "staffOnly": true,
      "captcha": false,
      "source": "maintenance.js:88",
      "legacy": false
    },
    {
      "operationId": "post_admin_maintenance_bypass",
      "group": "maintenance",
      "method": "POST",
      "path": "/admin/maintenance/bypass",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": true,
      "captcha": false,
      "source": "maintenance.js:99",
      "legacy": false
    },
    {
      "operationId": "post_auth_ext_code",
      "group": "auth",
      "method": "POST",
      "path": "/auth/ext-code",
      "auth": "none",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [
        "permissions_integer",
        "project_name"
      ],
      "files": [],
      "errors": [
        "reserved_project_name"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/auth.js:97",
      "legacy": false
    },
    {
      "operationId": "get_auth_ext_code_heartbeat",
      "group": "auth",
      "method": "GET",
      "path": "/auth/ext-code/heartbeat",
      "auth": "none",
      "scopes": [],
      "params": [],
      "query": [
        "code"
      ],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/auth.js:125",
      "legacy": false
    },
    {
      "operationId": "get_auth_ext_code_info",
      "group": "auth",
      "method": "GET",
      "path": "/auth/ext-code/info",
      "auth": "none",
      "scopes": [],
      "params": [],
      "query": [
        "code"
      ],
      "body": [],
      "files": [],
      "errors": [
        "invalid_or_expired_code",
        "missing_code"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/auth.js:133",
      "legacy": false
    },
    {
      "operationId": "post_auth_ext_code_complete",
      "group": "auth",
      "method": "POST",
      "path": "/auth/ext-code/complete",
      "auth": "none",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [
        "code",
        "granted_scopes",
        "token"
      ],
      "files": [],
      "errors": [
        "invalid_granted_scopes",
        "invalid_or_expired_code",
        "invalid_token",
        "missing_fields"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/auth.js:155",
      "legacy": false
    },
    {
      "operationId": "get_auth_ext_code_status",
      "group": "auth",
      "method": "GET",
      "path": "/auth/ext-code/status",
      "auth": "none",
      "scopes": [],
      "params": [],
      "query": [
        "code"
      ],
      "body": [],
      "files": [],
      "errors": [
        "invalid_or_expired_code",
        "missing_code"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/auth.js:190",
      "legacy": false
    },
    {
      "operationId": "post_auth_register",
      "group": "auth",
      "method": "POST",
      "path": "/auth/register",
      "auth": "none",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [
        "email",
        "password",
        "tos_accepted",
        "username",
        "captcha_token"
      ],
      "files": [],
      "errors": [
        "invalid_email",
        "invalid_username",
        "ip_banned",
        "missing_fields",
        "password_too_short",
        "server_error",
        "tos_not_accepted",
        "username_or_email_taken"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": true,
      "source": "routes/auth.js:294",
      "legacy": false
    },
    {
      "operationId": "post_auth_register_verify",
      "group": "auth",
      "method": "POST",
      "path": "/auth/register/verify",
      "auth": "none",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [
        "code",
        "email"
      ],
      "files": [],
      "errors": [
        "invalid_code",
        "invalid_or_expired_code",
        "missing_fields",
        "server_error",
        "too_many_attempts",
        "username_or_email_taken"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/auth.js:367",
      "legacy": false
    },
    {
      "operationId": "post_auth_register_verify_link",
      "group": "auth",
      "method": "POST",
      "path": "/auth/register/verify-link",
      "auth": "none",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [
        "token"
      ],
      "files": [],
      "errors": [
        "invalid_or_expired_link",
        "missing_fields",
        "server_error"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/auth.js:408",
      "legacy": false
    },
    {
      "operationId": "post_auth_register_status",
      "group": "auth",
      "method": "POST",
      "path": "/auth/register/status",
      "auth": "none",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [
        "claim_token",
        "email",
        "verify_token"
      ],
      "files": [],
      "errors": [
        "expired",
        "missing_fields",
        "not_authorized",
        "not_found",
        "server_error",
        "username_or_email_taken"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/auth.js:438",
      "legacy": false
    },
    {
      "operationId": "post_auth_register_resend",
      "group": "auth",
      "method": "POST",
      "path": "/auth/register/resend",
      "auth": "none",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [
        "email",
        "captcha_token"
      ],
      "files": [],
      "errors": [
        "missing_fields",
        "not_found",
        "server_error"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": true,
      "source": "routes/auth.js:472",
      "legacy": false
    },
    {
      "operationId": "post_auth_login",
      "group": "auth",
      "method": "POST",
      "path": "/auth/login",
      "auth": "none",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [
        "password",
        "username",
        "captcha_token"
      ],
      "files": [],
      "errors": [
        "account_banned",
        "account_suspended",
        "invalid_credentials",
        "ip_banned",
        "missing_fields",
        "no_password_set",
        "server_error"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": true,
      "source": "routes/auth.js:501",
      "legacy": false
    },
    {
      "operationId": "post_auth_verify_new_ip",
      "group": "auth",
      "method": "POST",
      "path": "/auth/verify-new-ip",
      "auth": "none",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [
        "pending_id"
      ],
      "files": [],
      "errors": [
        "expired_or_invalid",
        "server_error",
        "user_not_found"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/auth.js:625",
      "legacy": false
    },
    {
      "operationId": "post_auth_verify_email_link",
      "group": "auth",
      "method": "POST",
      "path": "/auth/verify-email-link",
      "auth": "none",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [
        "token"
      ],
      "files": [],
      "errors": [
        "invalid_or_expired_link",
        "missing_fields",
        "server_error"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/auth.js:679",
      "legacy": false
    },
    {
      "operationId": "post_auth_verify_ip_link",
      "group": "auth",
      "method": "POST",
      "path": "/auth/verify-ip-link",
      "auth": "none",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [
        "token"
      ],
      "files": [],
      "errors": [
        "invalid_or_expired_link",
        "missing_fields",
        "server_error"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/auth.js:700",
      "legacy": false
    },
    {
      "operationId": "post_auth_resend_new_ip",
      "group": "auth",
      "method": "POST",
      "path": "/auth/resend-new-ip",
      "auth": "none",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [
        "pending_id",
        "captcha_token"
      ],
      "files": [],
      "errors": [
        "expired_or_invalid",
        "no_email",
        "server_error"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": true,
      "source": "routes/auth.js:718",
      "legacy": false
    },
    {
      "operationId": "post_auth_validate",
      "group": "auth",
      "method": "POST",
      "path": "/auth/validate",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [
        "token"
      ],
      "files": [],
      "errors": [
        "invalid_token",
        "server_error"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/auth.js:742",
      "legacy": false
    },
    {
      "operationId": "post_auth_accept_tos",
      "group": "auth",
      "method": "POST",
      "path": "/auth/accept-tos",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [
        "version"
      ],
      "files": [],
      "errors": [
        "invalid_tos_version",
        "server_error"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/auth.js:772",
      "legacy": false
    },
    {
      "operationId": "post_auth_logout",
      "group": "auth",
      "method": "POST",
      "path": "/auth/logout",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/auth.js:794",
      "legacy": false
    },
    {
      "operationId": "post_auth_set_email",
      "group": "auth",
      "method": "POST",
      "path": "/auth/set-email",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [
        "email"
      ],
      "files": [],
      "errors": [
        "email_taken",
        "server_error"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/auth.js:801",
      "legacy": false
    },
    {
      "operationId": "post_auth_verify_email",
      "group": "auth",
      "method": "POST",
      "path": "/auth/verify-email",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "server_error",
        "user_not_found"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/auth.js:821",
      "legacy": false
    },
    {
      "operationId": "post_auth_resend_verification",
      "group": "auth",
      "method": "POST",
      "path": "/auth/resend-verification",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [
        "captcha_token"
      ],
      "files": [],
      "errors": [
        "already_verified",
        "no_email",
        "server_error"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": true,
      "source": "routes/auth.js:834",
      "legacy": false
    },
    {
      "operationId": "delete_auth_sessions_by_sessionid",
      "group": "auth",
      "method": "DELETE",
      "path": "/auth/sessions/:sessionId",
      "auth": "bearer",
      "scopes": [],
      "params": [
        {
          "name": "sessionId",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "server_error"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/auth.js:851",
      "legacy": false
    },
    {
      "operationId": "get_auth_sessions",
      "group": "auth",
      "method": "GET",
      "path": "/auth/sessions",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "server_error"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/auth.js:865",
      "legacy": false
    },
    {
      "operationId": "get_auth_login_history",
      "group": "auth",
      "method": "GET",
      "path": "/auth/login-history",
      "auth": "bearer",
      "scopes": [
        "PROFILE_SENSITIVE"
      ],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "server_error"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/auth.js:879",
      "legacy": false
    },
    {
      "operationId": "post_auth_forgot_password",
      "group": "auth",
      "method": "POST",
      "path": "/auth/forgot-password",
      "auth": "none",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [
        "email",
        "captcha_token"
      ],
      "files": [],
      "errors": [
        "missing_email",
        "server_error"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": true,
      "source": "routes/auth.js:895",
      "legacy": false
    },
    {
      "operationId": "post_auth_reset_password",
      "group": "auth",
      "method": "POST",
      "path": "/auth/reset-password",
      "auth": "none",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [
        "password",
        "token",
        "captcha_token"
      ],
      "files": [],
      "errors": [
        "invalid_input",
        "invalid_or_expired_token",
        "server_error"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": true,
      "source": "routes/auth.js:921",
      "legacy": false
    },
    {
      "operationId": "get_auth_oauth_providers",
      "group": "oauth",
      "method": "GET",
      "path": "/auth/oauth/providers",
      "auth": "none",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "Client-specific protocol. See the integration guide before using this endpoint.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/oauth.js:133",
      "legacy": false
    },
    {
      "operationId": "get_auth_oauth_by_p_start",
      "group": "oauth",
      "method": "GET",
      "path": "/auth/oauth/:p/start",
      "auth": "none",
      "scopes": [],
      "params": [
        {
          "name": "p",
          "optional": false
        }
      ],
      "query": [
        "ret"
      ],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "Client-specific protocol. See the integration guide before using this endpoint.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/oauth.js:137",
      "legacy": false
    },
    {
      "operationId": "post_auth_oauth_by_p_link",
      "group": "oauth",
      "method": "POST",
      "path": "/auth/oauth/:p/link",
      "auth": "bearer",
      "scopes": [],
      "params": [
        {
          "name": "p",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "unknown_provider"
      ],
      "notes": "Client-specific protocol. See the integration guide before using this endpoint.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/oauth.js:145",
      "legacy": false
    },
    {
      "operationId": "get_auth_oauth_by_p_callback",
      "group": "oauth",
      "method": "GET",
      "path": "/auth/oauth/:p/callback",
      "auth": "none",
      "scopes": [],
      "params": [
        {
          "name": "p",
          "optional": false
        }
      ],
      "query": [
        "code",
        "error",
        "state"
      ],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "Client-specific protocol. See the integration guide before using this endpoint.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/oauth.js:153",
      "legacy": false
    },
    {
      "operationId": "post_auth_oauth_exchange",
      "group": "oauth",
      "method": "POST",
      "path": "/auth/oauth/exchange",
      "auth": "none",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [
        "code"
      ],
      "files": [],
      "errors": [
        "account_banned",
        "account_suspended",
        "ip_banned",
        "oauth_expired",
        "oauth_no_email",
        "password_required",
        "user_not_found"
      ],
      "notes": "Client-specific protocol. See the integration guide before using this endpoint.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/oauth.js:212",
      "legacy": false
    },
    {
      "operationId": "post_auth_oauth_signup",
      "group": "oauth",
      "method": "POST",
      "path": "/auth/oauth/signup",
      "auth": "none",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [
        "code",
        "tos_accepted",
        "username"
      ],
      "files": [],
      "errors": [
        "account_banned",
        "account_suspended",
        "already_linked",
        "email_taken",
        "invalid_username",
        "ip_banned",
        "oauth_expired",
        "oauth_no_email",
        "password_required",
        "server_error",
        "tos_not_accepted",
        "user_not_found",
        "username_taken"
      ],
      "notes": "Client-specific protocol. See the integration guide before using this endpoint.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/oauth.js:232",
      "legacy": false
    },
    {
      "operationId": "get_auth_oauth_linked",
      "group": "oauth",
      "method": "GET",
      "path": "/auth/oauth/linked",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "Client-specific protocol. See the integration guide before using this endpoint.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/oauth.js:273",
      "legacy": false
    },
    {
      "operationId": "patch_auth_oauth_by_p",
      "group": "oauth",
      "method": "PATCH",
      "path": "/auth/oauth/:p",
      "auth": "bearer",
      "scopes": [],
      "params": [
        {
          "name": "p",
          "optional": false
        }
      ],
      "query": [],
      "body": [
        "show"
      ],
      "files": [],
      "errors": [
        "not_linked"
      ],
      "notes": "Client-specific protocol. See the integration guide before using this endpoint.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/oauth.js:283",
      "legacy": false
    },
    {
      "operationId": "delete_auth_oauth_by_p",
      "group": "oauth",
      "method": "DELETE",
      "path": "/auth/oauth/:p",
      "auth": "bearer",
      "scopes": [],
      "params": [
        {
          "name": "p",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "last_login_method",
        "not_linked"
      ],
      "notes": "Client-specific protocol. See the integration guide before using this endpoint.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/oauth.js:289",
      "legacy": false
    },
    {
      "operationId": "post_auth_child_token",
      "group": "child-tokens",
      "method": "POST",
      "path": "/auth/child-token",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [
        "project",
        "scopes"
      ],
      "files": [],
      "errors": [
        "bad_project",
        "no_scopes",
        "not_a_launcher"
      ],
      "notes": "Client-specific protocol. See the integration guide before using this endpoint.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/childtoken.js:15",
      "legacy": false
    },
    {
      "operationId": "get_bonfire_app_login",
      "group": "desktop-sign-in",
      "method": "GET",
      "path": "/bonfire/app-login",
      "auth": "none",
      "scopes": [],
      "params": [],
      "query": [
        "client",
        "done",
        "state"
      ],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "Browser entry point of the official apps: ?state=STATE (16 to 128 URL-safe characters) and client=web|desktop|android. Redirects to the Nookara consent screen.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/bonfire-app.js:30",
      "legacy": false
    },
    {
      "operationId": "get_bonfire_scopes_json",
      "group": "desktop-sign-in",
      "method": "GET",
      "path": "/bonfire/scopes.json",
      "auth": "none",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "Public. What the official Ember apps ask for: {version, scopes: [{id, bit, required: false, since, name, reason}], permissions_integer, ...}. Nothing is required; every scope is the person's choice.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/bonfire-app.js:46",
      "legacy": false
    },
    {
      "operationId": "get_bonfire_session",
      "group": "desktop-sign-in",
      "method": "GET",
      "path": "/bonfire/session",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "Any token. Compares the token with what Ember asks for: {granted, effective, disabled, not_granted: [...]}. Informational: not_granted never blocks. Also works as a general \"which scopes did I get?\" call.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/bonfire-app.js:55",
      "legacy": false
    },
    {
      "operationId": "post_bonfire_app_exchange",
      "group": "desktop-sign-in",
      "method": "POST",
      "path": "/bonfire/app-exchange",
      "auth": "none",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [
        "code",
        "state"
      ],
      "files": [],
      "errors": [
        "invalid_code",
        "not_allowed",
        "rate_limited",
        "server_error"
      ],
      "notes": "Official apps: body {code, state} returns {token, username, scopes, version}. One try per code.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/bonfire-app.js:70",
      "legacy": false
    },
    {
      "operationId": "post_bonfire_replace_token",
      "group": "desktop-sign-in",
      "method": "POST",
      "path": "/bonfire/replace-token",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [
        "old"
      ],
      "files": [],
      "errors": [
        "server_error"
      ],
      "notes": "Official apps: revokes the app token that was replaced after a new sign-in.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/bonfire-app.js:84",
      "legacy": false
    },
    {
      "operationId": "post_bonfire_sign_out",
      "group": "desktop-sign-in",
      "method": "POST",
      "path": "/bonfire/sign-out",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "server_error"
      ],
      "notes": "Official apps: revokes the calling Ember app token (never a website session).",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/bonfire-app.js:95",
      "legacy": false
    },
    {
      "operationId": "post_bonfire_app_code",
      "group": "desktop-sign-in",
      "method": "POST",
      "path": "/bonfire/app-code",
      "auth": "none",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "login_again"
      ],
      "notes": "Gone (410 login_again). Apps now sign in through the consent screen.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/bonfire-app.js:104",
      "legacy": false
    },
    {
      "operationId": "get_account_me",
      "group": "account",
      "method": "GET",
      "path": "/account/me",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "server_error"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/account.js:60",
      "legacy": false
    },
    {
      "operationId": "post_account_change_username",
      "group": "account",
      "method": "POST",
      "path": "/account/change-username",
      "auth": "bearer",
      "scopes": [
        "ACCOUNT_WRITE"
      ],
      "params": [],
      "query": [],
      "body": [
        "username"
      ],
      "files": [],
      "errors": [
        "invalid_username",
        "no_free_rename",
        "same_username",
        "username_taken"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/account.js:170",
      "legacy": false
    },
    {
      "operationId": "post_account_onboarding_complete",
      "group": "account",
      "method": "POST",
      "path": "/account/onboarding/complete",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/account.js:209",
      "legacy": false
    },
    {
      "operationId": "get_account_export",
      "group": "account",
      "method": "GET",
      "path": "/account/export",
      "auth": "bearer",
      "scopes": [
        "PROFILE_SENSITIVE"
      ],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "server_error"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/account.js:230",
      "legacy": false
    },
    {
      "operationId": "delete_account_sessions_by_tokenid",
      "group": "account",
      "method": "DELETE",
      "path": "/account/sessions/:tokenId",
      "auth": "bearer",
      "scopes": [],
      "params": [
        {
          "name": "tokenId",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "cannot_revoke_current_session"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/account.js:363",
      "legacy": false
    },
    {
      "operationId": "get_account_search",
      "group": "account",
      "method": "GET",
      "path": "/account/search",
      "auth": "none",
      "scopes": [],
      "params": [],
      "query": [
        "q"
      ],
      "body": [],
      "files": [],
      "errors": [
        "rate_limited"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/account.js:375",
      "legacy": false
    },
    {
      "operationId": "get_account_lookup_by_username",
      "group": "account",
      "method": "GET",
      "path": "/account/lookup/:username",
      "auth": "none",
      "scopes": [],
      "params": [
        {
          "name": "username",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "not_found"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/account.js:406",
      "legacy": false
    },
    {
      "operationId": "get_account_blocks",
      "group": "account",
      "method": "GET",
      "path": "/account/blocks",
      "auth": "bearer",
      "scopes": [
        "FRIENDS_READ"
      ],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "The accounts YOU blocked: {blocks:[{username,pfp_url,color,created_at}]}. Blocking is mutual in effect (neither of you can see or interact with the other) but only the blocker sees or removes it.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/account.js:376",
      "legacy": false
    },
    {
      "operationId": "post_account_blocks",
      "group": "account",
      "method": "POST",
      "path": "/account/blocks",
      "auth": "bearer",
      "scopes": [
        "FRIENDS_MANAGE"
      ],
      "params": [],
      "query": [],
      "body": [
        "username"
      ],
      "files": [],
      "errors": [
        "cannot_block_self",
        "cannot_block_staff",
        "missing_fields",
        "user_not_found"
      ],
      "notes": "Block an account. Removes any friendship and pending friend requests between you, ends DM calls, and stops profiles, DMs, calls, payments and presence between the two of you. Staff (owner, admin, mod) cannot be blocked. Returns {success, blocked}.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/account.js:380",
      "legacy": false
    },
    {
      "operationId": "delete_account_blocks_by_username",
      "group": "account",
      "method": "DELETE",
      "path": "/account/blocks/:username",
      "auth": "bearer",
      "scopes": [
        "FRIENDS_MANAGE"
      ],
      "params": [
        {
          "name": "username",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "user_not_found"
      ],
      "notes": "Unblock. Only the account that blocked can. Returns {success, was_blocked}.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/account.js:396",
      "legacy": false
    },
    {
      "operationId": "get_account_dm_privacy",
      "group": "account",
      "method": "GET",
      "path": "/account/dm-privacy",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "Your 'who can DM you' setting: {dm_privacy:'everyone'|'friends'|'servers', options}. The same value as the Ember chat setting dm_privacy (GET /chat/settings). everyone = anyone (default), friends = friends only, servers = friends plus people who share an Ember server with you. Nookara staff and bots always get through.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/account.js:409",
      "legacy": false
    },
    {
      "operationId": "patch_account_dm_privacy",
      "group": "account",
      "method": "PATCH",
      "path": "/account/dm-privacy",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [],
      "query": [],
      "body": [
        "dm_privacy"
      ],
      "files": [],
      "errors": [
        "invalid_dm_privacy"
      ],
      "notes": "Set who can DM you: {dm_privacy:'everyone'|'friends'|'servers'}. Applies to starting a DM, sending DM messages (POST /im/send, im_send) and DM calls; a sender it blocks gets error dm_privacy (403, 'Failed to send this message due to the users privacy settings'). Staff and bots bypass. Returns {success, dm_privacy}.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/account.js:414",
      "legacy": false
    },
    {
      "operationId": "get_account_notices",
      "group": "account",
      "method": "GET",
      "path": "/account/notices",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "One-time account notices (\"what's new\" popups) this account hasn't dismissed yet: {notices:[id,...]}, e.g. ['privacy-settings-2026-10']. Some notices only go to accounts created before a cutoff. Clients show each id once and then call POST /account/notices/:id/seen.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/account.js:424",
      "legacy": false
    },
    {
      "operationId": "post_account_notices_by_id_seen",
      "group": "account",
      "method": "POST",
      "path": "/account/notices/:id/seen",
      "auth": "bearer",
      "scopes": [],
      "params": [
        "id"
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "unknown_notice"
      ],
      "notes": "Dismiss a one-time account notice for this account everywhere (the dashboard and every Ember client). Idempotent. Returns {success:true}; 404 unknown_notice for an id that doesn't exist.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/account.js:428",
      "legacy": false
    },
    {
      "operationId": "patch_account_update",
      "group": "account",
      "method": "PATCH",
      "path": "/account/update",
      "auth": "bearer",
      "scopes": [
        "ACCOUNT_WRITE"
      ],
      "params": [],
      "query": [],
      "body": [
        "bio",
        "timezone",
        "country_code",
        "color",
        "profile_visibility",
        "website"
      ],
      "files": [],
      "errors": [
        "bio_too_long",
        "invalid_pronouns",
        "invalid_visibility",
        "invalid_website",
        "no_fields"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/account.js:452",
      "legacy": false
    },
    {
      "operationId": "post_account_change_password",
      "group": "account",
      "method": "POST",
      "path": "/account/change-password",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [
        "password"
      ],
      "files": [],
      "errors": [
        "password_too_short",
        "server_error"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/account.js:510",
      "legacy": false
    },
    {
      "operationId": "delete_account_me",
      "group": "account",
      "method": "DELETE",
      "path": "/account/me",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [
        "password"
      ],
      "files": [],
      "errors": [
        "invalid_password",
        "missing_password",
        "owner_cannot_delete",
        "server_error",
        "subscription_active",
        "user_not_found"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/account.js:530",
      "legacy": false
    },
    {
      "operationId": "get_account_cursor_ticket",
      "group": "account",
      "method": "GET",
      "path": "/account/cursor-ticket",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "unavailable"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/account.js:582",
      "legacy": false
    },
    {
      "operationId": "get_storage_info_usage",
      "group": "storage",
      "method": "GET",
      "path": "/storage/info/usage",
      "auth": "bearer",
      "scopes": [
        "STORAGE_READ"
      ],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/storage.js:33",
      "legacy": false
    },
    {
      "operationId": "get_storage_by_storageid",
      "group": "storage",
      "method": "GET",
      "path": "/storage/:storageId",
      "auth": "bearer",
      "scopes": [
        "STORAGE_READ"
      ],
      "params": [
        {
          "name": "storageId",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/storage.js:48",
      "legacy": false
    },
    {
      "operationId": "get_storage_by_storageid_keys",
      "group": "storage",
      "method": "GET",
      "path": "/storage/:storageId/keys",
      "auth": "bearer",
      "scopes": [
        "STORAGE_READ"
      ],
      "params": [
        {
          "name": "storageId",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/storage.js:59",
      "legacy": false
    },
    {
      "operationId": "get_storage_by_storageid_values",
      "group": "storage",
      "method": "GET",
      "path": "/storage/:storageId/values",
      "auth": "bearer",
      "scopes": [
        "STORAGE_READ"
      ],
      "params": [
        {
          "name": "storageId",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/storage.js:68",
      "legacy": false
    },
    {
      "operationId": "get_storage_by_storageid_by_key",
      "group": "storage",
      "method": "GET",
      "path": "/storage/:storageId/:key",
      "auth": "bearer",
      "scopes": [
        "STORAGE_READ"
      ],
      "params": [
        {
          "name": "storageId",
          "optional": false
        },
        {
          "name": "key",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "key_not_found"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/storage.js:77",
      "legacy": false
    },
    {
      "operationId": "put_storage_by_storageid_by_key",
      "group": "storage",
      "method": "PUT",
      "path": "/storage/:storageId/:key",
      "auth": "bearer",
      "scopes": [
        "STORAGE_WRITE"
      ],
      "params": [
        {
          "name": "storageId",
          "optional": false
        },
        {
          "name": "key",
          "optional": false
        }
      ],
      "query": [],
      "body": [
        "value"
      ],
      "files": [],
      "errors": [
        "missing_value",
        "storage_limit_exceeded"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/storage.js:87",
      "legacy": false
    },
    {
      "operationId": "delete_storage_by_storageid_by_key",
      "group": "storage",
      "method": "DELETE",
      "path": "/storage/:storageId/:key",
      "auth": "bearer",
      "scopes": [
        "STORAGE_WRITE"
      ],
      "params": [
        {
          "name": "storageId",
          "optional": false
        },
        {
          "name": "key",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/storage.js:115",
      "legacy": false
    },
    {
      "operationId": "delete_storage_by_storageid",
      "group": "storage",
      "method": "DELETE",
      "path": "/storage/:storageId",
      "auth": "bearer",
      "scopes": [
        "STORAGE_WRITE"
      ],
      "params": [
        {
          "name": "storageId",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/storage.js:124",
      "legacy": false
    },
    {
      "operationId": "get_storage_info_info_usage",
      "group": "storage",
      "method": "GET",
      "path": "/storage-info/info/usage",
      "auth": "bearer",
      "scopes": [
        "STORAGE_READ"
      ],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/storage.js:33",
      "legacy": false
    },
    {
      "operationId": "get_storage_info_by_storageid",
      "group": "storage",
      "method": "GET",
      "path": "/storage-info/:storageId",
      "auth": "bearer",
      "scopes": [
        "STORAGE_READ"
      ],
      "params": [
        {
          "name": "storageId",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/storage.js:48",
      "legacy": false
    },
    {
      "operationId": "get_storage_info_by_storageid_keys",
      "group": "storage",
      "method": "GET",
      "path": "/storage-info/:storageId/keys",
      "auth": "bearer",
      "scopes": [
        "STORAGE_READ"
      ],
      "params": [
        {
          "name": "storageId",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/storage.js:59",
      "legacy": false
    },
    {
      "operationId": "get_storage_info_by_storageid_values",
      "group": "storage",
      "method": "GET",
      "path": "/storage-info/:storageId/values",
      "auth": "bearer",
      "scopes": [
        "STORAGE_READ"
      ],
      "params": [
        {
          "name": "storageId",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/storage.js:68",
      "legacy": false
    },
    {
      "operationId": "get_storage_info_by_storageid_by_key",
      "group": "storage",
      "method": "GET",
      "path": "/storage-info/:storageId/:key",
      "auth": "bearer",
      "scopes": [
        "STORAGE_READ"
      ],
      "params": [
        {
          "name": "storageId",
          "optional": false
        },
        {
          "name": "key",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "key_not_found"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/storage.js:77",
      "legacy": false
    },
    {
      "operationId": "put_storage_info_by_storageid_by_key",
      "group": "storage",
      "method": "PUT",
      "path": "/storage-info/:storageId/:key",
      "auth": "bearer",
      "scopes": [
        "STORAGE_WRITE"
      ],
      "params": [
        {
          "name": "storageId",
          "optional": false
        },
        {
          "name": "key",
          "optional": false
        }
      ],
      "query": [],
      "body": [
        "value"
      ],
      "files": [],
      "errors": [
        "missing_value",
        "storage_limit_exceeded"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/storage.js:87",
      "legacy": false
    },
    {
      "operationId": "delete_storage_info_by_storageid_by_key",
      "group": "storage",
      "method": "DELETE",
      "path": "/storage-info/:storageId/:key",
      "auth": "bearer",
      "scopes": [
        "STORAGE_WRITE"
      ],
      "params": [
        {
          "name": "storageId",
          "optional": false
        },
        {
          "name": "key",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/storage.js:115",
      "legacy": false
    },
    {
      "operationId": "delete_storage_info_by_storageid",
      "group": "storage",
      "method": "DELETE",
      "path": "/storage-info/:storageId",
      "auth": "bearer",
      "scopes": [
        "STORAGE_WRITE"
      ],
      "params": [
        {
          "name": "storageId",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/storage.js:124",
      "legacy": false
    },
    {
      "operationId": "post_im_send",
      "group": "instant-messages",
      "method": "POST",
      "path": "/im/send",
      "auth": "bearer",
      "scopes": [
        "VMAIL_SEND"
      ],
      "params": [],
      "query": [],
      "body": [
        "message",
        "status_reply",
        "to"
      ],
      "files": [],
      "errors": [
        "cannot_dm_bot",
        "cannot_reply_own_status",
        "dm_privacy",
        "message_too_long",
        "missing_fields",
        "status_changed",
        "too_many_recipients",
        "user_blocked",
        "user_not_found"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/mail.js:200",
      "legacy": false
    },
    {
      "operationId": "get_im_status_reply_by_username",
      "group": "instant-messages",
      "method": "GET",
      "path": "/im/status-reply/:username",
      "auth": "bearer",
      "scopes": [],
      "params": [
        {
          "name": "username",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/mail.js:223",
      "legacy": false
    },
    {
      "operationId": "get_im_conversations",
      "group": "instant-messages",
      "method": "GET",
      "path": "/im/conversations",
      "auth": "bearer",
      "scopes": [
        "VMAIL_READ"
      ],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/mail.js:237",
      "legacy": false
    },
    {
      "operationId": "get_im_with_by_username",
      "group": "instant-messages",
      "method": "GET",
      "path": "/im/with/:username",
      "auth": "bearer",
      "scopes": [
        "VMAIL_READ"
      ],
      "params": [
        {
          "name": "username",
          "optional": false
        }
      ],
      "query": [
        "before",
        "limit"
      ],
      "body": [],
      "files": [],
      "errors": [
        "user_not_found"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/mail.js:268",
      "legacy": false
    },
    {
      "operationId": "post_im_with_by_username_read",
      "group": "instant-messages",
      "method": "POST",
      "path": "/im/with/:username/read",
      "auth": "bearer",
      "scopes": [
        "VMAIL_READ"
      ],
      "params": [
        {
          "name": "username",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/mail.js:295",
      "legacy": false
    },
    {
      "operationId": "get_im",
      "group": "instant-messages",
      "method": "GET",
      "path": "/im",
      "auth": "bearer",
      "scopes": [
        "VMAIL_READ"
      ],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/mail.js:316",
      "legacy": false
    },
    {
      "operationId": "get_im_inbox",
      "group": "instant-messages",
      "method": "GET",
      "path": "/im/inbox",
      "auth": "bearer",
      "scopes": [
        "VMAIL_READ"
      ],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/mail.js:317",
      "legacy": false
    },
    {
      "operationId": "get_im_sent",
      "group": "instant-messages",
      "method": "GET",
      "path": "/im/sent",
      "auth": "bearer",
      "scopes": [
        "VMAIL_READ"
      ],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/mail.js:320",
      "legacy": false
    },
    {
      "operationId": "get_im_unread_count",
      "group": "instant-messages",
      "method": "GET",
      "path": "/im/unread-count",
      "auth": "bearer",
      "scopes": [
        "VMAIL_READ"
      ],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/mail.js:329",
      "legacy": false
    },
    {
      "operationId": "patch_im_by_id_read",
      "group": "instant-messages",
      "method": "PATCH",
      "path": "/im/:id/read",
      "auth": "bearer",
      "scopes": [
        "VMAIL_READ"
      ],
      "params": [
        {
          "name": "id",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/mail.js:338",
      "legacy": false
    },
    {
      "operationId": "patch_im_by_id_edit",
      "group": "instant-messages",
      "method": "PATCH",
      "path": "/im/:id/edit",
      "auth": "bearer",
      "scopes": [
        "VMAIL_SEND"
      ],
      "params": [
        {
          "name": "id",
          "optional": false
        }
      ],
      "query": [],
      "body": [
        "body"
      ],
      "files": [],
      "errors": [
        "message_not_found",
        "message_too_long",
        "missing_fields"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/mail.js:347",
      "legacy": false
    },
    {
      "operationId": "delete_im_by_id",
      "group": "instant-messages",
      "method": "DELETE",
      "path": "/im/:id",
      "auth": "bearer",
      "scopes": [
        "VMAIL_SEND"
      ],
      "params": [
        {
          "name": "id",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/mail.js:360",
      "legacy": false
    },
    {
      "operationId": "delete_im",
      "group": "instant-messages",
      "method": "DELETE",
      "path": "/im",
      "auth": "bearer",
      "scopes": [
        "VMAIL_SEND"
      ],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/mail.js:366",
      "legacy": false
    },
    {
      "operationId": "get_friends",
      "group": "friends",
      "method": "GET",
      "path": "/friends",
      "auth": "bearer",
      "scopes": [
        "FRIENDS_READ"
      ],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/friends.js:8",
      "legacy": false
    },
    {
      "operationId": "get_friends_requests",
      "group": "friends",
      "method": "GET",
      "path": "/friends/requests",
      "auth": "bearer",
      "scopes": [
        "FRIENDS_READ"
      ],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/friends.js:24",
      "legacy": false
    },
    {
      "operationId": "post_friends_request",
      "group": "friends",
      "method": "POST",
      "path": "/friends/request",
      "auth": "bearer",
      "scopes": [
        "FRIENDS_MANAGE"
      ],
      "params": [],
      "query": [],
      "body": [
        "username"
      ],
      "files": [],
      "errors": [
        "already_friends",
        "cannot_friend_bot",
        "invalid_target",
        "user_blocked",
        "user_not_found"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/friends.js:41",
      "legacy": false
    },
    {
      "operationId": "patch_friends_request_by_id_accept",
      "group": "friends",
      "method": "PATCH",
      "path": "/friends/request/:id/accept",
      "auth": "bearer",
      "scopes": [
        "FRIENDS_MANAGE"
      ],
      "params": [
        {
          "name": "id",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "request_not_found"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/friends.js:80",
      "legacy": false
    },
    {
      "operationId": "patch_friends_request_by_id_decline",
      "group": "friends",
      "method": "PATCH",
      "path": "/friends/request/:id/decline",
      "auth": "bearer",
      "scopes": [
        "FRIENDS_MANAGE"
      ],
      "params": [
        {
          "name": "id",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/friends.js:103",
      "legacy": false
    },
    {
      "operationId": "delete_friends_by_username",
      "group": "friends",
      "method": "DELETE",
      "path": "/friends/:username",
      "auth": "bearer",
      "scopes": [
        "FRIENDS_MANAGE"
      ],
      "params": [
        {
          "name": "username",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/friends.js:112",
      "legacy": false
    },
    {
      "operationId": "get_friends_status_by_username",
      "group": "friends",
      "method": "GET",
      "path": "/friends/status/:username",
      "auth": "bearer",
      "scopes": [
        "FRIENDS_READ"
      ],
      "params": [
        {
          "name": "username",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/friends.js:122",
      "legacy": false
    },
    {
      "operationId": "get_groups",
      "group": "groups",
      "method": "GET",
      "path": "/groups",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/groups.js:35",
      "legacy": false
    },
    {
      "operationId": "post_groups",
      "group": "groups",
      "method": "POST",
      "path": "/groups",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [],
      "query": [],
      "body": [
        "members",
        "name"
      ],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/groups.js:47",
      "legacy": false
    },
    {
      "operationId": "get_groups_by_room",
      "group": "groups",
      "method": "GET",
      "path": "/groups/:room",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "room",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/groups.js:63",
      "legacy": false
    },
    {
      "operationId": "get_groups_by_room_messages",
      "group": "groups",
      "method": "GET",
      "path": "/groups/:room/messages",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "room",
          "optional": false
        }
      ],
      "query": [
        "limit"
      ],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/groups.js:69",
      "legacy": false
    },
    {
      "operationId": "post_groups_by_room_messages",
      "group": "groups",
      "method": "POST",
      "path": "/groups/:room/messages",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "room",
          "optional": false
        }
      ],
      "query": [],
      "body": [
        "color",
        "message"
      ],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/groups.js:75",
      "legacy": false
    },
    {
      "operationId": "post_groups_by_room_members",
      "group": "groups",
      "method": "POST",
      "path": "/groups/:room/members",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "room",
          "optional": false
        }
      ],
      "query": [],
      "body": [
        "username"
      ],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/groups.js:84",
      "legacy": false
    },
    {
      "operationId": "delete_groups_by_room_members_by_username",
      "group": "groups",
      "method": "DELETE",
      "path": "/groups/:room/members/:username",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "room",
          "optional": false
        },
        {
          "name": "username",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/groups.js:98",
      "legacy": false
    },
    {
      "operationId": "patch_groups_by_room",
      "group": "groups",
      "method": "PATCH",
      "path": "/groups/:room",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "room",
          "optional": false
        }
      ],
      "query": [],
      "body": [
        "name"
      ],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/groups.js:121",
      "legacy": false
    },
    {
      "operationId": "delete_groups_by_room",
      "group": "groups",
      "method": "DELETE",
      "path": "/groups/:room",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "room",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/groups.js:133",
      "legacy": false
    },
    {
      "operationId": "get_chat_game_downloads",
      "group": "game",
      "method": "GET",
      "path": "/chat/game/downloads",
      "auth": "none",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat-game.js:38",
      "legacy": true
    },
    {
      "operationId": "get_chat_game_servers_by_sid_instances",
      "group": "game",
      "method": "GET",
      "path": "/chat/game/servers/:sid/instances",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "sid",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "not_a_member",
        "not_allowed"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat-game.js:60",
      "legacy": true
    },
    {
      "operationId": "delete_chat_game_servers_by_sid_instances_by_iid",
      "group": "game",
      "method": "DELETE",
      "path": "/chat/game/servers/:sid/instances/:iid",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "sid",
          "optional": false
        },
        {
          "name": "iid",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "not_a_member",
        "not_allowed",
        "not_linked"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat-game.js:65",
      "legacy": true
    },
    {
      "operationId": "get_chat_game_unclaimed",
      "group": "game",
      "method": "GET",
      "path": "/chat/game/unclaimed",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [],
      "query": [
        "page",
        "q",
        "sid",
        "tag"
      ],
      "body": [],
      "files": [],
      "errors": [
        "not_a_member",
        "not_allowed",
        "rate_limited"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat-game.js:73",
      "legacy": true
    },
    {
      "operationId": "post_chat_game_claims",
      "group": "game",
      "method": "POST",
      "path": "/chat/game/claims",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [],
      "query": [],
      "body": [
        "cid",
        "hint",
        "sid"
      ],
      "files": [],
      "errors": [
        "channel_not_found",
        "not_a_game_channel",
        "not_a_member",
        "not_allowed",
        "rate_limited",
        "server_not_found",
        "server_read_only",
        "too_many_instances"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat-game.js:81",
      "legacy": true
    },
    {
      "operationId": "get_chat_game_claims_by_code",
      "group": "game",
      "method": "GET",
      "path": "/chat/game/claims/:code",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "code",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "claim_not_found"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat-game.js:95",
      "legacy": true
    },
    {
      "operationId": "get_chat_game_channels_by_cid_status",
      "group": "game",
      "method": "GET",
      "path": "/chat/game/channels/:cid/status",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "cid",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "channel_not_found",
        "not_a_game_channel",
        "not_a_member"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat-game.js:98",
      "legacy": true
    },
    {
      "operationId": "get_chat_game_channels_by_cid_console",
      "group": "game",
      "method": "GET",
      "path": "/chat/game/channels/:cid/console",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "cid",
          "optional": false
        }
      ],
      "query": [
        "before"
      ],
      "body": [],
      "files": [],
      "errors": [
        "channel_not_found",
        "not_a_console",
        "not_a_game_channel",
        "not_a_member"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat-game.js:108",
      "legacy": true
    },
    {
      "operationId": "post_chat_game_channels_by_cid_console",
      "group": "game",
      "method": "POST",
      "path": "/chat/game/channels/:cid/console",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "cid",
          "optional": false
        }
      ],
      "query": [],
      "body": [
        "command"
      ],
      "files": [],
      "errors": [
        "channel_not_found",
        "console_disabled",
        "console_needs_bonfire",
        "empty_command",
        "not_a_console",
        "not_a_game_channel",
        "not_a_member",
        "not_allowed",
        "offline",
        "rate_limited",
        "server_read_only",
        "timeout"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat-game.js:115",
      "legacy": true
    },
    {
      "operationId": "get_chat_game_servers_by_sid_audit",
      "group": "game",
      "method": "GET",
      "path": "/chat/game/servers/:sid/audit",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "sid",
          "optional": false
        }
      ],
      "query": [
        "before"
      ],
      "body": [],
      "files": [],
      "errors": [
        "not_a_member",
        "not_allowed"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat-game.js:129",
      "legacy": true
    },
    {
      "operationId": "get_chat_invite_by_code",
      "group": "chat",
      "method": "GET",
      "path": "/chat/invite/:code",
      "auth": "none",
      "scopes": [],
      "params": [
        {
          "name": "code",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "invalid_invite"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:41",
      "legacy": true
    },
    {
      "operationId": "get_chat_identities",
      "group": "chat",
      "method": "GET",
      "path": "/chat/identities",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [],
      "query": [
        "ids"
      ],
      "body": [],
      "files": [],
      "errors": [
        "invalid_user_ids"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:46",
      "legacy": false
    },
    {
      "operationId": "get_chat_server_creation_policy",
      "group": "chat",
      "method": "GET",
      "path": "/chat/server-creation-policy",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:55",
      "legacy": true
    },
    {
      "operationId": "get_chat_servers",
      "group": "chat",
      "method": "GET",
      "path": "/chat/servers",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:56",
      "legacy": true
    },
    {
      "operationId": "get_chat_discover",
      "group": "chat",
      "method": "GET",
      "path": "/chat/discover",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:57",
      "legacy": true
    },
    {
      "operationId": "post_chat_servers",
      "group": "chat",
      "method": "POST",
      "path": "/chat/servers",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [],
      "query": [],
      "body": [
        "description",
        "discoverable",
        "name"
      ],
      "files": [],
      "errors": [
        "name_required",
        "not_a_member",
        "too_many_joined",
        "too_many_servers"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:58",
      "legacy": true
    },
    {
      "operationId": "get_chat_servers_by_sid",
      "group": "chat",
      "method": "GET",
      "path": "/chat/servers/:sid",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "sid",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "not_a_member"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:62",
      "legacy": true
    },
    {
      "operationId": "patch_chat_servers_by_sid",
      "group": "chat",
      "method": "PATCH",
      "path": "/chat/servers/:sid",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "sid",
          "optional": false
        }
      ],
      "query": [],
      "body": [
        "allow_accent",
        "description",
        "discoverable",
        "name",
        "new_invite"
      ],
      "files": [],
      "errors": [
        "name_required",
        "not_a_member",
        "not_allowed",
        "server_read_only"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:63",
      "legacy": true
    },
    {
      "operationId": "put_chat_servers_by_sid_layout",
      "group": "chat",
      "method": "PUT",
      "path": "/chat/servers/:sid/layout",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "sid",
          "optional": false
        }
      ],
      "query": [],
      "body": [
        "categories",
        "channels"
      ],
      "files": [],
      "errors": [
        "need_a_category",
        "not_a_member",
        "not_allowed",
        "server_read_only"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:68",
      "legacy": true
    },
    {
      "operationId": "post_chat_servers_by_sid_roles",
      "group": "chat",
      "method": "POST",
      "path": "/chat/servers/:sid/roles",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "sid",
          "optional": false
        }
      ],
      "query": [],
      "body": [
        "color",
        "hoist",
        "mentionable",
        "name",
        "permissions"
      ],
      "files": [],
      "errors": [
        "not_a_member",
        "not_allowed",
        "role_too_high",
        "server_read_only",
        "too_many_roles"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:73",
      "legacy": true
    },
    {
      "operationId": "put_chat_servers_by_sid_roles_order",
      "group": "chat",
      "method": "PUT",
      "path": "/chat/servers/:sid/roles/order",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "sid",
          "optional": false
        }
      ],
      "query": [],
      "body": [
        "order"
      ],
      "files": [],
      "errors": [
        "not_a_member",
        "not_allowed",
        "role_too_high",
        "server_read_only"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:74",
      "legacy": true
    },
    {
      "operationId": "patch_chat_servers_by_sid_roles_by_rid",
      "group": "chat",
      "method": "PATCH",
      "path": "/chat/servers/:sid/roles/:rid",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "sid",
          "optional": false
        },
        {
          "name": "rid",
          "optional": false
        }
      ],
      "query": [],
      "body": [
        "color",
        "hoist",
        "icon_url",
        "mentionable",
        "name",
        "permissions"
      ],
      "files": [],
      "errors": [
        "name_required",
        "not_a_member",
        "not_allowed",
        "role_not_found",
        "role_too_high",
        "server_read_only"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:75",
      "legacy": true
    },
    {
      "operationId": "delete_chat_servers_by_sid_roles_by_rid",
      "group": "chat",
      "method": "DELETE",
      "path": "/chat/servers/:sid/roles/:rid",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "sid",
          "optional": false
        },
        {
          "name": "rid",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "not_a_member",
        "not_allowed",
        "role_not_found",
        "role_too_high",
        "server_read_only"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:76",
      "legacy": true
    },
    {
      "operationId": "put_chat_servers_by_sid_members_by_username_roles_by_rid",
      "group": "chat",
      "method": "PUT",
      "path": "/chat/servers/:sid/members/:username/roles/:rid",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "sid",
          "optional": false
        },
        {
          "name": "username",
          "optional": false
        },
        {
          "name": "rid",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "not_a_member",
        "not_allowed",
        "role_not_found",
        "role_too_high",
        "server_read_only"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:77",
      "legacy": true
    },
    {
      "operationId": "delete_chat_servers_by_sid_members_by_username_roles_by_rid",
      "group": "chat",
      "method": "DELETE",
      "path": "/chat/servers/:sid/members/:username/roles/:rid",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "sid",
          "optional": false
        },
        {
          "name": "username",
          "optional": false
        },
        {
          "name": "rid",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "not_a_member",
        "not_allowed",
        "role_not_found",
        "role_too_high",
        "server_read_only"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:78",
      "legacy": true
    },
    {
      "operationId": "post_chat_servers_by_sid_roles_by_rid_icon",
      "group": "chat",
      "method": "POST",
      "path": "/chat/servers/:sid/roles/:rid/icon",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "sid",
          "optional": false
        },
        {
          "name": "rid",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [
        "file"
      ],
      "errors": [
        "name_required",
        "no_file",
        "server_not_found",
        "server_read_only"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:88",
      "legacy": true
    },
    {
      "operationId": "delete_chat_servers_by_sid_roles_by_rid_icon",
      "group": "chat",
      "method": "DELETE",
      "path": "/chat/servers/:sid/roles/:rid/icon",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "sid",
          "optional": false
        },
        {
          "name": "rid",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "name_required"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:92",
      "legacy": true
    },
    {
      "operationId": "post_chat_channels_by_cid_icon",
      "group": "chat",
      "method": "POST",
      "path": "/chat/channels/:cid/icon",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "cid",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [
        "file"
      ],
      "errors": [
        "bad_link",
        "category_required",
        "channel_not_found",
        "name_required",
        "no_file",
        "not_a_member",
        "not_allowed",
        "role_too_high",
        "server_not_found",
        "server_read_only",
        "shop_admin_role"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:93",
      "legacy": true
    },
    {
      "operationId": "get_chat_servers_by_sid_export",
      "group": "chat",
      "method": "GET",
      "path": "/chat/servers/:sid/export",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "sid",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "not_allowed",
        "server_not_found"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:98",
      "legacy": true
    },
    {
      "operationId": "post_chat_servers_by_sid_export_to_account",
      "group": "chat",
      "method": "POST",
      "path": "/chat/servers/:sid/export-to-account",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "sid",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "not_allowed",
        "server_not_found"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:105",
      "legacy": true
    },
    {
      "operationId": "delete_chat_servers_by_sid",
      "group": "chat",
      "method": "DELETE",
      "path": "/chat/servers/:sid",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "sid",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "not_a_member",
        "not_allowed",
        "owner_only",
        "server_not_found"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:110",
      "legacy": true
    },
    {
      "operationId": "post_chat_servers_by_sid_join",
      "group": "chat",
      "method": "POST",
      "path": "/chat/servers/:sid/join",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "sid",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "banned_from_server",
        "invalid_invite",
        "invite_required",
        "server_full",
        "server_not_found",
        "server_read_only",
        "too_many_joined"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:111",
      "legacy": true
    },
    {
      "operationId": "post_chat_join_by_code",
      "group": "chat",
      "method": "POST",
      "path": "/chat/join/:code",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "code",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "banned_from_server",
        "invalid_invite",
        "invite_required",
        "server_full",
        "server_not_found",
        "server_read_only",
        "too_many_joined"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:112",
      "legacy": true
    },
    {
      "operationId": "post_chat_servers_by_sid_leave",
      "group": "chat",
      "method": "POST",
      "path": "/chat/servers/:sid/leave",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "sid",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "not_a_member",
        "owner_cannot_leave"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:113",
      "legacy": true
    },
    {
      "operationId": "get_chat_servers_by_sid_members",
      "group": "chat",
      "method": "GET",
      "path": "/chat/servers/:sid/members",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "sid",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "not_a_member"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:114",
      "legacy": true
    },
    {
      "operationId": "delete_chat_servers_by_sid_members_by_username",
      "group": "chat",
      "method": "DELETE",
      "path": "/chat/servers/:sid/members/:username",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "sid",
          "optional": false
        },
        {
          "name": "username",
          "optional": false
        }
      ],
      "query": [
        "ban"
      ],
      "body": [],
      "files": [],
      "errors": [
        "not_a_member",
        "not_allowed",
        "server_read_only",
        "user_not_found"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:116",
      "legacy": true
    },
    {
      "operationId": "delete_chat_servers_by_sid_bans_by_username",
      "group": "chat",
      "method": "DELETE",
      "path": "/chat/servers/:sid/bans/:username",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "sid",
          "optional": false
        },
        {
          "name": "username",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "not_a_member",
        "not_allowed",
        "server_read_only",
        "user_not_found"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:117",
      "legacy": true
    },
    {
      "operationId": "post_chat_servers_by_sid_icon",
      "group": "chat",
      "method": "POST",
      "path": "/chat/servers/:sid/icon",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "sid",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [
        "file"
      ],
      "errors": [
        "name_required",
        "no_file",
        "not_a_member",
        "not_allowed",
        "server_read_only"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:134",
      "legacy": true
    },
    {
      "operationId": "post_chat_servers_by_sid_banner",
      "group": "chat",
      "method": "POST",
      "path": "/chat/servers/:sid/banner",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "sid",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [
        "file"
      ],
      "errors": [
        "name_required",
        "no_file",
        "not_a_member",
        "not_allowed",
        "server_read_only"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:135",
      "legacy": true
    },
    {
      "operationId": "delete_chat_servers_by_sid_icon",
      "group": "chat",
      "method": "DELETE",
      "path": "/chat/servers/:sid/icon",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "sid",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "name_required",
        "not_a_member",
        "not_allowed",
        "server_read_only"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:136",
      "legacy": true
    },
    {
      "operationId": "delete_chat_servers_by_sid_banner",
      "group": "chat",
      "method": "DELETE",
      "path": "/chat/servers/:sid/banner",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "sid",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "name_required",
        "not_a_member",
        "not_allowed",
        "server_read_only"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:137",
      "legacy": true
    },
    {
      "operationId": "post_chat_servers_by_sid_channels",
      "group": "chat",
      "method": "POST",
      "path": "/chat/servers/:sid/channels",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "sid",
          "optional": false
        }
      ],
      "query": [],
      "body": [
        "category",
        "config",
        "icon",
        "locked",
        "name",
        "topic",
        "type"
      ],
      "files": [],
      "errors": [
        "name_required",
        "not_a_member",
        "not_allowed",
        "server_read_only",
        "too_many_channels"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:140",
      "legacy": true
    },
    {
      "operationId": "patch_chat_channels_by_cid",
      "group": "chat",
      "method": "PATCH",
      "path": "/chat/channels/:cid",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "cid",
          "optional": false
        }
      ],
      "query": [],
      "body": [
        "category",
        "config",
        "icon",
        "locked",
        "name",
        "position",
        "topic",
        "type"
      ],
      "files": [],
      "errors": [
        "bad_link",
        "category_required",
        "channel_not_found",
        "name_required",
        "not_a_member",
        "not_allowed",
        "role_too_high",
        "server_read_only",
        "shop_admin_role"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:143",
      "legacy": true
    },
    {
      "operationId": "delete_chat_channels_by_cid",
      "group": "chat",
      "method": "DELETE",
      "path": "/chat/channels/:cid",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "cid",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "channel_not_found",
        "last_channel",
        "not_a_member",
        "not_allowed",
        "server_read_only"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:147",
      "legacy": true
    },
    {
      "operationId": "get_chat_channels_by_cid_cloudlink",
      "group": "chat",
      "method": "GET",
      "path": "/chat/channels/:cid/cloudlink",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "cid",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "channel_not_found",
        "not_a_member"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:155",
      "legacy": true
    },
    {
      "operationId": "post_chat_channels_by_cid_cloudlink_reconnect",
      "group": "chat",
      "method": "POST",
      "path": "/chat/channels/:cid/cloudlink/reconnect",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "cid",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "channel_not_found",
        "not_a_member"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:156",
      "legacy": true
    },
    {
      "operationId": "get_chat_channels_by_cid_messages",
      "group": "chat",
      "method": "GET",
      "path": "/chat/channels/:cid/messages",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "cid",
          "optional": false
        }
      ],
      "query": [
        "after",
        "before",
        "limit"
      ],
      "body": [],
      "files": [],
      "errors": [
        "channel_not_found",
        "not_a_member"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:157",
      "legacy": true
    },
    {
      "operationId": "post_chat_channels_by_cid_messages",
      "group": "chat",
      "method": "POST",
      "path": "/chat/channels/:cid/messages",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "cid",
          "optional": false
        }
      ],
      "query": [],
      "body": [
        "attachments",
        "message",
        "reply_to"
      ],
      "files": [],
      "errors": [
        "channel_not_found",
        "empty_message",
        "no_attach_permission",
        "not_a_member",
        "rate_limited",
        "server_not_found",
        "server_read_only"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:158",
      "legacy": true
    },
    {
      "operationId": "post_chat_channels_by_cid_read",
      "group": "chat",
      "method": "POST",
      "path": "/chat/channels/:cid/read",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "cid",
          "optional": false
        }
      ],
      "query": [],
      "body": [
        "id"
      ],
      "files": [],
      "errors": [
        "channel_not_found",
        "not_a_member"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:161",
      "legacy": true
    },
    {
      "operationId": "get_chat_channels_by_cid_search",
      "group": "chat",
      "method": "GET",
      "path": "/chat/channels/:cid/search",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "cid",
          "optional": false
        }
      ],
      "query": [
        "q"
      ],
      "body": [],
      "files": [],
      "errors": [
        "channel_not_found",
        "not_a_member"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:162",
      "legacy": true
    },
    {
      "operationId": "patch_chat_messages_by_id",
      "group": "chat",
      "method": "PATCH",
      "path": "/chat/messages/:id",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "id",
          "optional": false
        }
      ],
      "query": [],
      "body": [
        "message"
      ],
      "files": [],
      "errors": [
        "empty_message",
        "message_not_found",
        "not_allowed",
        "server_read_only"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:163",
      "legacy": true
    },
    {
      "operationId": "delete_chat_messages_by_id",
      "group": "chat",
      "method": "DELETE",
      "path": "/chat/messages/:id",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "id",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "message_not_found",
        "not_allowed",
        "server_read_only"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:164",
      "legacy": true
    },
    {
      "operationId": "post_chat_upload",
      "group": "chat",
      "method": "POST",
      "path": "/chat/upload",
      "auth": "bearer",
      "scopes": [
        "CHAT",
        "MEDIA_UPLOAD"
      ],
      "params": [],
      "query": [],
      "body": [],
      "files": [
        "file"
      ],
      "errors": [
        "images_only",
        "no_file",
        "storage_limit_exceeded",
        "upload_suspended"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:167",
      "legacy": true
    },
    {
      "operationId": "get_chat_notify",
      "group": "chat",
      "method": "GET",
      "path": "/chat/notify",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:192",
      "legacy": false
    },
    {
      "operationId": "put_chat_notify_by_target",
      "group": "chat",
      "method": "PUT",
      "path": "/chat/notify/:target",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "target",
          "optional": false
        }
      ],
      "query": [],
      "body": [
        "level",
        "mute_minutes",
        "push"
      ],
      "files": [],
      "errors": [
        "not_found"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:193",
      "legacy": false
    },
    {
      "operationId": "get_chat_settings",
      "group": "chat",
      "method": "GET",
      "path": "/chat/settings",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:196",
      "legacy": false
    },
    {
      "operationId": "patch_chat_settings",
      "group": "chat",
      "method": "PATCH",
      "path": "/chat/settings",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [],
      "query": [],
      "body": [
        "show_typing",
        "share_typing",
        "share_activity",
        "sounds",
        "notifications",
        "dm_privacy",
        "compact",
        "animations",
        "link_images",
        "server_order",
        "daily_notice",
        "developer_mode",
        "allow_vc_calls",
        "yt_mode"
      ],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:197",
      "legacy": false
    },
    {
      "operationId": "get_chat_open",
      "group": "chat",
      "method": "GET",
      "path": "/chat/open",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:200",
      "legacy": false
    },
    {
      "operationId": "get_chat_users_by_username",
      "group": "chat",
      "method": "GET",
      "path": "/chat/users/:username",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "username",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "user_not_found"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:203",
      "legacy": false
    },
    {
      "operationId": "get_chat_bots",
      "group": "chat",
      "method": "GET",
      "path": "/chat/bots",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "Nookara developer bots: bot accounts you own on Nookara (not tied to one server). Needs Chat. Entries carry id, username, description, verified, trusted_in and gallery {state, verified, review_message, trusted_in}.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:210",
      "legacy": false
    },
    {
      "operationId": "post_chat_bots",
      "group": "chat",
      "method": "POST",
      "path": "/chat/bots",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [],
      "query": [],
      "body": [
        "description",
        "name"
      ],
      "files": [],
      "errors": [],
      "notes": "Needs Chat. Body {name, description}. Returns {bot, token}; the token is shown once. The same token works on every instance the bot is added to.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:211",
      "legacy": false
    },
    {
      "operationId": "patch_chat_bots_by_id",
      "group": "chat",
      "method": "PATCH",
      "path": "/chat/bots/:id",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "id",
          "optional": false
        }
      ],
      "query": [],
      "body": [
        "description",
        "name",
        "public"
      ],
      "files": [],
      "errors": [],
      "notes": "Needs Chat. Bot owner only. name, description.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:212",
      "legacy": false
    },
    {
      "operationId": "post_chat_bots_by_id_avatar",
      "group": "chat",
      "method": "POST",
      "path": "/chat/bots/:id/avatar",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "id",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [
        "file"
      ],
      "errors": [],
      "notes": "Needs Chat. Multipart file. A listed bot needs an avatar.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:213",
      "legacy": false
    },
    {
      "operationId": "post_chat_bots_by_id_token",
      "group": "chat",
      "method": "POST",
      "path": "/chat/bots/:id/token",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "id",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "Needs Chat. Resets the token; instances pick up the new hash within about 10 minutes.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:214",
      "legacy": false
    },
    {
      "operationId": "delete_chat_bots_by_id",
      "group": "chat",
      "method": "DELETE",
      "path": "/chat/bots/:id",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "id",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "Needs Chat. Deletes the bot account; instances remove it at their next sync.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:215",
      "legacy": false
    },
    {
      "operationId": "post_chat_bots_by_name_by_username_add",
      "group": "chat",
      "method": "POST",
      "path": "/chat/bots/by-name/:username/add",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "username",
          "optional": false
        }
      ],
      "query": [],
      "body": [
        "sid"
      ],
      "files": [],
      "errors": [],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:217",
      "legacy": true
    },
    {
      "operationId": "get_chat_presence_by_username",
      "group": "chat",
      "method": "GET",
      "path": "/chat/presence/:username",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "username",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "user_not_found"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:218",
      "legacy": false
    },
    {
      "operationId": "post_chat_presence_status",
      "group": "chat",
      "method": "POST",
      "path": "/chat/presence/status",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [],
      "query": [],
      "body": [
        "status"
      ],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:219",
      "legacy": false
    },
    {
      "operationId": "post_chat_presence_custom",
      "group": "chat",
      "method": "POST",
      "path": "/chat/presence/custom",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [],
      "query": [],
      "body": [
        "text"
      ],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:220",
      "legacy": false
    },
    {
      "operationId": "post_chat_presence_activity",
      "group": "chat",
      "method": "POST",
      "path": "/chat/presence/activity",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [],
      "query": [],
      "body": [
        "name",
        "key",
        "ttl",
        "type",
        "details",
        "state",
        "icon",
        "image",
        "url",
        "app",
        "since",
        "duration",
        "progress",
        "progress_at"
      ],
      "files": [],
      "errors": [
        "name_required",
        "too_many_activities"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:222",
      "legacy": false
    },
    {
      "operationId": "delete_chat_presence_activity_by_key",
      "group": "chat",
      "method": "DELETE",
      "path": "/chat/presence/activity/:key?",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "key",
          "optional": true
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:225",
      "legacy": false
    },
    {
      "operationId": "get_chat_gifs",
      "group": "chat",
      "method": "GET",
      "path": "/chat/gifs",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [],
      "query": [
        "page",
        "q"
      ],
      "body": [],
      "files": [],
      "errors": [
        "gif_search_failed",
        "gifs_not_configured"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:239",
      "legacy": false
    },
    {
      "operationId": "get_chat_media",
      "group": "chat",
      "method": "GET",
      "path": "/chat/media",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:269",
      "legacy": false
    },
    {
      "operationId": "post_chat_media_save",
      "group": "chat",
      "method": "POST",
      "path": "/chat/media/save",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [],
      "query": [],
      "body": [
        "name",
        "url"
      ],
      "files": [],
      "errors": [
        "cant_save_that",
        "storage_limit_exceeded",
        "upload_suspended"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:283",
      "legacy": false
    },
    {
      "operationId": "get_chat_klipy_by_kind_by_slug",
      "group": "chat",
      "method": "GET",
      "path": "/chat/klipy/:kind/:slug",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "kind",
          "optional": false
        },
        {
          "name": "slug",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "bad_gif",
        "gifs_not_set_up"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:342",
      "legacy": false
    },
    {
      "operationId": "post_chat_media_gif",
      "group": "chat",
      "method": "POST",
      "path": "/chat/media/gif",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [],
      "query": [],
      "body": [
        "height",
        "preview",
        "title",
        "url",
        "width"
      ],
      "files": [],
      "errors": [
        "bad_gif",
        "too_many_saved"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:359",
      "legacy": false
    },
    {
      "operationId": "delete_chat_media_by_id",
      "group": "chat",
      "method": "DELETE",
      "path": "/chat/media/:id",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "id",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "not_found"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:371",
      "legacy": false
    },
    {
      "operationId": "delete_chat_media",
      "group": "chat",
      "method": "DELETE",
      "path": "/chat/media",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [],
      "query": [
        "url"
      ],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:385",
      "legacy": false
    },
    {
      "operationId": "get_chat_media_limits",
      "group": "chat",
      "method": "GET",
      "path": "/chat/media/limits",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:393",
      "legacy": false
    },
    {
      "operationId": "post_chat_media_upload",
      "group": "chat",
      "method": "POST",
      "path": "/chat/media/upload",
      "auth": "bearer",
      "scopes": [
        "CHAT",
        "MEDIA_UPLOAD"
      ],
      "params": [],
      "query": [],
      "body": [],
      "files": [
        "file"
      ],
      "errors": [
        "no_file",
        "storage_limit_exceeded",
        "unsupported_file",
        "upload_suspended"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:396",
      "legacy": false
    },
    {
      "operationId": "get_chat_emojis",
      "group": "chat",
      "method": "GET",
      "path": "/chat/emojis",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "server_not_found"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:452",
      "legacy": true
    },
    {
      "operationId": "get_chat_emojis_by_eid_info",
      "group": "chat",
      "method": "GET",
      "path": "/chat/emojis/:eid/info",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "eid",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "not_found",
        "server_not_found"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:463",
      "legacy": true
    },
    {
      "operationId": "get_chat_servers_by_sid_emojis",
      "group": "chat",
      "method": "GET",
      "path": "/chat/servers/:sid/emojis",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "sid",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "not_a_member",
        "not_allowed",
        "server_read_only"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:472",
      "legacy": true
    },
    {
      "operationId": "post_chat_servers_by_sid_emojis",
      "group": "chat",
      "method": "POST",
      "path": "/chat/servers/:sid/emojis",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "sid",
          "optional": false
        }
      ],
      "query": [],
      "body": [
        "name"
      ],
      "files": [
        "file"
      ],
      "errors": [
        "file_too_large",
        "no_file",
        "not_a_member",
        "not_allowed",
        "server_read_only",
        "too_many_emojis"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:478",
      "legacy": true
    },
    {
      "operationId": "patch_chat_servers_by_sid_emojis_by_eid",
      "group": "chat",
      "method": "PATCH",
      "path": "/chat/servers/:sid/emojis/:eid",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "sid",
          "optional": false
        },
        {
          "name": "eid",
          "optional": false
        }
      ],
      "query": [],
      "body": [
        "name"
      ],
      "files": [],
      "errors": [
        "name_required",
        "not_a_member",
        "not_allowed",
        "server_read_only"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:495",
      "legacy": true
    },
    {
      "operationId": "delete_chat_servers_by_sid_emojis_by_eid",
      "group": "chat",
      "method": "DELETE",
      "path": "/chat/servers/:sid/emojis/:eid",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "sid",
          "optional": false
        },
        {
          "name": "eid",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "not_a_member",
        "not_allowed",
        "not_found",
        "server_read_only"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:503",
      "legacy": true
    },
    {
      "operationId": "get_chat_bridge_platforms",
      "group": "chat",
      "method": "GET",
      "path": "/chat/bridge/platforms",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:515",
      "legacy": true
    },
    {
      "operationId": "get_chat_bridge_by_platform_guilds",
      "group": "chat",
      "method": "GET",
      "path": "/chat/bridge/:platform/guilds",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "platform",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:516",
      "legacy": true
    },
    {
      "operationId": "get_chat_bridge_by_platform_guilds_by_gid",
      "group": "chat",
      "method": "GET",
      "path": "/chat/bridge/:platform/guilds/:gid",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "platform",
          "optional": false
        },
        {
          "name": "gid",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:517",
      "legacy": true
    },
    {
      "operationId": "post_chat_bridge_by_platform_guilds_by_gid_import",
      "group": "chat",
      "method": "POST",
      "path": "/chat/bridge/:platform/guilds/:gid/import",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "platform",
          "optional": false
        },
        {
          "name": "gid",
          "optional": false
        }
      ],
      "query": [],
      "body": [
        "channels",
        "name",
        "roles"
      ],
      "files": [],
      "errors": [],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:518",
      "legacy": true
    },
    {
      "operationId": "get_chat_bridge_servers_by_sid",
      "group": "chat",
      "method": "GET",
      "path": "/chat/bridge/servers/:sid",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "sid",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:521",
      "legacy": true
    },
    {
      "operationId": "put_chat_bridge_servers_by_sid",
      "group": "chat",
      "method": "PUT",
      "path": "/chat/bridge/servers/:sid",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "sid",
          "optional": false
        }
      ],
      "query": [],
      "body": [
        "automap",
        "guild_id",
        "platform"
      ],
      "files": [],
      "errors": [],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:522",
      "legacy": true
    },
    {
      "operationId": "patch_chat_bridge_servers_by_sid",
      "group": "chat",
      "method": "PATCH",
      "path": "/chat/bridge/servers/:sid",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "sid",
          "optional": false
        }
      ],
      "query": [],
      "body": [
        "enabled",
        "platform"
      ],
      "files": [],
      "errors": [],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:523",
      "legacy": true
    },
    {
      "operationId": "delete_chat_bridge_servers_by_sid",
      "group": "chat",
      "method": "DELETE",
      "path": "/chat/bridge/servers/:sid",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "sid",
          "optional": false
        }
      ],
      "query": [],
      "body": [
        "platform"
      ],
      "files": [],
      "errors": [],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:524",
      "legacy": true
    },
    {
      "operationId": "put_chat_bridge_servers_by_sid_channels_by_cid",
      "group": "chat",
      "method": "PUT",
      "path": "/chat/bridge/servers/:sid/channels/:cid",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "sid",
          "optional": false
        },
        {
          "name": "cid",
          "optional": false
        }
      ],
      "query": [],
      "body": [
        "ext_channel_id",
        "platform"
      ],
      "files": [],
      "errors": [],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:525",
      "legacy": true
    },
    {
      "operationId": "post_chat_media_external",
      "group": "chat",
      "method": "POST",
      "path": "/chat/media/external",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [],
      "query": [],
      "body": [
        "time"
      ],
      "files": [
        "file"
      ],
      "errors": [
        "no_file",
        "rate_limited",
        "upload_suspended"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:535",
      "legacy": false
    },
    {
      "operationId": "get_chat_servers_by_sid_search",
      "group": "chat",
      "method": "GET",
      "path": "/chat/servers/:sid/search",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "sid",
          "optional": false
        }
      ],
      "query": [
        "offset",
        "q"
      ],
      "body": [],
      "files": [],
      "errors": [
        "not_a_member"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:586",
      "legacy": true
    },
    {
      "operationId": "get_chat_channels_by_cid_starboard",
      "group": "chat",
      "method": "GET",
      "path": "/chat/channels/:cid/starboard",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "cid",
          "optional": false
        }
      ],
      "query": [
        "before"
      ],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:589",
      "legacy": true
    },
    {
      "operationId": "put_chat_messages_by_id_reactions_by_emoji",
      "group": "chat",
      "method": "PUT",
      "path": "/chat/messages/:id/reactions/:emoji",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "id",
          "optional": false
        },
        {
          "name": "emoji",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "message_not_found",
        "server_read_only",
        "too_many_reactions",
        "unknown_emoji"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:592",
      "legacy": true
    },
    {
      "operationId": "delete_chat_messages_by_id_reactions_by_emoji",
      "group": "chat",
      "method": "DELETE",
      "path": "/chat/messages/:id/reactions/:emoji",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "id",
          "optional": false
        },
        {
          "name": "emoji",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "message_not_found",
        "server_read_only",
        "too_many_reactions",
        "unknown_emoji"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:593",
      "legacy": true
    },
    {
      "operationId": "put_chat_dm_by_id_reactions_by_emoji",
      "group": "chat",
      "method": "PUT",
      "path": "/chat/dm/:id/reactions/:emoji",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "id",
          "optional": false
        },
        {
          "name": "emoji",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:595",
      "legacy": false
    },
    {
      "operationId": "delete_chat_dm_by_id_reactions_by_emoji",
      "group": "chat",
      "method": "DELETE",
      "path": "/chat/dm/:id/reactions/:emoji",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "id",
          "optional": false
        },
        {
          "name": "emoji",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:596",
      "legacy": false
    },
    {
      "operationId": "put_chat_channels_by_cid_perms",
      "group": "chat",
      "method": "PUT",
      "path": "/chat/channels/:cid/perms",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "cid",
          "optional": false
        }
      ],
      "query": [],
      "body": [
        "overwrites"
      ],
      "files": [],
      "errors": [
        "channel_not_found",
        "not_a_member",
        "not_allowed",
        "server_read_only"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:598",
      "legacy": true
    },
    {
      "operationId": "get_chat_modmail",
      "group": "chat",
      "method": "GET",
      "path": "/chat/modmail",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:601",
      "legacy": false
    },
    {
      "operationId": "post_chat_modmail_read",
      "group": "chat",
      "method": "POST",
      "path": "/chat/modmail/read",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:602",
      "legacy": false
    },
    {
      "operationId": "get_chat_modmail_staff",
      "group": "chat",
      "method": "GET",
      "path": "/chat/modmail/staff",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:603",
      "legacy": false
    },
    {
      "operationId": "get_chat_modmail_with_by_username",
      "group": "chat",
      "method": "GET",
      "path": "/chat/modmail/with/:username",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "username",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:604",
      "legacy": false
    },
    {
      "operationId": "post_chat_modmail_with_by_username",
      "group": "chat",
      "method": "POST",
      "path": "/chat/modmail/with/:username",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "username",
          "optional": false
        }
      ],
      "query": [],
      "body": [
        "body"
      ],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:605",
      "legacy": false
    },
    {
      "operationId": "get_chat_sounds",
      "group": "chat",
      "method": "GET",
      "path": "/chat/sounds",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:610",
      "legacy": true
    },
    {
      "operationId": "get_chat_servers_by_sid_sounds",
      "group": "chat",
      "method": "GET",
      "path": "/chat/servers/:sid/sounds",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "sid",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:611",
      "legacy": true
    },
    {
      "operationId": "post_chat_servers_by_sid_sounds",
      "group": "chat",
      "method": "POST",
      "path": "/chat/servers/:sid/sounds",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "sid",
          "optional": false
        }
      ],
      "query": [],
      "body": [
        "name",
        "emoji",
        "volume"
      ],
      "files": [
        "file"
      ],
      "errors": [],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:612",
      "legacy": true
    },
    {
      "operationId": "patch_chat_servers_by_sid_sounds_by_id",
      "group": "chat",
      "method": "PATCH",
      "path": "/chat/servers/:sid/sounds/:id",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "sid",
          "optional": false
        },
        {
          "name": "id",
          "optional": false
        }
      ],
      "query": [],
      "body": [
        "name",
        "emoji",
        "volume"
      ],
      "files": [],
      "errors": [],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:613",
      "legacy": true
    },
    {
      "operationId": "delete_chat_servers_by_sid_sounds_by_id",
      "group": "chat",
      "method": "DELETE",
      "path": "/chat/servers/:sid/sounds/:id",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "sid",
          "optional": false
        },
        {
          "name": "id",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:614",
      "legacy": true
    },
    {
      "operationId": "put_chat_messages_by_id_pin",
      "group": "chat",
      "method": "PUT",
      "path": "/chat/messages/:id/pin",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "id",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "channel_not_found",
        "empty_message",
        "message_not_found",
        "no_attach_permission",
        "not_a_member",
        "not_allowed",
        "rate_limited",
        "server_read_only",
        "too_many_pins"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:617",
      "legacy": true
    },
    {
      "operationId": "delete_chat_messages_by_id_pin",
      "group": "chat",
      "method": "DELETE",
      "path": "/chat/messages/:id/pin",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "id",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "channel_not_found",
        "empty_message",
        "message_not_found",
        "no_attach_permission",
        "not_a_member",
        "not_allowed",
        "rate_limited",
        "server_read_only",
        "too_many_pins"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:618",
      "legacy": true
    },
    {
      "operationId": "get_chat_channels_by_cid_pins",
      "group": "chat",
      "method": "GET",
      "path": "/chat/channels/:cid/pins",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "cid",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "channel_not_found",
        "not_a_member"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:619",
      "legacy": true
    },
    {
      "operationId": "get_chat_unfurl",
      "group": "chat",
      "method": "GET",
      "path": "/chat/unfurl",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [],
      "query": [
        "url"
      ],
      "body": [],
      "files": [],
      "errors": [
        "rate_limited"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:623",
      "legacy": true
    },
    {
      "operationId": "get_chat_hf_game_by_id",
      "group": "chat",
      "method": "GET",
      "path": "/chat/hf-game/:id",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "id",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "rate_limited"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:633",
      "legacy": false
    },
    {
      "operationId": "post_chat_calls",
      "group": "chat",
      "method": "POST",
      "path": "/chat/calls",
      "auth": "bearer",
      "scopes": [
        "CHAT",
        "VOICE"
      ],
      "params": [],
      "query": [],
      "body": [
        "to"
      ],
      "files": [],
      "errors": [
        "cannot_dm_bot",
        "cannot_reply_own_status",
        "dm_privacy",
        "message_too_long",
        "missing_fields",
        "status_changed",
        "user_blocked",
        "user_not_found"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:643",
      "legacy": false
    },
    {
      "operationId": "get_chat_channels_by_cid_shop",
      "group": "chat",
      "method": "GET",
      "path": "/chat/channels/:cid/shop",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "cid",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "channel_not_found",
        "not_a_member",
        "not_a_shop"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:646",
      "legacy": true
    },
    {
      "operationId": "post_chat_channels_by_cid_shop_by_rid",
      "group": "chat",
      "method": "POST",
      "path": "/chat/channels/:cid/shop/:rid",
      "auth": "bearer",
      "scopes": [
        "CHAT",
        "CURRENCY_PAY"
      ],
      "params": [
        {
          "name": "cid",
          "optional": false
        },
        {
          "name": "rid",
          "optional": false
        }
      ],
      "query": [],
      "body": [
        "price"
      ],
      "files": [],
      "errors": [
        "channel_not_found",
        "insufficient_balance",
        "not_a_member",
        "not_a_shop",
        "price_changed",
        "purchase_failed",
        "role_not_found",
        "server_read_only"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:647",
      "legacy": true
    },
    {
      "operationId": "delete_chat_channels_by_cid_shop_by_rid",
      "group": "chat",
      "method": "DELETE",
      "path": "/chat/channels/:cid/shop/:rid",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "cid",
          "optional": false
        },
        {
          "name": "rid",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "channel_not_found",
        "insufficient_balance",
        "not_a_member",
        "not_a_shop",
        "price_changed",
        "purchase_failed",
        "role_not_found",
        "server_read_only"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:648",
      "legacy": true
    },
    {
      "operationId": "get_chat_channels_by_cid_webhooks",
      "group": "chat",
      "method": "GET",
      "path": "/chat/channels/:cid/webhooks",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "cid",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "no_webhooks_here",
        "not_allowed"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:650",
      "legacy": true
    },
    {
      "operationId": "post_chat_channels_by_cid_webhooks",
      "group": "chat",
      "method": "POST",
      "path": "/chat/channels/:cid/webhooks",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "cid",
          "optional": false
        }
      ],
      "query": [],
      "body": [
        "name"
      ],
      "files": [],
      "errors": [
        "no_webhooks_here",
        "not_allowed",
        "server_read_only",
        "too_many_webhooks"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:651",
      "legacy": true
    },
    {
      "operationId": "patch_chat_hooks_by_wid",
      "group": "chat",
      "method": "PATCH",
      "path": "/chat/hooks/:wid",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "wid",
          "optional": false
        }
      ],
      "query": [],
      "body": [
        "avatar",
        "channel",
        "name",
        "new_token"
      ],
      "files": [],
      "errors": [
        "channel_not_found",
        "no_webhooks_here",
        "not_a_member",
        "not_allowed",
        "server_read_only",
        "webhook_not_found"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:652",
      "legacy": true
    },
    {
      "operationId": "delete_chat_hooks_by_wid",
      "group": "chat",
      "method": "DELETE",
      "path": "/chat/hooks/:wid",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "wid",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "not_allowed",
        "server_read_only",
        "webhook_not_found"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:653",
      "legacy": true
    },
    {
      "operationId": "post_chat_hooks_by_wid_avatar",
      "group": "chat",
      "method": "POST",
      "path": "/chat/hooks/:wid/avatar",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "wid",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [
        "file"
      ],
      "errors": [
        "channel_not_found",
        "images_only",
        "no_webhooks_here",
        "not_a_member",
        "not_allowed",
        "server_read_only",
        "webhook_not_found"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat.js:654",
      "legacy": true
    },
    {
      "operationId": "get_chat_api_discovery",
      "group": "bots",
      "method": "GET",
      "path": "/chat/api/discovery",
      "auth": "none",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat-botapi.js:34",
      "legacy": true
    },
    {
      "operationId": "get_chat_api_v1_gateway",
      "group": "bots",
      "method": "GET",
      "path": "/chat/api/v1/gateway",
      "auth": "none",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat-botapi.js:35",
      "legacy": true
    },
    {
      "operationId": "get_chat_api_v1_gateway_bot",
      "group": "bots",
      "method": "GET",
      "path": "/chat/api/v1/gateway/bot",
      "auth": "bot",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat-botapi.js:65",
      "legacy": true
    },
    {
      "operationId": "get_chat_api_v1_users_me",
      "group": "bots",
      "method": "GET",
      "path": "/chat/api/v1/users/@me",
      "auth": "bot",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat-botapi.js:66",
      "legacy": true
    },
    {
      "operationId": "get_chat_api_v1_oauth2_applications_me",
      "group": "bots",
      "method": "GET",
      "path": "/chat/api/v1/oauth2/applications/@me",
      "auth": "bot",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat-botapi.js:67",
      "legacy": true
    },
    {
      "operationId": "get_chat_api_v1_users_me_guilds",
      "group": "bots",
      "method": "GET",
      "path": "/chat/api/v1/users/@me/guilds",
      "auth": "bot",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat-botapi.js:68",
      "legacy": true
    },
    {
      "operationId": "delete_chat_api_v1_users_me_guilds_by_gid",
      "group": "bots",
      "method": "DELETE",
      "path": "/chat/api/v1/users/@me/guilds/:gid",
      "auth": "bot",
      "scopes": [],
      "params": [
        {
          "name": "gid",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "not_a_member",
        "server_not_found"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat-botapi.js:69",
      "legacy": true
    },
    {
      "operationId": "get_chat_api_v1_users_by_uid",
      "group": "bots",
      "method": "GET",
      "path": "/chat/api/v1/users/:uid",
      "auth": "bot",
      "scopes": [],
      "params": [
        {
          "name": "uid",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "user_not_found"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat-botapi.js:70",
      "legacy": true
    },
    {
      "operationId": "post_chat_api_v1_users_me_channels",
      "group": "bots",
      "method": "POST",
      "path": "/chat/api/v1/users/@me/channels",
      "auth": "bot",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "cannot_dm_bot"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat-botapi.js:75",
      "legacy": true
    },
    {
      "operationId": "get_chat_api_v1_guilds_by_gid",
      "group": "bots",
      "method": "GET",
      "path": "/chat/api/v1/guilds/:gid",
      "auth": "bot",
      "scopes": [],
      "params": [
        {
          "name": "gid",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "not_a_member",
        "server_not_found"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat-botapi.js:77",
      "legacy": true
    },
    {
      "operationId": "get_chat_api_v1_guilds_by_gid_roles",
      "group": "bots",
      "method": "GET",
      "path": "/chat/api/v1/guilds/:gid/roles",
      "auth": "bot",
      "scopes": [],
      "params": [
        {
          "name": "gid",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "not_a_member",
        "server_not_found"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat-botapi.js:78",
      "legacy": true
    },
    {
      "operationId": "get_chat_api_v1_guilds_by_gid_channels",
      "group": "bots",
      "method": "GET",
      "path": "/chat/api/v1/guilds/:gid/channels",
      "auth": "bot",
      "scopes": [],
      "params": [
        {
          "name": "gid",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "not_a_member",
        "server_not_found"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat-botapi.js:79",
      "legacy": true
    },
    {
      "operationId": "get_chat_api_v1_guilds_by_gid_members_by_uid",
      "group": "bots",
      "method": "GET",
      "path": "/chat/api/v1/guilds/:gid/members/:uid",
      "auth": "bot",
      "scopes": [],
      "params": [
        {
          "name": "gid",
          "optional": false
        },
        {
          "name": "uid",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "not_a_member",
        "server_not_found",
        "user_not_found"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat-botapi.js:80",
      "legacy": true
    },
    {
      "operationId": "get_chat_api_v1_guilds_by_gid_members",
      "group": "bots",
      "method": "GET",
      "path": "/chat/api/v1/guilds/:gid/members",
      "auth": "bot",
      "scopes": [],
      "params": [
        {
          "name": "gid",
          "optional": false
        }
      ],
      "query": [
        "limit"
      ],
      "body": [],
      "files": [],
      "errors": [
        "not_a_member",
        "server_not_found"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat-botapi.js:87",
      "legacy": true
    },
    {
      "operationId": "get_chat_api_v1_channels_by_cid",
      "group": "bots",
      "method": "GET",
      "path": "/chat/api/v1/channels/:cid",
      "auth": "bot",
      "scopes": [],
      "params": [
        {
          "name": "cid",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "channel_not_found",
        "not_a_member"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat-botapi.js:95",
      "legacy": true
    },
    {
      "operationId": "post_chat_api_v1_channels_by_cid_typing",
      "group": "bots",
      "method": "POST",
      "path": "/chat/api/v1/channels/:cid/typing",
      "auth": "bot",
      "scopes": [],
      "params": [
        {
          "name": "cid",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "channel_not_found",
        "not_a_member"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat-botapi.js:96",
      "legacy": true
    },
    {
      "operationId": "get_chat_api_v1_channels_by_cid_messages",
      "group": "bots",
      "method": "GET",
      "path": "/chat/api/v1/channels/:cid/messages",
      "auth": "bot",
      "scopes": [],
      "params": [
        {
          "name": "cid",
          "optional": false
        }
      ],
      "query": [
        "after",
        "before",
        "limit"
      ],
      "body": [],
      "files": [],
      "errors": [
        "channel_not_found",
        "not_a_member"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat-botapi.js:97",
      "legacy": true
    },
    {
      "operationId": "get_chat_api_v1_channels_by_cid_messages_by_mid",
      "group": "bots",
      "method": "GET",
      "path": "/chat/api/v1/channels/:cid/messages/:mid",
      "auth": "bot",
      "scopes": [],
      "params": [
        {
          "name": "cid",
          "optional": false
        },
        {
          "name": "mid",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "channel_not_found",
        "message_not_found",
        "not_a_member"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat-botapi.js:103",
      "legacy": true
    },
    {
      "operationId": "post_chat_api_v1_channels_by_cid_messages",
      "group": "bots",
      "method": "POST",
      "path": "/chat/api/v1/channels/:cid/messages",
      "auth": "bot",
      "scopes": [],
      "params": [
        {
          "name": "cid",
          "optional": false
        }
      ],
      "query": [],
      "body": [
        "content",
        "embeds",
        "message_reference",
        "allowed_mentions",
        "payload_json",
        "attachments"
      ],
      "files": [
        "files[0]"
      ],
      "errors": [
        "channel_not_found",
        "empty_message",
        "not_a_member"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat-botapi.js:109",
      "legacy": true
    },
    {
      "operationId": "patch_chat_api_v1_channels_by_cid_messages_by_mid",
      "group": "bots",
      "method": "PATCH",
      "path": "/chat/api/v1/channels/:cid/messages/:mid",
      "auth": "bot",
      "scopes": [],
      "params": [
        {
          "name": "cid",
          "optional": false
        },
        {
          "name": "mid",
          "optional": false
        }
      ],
      "query": [],
      "body": [
        "content",
        "allowed_mentions"
      ],
      "files": [],
      "errors": [
        "channel_not_found",
        "empty_message",
        "message_not_found",
        "not_a_member",
        "not_allowed",
        "server_read_only"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat-botapi.js:119",
      "legacy": true
    },
    {
      "operationId": "delete_chat_api_v1_channels_by_cid_messages_by_mid",
      "group": "bots",
      "method": "DELETE",
      "path": "/chat/api/v1/channels/:cid/messages/:mid",
      "auth": "bot",
      "scopes": [],
      "params": [
        {
          "name": "cid",
          "optional": false
        },
        {
          "name": "mid",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "channel_not_found",
        "message_not_found",
        "not_a_member",
        "not_allowed",
        "server_read_only"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat-botapi.js:125",
      "legacy": true
    },
    {
      "operationId": "put_chat_api_v1_channels_by_cid_messages_by_mid_reactions_by_emoji_me",
      "group": "bots",
      "method": "PUT",
      "path": "/chat/api/v1/channels/:cid/messages/:mid/reactions/:emoji/@me",
      "auth": "bot",
      "scopes": [],
      "params": [
        {
          "name": "cid",
          "optional": false
        },
        {
          "name": "mid",
          "optional": false
        },
        {
          "name": "emoji",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "channel_not_found",
        "message_not_found",
        "not_a_member",
        "server_read_only",
        "too_many_reactions",
        "unknown_emoji"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat-botapi.js:127",
      "legacy": true
    },
    {
      "operationId": "delete_chat_api_v1_channels_by_cid_messages_by_mid_reactions_by_emoji_me",
      "group": "bots",
      "method": "DELETE",
      "path": "/chat/api/v1/channels/:cid/messages/:mid/reactions/:emoji/@me",
      "auth": "bot",
      "scopes": [],
      "params": [
        {
          "name": "cid",
          "optional": false
        },
        {
          "name": "mid",
          "optional": false
        },
        {
          "name": "emoji",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "channel_not_found",
        "message_not_found",
        "not_a_member",
        "server_read_only",
        "too_many_reactions",
        "unknown_emoji"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat-botapi.js:128",
      "legacy": true
    },
    {
      "operationId": "put_chat_api_v1_channels_by_cid_pins_by_mid",
      "group": "bots",
      "method": "PUT",
      "path": "/chat/api/v1/channels/:cid/pins/:mid",
      "auth": "bot",
      "scopes": [],
      "params": [
        {
          "name": "cid",
          "optional": false
        },
        {
          "name": "mid",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "channel_not_found",
        "empty_message",
        "message_not_found",
        "no_attach_permission",
        "not_a_member",
        "not_allowed",
        "rate_limited",
        "server_read_only",
        "too_many_pins"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat-botapi.js:129",
      "legacy": true
    },
    {
      "operationId": "delete_chat_api_v1_channels_by_cid_pins_by_mid",
      "group": "bots",
      "method": "DELETE",
      "path": "/chat/api/v1/channels/:cid/pins/:mid",
      "auth": "bot",
      "scopes": [],
      "params": [
        {
          "name": "cid",
          "optional": false
        },
        {
          "name": "mid",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "channel_not_found",
        "empty_message",
        "message_not_found",
        "no_attach_permission",
        "not_a_member",
        "not_allowed",
        "rate_limited",
        "server_read_only",
        "too_many_pins"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat-botapi.js:130",
      "legacy": true
    },
    {
      "operationId": "post_bot_payment_requests",
      "group": "bot-payments",
      "method": "POST",
      "path": "/bot/payment-requests",
      "auth": "bot",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [
        "buyer",
        "buyer_id",
        "amount",
        "order_id",
        "description",
        "return_url",
        "expires_in",
        "metadata"
      ],
      "files": [],
      "errors": [
        "invalid_bot_token",
        "merchant_unavailable",
        "bot_banned",
        "invalid_amount",
        "invalid_order_id",
        "invalid_description",
        "invalid_metadata",
        "invalid_return_url",
        "invalid_expires_in",
        "invalid_buyer",
        "buyer_not_found",
        "buyer_is_bot",
        "self_payment",
        "buyer_banned",
        "buyer_suspended",
        "buyer_restricted",
        "order_id_conflict",
        "rate_limited",
        "too_many_open_requests",
        "buyer_has_too_many_open_requests"
      ],
      "notes": "Bot payments. Authorization: Bot TOKEN only (a user token is refused). Asks a buyer for credits; the money goes to the bot owner. Returns 201 with the request and its pay_url, or 200 with idempotent_replay true when the same order_id, buyer and amount were already created. 60 creates per minute per bot. See Bot payments in the guide.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/botpayments.js:160",
      "legacy": false
    },
    {
      "operationId": "get_bot_payment_requests",
      "group": "bot-payments",
      "method": "GET",
      "path": "/bot/payment-requests",
      "auth": "bot",
      "scopes": [],
      "params": [],
      "query": [
        "order_id",
        "status",
        "limit"
      ],
      "body": [],
      "files": [],
      "errors": [
        "invalid_bot_token",
        "not_found",
        "rate_limited"
      ],
      "notes": "Bot payments. With order_id returns that single request (404 not_found if none); otherwise lists your latest requests as {requests: [...]}, optionally filtered by status (pending, paid, declined, expired, cancelled) and limit. 300 reads per minute per bot.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/botpayments.js:207",
      "legacy": false
    },
    {
      "operationId": "get_bot_payment_requests_by_id",
      "group": "bot-payments",
      "method": "GET",
      "path": "/bot/payment-requests/:id",
      "auth": "bot",
      "scopes": [],
      "params": [
        {
          "name": "id",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "invalid_bot_token",
        "not_found",
        "rate_limited"
      ],
      "notes": "Bot payments. One request of your own bot (404 not_found for anything else). Fulfil an order only when status is paid.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/botpayments.js:223",
      "legacy": false
    },
    {
      "operationId": "post_bot_payment_requests_by_id_cancel",
      "group": "bot-payments",
      "method": "POST",
      "path": "/bot/payment-requests/:id/cancel",
      "auth": "bot",
      "scopes": [],
      "params": [
        {
          "name": "id",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "invalid_bot_token",
        "not_found",
        "payment_in_progress",
        "not_cancellable",
        "rate_limited"
      ],
      "notes": "Bot payments. Cancels a pending request. 409 payment_in_progress while the buyer is paying, 409 not_cancellable once paid, declined or expired; cancelling a cancelled request is a no-op 200.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/botpayments.js:231",
      "legacy": false
    },
    {
      "operationId": "get_chat_webhooks_by_wid_by_token",
      "group": "webhooks",
      "method": "GET",
      "path": "/chat/webhooks/:wid/:token",
      "auth": "webhook",
      "scopes": [],
      "params": [
        {
          "name": "wid",
          "optional": false
        },
        {
          "name": "token",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "Unknown Webhook"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat-hooks.js:21",
      "legacy": true
    },
    {
      "operationId": "post_chat_webhooks_by_wid_by_token",
      "group": "webhooks",
      "method": "POST",
      "path": "/chat/webhooks/:wid/:token",
      "auth": "webhook",
      "scopes": [],
      "params": [
        {
          "name": "wid",
          "optional": false
        },
        {
          "name": "token",
          "optional": false
        }
      ],
      "query": [
        "wait"
      ],
      "body": [
        "content",
        "username",
        "avatar_url",
        "embeds",
        "payload_json",
        "attachments"
      ],
      "files": [
        "files[0]"
      ],
      "errors": [
        "Cannot send an empty message",
        "Unknown Webhook",
        "channel_not_found",
        "empty_message",
        "no_attach_permission",
        "not_a_member",
        "rate_limited",
        "server_read_only"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat-hooks.js:24",
      "legacy": true
    },
    {
      "operationId": "delete_chat_webhooks_by_wid_by_token",
      "group": "webhooks",
      "method": "DELETE",
      "path": "/chat/webhooks/:wid/:token",
      "auth": "webhook",
      "scopes": [],
      "params": [
        {
          "name": "wid",
          "optional": false
        },
        {
          "name": "token",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "Unknown Webhook",
        "server_read_only"
      ],
      "notes": "Legacy: Nookara-hosted servers are read-only now (writes answer server_read_only with moved_to). Use an Ember instance instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat-hooks.js:38",
      "legacy": true
    },
    {
      "operationId": "post_chat_yt_by_id_prepare",
      "group": "video-player",
      "method": "POST",
      "path": "/chat/yt/:id/prepare",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "id",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "bad_video",
        "server_busy"
      ],
      "notes": "Client-specific protocol. See the integration guide before using this endpoint.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat-yt.js:116",
      "legacy": true
    },
    {
      "operationId": "get_chat_yt_by_id_status",
      "group": "video-player",
      "method": "GET",
      "path": "/chat/yt/:id/status",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "id",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "bad_video"
      ],
      "notes": "Client-specific protocol. See the integration guide before using this endpoint.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat-yt.js:122",
      "legacy": true
    },
    {
      "operationId": "post_chat_yt_by_id_save",
      "group": "video-player",
      "method": "POST",
      "path": "/chat/yt/:id/save",
      "auth": "bearer",
      "scopes": [
        "CHAT",
        "MEDIA_UPLOAD"
      ],
      "params": [
        {
          "name": "id",
          "optional": false
        }
      ],
      "query": [],
      "body": [
        "title"
      ],
      "files": [],
      "errors": [
        "bad_video",
        "server_busy",
        "server_error",
        "storage_limit_exceeded",
        "upload_suspended"
      ],
      "notes": "Client-specific protocol. See the integration guide before using this endpoint.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat-yt.js:127",
      "legacy": true
    },
    {
      "operationId": "get_chat_yt_stream_by_id",
      "group": "video-player",
      "method": "GET",
      "path": "/chat/yt/stream/:id",
      "auth": "none",
      "scopes": [],
      "params": [
        {
          "name": "id",
          "optional": false
        }
      ],
      "query": [
        "dl",
        "e",
        "s"
      ],
      "body": [],
      "files": [],
      "errors": [
        "link_expired",
        "not_ready"
      ],
      "notes": "Client-specific protocol. See the integration guide before using this endpoint.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/chat-yt.js:147",
      "legacy": true
    },
    {
      "operationId": "get_achievements",
      "group": "achievements",
      "method": "GET",
      "path": "/achievements",
      "auth": "bearer",
      "scopes": [
        "PROFILE_READ"
      ],
      "params": [],
      "query": [
        "game"
      ],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/achievements.js:30",
      "legacy": false
    },
    {
      "operationId": "post_achievements_by_id_grant",
      "group": "achievements",
      "method": "POST",
      "path": "/achievements/:id/grant",
      "auth": "bearer",
      "scopes": [
        "PROFILE_READ"
      ],
      "params": [
        {
          "name": "id",
          "optional": false
        }
      ],
      "query": [],
      "body": [
        "game"
      ],
      "files": [],
      "errors": [
        "achievement_not_found",
        "wrong_game"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/achievements.js:83",
      "legacy": false
    },
    {
      "operationId": "post_achievements_by_id_revoke",
      "group": "achievements",
      "method": "POST",
      "path": "/achievements/:id/revoke",
      "auth": "bearer",
      "scopes": [
        "PROFILE_READ"
      ],
      "params": [
        {
          "name": "id",
          "optional": false
        }
      ],
      "query": [],
      "body": [
        "game"
      ],
      "files": [],
      "errors": [
        "achievement_not_found",
        "wrong_game"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/achievements.js:95",
      "legacy": false
    },
    {
      "operationId": "get_currency_balance",
      "group": "currency",
      "method": "GET",
      "path": "/currency/balance",
      "auth": "bearer",
      "scopes": [
        "CURRENCY_READ"
      ],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/currency.js:51",
      "legacy": false
    },
    {
      "operationId": "get_currency_captcha_status",
      "group": "currency",
      "method": "GET",
      "path": "/currency/captcha-status",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/currency.js:88",
      "legacy": false
    },
    {
      "operationId": "post_currency_transfer",
      "group": "currency",
      "method": "POST",
      "path": "/currency/transfer",
      "auth": "bearer",
      "scopes": [
        "CURRENCY_PAY"
      ],
      "params": [],
      "query": [],
      "body": [
        "amount",
        "note",
        "to",
        "captcha_token"
      ],
      "files": [],
      "errors": [
        "insufficient_balance",
        "invalid_input",
        "self_transfer",
        "user_blocked",
        "user_not_found"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": true,
      "source": "routes/currency.js:95",
      "legacy": false
    },
    {
      "operationId": "get_currency_transactions",
      "group": "currency",
      "method": "GET",
      "path": "/currency/transactions",
      "auth": "bearer",
      "scopes": [
        "CURRENCY_READ"
      ],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/currency.js:105",
      "legacy": false
    },
    {
      "operationId": "post_currency_subscribe",
      "group": "currency",
      "method": "POST",
      "path": "/currency/subscribe",
      "auth": "bearer",
      "scopes": [
        "CURRENCY_PAY"
      ],
      "params": [],
      "query": [],
      "body": [
        "amount",
        "note",
        "period",
        "to"
      ],
      "files": [],
      "errors": [
        "cannot_subscribe_to_self",
        "invalid_input",
        "user_blocked",
        "user_not_found"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/currency.js:122",
      "legacy": false
    },
    {
      "operationId": "delete_currency_subscribe_user_by_username",
      "group": "currency",
      "method": "DELETE",
      "path": "/currency/subscribe/user/:username",
      "auth": "bearer",
      "scopes": [
        "CURRENCY_PAY"
      ],
      "params": [
        {
          "name": "username",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "user_not_found"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/currency.js:146",
      "legacy": false
    },
    {
      "operationId": "get_currency_subscriptions_outgoing",
      "group": "currency",
      "method": "GET",
      "path": "/currency/subscriptions/outgoing",
      "auth": "bearer",
      "scopes": [
        "CURRENCY_READ"
      ],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/currency.js:157",
      "legacy": false
    },
    {
      "operationId": "get_currency_subscriptions_incoming",
      "group": "currency",
      "method": "GET",
      "path": "/currency/subscriptions/incoming",
      "auth": "bearer",
      "scopes": [
        "CURRENCY_READ"
      ],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/currency.js:168",
      "legacy": false
    },
    {
      "operationId": "post_currency_daily_claim",
      "group": "currency",
      "method": "POST",
      "path": "/currency/daily-claim",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "already_claimed"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/currency.js:179",
      "legacy": false
    },
    {
      "operationId": "get_currency_credit_sub",
      "group": "currency",
      "method": "GET",
      "path": "/currency/credit-sub",
      "auth": "bearer",
      "scopes": [
        "CURRENCY_READ"
      ],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/currency.js:200",
      "legacy": false
    },
    {
      "operationId": "post_currency_credit_sub_buy",
      "group": "currency",
      "method": "POST",
      "path": "/currency/credit-sub/buy",
      "auth": "bearer",
      "scopes": [
        "CURRENCY_PAY"
      ],
      "params": [],
      "query": [],
      "body": [
        "tier",
        "weeks"
      ],
      "files": [],
      "errors": [
        "already_have_tier_or_higher",
        "insufficient_balance",
        "invalid_input"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/currency.js:218",
      "legacy": false
    },
    {
      "operationId": "post_currency_credit_sub_ack",
      "group": "currency",
      "method": "POST",
      "path": "/currency/credit-sub/ack",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/currency.js:283",
      "legacy": false
    },
    {
      "operationId": "post_currency_transfer_request",
      "group": "currency",
      "method": "POST",
      "path": "/currency/transfer-request",
      "auth": "bearer",
      "scopes": [
        "CURRENCY_PAY"
      ],
      "params": [],
      "query": [],
      "body": [
        "amount",
        "note",
        "to"
      ],
      "files": [],
      "errors": [
        "invalid_input",
        "self_transfer",
        "too_many_requests",
        "user_blocked",
        "user_not_found"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/payrequests.js:94",
      "legacy": false
    },
    {
      "operationId": "get_currency_transfer_request_by_id",
      "group": "currency",
      "method": "GET",
      "path": "/currency/transfer-request/:id",
      "auth": "none",
      "scopes": [],
      "params": [
        {
          "name": "id",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "not_found"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/payrequests.js:101",
      "legacy": false
    },
    {
      "operationId": "post_currency_transfer_request_by_id_confirm",
      "group": "currency",
      "method": "POST",
      "path": "/currency/transfer-request/:id/confirm",
      "auth": "bearer",
      "scopes": [
        "CURRENCY_PAY"
      ],
      "params": [
        {
          "name": "id",
          "optional": false
        }
      ],
      "query": [],
      "body": [
        "captcha_token"
      ],
      "files": [],
      "errors": [
        "not_found",
        "user_blocked",
        "wrong_account"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": true,
      "source": "routes/payrequests.js:108",
      "legacy": false
    },
    {
      "operationId": "post_currency_transfer_request_by_id_cancel",
      "group": "currency",
      "method": "POST",
      "path": "/currency/transfer-request/:id/cancel",
      "auth": "none",
      "scopes": [],
      "params": [
        {
          "name": "id",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "not_found"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/payrequests.js:114",
      "legacy": false
    },
    {
      "operationId": "get_badges_user_by_username",
      "group": "badges",
      "method": "GET",
      "path": "/badges/user/:username",
      "auth": "none",
      "scopes": [],
      "params": [
        {
          "name": "username",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "user_not_found"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/badges.js:7",
      "legacy": false
    },
    {
      "operationId": "get_badges_all",
      "group": "badges",
      "method": "GET",
      "path": "/badges/all",
      "auth": "none",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/badges.js:21",
      "legacy": false
    },
    {
      "operationId": "get_badges_by_id",
      "group": "badges",
      "method": "GET",
      "path": "/badges/:id",
      "auth": "none",
      "scopes": [],
      "params": [
        {
          "name": "id",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "badge_not_found"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/badges.js:27",
      "legacy": false
    },
    {
      "operationId": "post_media_pfp",
      "group": "media",
      "method": "POST",
      "path": "/media/pfp",
      "auth": "bearer",
      "scopes": [
        "ACCOUNT_WRITE"
      ],
      "params": [],
      "query": [],
      "body": [
        "crop",
        "data"
      ],
      "files": [
        "file"
      ],
      "errors": [
        "bad_image",
        "file_too_large",
        "gif_pro_only",
        "invalid_data_uri",
        "no_file",
        "upload_error",
        "upload_suspended"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/media.js:183",
      "legacy": false
    },
    {
      "operationId": "post_media_banner",
      "group": "media",
      "method": "POST",
      "path": "/media/banner",
      "auth": "bearer",
      "scopes": [
        "ACCOUNT_WRITE"
      ],
      "params": [],
      "query": [],
      "body": [
        "crop",
        "data"
      ],
      "files": [
        "file"
      ],
      "errors": [
        "bad_image",
        "file_too_large",
        "gif_pro_only",
        "invalid_data_uri",
        "no_file",
        "upload_error",
        "upload_suspended"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/media.js:236",
      "legacy": false
    },
    {
      "operationId": "delete_media_pfp",
      "group": "media",
      "method": "DELETE",
      "path": "/media/pfp",
      "auth": "bearer",
      "scopes": [
        "ACCOUNT_WRITE"
      ],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/media.js:284",
      "legacy": false
    },
    {
      "operationId": "delete_media_banner",
      "group": "media",
      "method": "DELETE",
      "path": "/media/banner",
      "auth": "bearer",
      "scopes": [
        "ACCOUNT_WRITE"
      ],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/media.js:291",
      "legacy": false
    },
    {
      "operationId": "post_media_image",
      "group": "media",
      "method": "POST",
      "path": "/media/image",
      "auth": "bearer",
      "scopes": [
        "MEDIA_UPLOAD"
      ],
      "params": [],
      "query": [],
      "body": [
        "data"
      ],
      "files": [
        "file"
      ],
      "errors": [
        "file_too_large",
        "invalid_data_uri",
        "no_file",
        "storage_limit_exceeded",
        "upload_error"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/media.js:298",
      "legacy": false
    },
    {
      "operationId": "post_media_audio",
      "group": "media",
      "method": "POST",
      "path": "/media/audio",
      "auth": "bearer",
      "scopes": [
        "MEDIA_UPLOAD"
      ],
      "params": [],
      "query": [],
      "body": [
        "data"
      ],
      "files": [
        "file"
      ],
      "errors": [
        "file_too_large",
        "invalid_data_uri",
        "no_data",
        "storage_limit_exceeded",
        "unsupported_type",
        "upload_error"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/media.js:328",
      "legacy": false
    },
    {
      "operationId": "post_media_video_chunk",
      "group": "media",
      "method": "POST",
      "path": "/media/video/chunk",
      "auth": "bearer",
      "scopes": [
        "MEDIA_UPLOAD"
      ],
      "params": [],
      "query": [],
      "body": [
        "chunkIndex",
        "sessionId",
        "totalChunks"
      ],
      "files": [
        "chunk"
      ],
      "errors": [
        "file_too_large",
        "forbidden",
        "missing_fields",
        "no_chunk",
        "pro_only",
        "session_expired",
        "upload_error"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/media.js:363",
      "legacy": false
    },
    {
      "operationId": "post_media_video_finalize",
      "group": "media",
      "method": "POST",
      "path": "/media/video/finalize",
      "auth": "bearer",
      "scopes": [
        "MEDIA_UPLOAD"
      ],
      "params": [],
      "query": [],
      "body": [
        "mimeType",
        "originalName",
        "sessionId"
      ],
      "files": [],
      "errors": [
        "file_too_large",
        "forbidden",
        "missing_chunk",
        "missing_session_id",
        "pro_only",
        "session_expired",
        "session_not_found",
        "storage_limit_exceeded",
        "unsupported_type"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/media.js:397",
      "legacy": false
    },
    {
      "operationId": "post_media_video",
      "group": "media",
      "method": "POST",
      "path": "/media/video",
      "auth": "bearer",
      "scopes": [
        "MEDIA_UPLOAD"
      ],
      "params": [],
      "query": [],
      "body": [
        "data"
      ],
      "files": [],
      "errors": [
        "file_too_large",
        "invalid_data_uri",
        "no_file",
        "pro_only",
        "storage_limit_exceeded",
        "unsupported_type"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/media.js:479",
      "legacy": false
    },
    {
      "operationId": "get_media_list",
      "group": "media",
      "method": "GET",
      "path": "/media/list",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/media.js:516",
      "legacy": false
    },
    {
      "operationId": "delete_media_by_id",
      "group": "media",
      "method": "DELETE",
      "path": "/media/:id",
      "auth": "bearer",
      "scopes": [],
      "params": [
        {
          "name": "id",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "not_found"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/media.js:525",
      "legacy": false
    },
    {
      "operationId": "get_account_notifications",
      "group": "notifications",
      "method": "GET",
      "path": "/account/notifications",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [
        "unread",
        "category",
        "cursor",
        "limit"
      ],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "Newest first. Query unread=1 (only unread), category (one category key), cursor (the last id you got, for the next page), limit (up to 50). Returns {notifications: [{id, category, kind, title, body, link, icon, actor: {username, pfp_url} | null, data, read, read_at, created_at}], next_cursor, unread}. title and body are plain text with **bold** as the only markup; render it yourself, never as HTML.",
      "staffOnly": false,
      "captcha": false,
      "source": "notifications.js:348",
      "legacy": false
    },
    {
      "operationId": "get_account_notifications_unread_count",
      "group": "notifications",
      "method": "GET",
      "path": "/account/notifications/unread-count",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "Returns {unread}: the number for the bell.",
      "staffOnly": false,
      "captcha": false,
      "source": "notifications.js:352",
      "legacy": false
    },
    {
      "operationId": "post_account_notifications_read",
      "group": "notifications",
      "method": "POST",
      "path": "/account/notifications/read",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [
        "all",
        "ids"
      ],
      "files": [],
      "errors": [],
      "notes": "Body {ids: [..]} or {all: true}. Returns {success, unread}. Your other sockets get notifications_updated.",
      "staffOnly": false,
      "captcha": false,
      "source": "notifications.js:355",
      "legacy": false
    },
    {
      "operationId": "post_account_notifications_unread",
      "group": "notifications",
      "method": "POST",
      "path": "/account/notifications/unread",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [
        "ids"
      ],
      "files": [],
      "errors": [],
      "notes": "Body {ids: [..]}. Marks them unread again. Returns {success, unread}.",
      "staffOnly": false,
      "captcha": false,
      "source": "notifications.js:359",
      "legacy": false
    },
    {
      "operationId": "delete_account_notifications_by_id",
      "group": "notifications",
      "method": "DELETE",
      "path": "/account/notifications/:id",
      "auth": "bearer",
      "scopes": [],
      "params": [
        {
          "name": "id",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "not_found"
      ],
      "notes": "Deletes one of your notifications. Returns {success, unread}, or 404 not_found.",
      "staffOnly": false,
      "captcha": false,
      "source": "notifications.js:363",
      "legacy": false
    },
    {
      "operationId": "get_account_notification_settings",
      "group": "notifications",
      "method": "GET",
      "path": "/account/notification-settings",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "Returns {categories: [{key, label, description, icon, locked, staff, email, list}]} in settings order. locked categories (system, moderation) are always on. staff categories only exist for staff accounts. list = it lands in the bell and on your devices; email = it is also emailed (throttled).",
      "staffOnly": false,
      "captcha": false,
      "source": "notifications.js:367",
      "legacy": false
    },
    {
      "operationId": "patch_account_notification_settings",
      "group": "notifications",
      "method": "PATCH",
      "path": "/account/notification-settings",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [
        "prefs"
      ],
      "files": [],
      "errors": [],
      "notes": "Body {prefs: {<category>: {email?: bool, list?: bool}}}. Locked and unknown categories are ignored. Returns {success, categories} like the GET.",
      "staffOnly": false,
      "captcha": false,
      "source": "notifications.js:370",
      "legacy": false
    },
    {
      "operationId": "get_notifications",
      "group": "notifications",
      "method": "GET",
      "path": "/notifications",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "Older feed (the Scratch/PenguinMod extension uses it): your unread notifications, newest first, at most 50, as {notifications: [{id, type, category, title, body, data, created_at}]} with the **bold** markers removed. New clients use GET /account/notifications.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/notifications.js:14",
      "legacy": false
    },
    {
      "operationId": "get_notifications_count",
      "group": "notifications",
      "method": "GET",
      "path": "/notifications/count",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "Older feed: {count} of unread notifications. Same number as GET /account/notifications/unread-count.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/notifications.js:25",
      "legacy": false
    },
    {
      "operationId": "patch_notifications_read_all",
      "group": "notifications",
      "method": "PATCH",
      "path": "/notifications/read-all",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "Older feed: marks every notification read. Same as POST /account/notifications/read {all: true}.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/notifications.js:34",
      "legacy": false
    },
    {
      "operationId": "delete_notifications_by_id",
      "group": "notifications",
      "method": "DELETE",
      "path": "/notifications/:id",
      "auth": "bearer",
      "scopes": [],
      "params": [
        {
          "name": "id",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "Older feed: deletes one notification. Always answers {success: true}.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/notifications.js:43",
      "legacy": false
    },
    {
      "operationId": "get_store_game_by_id",
      "group": "store",
      "method": "GET",
      "path": "/store/game/:id",
      "auth": "none",
      "scopes": [],
      "params": [
        {
          "name": "id",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "game_not_found"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/store.js:186",
      "legacy": false
    },
    {
      "operationId": "post_store_game_by_id_buy",
      "group": "store",
      "method": "POST",
      "path": "/store/game/:id/buy",
      "auth": "bearer",
      "scopes": [
        "CURRENCY_PAY"
      ],
      "params": [
        {
          "name": "id",
          "optional": false
        }
      ],
      "query": [],
      "body": [
        "price",
        "captcha_token"
      ],
      "files": [],
      "errors": [
        "already_owned",
        "free_game",
        "game_not_found",
        "insufficient_balance",
        "no_seller",
        "price_changed"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": true,
      "source": "routes/store.js:197",
      "legacy": false
    },
    {
      "operationId": "post_store_game_by_id_refund",
      "group": "store",
      "method": "POST",
      "path": "/store/game/:id/refund",
      "auth": "bearer",
      "scopes": [
        "CURRENCY_PAY"
      ],
      "params": [
        {
          "name": "id",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "not_purchased",
        "played_too_long"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/store.js:221",
      "legacy": false
    },
    {
      "operationId": "get_api_report_search_users",
      "group": "reports",
      "method": "GET",
      "path": "/api/report/search-users",
      "auth": "none",
      "scopes": [],
      "params": [],
      "query": [
        "q"
      ],
      "body": [],
      "files": [],
      "errors": [
        "Search failed",
        "rate_limited"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/report.js:86",
      "legacy": false
    },
    {
      "operationId": "post_api_report_submit",
      "group": "reports",
      "method": "POST",
      "path": "/api/report/submit",
      "auth": "none",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [
        "category",
        "contact",
        "description",
        "location",
        "reported_id"
      ],
      "files": [
        "evidence"
      ],
      "errors": [
        "Contact email is required for guest submissions.",
        "Failed to submit report. Please try again.",
        "Missing required report fields.",
        "Reported user not found.",
        "Your IP address is permanently suspended from submitting guest reports. Please log into your Nookara account to submit a report."
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/report.js:120",
      "legacy": false
    },
    {
      "operationId": "get_api_report_ban_guest_ip",
      "group": "reports",
      "method": "GET",
      "path": "/api/report/ban-guest-ip",
      "auth": "none",
      "scopes": [],
      "params": [],
      "query": [
        "token"
      ],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/report.js:321",
      "legacy": false
    },
    {
      "operationId": "post_api_feedback_by_type_submit",
      "group": "feedback",
      "method": "POST",
      "path": "/api/feedback/:type/submit",
      "auth": "none",
      "scopes": [],
      "params": [
        {
          "name": "type",
          "optional": false
        }
      ],
      "query": [],
      "body": [
        "category",
        "description",
        "location",
        "title"
      ],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/feedback.js:103",
      "legacy": false
    },
    {
      "operationId": "post_api_support_submit",
      "group": "feedback",
      "method": "POST",
      "path": "/api/support/submit",
      "auth": "none",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [
        "category",
        "email",
        "message",
        "name",
        "subject",
        "username"
      ],
      "files": [],
      "errors": [],
      "notes": "Support form. No account needed (an optional Bearer token links the account). Emailed to staff with Reply-To = email. 1 request per IP per hour (429 + Retry-After / retry_after seconds); IPs banned from support get a generic 403.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/support.js:89",
      "legacy": false
    },
    {
      "operationId": "get_api_projects",
      "group": "projects",
      "method": "GET",
      "path": "/api/projects",
      "auth": "none",
      "scopes": [],
      "params": [],
      "query": [
        "q",
        "service",
        "featured",
        "limit",
        "offset"
      ],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "Featured projects: approved apps and games that use Nookara, featured first (then sort order, newest). No sign-in. service = one key from /api/projects/services, q searches the name, tagline and creator, featured=1 only featured ones. limit 1-100 (default 60). Returns { total, limit, offset, projects: [...] }.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/projects.js:51",
      "legacy": false
    },
    {
      "operationId": "get_api_projects_services",
      "group": "projects",
      "method": "GET",
      "path": "/api/projects/services",
      "auth": "none",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "The Nookara services a project can list: { services: [{ key, label }] }.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/projects.js:46",
      "legacy": false
    },
    {
      "operationId": "get_api_projects_mine",
      "group": "projects",
      "method": "GET",
      "path": "/api/projects/mine",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "Your own submissions in any state (pending, approved, rejected with reject_reason, hidden), plus limits { open, per_day }.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/projects.js:70",
      "legacy": false
    },
    {
      "operationId": "get_api_projects_by_slug",
      "group": "projects",
      "method": "GET",
      "path": "/api/projects/:slug",
      "auth": "none",
      "scopes": [],
      "params": [
        {
          "name": "slug",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "not_found"
      ],
      "notes": "One approved project. With the submitter's, creator's or staff bearer token a project that is not approved shows too, with status and reject_reason.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/projects.js:83",
      "legacy": false
    },
    {
      "operationId": "post_api_projects",
      "group": "projects",
      "method": "POST",
      "path": "/api/projects",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [
        "title",
        "tagline",
        "description",
        "url",
        "services",
        "icon",
        "cover"
      ],
      "files": [],
      "errors": [
        "invalid",
        "submit_limit",
        "rate_limited",
        "bad_image",
        "image_too_large",
        "image_fetch_failed"
      ],
      "notes": "Submit a project for review (status pending; you are the creator). Plain text only (tags are removed). url must be https. services: at least one key. icon / cover: a data:image URI or an https image link, re-hosted by Nookara. Limits: 3 a day per account, 6 a day per IP, 5 open (pending or rejected) at once.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/projects.js:104",
      "legacy": false
    },
    {
      "operationId": "patch_api_projects_by_id",
      "group": "projects",
      "method": "PATCH",
      "path": "/api/projects/:id",
      "auth": "bearer",
      "scopes": [],
      "params": [
        {
          "name": "id",
          "optional": false
        }
      ],
      "query": [],
      "body": [
        "title",
        "tagline",
        "description",
        "url",
        "services",
        "icon",
        "cover"
      ],
      "files": [],
      "errors": [
        "not_found",
        "not_editable",
        "invalid",
        "rate_limited"
      ],
      "notes": "Edit your own pending or rejected submission (only the fields you send). It goes back to the review queue.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/projects.js:131",
      "legacy": false
    },
    {
      "operationId": "delete_api_projects_by_id",
      "group": "projects",
      "method": "DELETE",
      "path": "/api/projects/:id",
      "auth": "bearer",
      "scopes": [],
      "params": [
        {
          "name": "id",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "not_found",
        "not_editable"
      ],
      "notes": "Withdraw (delete) your own pending or rejected submission.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/projects.js:156",
      "legacy": false
    },
    {
      "operationId": "get_hyperfocus_profile_by_username",
      "group": "hyperfocus",
      "method": "GET",
      "path": "/hyperfocus/profile/:username",
      "auth": "none",
      "scopes": [],
      "params": [
        {
          "name": "username",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "not_found",
        "server_error"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/hyperfocus.js:120",
      "legacy": false
    },
    {
      "operationId": "get_hyperfocus_achievements_stats_by_game",
      "group": "hyperfocus",
      "method": "GET",
      "path": "/hyperfocus/achievements/stats/:game",
      "auth": "none",
      "scopes": [],
      "params": [
        {
          "name": "game",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "bad_game",
        "server_error"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/hyperfocus.js:225",
      "legacy": false
    },
    {
      "operationId": "get_hyperfocus_admin_remote_by_username",
      "group": "hyperfocus",
      "method": "GET",
      "path": "/hyperfocus/admin/remote/:username",
      "auth": "bearer",
      "scopes": [],
      "params": [
        {
          "name": "username",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "not_found",
        "owner_only"
      ],
      "notes": "",
      "staffOnly": true,
      "captcha": false,
      "source": "routes/hyperfocus.js:241",
      "legacy": false
    },
    {
      "operationId": "post_hyperfocus_admin_close",
      "group": "hyperfocus",
      "method": "POST",
      "path": "/hyperfocus/admin/close",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [
        "username"
      ],
      "files": [],
      "errors": [
        "not_closable",
        "not_found",
        "owner_only"
      ],
      "notes": "",
      "staffOnly": true,
      "captcha": false,
      "source": "routes/hyperfocus.js:249",
      "legacy": false
    },
    {
      "operationId": "get_hyperfocus_friends",
      "group": "hyperfocus",
      "method": "GET",
      "path": "/hyperfocus/friends",
      "auth": "bearer",
      "scopes": [
        "FRIENDS_READ"
      ],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/hyperfocus.js:261",
      "legacy": false
    },
    {
      "operationId": "post_hyperfocus_bug_report",
      "group": "hyperfocus",
      "method": "POST",
      "path": "/hyperfocus/bug-report",
      "auth": "none",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "mail_failed",
        "too_many_reports",
        "too_short"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/hyperfocus.js:280",
      "legacy": false
    },
    {
      "operationId": "patch_admin_user_by_username_rank",
      "group": "staff",
      "method": "PATCH",
      "path": "/admin/user/:username/rank",
      "auth": "bearer",
      "scopes": [],
      "params": [
        {
          "name": "username",
          "optional": false
        }
      ],
      "query": [],
      "body": [
        "rank"
      ],
      "files": [],
      "errors": [
        "cannot_modify_owner",
        "insufficient_rank",
        "invalid_rank",
        "missing_rank",
        "user_not_found"
      ],
      "notes": "",
      "staffOnly": true,
      "captcha": false,
      "source": "routes/admin.js:40",
      "legacy": false
    },
    {
      "operationId": "patch_admin_user_by_username_credits",
      "group": "staff",
      "method": "PATCH",
      "path": "/admin/user/:username/credits",
      "auth": "bearer",
      "scopes": [],
      "params": [
        {
          "name": "username",
          "optional": false
        }
      ],
      "query": [],
      "body": [
        "amount",
        "note"
      ],
      "files": [],
      "errors": [
        "invalid_amount",
        "user_not_found"
      ],
      "notes": "",
      "staffOnly": true,
      "captcha": false,
      "source": "routes/admin.js:79",
      "legacy": false
    },
    {
      "operationId": "get_admin_badges",
      "group": "staff",
      "method": "GET",
      "path": "/admin/badges",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": true,
      "captcha": false,
      "source": "routes/admin.js:104",
      "legacy": false
    },
    {
      "operationId": "post_admin_badges",
      "group": "staff",
      "method": "POST",
      "path": "/admin/badges",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [
        "description",
        "icon_url",
        "name",
        "sort"
      ],
      "files": [],
      "errors": [
        "missing_fields",
        "name_taken"
      ],
      "notes": "",
      "staffOnly": true,
      "captcha": false,
      "source": "routes/admin.js:113",
      "legacy": false
    },
    {
      "operationId": "patch_admin_badges_by_id",
      "group": "staff",
      "method": "PATCH",
      "path": "/admin/badges/:id",
      "auth": "bearer",
      "scopes": [],
      "params": [
        {
          "name": "id",
          "optional": false
        }
      ],
      "query": [],
      "body": [
        "description",
        "icon_url",
        "name",
        "sort"
      ],
      "files": [],
      "errors": [
        "missing_fields",
        "name_taken",
        "no_fields"
      ],
      "notes": "",
      "staffOnly": true,
      "captcha": false,
      "source": "routes/admin.js:128",
      "legacy": false
    },
    {
      "operationId": "delete_admin_badges_by_id",
      "group": "staff",
      "method": "DELETE",
      "path": "/admin/badges/:id",
      "auth": "bearer",
      "scopes": [],
      "params": [
        {
          "name": "id",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "badge_not_found",
        "system_badge"
      ],
      "notes": "",
      "staffOnly": true,
      "captcha": false,
      "source": "routes/admin.js:143",
      "legacy": false
    },
    {
      "operationId": "post_admin_badges_by_id_icon",
      "group": "staff",
      "method": "POST",
      "path": "/admin/badges/:id/icon",
      "auth": "bearer",
      "scopes": [],
      "params": [
        {
          "name": "id",
          "optional": false
        }
      ],
      "query": [],
      "body": [
        "data"
      ],
      "files": [],
      "errors": [
        "bad_image",
        "badge_not_found",
        "too_big"
      ],
      "notes": "",
      "staffOnly": true,
      "captcha": false,
      "source": "routes/admin.js:153",
      "legacy": false
    },
    {
      "operationId": "get_admin_badges_by_id_holders",
      "group": "staff",
      "method": "GET",
      "path": "/admin/badges/:id/holders",
      "auth": "bearer",
      "scopes": [],
      "params": [
        {
          "name": "id",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": true,
      "captcha": false,
      "source": "routes/admin.js:176",
      "legacy": false
    },
    {
      "operationId": "get_admin_user_by_username_badges",
      "group": "staff",
      "method": "GET",
      "path": "/admin/user/:username/badges",
      "auth": "bearer",
      "scopes": [],
      "params": [
        {
          "name": "username",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "user_not_found"
      ],
      "notes": "",
      "staffOnly": true,
      "captcha": false,
      "source": "routes/admin.js:185",
      "legacy": false
    },
    {
      "operationId": "post_admin_user_by_username_badges",
      "group": "staff",
      "method": "POST",
      "path": "/admin/user/:username/badges",
      "auth": "bearer",
      "scopes": [],
      "params": [
        {
          "name": "username",
          "optional": false
        }
      ],
      "query": [],
      "body": [
        "badge_id"
      ],
      "files": [],
      "errors": [
        "badge_not_found",
        "missing_badge_id",
        "user_not_found"
      ],
      "notes": "",
      "staffOnly": true,
      "captcha": false,
      "source": "routes/admin.js:196",
      "legacy": false
    },
    {
      "operationId": "delete_admin_user_by_username_badges_by_badgeid",
      "group": "staff",
      "method": "DELETE",
      "path": "/admin/user/:username/badges/:badgeId",
      "auth": "bearer",
      "scopes": [],
      "params": [
        {
          "name": "username",
          "optional": false
        },
        {
          "name": "badgeId",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "user_not_found"
      ],
      "notes": "",
      "staffOnly": true,
      "captcha": false,
      "source": "routes/admin.js:212",
      "legacy": false
    },
    {
      "operationId": "delete_admin_user_by_username",
      "group": "staff",
      "method": "DELETE",
      "path": "/admin/user/:username",
      "auth": "bearer",
      "scopes": [],
      "params": [
        {
          "name": "username",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "cannot_delete_owner",
        "user_not_found"
      ],
      "notes": "",
      "staffOnly": true,
      "captcha": false,
      "source": "routes/admin.js:227",
      "legacy": false
    },
    {
      "operationId": "post_admin_user_by_username_reset_link",
      "group": "staff",
      "method": "POST",
      "path": "/admin/user/:username/reset-link",
      "auth": "bearer",
      "scopes": [],
      "params": [
        {
          "name": "username",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "server_error",
        "user_not_found"
      ],
      "notes": "",
      "staffOnly": true,
      "captcha": false,
      "source": "routes/admin.js:239",
      "legacy": false
    },
    {
      "operationId": "get_admin_users",
      "group": "staff",
      "method": "GET",
      "path": "/admin/users",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [
        "ip"
      ],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": true,
      "captcha": false,
      "source": "routes/admin.js:260",
      "legacy": false
    },
    {
      "operationId": "get_admin_banned_users",
      "group": "staff",
      "method": "GET",
      "path": "/admin/banned-users",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": true,
      "captcha": false,
      "source": "routes/admin.js:280",
      "legacy": false
    },
    {
      "operationId": "get_admin_userinfo_by_username",
      "group": "staff",
      "method": "GET",
      "path": "/admin/userinfo/:username",
      "auth": "bearer",
      "scopes": [],
      "params": [
        {
          "name": "username",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "not_found",
        "server_error"
      ],
      "notes": "",
      "staffOnly": true,
      "captcha": false,
      "source": "routes/admin.js:296",
      "legacy": false
    },
    {
      "operationId": "put_admin_user_by_username_restrictions",
      "group": "staff",
      "method": "PUT",
      "path": "/admin/user/:username/restrictions",
      "auth": "bearer",
      "scopes": [],
      "params": [
        {
          "name": "username",
          "optional": false
        }
      ],
      "query": [],
      "body": [
        "disabled_scopes"
      ],
      "files": [],
      "errors": [
        "cannot_restrict_owner",
        "not_found",
        "server_error"
      ],
      "notes": "",
      "staffOnly": true,
      "captcha": false,
      "source": "routes/admin.js:317",
      "legacy": false
    },
    {
      "operationId": "patch_admin_user_by_username_profile",
      "group": "staff",
      "method": "PATCH",
      "path": "/admin/user/:username/profile",
      "auth": "bearer",
      "scopes": [],
      "params": [
        {
          "name": "username",
          "optional": false
        }
      ],
      "query": [],
      "body": [
        "bio",
        "color",
        "country_code",
        "timezone"
      ],
      "files": [],
      "errors": [
        "no_fields",
        "server_error",
        "user_not_found"
      ],
      "notes": "",
      "staffOnly": true,
      "captcha": false,
      "source": "routes/admin.js:336",
      "legacy": false
    },
    {
      "operationId": "delete_admin_user_by_username_pfp",
      "group": "staff",
      "method": "DELETE",
      "path": "/admin/user/:username/pfp",
      "auth": "bearer",
      "scopes": [],
      "params": [
        {
          "name": "username",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "server_error",
        "user_not_found"
      ],
      "notes": "",
      "staffOnly": true,
      "captcha": false,
      "source": "routes/admin.js:359",
      "legacy": false
    },
    {
      "operationId": "delete_admin_user_by_username_banner",
      "group": "staff",
      "method": "DELETE",
      "path": "/admin/user/:username/banner",
      "auth": "bearer",
      "scopes": [],
      "params": [
        {
          "name": "username",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "server_error",
        "user_not_found"
      ],
      "notes": "",
      "staffOnly": true,
      "captcha": false,
      "source": "routes/admin.js:380",
      "legacy": false
    },
    {
      "operationId": "post_admin_user_by_username_grant_rename",
      "group": "staff",
      "method": "POST",
      "path": "/admin/user/:username/grant-rename",
      "auth": "bearer",
      "scopes": [],
      "params": [
        {
          "name": "username",
          "optional": false
        }
      ],
      "query": [],
      "body": [
        "days"
      ],
      "files": [],
      "errors": [
        "server_error",
        "user_not_found"
      ],
      "notes": "",
      "staffOnly": true,
      "captcha": false,
      "source": "routes/admin.js:401",
      "legacy": false
    },
    {
      "operationId": "post_admin_user_by_username_ban",
      "group": "staff",
      "method": "POST",
      "path": "/admin/user/:username/ban",
      "auth": "bearer",
      "scopes": [],
      "params": [
        {
          "name": "username",
          "optional": false
        }
      ],
      "query": [],
      "body": [
        "reason"
      ],
      "files": [],
      "errors": [
        "cannot_ban_owner",
        "insufficient_rank",
        "server_error",
        "user_not_found"
      ],
      "notes": "",
      "staffOnly": true,
      "captcha": false,
      "source": "routes/admin.js:417",
      "legacy": false
    },
    {
      "operationId": "post_admin_user_by_username_unban",
      "group": "staff",
      "method": "POST",
      "path": "/admin/user/:username/unban",
      "auth": "bearer",
      "scopes": [],
      "params": [
        {
          "name": "username",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "server_error",
        "user_not_banned",
        "user_not_found"
      ],
      "notes": "",
      "staffOnly": true,
      "captcha": false,
      "source": "routes/admin.js:442",
      "legacy": false
    },
    {
      "operationId": "patch_admin_user_by_username_monitor",
      "group": "staff",
      "method": "PATCH",
      "path": "/admin/user/:username/monitor",
      "auth": "bearer",
      "scopes": [],
      "params": [
        {
          "name": "username",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "server_error",
        "user_not_found"
      ],
      "notes": "",
      "staffOnly": true,
      "captcha": false,
      "source": "routes/admin.js:458",
      "legacy": false
    },
    {
      "operationId": "post_admin_user_by_username_revoke_sessions",
      "group": "staff",
      "method": "POST",
      "path": "/admin/user/:username/revoke-sessions",
      "auth": "bearer",
      "scopes": [],
      "params": [
        {
          "name": "username",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "server_error",
        "user_not_found"
      ],
      "notes": "",
      "staffOnly": true,
      "captcha": false,
      "source": "routes/admin.js:472",
      "legacy": false
    },
    {
      "operationId": "delete_admin_user_by_username_sessions_by_sessionid",
      "group": "staff",
      "method": "DELETE",
      "path": "/admin/user/:username/sessions/:sessionId",
      "auth": "bearer",
      "scopes": [],
      "params": [
        {
          "name": "username",
          "optional": false
        },
        {
          "name": "sessionId",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "server_error",
        "user_not_found"
      ],
      "notes": "",
      "staffOnly": true,
      "captcha": false,
      "source": "routes/admin.js:484",
      "legacy": false
    },
    {
      "operationId": "post_admin_warn_by_username",
      "group": "staff",
      "method": "POST",
      "path": "/admin/warn/:username",
      "auth": "bearer",
      "scopes": [],
      "params": [
        {
          "name": "username",
          "optional": false
        }
      ],
      "query": [],
      "body": [
        "level",
        "reason"
      ],
      "files": [],
      "errors": [
        "cannot_warn_owner",
        "invalid_level",
        "missing_fields",
        "server_error",
        "user_not_found"
      ],
      "notes": "",
      "staffOnly": true,
      "captcha": false,
      "source": "routes/admin.js:508",
      "legacy": false
    },
    {
      "operationId": "get_admin_warnings_by_username",
      "group": "staff",
      "method": "GET",
      "path": "/admin/warnings/:username",
      "auth": "bearer",
      "scopes": [],
      "params": [
        {
          "name": "username",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "user_not_found"
      ],
      "notes": "",
      "staffOnly": true,
      "captcha": false,
      "source": "routes/admin.js:584",
      "legacy": false
    },
    {
      "operationId": "get_admin_mod_logs",
      "group": "staff",
      "method": "GET",
      "path": "/admin/mod-logs",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": true,
      "captcha": false,
      "source": "routes/admin.js:601",
      "legacy": false
    },
    {
      "operationId": "get_admin_monitored_logs",
      "group": "staff",
      "method": "GET",
      "path": "/admin/monitored-logs",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": true,
      "captcha": false,
      "source": "routes/admin.js:614",
      "legacy": false
    },
    {
      "operationId": "get_admin_mod_logs_by_username",
      "group": "staff",
      "method": "GET",
      "path": "/admin/mod-logs/:username",
      "auth": "bearer",
      "scopes": [],
      "params": [
        {
          "name": "username",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "user_not_found"
      ],
      "notes": "",
      "staffOnly": true,
      "captcha": false,
      "source": "routes/admin.js:627",
      "legacy": false
    },
    {
      "operationId": "post_admin_send_vmail",
      "group": "staff",
      "method": "POST",
      "path": "/admin/send-vmail",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [
        "message",
        "subject",
        "username"
      ],
      "files": [],
      "errors": [
        "missing_fields",
        "user_not_found"
      ],
      "notes": "Staff. The older \"system message\" call. System DMs are gone: {username, subject, message} now becomes a system notification for that account.",
      "staffOnly": true,
      "captcha": false,
      "source": "routes/admin.js:646",
      "legacy": false
    },
    {
      "operationId": "post_admin_notifications_send",
      "group": "staff",
      "method": "POST",
      "path": "/admin/notifications/send",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [
        "all",
        "body",
        "confirm",
        "email",
        "link",
        "title",
        "usernames"
      ],
      "files": [],
      "errors": [
        "bad_link",
        "confirm_required",
        "forbidden",
        "missing_fields",
        "too_long",
        "too_many",
        "too_soon",
        "user_not_found"
      ],
      "notes": "Staff. Sends a system notification (a locked category, nobody can turn it off). Body {usernames: [..]} (up to 200) or {all: true, confirm: \"ALL\"} (admins and the owner only, once every 10 minutes), plus title (up to 128), body (up to 2000, **bold** allowed), link (a site path or an https URL) and email (also email it). Returns {success, sent, emailed}. Errors: missing_fields, too_long, bad_link, forbidden, confirm_required, too_soon (429), too_many, user_not_found (with missing).",
      "staffOnly": true,
      "captcha": false,
      "source": "routes/admin.js:656",
      "legacy": false
    },
    {
      "operationId": "post_admin_send_email",
      "group": "staff",
      "method": "POST",
      "path": "/admin/send-email",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [
        "message",
        "subject",
        "username"
      ],
      "files": [],
      "errors": [
        "missing_fields",
        "user_has_no_email",
        "user_not_found"
      ],
      "notes": "",
      "staffOnly": true,
      "captcha": false,
      "source": "routes/admin.js:658",
      "legacy": false
    },
    {
      "operationId": "post_admin_ip_ban",
      "group": "staff",
      "method": "POST",
      "path": "/admin/ip-ban",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [
        "expires_at",
        "ip",
        "ip_hash",
        "reason"
      ],
      "files": [],
      "errors": [
        "missing_ip"
      ],
      "notes": "",
      "staffOnly": true,
      "captcha": false,
      "source": "routes/admin.js:677",
      "legacy": false
    },
    {
      "operationId": "delete_admin_ip_ban_by_hash",
      "group": "staff",
      "method": "DELETE",
      "path": "/admin/ip-ban/:hash",
      "auth": "bearer",
      "scopes": [],
      "params": [
        {
          "name": "hash",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": true,
      "captcha": false,
      "source": "routes/admin.js:691",
      "legacy": false
    },
    {
      "operationId": "delete_admin_user_by_username_warn_clear",
      "group": "staff",
      "method": "DELETE",
      "path": "/admin/user/:username/warn/clear",
      "auth": "bearer",
      "scopes": [],
      "params": [
        {
          "name": "username",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "server_error",
        "user_not_found"
      ],
      "notes": "",
      "staffOnly": true,
      "captcha": false,
      "source": "routes/admin.js:697",
      "legacy": false
    },
    {
      "operationId": "get_admin_ip_bans",
      "group": "staff",
      "method": "GET",
      "path": "/admin/ip-bans",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": true,
      "captcha": false,
      "source": "routes/admin.js:723",
      "legacy": false
    },
    {
      "operationId": "get_admin_blacklisted_domains",
      "group": "staff",
      "method": "GET",
      "path": "/admin/blacklisted-domains",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": true,
      "captcha": false,
      "source": "routes/admin.js:739",
      "legacy": false
    },
    {
      "operationId": "post_admin_blacklisted_domains",
      "group": "staff",
      "method": "POST",
      "path": "/admin/blacklisted-domains",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [
        "domain",
        "reason"
      ],
      "files": [],
      "errors": [
        "invalid_domain"
      ],
      "notes": "",
      "staffOnly": true,
      "captcha": false,
      "source": "routes/admin.js:750",
      "legacy": false
    },
    {
      "operationId": "delete_admin_blacklisted_domains_by_domain",
      "group": "staff",
      "method": "DELETE",
      "path": "/admin/blacklisted-domains/:domain",
      "auth": "bearer",
      "scopes": [],
      "params": [
        {
          "name": "domain",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": true,
      "captcha": false,
      "source": "routes/admin.js:767",
      "legacy": false
    },
    {
      "operationId": "get_admin_stats",
      "group": "staff",
      "method": "GET",
      "path": "/admin/stats",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "server_error"
      ],
      "notes": "",
      "staffOnly": true,
      "captcha": false,
      "source": "routes/admin.js:777",
      "legacy": false
    },
    {
      "operationId": "post_admin_tos",
      "group": "staff",
      "method": "POST",
      "path": "/admin/tos",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [
        "content",
        "effective_date",
        "version"
      ],
      "files": [],
      "errors": [
        "missing_fields"
      ],
      "notes": "",
      "staffOnly": true,
      "captcha": false,
      "source": "routes/admin.js:804",
      "legacy": false
    },
    {
      "operationId": "get_admin_monitored",
      "group": "staff",
      "method": "GET",
      "path": "/admin/monitored",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "server_error"
      ],
      "notes": "",
      "staffOnly": true,
      "captcha": false,
      "source": "routes/admin.js:826",
      "legacy": false
    },
    {
      "operationId": "get_admin_monitored_pending",
      "group": "staff",
      "method": "GET",
      "path": "/admin/monitored/pending",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "server_error"
      ],
      "notes": "",
      "staffOnly": true,
      "captcha": false,
      "source": "routes/admin.js:844",
      "legacy": false
    },
    {
      "operationId": "post_admin_monitored_pending_by_id_approve",
      "group": "staff",
      "method": "POST",
      "path": "/admin/monitored/pending/:id/approve",
      "auth": "bearer",
      "scopes": [],
      "params": [
        {
          "name": "id",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "not_found",
        "server_error"
      ],
      "notes": "",
      "staffOnly": true,
      "captcha": false,
      "source": "routes/admin.js:857",
      "legacy": false
    },
    {
      "operationId": "delete_admin_monitored_pending_by_id",
      "group": "staff",
      "method": "DELETE",
      "path": "/admin/monitored/pending/:id",
      "auth": "bearer",
      "scopes": [],
      "params": [
        {
          "name": "id",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "not_found",
        "server_error"
      ],
      "notes": "",
      "staffOnly": true,
      "captcha": false,
      "source": "routes/admin.js:870",
      "legacy": false
    },
    {
      "operationId": "get_admin_api_logs",
      "group": "staff",
      "method": "GET",
      "path": "/admin/api-logs",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [
        "limit",
        "offset"
      ],
      "body": [],
      "files": [],
      "errors": [
        "server_error"
      ],
      "notes": "",
      "staffOnly": true,
      "captcha": false,
      "source": "routes/admin.js:927",
      "legacy": false
    },
    {
      "operationId": "get_admin_api_logs_top",
      "group": "staff",
      "method": "GET",
      "path": "/admin/api-logs/top",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [
        "by",
        "hours"
      ],
      "body": [],
      "files": [],
      "errors": [
        "server_error"
      ],
      "notes": "",
      "staffOnly": true,
      "captcha": false,
      "source": "routes/admin.js:944",
      "legacy": false
    },
    {
      "operationId": "get_admin_feedback",
      "group": "staff",
      "method": "GET",
      "path": "/admin/feedback",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [
        "type"
      ],
      "body": [],
      "files": [],
      "errors": [
        "server_error"
      ],
      "notes": "",
      "staffOnly": true,
      "captcha": false,
      "source": "routes/admin.js:965",
      "legacy": false
    },
    {
      "operationId": "patch_admin_feedback_by_id_pin",
      "group": "staff",
      "method": "PATCH",
      "path": "/admin/feedback/:id/pin",
      "auth": "bearer",
      "scopes": [],
      "params": [
        {
          "name": "id",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "not_found",
        "server_error"
      ],
      "notes": "",
      "staffOnly": true,
      "captcha": false,
      "source": "routes/admin.js:988",
      "legacy": false
    },
    {
      "operationId": "post_admin_feedback_by_id_grant_badge",
      "group": "staff",
      "method": "POST",
      "path": "/admin/feedback/:id/grant-badge",
      "auth": "bearer",
      "scopes": [],
      "params": [
        {
          "name": "id",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "not_found",
        "server_error",
        "user_not_found"
      ],
      "notes": "",
      "staffOnly": true,
      "captcha": false,
      "source": "routes/admin.js:1000",
      "legacy": false
    },
    {
      "operationId": "delete_admin_feedback_by_id",
      "group": "staff",
      "method": "DELETE",
      "path": "/admin/feedback/:id",
      "auth": "bearer",
      "scopes": [],
      "params": [
        {
          "name": "id",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "not_found",
        "server_error"
      ],
      "notes": "",
      "staffOnly": true,
      "captcha": false,
      "source": "routes/admin.js:1017",
      "legacy": false
    },
    {
      "operationId": "get_admin_vpn_networks",
      "group": "staff",
      "method": "GET",
      "path": "/admin/vpn-networks",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "network_rules_unavailable"
      ],
      "notes": "",
      "staffOnly": true,
      "captcha": false,
      "source": "routes/admin.js:1039",
      "legacy": false
    },
    {
      "operationId": "post_admin_vpn_networks",
      "group": "staff",
      "method": "POST",
      "path": "/admin/vpn-networks",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [
        "action",
        "cidr",
        "reason"
      ],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": true,
      "captcha": false,
      "source": "routes/admin.js:1043",
      "legacy": false
    },
    {
      "operationId": "delete_admin_vpn_networks_by_cidr",
      "group": "staff",
      "method": "DELETE",
      "path": "/admin/vpn-networks/:cidr",
      "auth": "bearer",
      "scopes": [],
      "params": [
        {
          "name": "cidr",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "network_rule_delete_failed"
      ],
      "notes": "",
      "staffOnly": true,
      "captcha": false,
      "source": "routes/admin.js:1052",
      "legacy": false
    },
    {
      "operationId": "post_admin_vpn_networks_refresh",
      "group": "staff",
      "method": "POST",
      "path": "/admin/vpn-networks/refresh",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "vpn_feed_update_failed"
      ],
      "notes": "",
      "staffOnly": true,
      "captcha": false,
      "source": "routes/admin.js:1059",
      "legacy": false
    },
    {
      "operationId": "get_connect_spotify_status",
      "group": "spotify",
      "method": "GET",
      "path": "/connect/spotify/status",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "Client-specific protocol. See the integration guide before using this endpoint.",
      "staffOnly": false,
      "captcha": false,
      "source": "spotify.js:98",
      "legacy": false
    },
    {
      "operationId": "post_connect_spotify_link",
      "group": "spotify",
      "method": "POST",
      "path": "/connect/spotify/link",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "spotify_not_configured"
      ],
      "notes": "Client-specific protocol. See the integration guide before using this endpoint.",
      "staffOnly": false,
      "captcha": false,
      "source": "spotify.js:102",
      "legacy": false
    },
    {
      "operationId": "get_connect_spotify_callback",
      "group": "spotify",
      "method": "GET",
      "path": "/connect/spotify/callback",
      "auth": "none",
      "scopes": [],
      "params": [],
      "query": [
        "code",
        "error",
        "state"
      ],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "Client-specific protocol. See the integration guide before using this endpoint.",
      "staffOnly": false,
      "captcha": false,
      "source": "spotify.js:108",
      "legacy": false
    },
    {
      "operationId": "patch_connect_spotify_profile",
      "group": "spotify",
      "method": "PATCH",
      "path": "/connect/spotify/profile",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [
        "show"
      ],
      "files": [],
      "errors": [
        "not_linked"
      ],
      "notes": "Client-specific protocol. See the integration guide before using this endpoint.",
      "staffOnly": false,
      "captcha": false,
      "source": "spotify.js:125",
      "legacy": false
    },
    {
      "operationId": "delete_connect_spotify",
      "group": "spotify",
      "method": "DELETE",
      "path": "/connect/spotify",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "Client-specific protocol. See the integration guide before using this endpoint.",
      "staffOnly": false,
      "captcha": false,
      "source": "spotify.js:130",
      "legacy": false
    },
    {
      "operationId": "get_push_vapid",
      "group": "push",
      "method": "GET",
      "path": "/push/vapid",
      "auth": "none",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "webpush.js:158",
      "legacy": false
    },
    {
      "operationId": "get_push_state",
      "group": "push",
      "method": "GET",
      "path": "/push/state",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "Browser push switches for chat-type events (messages, calls, mentions, achievements...). Friends, credits and announcements are notifications now and follow GET /account/notification-settings instead.",
      "staffOnly": false,
      "captcha": false,
      "source": "webpush.js:159",
      "legacy": false
    },
    {
      "operationId": "post_push_subscribe",
      "group": "push",
      "method": "POST",
      "path": "/push/subscribe",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [
        "subscription"
      ],
      "files": [],
      "errors": [
        "bad_subscription"
      ],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "webpush.js:163",
      "legacy": false
    },
    {
      "operationId": "post_push_unsubscribe",
      "group": "push",
      "method": "POST",
      "path": "/push/unsubscribe",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [
        "endpoint"
      ],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "webpush.js:174",
      "legacy": false
    },
    {
      "operationId": "patch_push_prefs",
      "group": "push",
      "method": "PATCH",
      "path": "/push/prefs",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [
        "prefs"
      ],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "webpush.js:179",
      "legacy": false
    },
    {
      "operationId": "post_push_test",
      "group": "push",
      "method": "POST",
      "path": "/push/test",
      "auth": "bearer",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "source": "webpush.js:185",
      "legacy": false
    },
    {
      "operationId": "get_arcade_sim_js",
      "group": "arcade",
      "method": "GET",
      "path": "/arcade/sim.js",
      "auth": "none",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "Client-specific protocol. See the integration guide before using this endpoint.",
      "staffOnly": false,
      "captcha": false,
      "source": "arcade/index.js:591",
      "legacy": false
    },
    {
      "operationId": "get_arcade_sim_sig",
      "group": "arcade",
      "method": "GET",
      "path": "/arcade/sim.sig",
      "auth": "none",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "Client-specific protocol. See the integration guide before using this endpoint.",
      "staffOnly": false,
      "captcha": false,
      "source": "arcade/index.js:592",
      "legacy": false
    },
    {
      "operationId": "get_arcade_sim_version",
      "group": "arcade",
      "method": "GET",
      "path": "/arcade/sim-version",
      "auth": "none",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "Client-specific protocol. See the integration guide before using this endpoint.",
      "staffOnly": false,
      "captcha": false,
      "source": "arcade/index.js:593",
      "legacy": false
    },
    {
      "operationId": "get_arcade_physics_js",
      "group": "arcade",
      "method": "GET",
      "path": "/arcade/physics.js",
      "auth": "none",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "Client-specific protocol. See the integration guide before using this endpoint.",
      "staffOnly": false,
      "captcha": false,
      "source": "arcade/index.js:594",
      "legacy": false
    },
    {
      "operationId": "get_arcade_physics_sig",
      "group": "arcade",
      "method": "GET",
      "path": "/arcade/physics.sig",
      "auth": "none",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "Client-specific protocol. See the integration guide before using this endpoint.",
      "staffOnly": false,
      "captcha": false,
      "source": "arcade/index.js:595",
      "legacy": false
    },
    {
      "operationId": "get_arcade_planck_js",
      "group": "arcade",
      "method": "GET",
      "path": "/arcade/planck.js",
      "auth": "none",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "Client-specific protocol. See the integration guide before using this endpoint.",
      "staffOnly": false,
      "captcha": false,
      "source": "arcade/index.js:596",
      "legacy": false
    },
    {
      "operationId": "get_arcade_admin",
      "group": "arcade",
      "method": "GET",
      "path": "/arcade/admin",
      "auth": "none",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "Client-specific protocol. See the integration guide before using this endpoint.",
      "staffOnly": true,
      "captcha": false,
      "source": "arcade/index.js:597",
      "legacy": false
    },
    {
      "operationId": "get_arcade_showcase",
      "group": "arcade",
      "method": "GET",
      "path": "/arcade/showcase",
      "auth": "none",
      "scopes": [],
      "params": [],
      "query": [
        "n"
      ],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "Client-specific protocol. See the integration guide before using this endpoint.",
      "staffOnly": false,
      "captcha": false,
      "source": "arcade/index.js:619",
      "legacy": false
    },
    {
      "operationId": "get_arcade_atlas_index",
      "group": "arcade",
      "method": "GET",
      "path": "/arcade/atlas/index",
      "auth": "none",
      "scopes": [],
      "params": [],
      "query": [
        "cell"
      ],
      "body": [],
      "files": [],
      "errors": [
        "bad_cell"
      ],
      "notes": "Client-specific protocol. See the integration guide before using this endpoint.",
      "staffOnly": false,
      "captcha": false,
      "source": "arcade/index.js:690",
      "legacy": false
    },
    {
      "operationId": "get_arcade_atlas_by_v_by_page_png",
      "group": "arcade",
      "method": "GET",
      "path": "/arcade/atlas/:v/:page.png",
      "auth": "none",
      "scopes": [],
      "params": [
        {
          "name": "v",
          "optional": false
        },
        {
          "name": "page",
          "optional": false
        }
      ],
      "query": [
        "cell"
      ],
      "body": [],
      "files": [],
      "errors": [
        "bad_cell",
        "stale"
      ],
      "notes": "Client-specific protocol. See the integration guide before using this endpoint.",
      "staffOnly": false,
      "captcha": false,
      "source": "arcade/index.js:696",
      "legacy": false
    },
    {
      "operationId": "get_arcade_thumb",
      "group": "arcade",
      "method": "GET",
      "path": "/arcade/thumb",
      "auth": "none",
      "scopes": [],
      "params": [],
      "query": [
        "u",
        "w"
      ],
      "body": [],
      "files": [],
      "errors": [
        "bad_image",
        "bad_path",
        "bad_width",
        "not_found"
      ],
      "notes": "Client-specific protocol. See the integration guide before using this endpoint.",
      "staffOnly": false,
      "captcha": false,
      "source": "arcade/index.js:708",
      "legacy": false
    },
    {
      "operationId": "get_arcade_state",
      "group": "arcade",
      "method": "GET",
      "path": "/arcade/state",
      "auth": "bearer",
      "scopes": [
        "PROFILE_READ"
      ],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "Client-specific protocol. See the integration guide before using this endpoint.",
      "staffOnly": false,
      "captcha": false,
      "source": "arcade/index.js:814",
      "legacy": false
    },
    {
      "operationId": "get_arcade_machine_by_id",
      "group": "arcade",
      "method": "GET",
      "path": "/arcade/machine/:id",
      "auth": "bearer",
      "scopes": [
        "PROFILE_READ"
      ],
      "params": [
        {
          "name": "id",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "machine_not_found"
      ],
      "notes": "Client-specific protocol. See the integration guide before using this endpoint.",
      "staffOnly": false,
      "captcha": false,
      "source": "arcade/index.js:842",
      "legacy": false
    },
    {
      "operationId": "post_arcade_machine_by_id_play",
      "group": "arcade",
      "method": "POST",
      "path": "/arcade/machine/:id/play",
      "auth": "bearer",
      "scopes": [
        "PROFILE_READ"
      ],
      "params": [
        {
          "name": "id",
          "optional": false
        }
      ],
      "query": [],
      "body": [
        "hold",
        "seq",
        "trace"
      ],
      "files": [],
      "errors": [
        "closed",
        "machine_not_found",
        "no_plays",
        "no_practice",
        "out_of_sync",
        "server_error"
      ],
      "notes": "Client-specific protocol. See the integration guide before using this endpoint.",
      "staffOnly": false,
      "captcha": false,
      "source": "arcade/index.js:855",
      "legacy": false
    },
    {
      "operationId": "post_arcade_machine_by_id_reset",
      "group": "arcade",
      "method": "POST",
      "path": "/arcade/machine/:id/reset",
      "auth": "bearer",
      "scopes": [
        "PROFILE_READ"
      ],
      "params": [
        {
          "name": "id",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "machine_not_found"
      ],
      "notes": "Client-specific protocol. See the integration guide before using this endpoint.",
      "staffOnly": false,
      "captcha": false,
      "source": "arcade/index.js:981",
      "legacy": false
    },
    {
      "operationId": "post_arcade_check",
      "group": "arcade",
      "method": "POST",
      "path": "/arcade/check",
      "auth": "bearer",
      "scopes": [
        "PROFILE_READ"
      ],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "Client-specific protocol. See the integration guide before using this endpoint.",
      "staffOnly": false,
      "captcha": false,
      "source": "arcade/index.js:995",
      "legacy": false
    },
    {
      "operationId": "get_arcade_news",
      "group": "arcade",
      "method": "GET",
      "path": "/arcade/news",
      "auth": "bearer",
      "scopes": [
        "PROFILE_READ"
      ],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "Client-specific protocol. See the integration guide before using this endpoint.",
      "staffOnly": false,
      "captcha": false,
      "source": "arcade/index.js:1017",
      "legacy": false
    },
    {
      "operationId": "post_arcade_tutorial",
      "group": "arcade",
      "method": "POST",
      "path": "/arcade/tutorial",
      "auth": "bearer",
      "scopes": [
        "PROFILE_READ"
      ],
      "params": [],
      "query": [],
      "body": [
        "done"
      ],
      "files": [],
      "errors": [],
      "notes": "Client-specific protocol. See the integration guide before using this endpoint.",
      "staffOnly": false,
      "captcha": false,
      "source": "arcade/index.js:1023",
      "legacy": false
    },
    {
      "operationId": "get_arcade_book",
      "group": "arcade",
      "method": "GET",
      "path": "/arcade/book",
      "auth": "bearer",
      "scopes": [
        "PROFILE_READ"
      ],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "closed"
      ],
      "notes": "Client-specific protocol. See the integration guide before using this endpoint.",
      "staffOnly": false,
      "captcha": false,
      "source": "arcade/index.js:1031",
      "legacy": false
    },
    {
      "operationId": "post_arcade_showcase",
      "group": "arcade",
      "method": "POST",
      "path": "/arcade/showcase",
      "auth": "bearer",
      "scopes": [
        "PROFILE_READ"
      ],
      "params": [],
      "query": [],
      "body": [
        "badges"
      ],
      "files": [],
      "errors": [
        "not_owned"
      ],
      "notes": "Client-specific protocol. See the integration guide before using this endpoint.",
      "staffOnly": false,
      "captcha": false,
      "source": "arcade/index.js:1060",
      "legacy": false
    },
    {
      "operationId": "put_arcade_board",
      "group": "arcade",
      "method": "PUT",
      "path": "/arcade/board",
      "auth": "bearer",
      "scopes": [
        "ACCOUNT_WRITE"
      ],
      "params": [],
      "query": [],
      "body": [
        "items",
        "kind"
      ],
      "files": [],
      "errors": [],
      "notes": "Client-specific protocol. See the integration guide before using this endpoint.",
      "staffOnly": false,
      "captcha": false,
      "source": "arcade/index.js:1075",
      "legacy": false
    },
    {
      "operationId": "post_arcade_buy",
      "group": "arcade",
      "method": "POST",
      "path": "/arcade/buy",
      "auth": "bearer",
      "scopes": [
        "PROFILE_READ"
      ],
      "params": [],
      "query": [],
      "body": [
        "bundle",
        "machine"
      ],
      "files": [],
      "errors": [
        "bundle_not_found",
        "limit_reached",
        "machine_not_found"
      ],
      "notes": "Client-specific protocol. See the integration guide before using this endpoint.",
      "staffOnly": false,
      "captcha": false,
      "source": "arcade/index.js:1089",
      "legacy": false
    },
    {
      "operationId": "get_arcade_purchase_by_id",
      "group": "arcade",
      "method": "GET",
      "path": "/arcade/purchase/:id",
      "auth": "bearer",
      "scopes": [
        "PROFILE_READ"
      ],
      "params": [
        {
          "name": "id",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "not_found"
      ],
      "notes": "Client-specific protocol. See the integration guide before using this endpoint.",
      "staffOnly": false,
      "captcha": false,
      "source": "arcade/index.js:1120",
      "legacy": false
    },
    {
      "operationId": "post_arcade_purchase_by_id_cancel",
      "group": "arcade",
      "method": "POST",
      "path": "/arcade/purchase/:id/cancel",
      "auth": "bearer",
      "scopes": [
        "PROFILE_READ"
      ],
      "params": [
        {
          "name": "id",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "Client-specific protocol. See the integration guide before using this endpoint.",
      "staffOnly": false,
      "captcha": false,
      "source": "arcade/index.js:1130",
      "legacy": false
    },
    {
      "operationId": "get_arcade_profile_by_username",
      "group": "arcade",
      "method": "GET",
      "path": "/arcade/profile/:username",
      "auth": "none",
      "scopes": [],
      "params": [
        {
          "name": "username",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "not_found"
      ],
      "notes": "Client-specific protocol. See the integration guide before using this endpoint.",
      "staffOnly": false,
      "captcha": false,
      "source": "arcade/index.js:1140",
      "legacy": false
    },
    {
      "operationId": "get_bonfire_bots_gallery",
      "group": "bot-gallery",
      "method": "GET",
      "path": "/bonfire/bots/gallery",
      "auth": "none",
      "scopes": [],
      "params": [],
      "query": [
        "q",
        "tag",
        "page"
      ],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "Public bot gallery, approved bots only. No login needed.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/bonfire-botgallery.js:29",
      "legacy": false
    },
    {
      "operationId": "get_bonfire_bots_gallery_tags",
      "group": "bot-gallery",
      "method": "GET",
      "path": "/bonfire/bots/gallery/tags",
      "auth": "none",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "Public bot gallery, approved bots only. No login needed.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/bonfire-botgallery.js:30",
      "legacy": false
    },
    {
      "operationId": "get_bonfire_bots_gallery_by_id",
      "group": "bot-gallery",
      "method": "GET",
      "path": "/bonfire/bots/gallery/:id",
      "auth": "bearer",
      "scopes": [],
      "params": [
        {
          "name": "id",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "bot_not_found"
      ],
      "notes": "Public for approved bots. Send the optional bearer token of the bot owner (or staff) to also see a bot that is not listed, with state, review_message and the can_submit / can_withdraw flags.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/bonfire-botgallery.js:31",
      "legacy": false
    },
    {
      "operationId": "post_bonfire_bots_gallery_by_id_ticket",
      "group": "bot-gallery",
      "method": "POST",
      "path": "/bonfire/bots/gallery/:id/ticket",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "id",
          "optional": false
        }
      ],
      "query": [],
      "body": [
        "instance"
      ],
      "files": [],
      "errors": [
        "bot_is_private",
        "gallery_banned",
        "instance_banned",
        "invalid_instance",
        "unknown_instance"
      ],
      "notes": "Returns a single-use add-ticket (JWS, 5 minutes) for one Ember instance: hand it to POST INSTANCE/api/v1/bots/gallery/add with { ticket, sid }.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/bonfire-botgallery.js:37",
      "legacy": false
    },
    {
      "operationId": "get_bonfire_bots_self_installs",
      "group": "bot-gallery",
      "method": "GET",
      "path": "/bonfire/bots/self/installs",
      "auth": "bot",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "invalid_bot_token"
      ],
      "notes": "Bot program, not a person: Authorization: Bot TOKEN (the Nookara bot account token). Lists the Ember instances the bot is installed on (from the instances' 10-minute sync reports; banned instances and banned bots are left out). Each entry has test: true or false; staff test installs are included with test: true and are not counted as real installs, so skip them. Open one INSTANCE/bot/gateway connection per entry and poll again every few minutes. 120 per minute per IP. Errors: invalid_bot_token (401).",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/bonfire-botgallery.js:40",
      "legacy": false
    },
    {
      "operationId": "get_chat_bots_by_id_gallery",
      "group": "bot-gallery",
      "method": "GET",
      "path": "/chat/bots/:id/gallery",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "id",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "bot_not_found"
      ],
      "notes": "Bot owner only (or Nookara rank owner). :id is the bot account id. Gallery states: private, pending, approved (verified), rejected, delisted, banned.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/bonfire-botgallery.js:47",
      "legacy": false
    },
    {
      "operationId": "put_chat_bots_by_id_gallery",
      "group": "bot-gallery",
      "method": "PUT",
      "path": "/chat/bots/:id/gallery",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "id",
          "optional": false
        }
      ],
      "query": [],
      "body": [
        "long_description",
        "tags",
        "support_url",
        "links",
        "permissions"
      ],
      "files": [],
      "errors": [
        "bot_not_found",
        "description_too_long",
        "invalid_links",
        "invalid_permissions",
        "invalid_support_url",
        "invalid_tags"
      ],
      "notes": "Bot owner only (or Nookara rank owner). :id is the bot account id. Gallery states: private, pending, approved (verified), rejected, delisted, banned.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/bonfire-botgallery.js:48",
      "legacy": false
    },
    {
      "operationId": "post_chat_bots_by_id_gallery_submit",
      "group": "bot-gallery",
      "method": "POST",
      "path": "/chat/bots/:id/gallery/submit",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "id",
          "optional": false
        }
      ],
      "query": [],
      "body": [
        "long_description",
        "tags",
        "support_url",
        "links",
        "permissions"
      ],
      "files": [],
      "errors": [
        "already_listed",
        "already_pending",
        "avatar_required",
        "bot_not_found",
        "description_required",
        "description_too_long",
        "gallery_banned",
        "invalid_links",
        "invalid_permissions",
        "invalid_support_url",
        "invalid_tags",
        "long_description_required"
      ],
      "notes": "Bot owner only (or Nookara rank owner). :id is the bot account id. Gallery states: private, pending, approved (verified), rejected, delisted, banned.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/bonfire-botgallery.js:49",
      "legacy": false
    },
    {
      "operationId": "post_chat_bots_by_id_gallery_withdraw",
      "group": "bot-gallery",
      "method": "POST",
      "path": "/chat/bots/:id/gallery/withdraw",
      "auth": "bearer",
      "scopes": [
        "CHAT"
      ],
      "params": [
        {
          "name": "id",
          "optional": false
        }
      ],
      "query": [],
      "body": [],
      "files": [],
      "errors": [
        "bot_not_found",
        "gallery_banned"
      ],
      "notes": "Bot owner only (or Nookara rank owner). :id is the bot account id. Gallery states: private, pending, approved (verified), rejected, delisted, banned.",
      "staffOnly": false,
      "captcha": false,
      "source": "routes/bonfire-botgallery.js:50",
      "legacy": false
    },
    {
      "operationId": "get_health",
      "group": "service",
      "method": "GET",
      "path": "/health",
      "auth": "none",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "legacy": false,
      "source": "server.js"
    },
    {
      "operationId": "get_stats_random_usernames",
      "group": "service",
      "method": "GET",
      "path": "/stats/random-usernames",
      "auth": "none",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "legacy": false,
      "source": "server.js"
    },
    {
      "operationId": "get_api_tos_current",
      "group": "auth",
      "method": "GET",
      "path": "/api/tos/current",
      "auth": "none",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "legacy": false,
      "source": "server.js"
    },
    {
      "operationId": "get_chat_dl",
      "group": "media",
      "method": "GET",
      "path": "/chat/dl",
      "auth": "none",
      "scopes": [],
      "params": [],
      "query": [
        "u",
        "n"
      ],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "",
      "staffOnly": false,
      "captcha": false,
      "legacy": false,
      "source": "server.js"
    },
    {
      "operationId": "get_well_known_bonfire_jwks_json",
      "group": "bonfire-identity",
      "method": "GET",
      "path": "/.well-known/bonfire/jwks.json",
      "auth": "none",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "Public. Nookara identity keys (Ed25519, JWKS). Instances verify instance tokens, pay receipts and bot-add tickets with it.",
      "staffOnly": false,
      "captcha": false,
      "legacy": false,
      "source": "server.js"
    },
    {
      "operationId": "get_bonfire_server_latest_json",
      "group": "bonfire-identity",
      "method": "GET",
      "path": "/bonfire/server-latest.json",
      "auth": "none",
      "scopes": [],
      "params": [],
      "query": [],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "Public. The official bonfire-server build: {version, commit, commit_short, commit_date, built_at, build_id, dirty, message, published_at}. Instances compare themselves with it (GET /api/v1/instance/info, admins).",
      "staffOnly": false,
      "captcha": false,
      "legacy": false,
      "source": "server.js"
    },
    {
      "operationId": "get_bonfire_profiles",
      "group": "bonfire-identity",
      "method": "GET",
      "path": "/bonfire/profiles",
      "auth": "none",
      "scopes": [],
      "params": [],
      "query": [
        "ids"
      ],
      "body": [],
      "files": [],
      "errors": [],
      "notes": "Public, up to 100 ids (comma separated Nookara ids). Returns {profiles: [{id, username, display_name, pfp}]}. Instances use it to keep names and pictures of Nookara members fresh.",
      "staffOnly": false,
      "captcha": false,
      "legacy": false,
      "source": "server.js"
    }
  ],
  "clientEvents": [
    {
      "type": "auth_token",
      "fields": [
        "capabilities",
        "fingerprint",
        "mobile",
        "notification_only",
        "passive",
        "token"
      ],
      "replies": [
        "auth_error",
        "auth_success",
        "bonfire_notification_config",
        "im_unread",
        "user_joined"
      ]
    },
    {
      "type": "auth",
      "fields": [
        "pass",
        "user"
      ],
      "replies": [
        "auth_failed",
        "auth_success",
        "user_joined"
      ]
    },
    {
      "type": "bonfire_visibility",
      "fields": [
        "active"
      ],
      "replies": []
    },
    {
      "type": "setStatus",
      "fields": [],
      "replies": []
    },
    {
      "type": "set_status",
      "fields": [
        "persist",
        "status"
      ],
      "replies": [
        "status_changed"
      ]
    },
    {
      "type": "getOnlinePlayers",
      "fields": [],
      "replies": [
        "onlinePlayers"
      ]
    },
    {
      "type": "globalMessage",
      "fields": [
        "color",
        "message"
      ],
      "replies": [
        "globalMessage"
      ]
    },
    {
      "type": "imageMessage",
      "fields": [
        "url"
      ],
      "replies": [
        "imageMessage"
      ]
    },
    {
      "type": "getGlobalHistory",
      "fields": [],
      "replies": [
        "globalHistory"
      ]
    },
    {
      "type": "typing",
      "fields": [],
      "replies": [
        "typing"
      ]
    },
    {
      "type": "stopTyping",
      "fields": [],
      "replies": [
        "stopTyping"
      ]
    },
    {
      "type": "joinRoom",
      "fields": [
        "room"
      ],
      "replies": [
        "error",
        "roomHistory"
      ]
    },
    {
      "type": "roomMessage",
      "fields": [
        "color",
        "message",
        "reply_to",
        "room"
      ],
      "replies": [
        "error"
      ]
    },
    {
      "type": "call_user",
      "fields": [
        "callId",
        "to"
      ],
      "replies": [
        "call_error",
        "call_incoming"
      ]
    },
    {
      "type": "call_accept",
      "fields": [
        "callId",
        "to"
      ],
      "replies": [
        "call_accepted"
      ]
    },
    {
      "type": "call_signal",
      "fields": [
        "callId",
        "signal",
        "to"
      ],
      "replies": [
        "call_signal"
      ]
    },
    {
      "type": "call_end",
      "fields": [
        "callId",
        "to"
      ],
      "replies": [
        "call_ended"
      ]
    },
    {
      "type": "mic_state",
      "fields": [
        "muted",
        "to"
      ],
      "replies": [
        "mic_state"
      ]
    },
    {
      "type": "set_activity",
      "fields": [
        "activity"
      ],
      "replies": [
        "friend_activity"
      ]
    },
    {
      "type": "voice_connect",
      "fields": [],
      "replies": []
    },
    {
      "type": "voice",
      "fields": [
        "msg"
      ],
      "replies": []
    },
    {
      "type": "voice_sound",
      "fields": [
        "room",
        "sound"
      ],
      "replies": [
        "chat_error",
        "voice_sound",
        "voice_sound_failed"
      ]
    },
    {
      "type": "voice_disconnect",
      "fields": [],
      "replies": []
    },
    {
      "type": "voice_call",
      "fields": [
        "room",
        "to"
      ],
      "replies": [
        "voice_call_failed"
      ]
    },
    {
      "type": "voice_call_answer",
      "fields": [
        "accept",
        "callId"
      ],
      "replies": []
    },
    {
      "type": "voice_call_cancel",
      "fields": [
        "callId"
      ],
      "replies": []
    },
    {
      "type": "hf_hello",
      "fields": [
        "caps",
        "version"
      ],
      "replies": []
    },
    {
      "type": "im_send",
      "fields": [
        "message",
        "nonce",
        "reply_to",
        "status_reply",
        "to"
      ],
      "replies": [
        "im_ack",
        "im_error"
      ]
    },
    {
      "type": "dm_typing",
      "fields": [
        "to",
        "typing"
      ],
      "replies": [
        "dm_typing"
      ]
    },
    {
      "type": "chat_active",
      "fields": [],
      "replies": []
    },
    {
      "type": "ping",
      "fields": [],
      "replies": [
        "pong"
      ]
    },
    {
      "type": "chat_hello",
      "fields": [],
      "replies": [
        "chat_ready"
      ]
    },
    {
      "type": "chat_send",
      "fields": [
        "attachments",
        "channel",
        "message",
        "nonce",
        "reply_to",
        "server"
      ],
      "replies": [
        "chat_ack"
      ]
    },
    {
      "type": "chat_typing",
      "fields": [
        "channel",
        "server",
        "typing"
      ],
      "replies": [
        "chat_typing"
      ]
    },
    {
      "type": "chat_read",
      "fields": [
        "channel",
        "id"
      ],
      "replies": []
    },
    {
      "type": "chat_presence",
      "fields": [
        "username"
      ],
      "replies": [
        "presence_update"
      ]
    },
    {
      "type": "set_rich_presence",
      "fields": [
        "activity"
      ],
      "replies": []
    },
    {
      "type": "clear_rich_presence",
      "fields": [],
      "replies": []
    },
    {
      "type": "set_custom_status",
      "fields": [
        "text"
      ],
      "replies": []
    },
    {
      "type": "chat_rtc_join",
      "fields": [
        "nonce",
        "room"
      ],
      "replies": [
        "chat_rtc_joined"
      ]
    },
    {
      "type": "chat_rtc_publish",
      "fields": [
        "nonce",
        "room",
        "sessionDescription",
        "tracks"
      ],
      "replies": [
        "chat_rtc_published"
      ]
    },
    {
      "type": "chat_rtc_connected",
      "fields": [
        "room"
      ],
      "replies": []
    },
    {
      "type": "chat_rtc_subscribe",
      "fields": [
        "nonce",
        "room",
        "sources"
      ],
      "replies": [
        "chat_rtc_offer",
        "chat_rtc_ready"
      ]
    },
    {
      "type": "chat_rtc_answer",
      "fields": [
        "nonce",
        "session",
        "sessionDescription"
      ],
      "replies": [
        "chat_rtc_ready"
      ]
    },
    {
      "type": "chat_rtc_close",
      "fields": [
        "nonce",
        "room",
        "tracks"
      ],
      "replies": [
        "chat_rtc_ready"
      ]
    },
    {
      "type": "chat_rtc_ice",
      "fields": [
        "nonce",
        "room"
      ],
      "replies": [
        "chat_rtc_ready"
      ]
    },
    {
      "type": "chat_rtc_leave",
      "fields": [],
      "replies": []
    },
    {
      "type": "arcade_join",
      "fields": [
        "version"
      ],
      "replies": [
        "arcade_denied",
        "arcade_welcome"
      ]
    },
    {
      "type": "arcade_where",
      "fields": [
        "machine"
      ],
      "replies": []
    },
    {
      "type": "arcade_leave",
      "fields": [],
      "replies": []
    }
  ],
  "serverEvents": [
    {
      "type": "account_updated",
      "fields": [
        "fields",
        "type"
      ]
    },
    {
      "type": "arcade_alert",
      "fields": [
        "text",
        "type"
      ]
    },
    {
      "type": "arcade_announce",
      "fields": [
        "news",
        "type"
      ]
    },
    {
      "type": "arcade_bundles_changed",
      "fields": [
        "type"
      ]
    },
    {
      "type": "arcade_converted",
      "fields": [
        "machine",
        "plays",
        "type"
      ]
    },
    {
      "type": "arcade_denied",
      "fields": [
        "message",
        "reason",
        "type"
      ]
    },
    {
      "type": "arcade_kicked",
      "fields": [
        "message",
        "reason",
        "type"
      ]
    },
    {
      "type": "arcade_notice",
      "fields": [
        "notice",
        "type"
      ]
    },
    {
      "type": "arcade_purchase",
      "fields": [
        "id",
        "plays",
        "status",
        "type"
      ]
    },
    {
      "type": "arcade_settings",
      "fields": [
        "settings",
        "type"
      ]
    },
    {
      "type": "arcade_wallet",
      "fields": [
        "type",
        "wallet"
      ]
    },
    {
      "type": "arcade_welcome",
      "fields": [
        "firstVisit",
        "panel",
        "settings",
        "simVersion",
        "staff",
        "type",
        "username",
        "wallet"
      ]
    },
    {
      "type": "auth_error",
      "fields": [
        "error",
        "type"
      ]
    },
    {
      "type": "auth_failed",
      "fields": [
        "error",
        "type"
      ]
    },
    {
      "type": "auth_success",
      "fields": [
        "disabled_scopes",
        "passive_supported",
        "scopes",
        "tos_required",
        "type",
        "user"
      ]
    },
    {
      "type": "balance_changed",
      "fields": [
        "delta",
        "type"
      ]
    },
    {
      "type": "call_accepted",
      "fields": [
        "by",
        "callId",
        "type"
      ]
    },
    {
      "type": "call_ended",
      "fields": [
        "by",
        "callId",
        "type"
      ]
    },
    {
      "type": "call_error",
      "fields": [
        "error",
        "type"
      ]
    },
    {
      "type": "call_incoming",
      "fields": [
        "callId",
        "from",
        "type"
      ]
    },
    {
      "type": "call_signal",
      "fields": [
        "callId",
        "from",
        "signal",
        "type"
      ]
    },
    {
      "type": "chat_ack",
      "fields": [
        "message",
        "nonce",
        "type"
      ]
    },
    {
      "type": "chat_call_state",
      "fields": [
        "answered_at",
        "ended",
        "room",
        "started_at",
        "type",
        "users",
        "with"
      ]
    },
    {
      "type": "chat_channels_update",
      "fields": [
        "categories",
        "channels",
        "server",
        "type"
      ]
    },
    {
      "type": "chat_emojis_update",
      "fields": [
        "emojis",
        "server",
        "type"
      ]
    },
    {
      "type": "chat_ephemeral",
      "fields": [
        "amount",
        "body",
        "channel",
        "kind",
        "server",
        "type"
      ]
    },
    {
      "type": "chat_error",
      "fields": [
        "disabled_by_admin",
        "error",
        "nonce",
        "request",
        "required_scope",
        "type"
      ]
    },
    {
      "type": "chat_identity_update",
      "fields": [
        "previous_username",
        "type",
        "user"
      ]
    },
    {
      "type": "chat_member_update",
      "fields": [
        "change",
        "member",
        "member_count",
        "server",
        "type",
        "user_id",
        "username"
      ]
    },
    {
      "type": "chat_members_stale",
      "fields": [
        "server",
        "type"
      ]
    },
    {
      "type": "chat_mention",
      "fields": [
        "body",
        "channel",
        "cid",
        "from",
        "pfp",
        "server",
        "sid",
        "type"
      ]
    },
    {
      "type": "chat_message",
      "fields": [
        "message",
        "type"
      ]
    },
    {
      "type": "chat_message_delete",
      "fields": [
        "channel",
        "id",
        "server",
        "type"
      ]
    },
    {
      "type": "chat_message_update",
      "fields": [
        "message",
        "type"
      ]
    },
    {
      "type": "chat_perms_changed",
      "fields": [
        "server",
        "type"
      ]
    },
    {
      "type": "chat_pins_update",
      "fields": [
        "channel",
        "server",
        "type"
      ]
    },
    {
      "type": "chat_reactions",
      "fields": [
        "add",
        "channel",
        "emoji",
        "id",
        "reactions",
        "server",
        "type",
        "user_id",
        "username"
      ]
    },
    {
      "type": "chat_ready",
      "fields": [
        "type",
        "you"
      ]
    },
    {
      "type": "chat_roles_update",
      "fields": [
        "roles",
        "server",
        "type"
      ]
    },
    {
      "type": "chat_rtc_joined",
      "fields": [
        "iceServers",
        "nonce",
        "people",
        "room",
        "type"
      ]
    },
    {
      "type": "chat_rtc_offer",
      "fields": [
        "nonce",
        "room",
        "session",
        "sessionDescription",
        "tracks",
        "type"
      ]
    },
    {
      "type": "chat_rtc_published",
      "fields": [
        "nonce",
        "room",
        "sessionDescription",
        "tracks",
        "type"
      ]
    },
    {
      "type": "chat_rtc_ready",
      "fields": [
        "iceServers",
        "nonce",
        "room",
        "session",
        "type"
      ]
    },
    {
      "type": "chat_rtc_room",
      "fields": [
        "people",
        "room",
        "type"
      ]
    },
    {
      "type": "chat_server_removed",
      "fields": [
        "reason",
        "server",
        "type"
      ]
    },
    {
      "type": "chat_server_update",
      "fields": [
        "server",
        "type"
      ]
    },
    {
      "type": "chat_typing",
      "fields": [
        "channel",
        "server",
        "type",
        "typing",
        "username"
      ]
    },
    {
      "type": "chat_voice_state",
      "fields": [
        "channel",
        "server",
        "type",
        "users"
      ]
    },
    {
      "type": "dm_typing",
      "fields": [
        "from",
        "type",
        "typing"
      ]
    },
    {
      "type": "error",
      "fields": [
        "disabled_by_admin",
        "error",
        "required_scope",
        "room",
        "type"
      ]
    },
    {
      "type": "friend_activity",
      "fields": [
        "activity",
        "started",
        "type",
        "username"
      ]
    },
    {
      "type": "friend_request",
      "fields": [
        "from",
        "type"
      ]
    },
    {
      "type": "friend_request_accepted",
      "fields": [
        "by",
        "type"
      ]
    },
    {
      "type": "game_console",
      "fields": [
        "channel",
        "instance",
        "lines",
        "server",
        "type"
      ]
    },
    {
      "type": "game_linked",
      "fields": [
        "claim",
        "hint",
        "instance",
        "server",
        "type"
      ]
    },
    {
      "type": "game_status",
      "fields": [
        "channel",
        "instance",
        "last_seen",
        "online",
        "server",
        "status",
        "type"
      ]
    },
    {
      "type": "game_unlinked",
      "fields": [
        "instance",
        "server",
        "type"
      ]
    },
    {
      "type": "globalHistory",
      "fields": [
        "messages",
        "type"
      ]
    },
    {
      "type": "globalMessage",
      "fields": [
        "color",
        "message",
        "rank",
        "timestamp",
        "type",
        "user"
      ]
    },
    {
      "type": "group_removed",
      "fields": [
        "room",
        "type"
      ]
    },
    {
      "type": "group_update",
      "fields": [
        "group",
        "type"
      ]
    },
    {
      "type": "im_ack",
      "fields": [
        "delivered",
        "message",
        "nonce",
        "type"
      ]
    },
    {
      "type": "im_edited",
      "fields": [
        "body",
        "edited_at",
        "id",
        "type",
        "with"
      ]
    },
    {
      "type": "im_error",
      "fields": [
        "error",
        "nonce",
        "type"
      ]
    },
    {
      "type": "im_received",
      "fields": [
        "message",
        "type"
      ]
    },
    {
      "type": "im_sent",
      "fields": [
        "message",
        "type"
      ]
    },
    {
      "type": "im_unread",
      "fields": [
        "count",
        "type"
      ]
    },
    {
      "type": "kicked",
      "fields": [
        "reason",
        "room",
        "type"
      ]
    },
    {
      "type": "mail_received",
      "fields": [
        "mail",
        "type"
      ]
    },
    {
      "type": "mic_state",
      "fields": [
        "from",
        "muted",
        "type"
      ]
    },
    {
      "type": "notification",
      "fields": [
        "body",
        "title",
        "type"
      ]
    },
    {
      "type": "notification_new",
      "fields": [
        "notification",
        "type",
        "unread"
      ]
    },
    {
      "type": "notifications_updated",
      "fields": [
        "deleted",
        "read",
        "type",
        "unread",
        "unread_ids"
      ]
    },
    {
      "type": "onlinePlayers",
      "fields": [
        "players",
        "type"
      ]
    },
    {
      "type": "pong",
      "fields": [
        "type"
      ]
    },
    {
      "type": "presence_update",
      "fields": [
        "presence",
        "request",
        "type",
        "username"
      ]
    },
    {
      "type": "restrictions",
      "fields": [
        "disabled_scopes",
        "scopes",
        "type"
      ]
    },
    {
      "type": "roomHistory",
      "fields": [
        "messages",
        "room",
        "type"
      ]
    },
    {
      "type": "roomMessage",
      "fields": [
        "color",
        "id",
        "message",
        "rank",
        "room",
        "timestamp",
        "type",
        "user"
      ]
    },
    {
      "type": "status_changed",
      "fields": [
        "status",
        "type",
        "username"
      ]
    },
    {
      "type": "user_joined",
      "fields": [
        "rank",
        "type",
        "username"
      ]
    },
    {
      "type": "user_left",
      "fields": [
        "type",
        "username"
      ]
    },
    {
      "type": "voice_call_accepted",
      "fields": [
        "callId",
        "from",
        "room",
        "type"
      ]
    },
    {
      "type": "voice_call_answered",
      "fields": [
        "accepted",
        "by",
        "callId",
        "type"
      ]
    },
    {
      "type": "voice_call_ended",
      "fields": [
        "callId",
        "reason",
        "type"
      ]
    },
    {
      "type": "voice_call_failed",
      "fields": [
        "reason",
        "to",
        "type"
      ]
    },
    {
      "type": "voice_call_incoming",
      "fields": [
        "callId",
        "from",
        "room",
        "type"
      ]
    },
    {
      "type": "voice_call_ringing",
      "fields": [
        "callId",
        "room",
        "to",
        "type"
      ]
    },
    {
      "type": "voice_closed",
      "fields": [
        "reason",
        "type"
      ]
    },
    {
      "type": "voice_open",
      "fields": [
        "id",
        "room",
        "type"
      ]
    },
    {
      "type": "voice_sound",
      "fields": [
        "by",
        "sound",
        "type"
      ]
    },
    {
      "type": "voice_sound_failed",
      "fields": [
        "reason",
        "type"
      ]
    }
  ],
  "exclusions": [
    {
      "method": "post",
      "path": "/hyperfocus/internal/fluxer-log",
      "reason": "service-to-service integration"
    },
    {
      "method": "post",
      "path": "/hyperfocus/internal/community-email",
      "reason": "service-to-service integration"
    }
  ]
}