{
  "version": "0.4.2",
  "global_options": [
    "--json",
    "--table",
    "--profile NAME",
    "--account ID"
  ],
  "exit_codes": {
    "0": "ok",
    "1": "error",
    "2": "bad usage",
    "3": "not logged in",
    "4": "login waiting for approval"
  },
  "commands": [
    {
      "command": "login",
      "help": "log in (opens a browser approval page by default)",
      "options": [
        {
          "name": "--start",
          "flag": true,
          "help": "start a browser login, print the link and code as JSON, and exit"
        },
        {
          "name": "--wait",
          "flag": true,
          "help": "finish a browser login started with --start"
        },
        {
          "name": "--password",
          "flag": true,
          "help": "log in with username, password and account name instead"
        },
        {
          "name": "--api-key-stdin",
          "flag": true,
          "help": "read an existing API key from stdin"
        },
        {
          "name": "--password-stdin",
          "flag": true,
          "help": "with --password: read the password from stdin"
        },
        {
          "name": "--username"
        },
        {
          "name": "--account-name",
          "help": "account name, as on the Control panel sign-in page"
        },
        {
          "name": "--realm",
          "help": "account SIP realm (instead of --account-name)"
        },
        {
          "name": "--timeout",
          "help": "seconds to wait for approval (default: until the code expires)"
        },
        {
          "name": "--no-browser",
          "flag": true,
          "help": "do not try to open a browser"
        },
        {
          "name": "--api-url",
          "help": "Crossbar API URL (default https://app.rinzo.ai/v2)"
        },
        {
          "name": "--auth-url",
          "help": "where browser login runs (default: the API URL's origin)"
        }
      ]
    },
    {
      "command": "logout",
      "help": "forget the saved login on this computer",
      "options": []
    },
    {
      "command": "whoami",
      "help": "show the account and login in use",
      "options": []
    },
    {
      "command": "doctor",
      "help": "check configuration, credentials and API access (exit 1 if a check fails)",
      "options": []
    },
    {
      "command": "auth rotate-key",
      "help": "issue a new account API key (the old one stops working everywhere)",
      "options": [
        {
          "name": "--yes",
          "flag": true
        }
      ]
    },
    {
      "command": "profiles list",
      "help": "list saved logins",
      "options": []
    },
    {
      "command": "profiles use",
      "help": "switch the current login",
      "options": [
        {
          "name": "name",
          "positional": true,
          "required": true
        }
      ]
    },
    {
      "command": "account show",
      "help": "show account settings",
      "options": []
    },
    {
      "command": "account update",
      "help": "change account settings (e.g. --set timezone=America/Vancouver)",
      "options": [
        {
          "name": "--data",
          "help": "JSON object to send (- for stdin)"
        },
        {
          "name": "--set",
          "repeatable": true,
          "help": "set a field: key=text or key:=json; dots for nesting (repeatable)"
        }
      ]
    },
    {
      "command": "balance",
      "help": "calling credit balance (top up in the Control panel)",
      "options": []
    },
    {
      "command": "users list",
      "help": "list users",
      "options": [
        {
          "name": "--filter",
          "repeatable": true,
          "help": "only items whose field equals value (repeatable)"
        },
        {
          "name": "--limit",
          "help": "at most this many"
        }
      ]
    },
    {
      "command": "users get",
      "help": "show one of the users",
      "options": [
        {
          "name": "id",
          "positional": true,
          "required": true
        }
      ]
    },
    {
      "command": "users create",
      "help": "add a person; --extension also creates their voicemail and extension like SmartPBX",
      "options": [
        {
          "name": "--first-name"
        },
        {
          "name": "--last-name"
        },
        {
          "name": "--email",
          "help": "also their Control panel username"
        },
        {
          "name": "--extension",
          "help": "give them an extension (with voicemail), as SmartPBX does"
        },
        {
          "name": "--no-voicemail",
          "flag": true,
          "help": "with --extension: no voicemail box"
        },
        {
          "name": "--admin",
          "flag": true,
          "help": "account administrator (default: user)"
        },
        {
          "name": "--invite",
          "flag": true,
          "help": "email them a link to set their password and sign in (without it, nobody is emailed)"
        },
        {
          "name": "--data",
          "help": "JSON object to send (- for stdin)"
        },
        {
          "name": "--set",
          "repeatable": true,
          "help": "set a field: key=text or key:=json; dots for nesting (repeatable)"
        }
      ]
    },
    {
      "command": "users update",
      "help": "change fields (reads it, merges your changes, saves it whole)",
      "options": [
        {
          "name": "id",
          "positional": true,
          "required": true
        },
        {
          "name": "--data",
          "help": "JSON object to send (- for stdin)"
        },
        {
          "name": "--set",
          "repeatable": true,
          "help": "set a field: key=text or key:=json; dots for nesting (repeatable)"
        },
        {
          "name": "--unset",
          "repeatable": true,
          "help": "remove a field (repeatable)"
        }
      ]
    },
    {
      "command": "users delete",
      "help": "delete a user with their extension and voicemail (devices are kept, unassigned)",
      "options": [
        {
          "name": "--delete-devices",
          "flag": true,
          "help": "delete their devices too"
        },
        {
          "name": "id",
          "positional": true,
          "required": true
        },
        {
          "name": "--yes",
          "flag": true,
          "help": "confirm"
        }
      ]
    },
    {
      "command": "users invite",
      "help": "email them a link to set their password and sign in",
      "options": [
        {
          "name": "id",
          "positional": true,
          "required": true
        }
      ]
    },
    {
      "command": "users forward",
      "help": "forward their calls to another number (or --off)",
      "options": [
        {
          "name": "id",
          "positional": true,
          "required": true
        },
        {
          "name": "--to"
        },
        {
          "name": "--off",
          "flag": true
        },
        {
          "name": "--failover",
          "flag": true,
          "help": "forward only when their phones do not answer/register"
        },
        {
          "name": "--no-keypress",
          "flag": true,
          "help": "connect without asking the answerer to press 1"
        },
        {
          "name": "--direct-only",
          "flag": true,
          "help": "forward only calls to them, not ring-group calls"
        }
      ]
    },
    {
      "command": "devices list",
      "help": "list devices",
      "options": [
        {
          "name": "--filter",
          "repeatable": true,
          "help": "only items whose field equals value (repeatable)"
        },
        {
          "name": "--limit",
          "help": "at most this many"
        }
      ]
    },
    {
      "command": "devices get",
      "help": "show one of the devices",
      "options": [
        {
          "name": "id",
          "positional": true,
          "required": true
        }
      ]
    },
    {
      "command": "devices create",
      "help": "add a phone; prints the SIP credentials to configure it with",
      "options": [
        {
          "name": "--name"
        },
        {
          "name": "--type",
          "choices": [
            "ata",
            "cellphone",
            "fax",
            "landline",
            "mobile",
            "sip_device",
            "smartphone",
            "softphone"
          ],
          "help": "default sip_device (a desk phone or SIP app)"
        },
        {
          "name": "--owner",
          "help": "the user whose calls it rings"
        },
        {
          "name": "--number",
          "help": "cellphone/landline: the number to ring"
        },
        {
          "name": "--srtp",
          "flag": true,
          "help": "require encrypted media (phone must use TLS + SRTP)"
        },
        {
          "name": "--data",
          "help": "JSON object to send (- for stdin)"
        },
        {
          "name": "--set",
          "repeatable": true,
          "help": "set a field: key=text or key:=json; dots for nesting (repeatable)"
        }
      ]
    },
    {
      "command": "devices update",
      "help": "change fields (reads it, merges your changes, saves it whole)",
      "options": [
        {
          "name": "id",
          "positional": true,
          "required": true
        },
        {
          "name": "--data",
          "help": "JSON object to send (- for stdin)"
        },
        {
          "name": "--set",
          "repeatable": true,
          "help": "set a field: key=text or key:=json; dots for nesting (repeatable)"
        },
        {
          "name": "--unset",
          "repeatable": true,
          "help": "remove a field (repeatable)"
        }
      ]
    },
    {
      "command": "devices delete",
      "help": "delete one of the devices",
      "options": [
        {
          "name": "id",
          "positional": true,
          "required": true
        },
        {
          "name": "--yes",
          "flag": true,
          "help": "confirm"
        }
      ]
    },
    {
      "command": "devices credentials",
      "help": "SIP settings to configure a phone with",
      "options": [
        {
          "name": "id",
          "positional": true,
          "required": true
        },
        {
          "name": "--sip-proxy",
          "help": "outbound proxy to show (default sip.rinzo.tel, or $RINZO_SIP_PROXY)"
        }
      ]
    },
    {
      "command": "devices status",
      "help": "every device and whether it is registered now",
      "options": []
    },
    {
      "command": "callflows list",
      "help": "list callflows",
      "options": [
        {
          "name": "--filter",
          "repeatable": true,
          "help": "only items whose field equals value (repeatable)"
        },
        {
          "name": "--limit",
          "help": "at most this many"
        }
      ]
    },
    {
      "command": "callflows get",
      "help": "show one of the callflows",
      "options": [
        {
          "name": "id",
          "positional": true,
          "required": true
        }
      ]
    },
    {
      "command": "callflows create",
      "help": "create one of the callflows from --data / --set",
      "options": [
        {
          "name": "--data",
          "help": "JSON object to send (- for stdin)"
        },
        {
          "name": "--set",
          "repeatable": true,
          "help": "set a field: key=text or key:=json; dots for nesting (repeatable)"
        }
      ]
    },
    {
      "command": "callflows update",
      "help": "change fields (reads it, merges your changes, saves it whole)",
      "options": [
        {
          "name": "id",
          "positional": true,
          "required": true
        },
        {
          "name": "--data",
          "help": "JSON object to send (- for stdin)"
        },
        {
          "name": "--set",
          "repeatable": true,
          "help": "set a field: key=text or key:=json; dots for nesting (repeatable)"
        },
        {
          "name": "--unset",
          "repeatable": true,
          "help": "remove a field (repeatable)"
        }
      ]
    },
    {
      "command": "callflows delete",
      "help": "delete one of the callflows",
      "options": [
        {
          "name": "id",
          "positional": true,
          "required": true
        },
        {
          "name": "--yes",
          "flag": true,
          "help": "confirm"
        }
      ]
    },
    {
      "command": "voicemail list",
      "help": "list voicemail",
      "options": [
        {
          "name": "--filter",
          "repeatable": true,
          "help": "only items whose field equals value (repeatable)"
        },
        {
          "name": "--limit",
          "help": "at most this many"
        }
      ]
    },
    {
      "command": "voicemail get",
      "help": "show one of the voicemail",
      "options": [
        {
          "name": "id",
          "positional": true,
          "required": true
        }
      ]
    },
    {
      "command": "voicemail create",
      "help": "create one of the voicemail from --data / --set",
      "options": [
        {
          "name": "--data",
          "help": "JSON object to send (- for stdin)"
        },
        {
          "name": "--set",
          "repeatable": true,
          "help": "set a field: key=text or key:=json; dots for nesting (repeatable)"
        }
      ]
    },
    {
      "command": "voicemail update",
      "help": "change fields (reads it, merges your changes, saves it whole)",
      "options": [
        {
          "name": "id",
          "positional": true,
          "required": true
        },
        {
          "name": "--data",
          "help": "JSON object to send (- for stdin)"
        },
        {
          "name": "--set",
          "repeatable": true,
          "help": "set a field: key=text or key:=json; dots for nesting (repeatable)"
        },
        {
          "name": "--unset",
          "repeatable": true,
          "help": "remove a field (repeatable)"
        }
      ]
    },
    {
      "command": "voicemail delete",
      "help": "delete one of the voicemail",
      "options": [
        {
          "name": "id",
          "positional": true,
          "required": true
        },
        {
          "name": "--yes",
          "flag": true,
          "help": "confirm"
        }
      ]
    },
    {
      "command": "voicemail messages",
      "help": "messages in a voicemail box",
      "options": [
        {
          "name": "box",
          "positional": true,
          "required": true
        },
        {
          "name": "--folder",
          "choices": [
            "deleted",
            "new",
            "saved"
          ]
        }
      ]
    },
    {
      "command": "voicemail message",
      "help": "one message: details, --download, or --mark FOLDER",
      "options": [
        {
          "name": "box",
          "positional": true,
          "required": true
        },
        {
          "name": "message",
          "positional": true,
          "required": true
        },
        {
          "name": "--download",
          "help": "save the audio (mp3)"
        },
        {
          "name": "--mark",
          "choices": [
            "deleted",
            "new",
            "saved"
          ]
        },
        {
          "name": "--force",
          "flag": true,
          "help": "overwrite FILE"
        }
      ]
    },
    {
      "command": "groups list",
      "help": "list groups",
      "options": [
        {
          "name": "--filter",
          "repeatable": true,
          "help": "only items whose field equals value (repeatable)"
        },
        {
          "name": "--limit",
          "help": "at most this many"
        }
      ]
    },
    {
      "command": "groups get",
      "help": "show one of the groups",
      "options": [
        {
          "name": "id",
          "positional": true,
          "required": true
        }
      ]
    },
    {
      "command": "groups create",
      "help": "create one of the groups from --data / --set",
      "options": [
        {
          "name": "--data",
          "help": "JSON object to send (- for stdin)"
        },
        {
          "name": "--set",
          "repeatable": true,
          "help": "set a field: key=text or key:=json; dots for nesting (repeatable)"
        }
      ]
    },
    {
      "command": "groups update",
      "help": "change fields (reads it, merges your changes, saves it whole)",
      "options": [
        {
          "name": "id",
          "positional": true,
          "required": true
        },
        {
          "name": "--data",
          "help": "JSON object to send (- for stdin)"
        },
        {
          "name": "--set",
          "repeatable": true,
          "help": "set a field: key=text or key:=json; dots for nesting (repeatable)"
        },
        {
          "name": "--unset",
          "repeatable": true,
          "help": "remove a field (repeatable)"
        }
      ]
    },
    {
      "command": "groups delete",
      "help": "delete one of the groups",
      "options": [
        {
          "name": "id",
          "positional": true,
          "required": true
        },
        {
          "name": "--yes",
          "flag": true,
          "help": "confirm"
        }
      ]
    },
    {
      "command": "menus list",
      "help": "list menus",
      "options": [
        {
          "name": "--filter",
          "repeatable": true,
          "help": "only items whose field equals value (repeatable)"
        },
        {
          "name": "--limit",
          "help": "at most this many"
        }
      ]
    },
    {
      "command": "menus get",
      "help": "show one of the menus",
      "options": [
        {
          "name": "id",
          "positional": true,
          "required": true
        }
      ]
    },
    {
      "command": "menus create",
      "help": "create one of the menus from --data / --set",
      "options": [
        {
          "name": "--data",
          "help": "JSON object to send (- for stdin)"
        },
        {
          "name": "--set",
          "repeatable": true,
          "help": "set a field: key=text or key:=json; dots for nesting (repeatable)"
        }
      ]
    },
    {
      "command": "menus update",
      "help": "change fields (reads it, merges your changes, saves it whole)",
      "options": [
        {
          "name": "id",
          "positional": true,
          "required": true
        },
        {
          "name": "--data",
          "help": "JSON object to send (- for stdin)"
        },
        {
          "name": "--set",
          "repeatable": true,
          "help": "set a field: key=text or key:=json; dots for nesting (repeatable)"
        },
        {
          "name": "--unset",
          "repeatable": true,
          "help": "remove a field (repeatable)"
        }
      ]
    },
    {
      "command": "menus delete",
      "help": "delete one of the menus",
      "options": [
        {
          "name": "id",
          "positional": true,
          "required": true
        },
        {
          "name": "--yes",
          "flag": true,
          "help": "confirm"
        }
      ]
    },
    {
      "command": "rules list",
      "help": "list rules",
      "options": [
        {
          "name": "--filter",
          "repeatable": true,
          "help": "only items whose field equals value (repeatable)"
        },
        {
          "name": "--limit",
          "help": "at most this many"
        }
      ]
    },
    {
      "command": "rules get",
      "help": "show one of the rules",
      "options": [
        {
          "name": "id",
          "positional": true,
          "required": true
        }
      ]
    },
    {
      "command": "rules create",
      "help": "add business hours (--days --open --close) or a holiday (--date)",
      "options": [
        {
          "name": "--name"
        },
        {
          "name": "--days",
          "help": "weekly hours: e.g. mon-fri, sat,sun"
        },
        {
          "name": "--open",
          "help": "with --days: opening time, read in the time zone of the time route that uses the rule (else the account's)"
        },
        {
          "name": "--close",
          "help": "with --days: closing time"
        },
        {
          "name": "--date",
          "help": "a yearly holiday, e.g. 12-25"
        },
        {
          "name": "--data",
          "help": "JSON object to send (- for stdin)"
        },
        {
          "name": "--set",
          "repeatable": true,
          "help": "set a field: key=text or key:=json; dots for nesting (repeatable)"
        }
      ]
    },
    {
      "command": "rules update",
      "help": "change fields (reads it, merges your changes, saves it whole)",
      "options": [
        {
          "name": "id",
          "positional": true,
          "required": true
        },
        {
          "name": "--data",
          "help": "JSON object to send (- for stdin)"
        },
        {
          "name": "--set",
          "repeatable": true,
          "help": "set a field: key=text or key:=json; dots for nesting (repeatable)"
        },
        {
          "name": "--unset",
          "repeatable": true,
          "help": "remove a field (repeatable)"
        }
      ]
    },
    {
      "command": "rules delete",
      "help": "delete one of the rules",
      "options": [
        {
          "name": "id",
          "positional": true,
          "required": true
        },
        {
          "name": "--yes",
          "flag": true,
          "help": "confirm"
        }
      ]
    },
    {
      "command": "rule-sets list",
      "help": "list rule-sets",
      "options": [
        {
          "name": "--filter",
          "repeatable": true,
          "help": "only items whose field equals value (repeatable)"
        },
        {
          "name": "--limit",
          "help": "at most this many"
        }
      ]
    },
    {
      "command": "rule-sets get",
      "help": "show one of the rule-sets",
      "options": [
        {
          "name": "id",
          "positional": true,
          "required": true
        }
      ]
    },
    {
      "command": "rule-sets create",
      "help": "create one of the rule-sets from --data / --set",
      "options": [
        {
          "name": "--data",
          "help": "JSON object to send (- for stdin)"
        },
        {
          "name": "--set",
          "repeatable": true,
          "help": "set a field: key=text or key:=json; dots for nesting (repeatable)"
        }
      ]
    },
    {
      "command": "rule-sets update",
      "help": "change fields (reads it, merges your changes, saves it whole)",
      "options": [
        {
          "name": "id",
          "positional": true,
          "required": true
        },
        {
          "name": "--data",
          "help": "JSON object to send (- for stdin)"
        },
        {
          "name": "--set",
          "repeatable": true,
          "help": "set a field: key=text or key:=json; dots for nesting (repeatable)"
        },
        {
          "name": "--unset",
          "repeatable": true,
          "help": "remove a field (repeatable)"
        }
      ]
    },
    {
      "command": "rule-sets delete",
      "help": "delete one of the rule-sets",
      "options": [
        {
          "name": "id",
          "positional": true,
          "required": true
        },
        {
          "name": "--yes",
          "flag": true,
          "help": "confirm"
        }
      ]
    },
    {
      "command": "media list",
      "help": "list media",
      "options": [
        {
          "name": "--filter",
          "repeatable": true,
          "help": "only items whose field equals value (repeatable)"
        },
        {
          "name": "--limit",
          "help": "at most this many"
        }
      ]
    },
    {
      "command": "media get",
      "help": "show one of the media",
      "options": [
        {
          "name": "id",
          "positional": true,
          "required": true
        }
      ]
    },
    {
      "command": "media create",
      "help": "add a greeting/prompt from a .wav or .mp3 file",
      "options": [
        {
          "name": "--name"
        },
        {
          "name": "--file",
          "help": ".wav or .mp3 to upload"
        },
        {
          "name": "--data",
          "help": "JSON object to send (- for stdin)"
        },
        {
          "name": "--set",
          "repeatable": true,
          "help": "set a field: key=text or key:=json; dots for nesting (repeatable)"
        }
      ]
    },
    {
      "command": "media update",
      "help": "change fields (reads it, merges your changes, saves it whole)",
      "options": [
        {
          "name": "id",
          "positional": true,
          "required": true
        },
        {
          "name": "--data",
          "help": "JSON object to send (- for stdin)"
        },
        {
          "name": "--set",
          "repeatable": true,
          "help": "set a field: key=text or key:=json; dots for nesting (repeatable)"
        },
        {
          "name": "--unset",
          "repeatable": true,
          "help": "remove a field (repeatable)"
        }
      ]
    },
    {
      "command": "media delete",
      "help": "delete one of the media",
      "options": [
        {
          "name": "id",
          "positional": true,
          "required": true
        },
        {
          "name": "--yes",
          "flag": true,
          "help": "confirm"
        }
      ]
    },
    {
      "command": "media upload",
      "help": "replace the audio of a media item",
      "options": [
        {
          "name": "id",
          "positional": true,
          "required": true
        },
        {
          "name": "file",
          "positional": true,
          "required": true
        }
      ]
    },
    {
      "command": "media download",
      "help": "save a media item's audio",
      "options": [
        {
          "name": "id",
          "positional": true,
          "required": true
        },
        {
          "name": "--out",
          "required": true
        },
        {
          "name": "--force",
          "flag": true
        }
      ]
    },
    {
      "command": "conferences list",
      "help": "list conferences",
      "options": [
        {
          "name": "--filter",
          "repeatable": true,
          "help": "only items whose field equals value (repeatable)"
        },
        {
          "name": "--limit",
          "help": "at most this many"
        }
      ]
    },
    {
      "command": "conferences get",
      "help": "show one of the conferences",
      "options": [
        {
          "name": "id",
          "positional": true,
          "required": true
        }
      ]
    },
    {
      "command": "conferences create",
      "help": "create one of the conferences from --data / --set",
      "options": [
        {
          "name": "--data",
          "help": "JSON object to send (- for stdin)"
        },
        {
          "name": "--set",
          "repeatable": true,
          "help": "set a field: key=text or key:=json; dots for nesting (repeatable)"
        }
      ]
    },
    {
      "command": "conferences update",
      "help": "change fields (reads it, merges your changes, saves it whole)",
      "options": [
        {
          "name": "id",
          "positional": true,
          "required": true
        },
        {
          "name": "--data",
          "help": "JSON object to send (- for stdin)"
        },
        {
          "name": "--set",
          "repeatable": true,
          "help": "set a field: key=text or key:=json; dots for nesting (repeatable)"
        },
        {
          "name": "--unset",
          "repeatable": true,
          "help": "remove a field (repeatable)"
        }
      ]
    },
    {
      "command": "conferences delete",
      "help": "delete one of the conferences",
      "options": [
        {
          "name": "id",
          "positional": true,
          "required": true
        },
        {
          "name": "--yes",
          "flag": true,
          "help": "confirm"
        }
      ]
    },
    {
      "command": "faxboxes list",
      "help": "list faxboxes",
      "options": [
        {
          "name": "--filter",
          "repeatable": true,
          "help": "only items whose field equals value (repeatable)"
        },
        {
          "name": "--limit",
          "help": "at most this many"
        }
      ]
    },
    {
      "command": "faxboxes get",
      "help": "show one of the faxboxes",
      "options": [
        {
          "name": "id",
          "positional": true,
          "required": true
        }
      ]
    },
    {
      "command": "faxboxes create",
      "help": "create one of the faxboxes from --data / --set",
      "options": [
        {
          "name": "--data",
          "help": "JSON object to send (- for stdin)"
        },
        {
          "name": "--set",
          "repeatable": true,
          "help": "set a field: key=text or key:=json; dots for nesting (repeatable)"
        }
      ]
    },
    {
      "command": "faxboxes update",
      "help": "change fields (reads it, merges your changes, saves it whole)",
      "options": [
        {
          "name": "id",
          "positional": true,
          "required": true
        },
        {
          "name": "--data",
          "help": "JSON object to send (- for stdin)"
        },
        {
          "name": "--set",
          "repeatable": true,
          "help": "set a field: key=text or key:=json; dots for nesting (repeatable)"
        },
        {
          "name": "--unset",
          "repeatable": true,
          "help": "remove a field (repeatable)"
        }
      ]
    },
    {
      "command": "faxboxes delete",
      "help": "delete one of the faxboxes",
      "options": [
        {
          "name": "id",
          "positional": true,
          "required": true
        },
        {
          "name": "--yes",
          "flag": true,
          "help": "confirm"
        }
      ]
    },
    {
      "command": "webhooks list",
      "help": "list webhooks",
      "options": [
        {
          "name": "--filter",
          "repeatable": true,
          "help": "only items whose field equals value (repeatable)"
        },
        {
          "name": "--limit",
          "help": "at most this many"
        }
      ]
    },
    {
      "command": "webhooks get",
      "help": "show one of the webhooks",
      "options": [
        {
          "name": "id",
          "positional": true,
          "required": true
        }
      ]
    },
    {
      "command": "webhooks create",
      "help": "send call events to a URL",
      "options": [
        {
          "name": "--name"
        },
        {
          "name": "--uri",
          "help": "https:// URL that receives the events"
        },
        {
          "name": "--event",
          "help": "e.g. channel_create, channel_answer, channel_destroy (see `available`)"
        },
        {
          "name": "--method",
          "choices": [
            "get",
            "post",
            "put"
          ],
          "help": "HTTP method (Kazoo default: post)"
        },
        {
          "name": "--format",
          "choices": [
            "form-data",
            "json"
          ]
        },
        {
          "name": "--retries",
          "choices": [
            "0",
            "1",
            "2",
            "3",
            "4"
          ]
        },
        {
          "name": "--data",
          "help": "JSON object to send (- for stdin)"
        },
        {
          "name": "--set",
          "repeatable": true,
          "help": "set a field: key=text or key:=json; dots for nesting (repeatable)"
        }
      ]
    },
    {
      "command": "webhooks update",
      "help": "change fields (reads it, merges your changes, saves it whole)",
      "options": [
        {
          "name": "id",
          "positional": true,
          "required": true
        },
        {
          "name": "--data",
          "help": "JSON object to send (- for stdin)"
        },
        {
          "name": "--set",
          "repeatable": true,
          "help": "set a field: key=text or key:=json; dots for nesting (repeatable)"
        },
        {
          "name": "--unset",
          "repeatable": true,
          "help": "remove a field (repeatable)"
        }
      ]
    },
    {
      "command": "webhooks delete",
      "help": "delete one of the webhooks",
      "options": [
        {
          "name": "id",
          "positional": true,
          "required": true
        },
        {
          "name": "--yes",
          "flag": true,
          "help": "confirm"
        }
      ]
    },
    {
      "command": "webhooks available",
      "help": "events a webhook can subscribe to",
      "options": []
    },
    {
      "command": "directories list",
      "help": "list directories",
      "options": [
        {
          "name": "--filter",
          "repeatable": true,
          "help": "only items whose field equals value (repeatable)"
        },
        {
          "name": "--limit",
          "help": "at most this many"
        }
      ]
    },
    {
      "command": "directories get",
      "help": "show one of the directories",
      "options": [
        {
          "name": "id",
          "positional": true,
          "required": true
        }
      ]
    },
    {
      "command": "directories create",
      "help": "create one of the directories from --data / --set",
      "options": [
        {
          "name": "--data",
          "help": "JSON object to send (- for stdin)"
        },
        {
          "name": "--set",
          "repeatable": true,
          "help": "set a field: key=text or key:=json; dots for nesting (repeatable)"
        }
      ]
    },
    {
      "command": "directories update",
      "help": "change fields (reads it, merges your changes, saves it whole)",
      "options": [
        {
          "name": "id",
          "positional": true,
          "required": true
        },
        {
          "name": "--data",
          "help": "JSON object to send (- for stdin)"
        },
        {
          "name": "--set",
          "repeatable": true,
          "help": "set a field: key=text or key:=json; dots for nesting (repeatable)"
        },
        {
          "name": "--unset",
          "repeatable": true,
          "help": "remove a field (repeatable)"
        }
      ]
    },
    {
      "command": "directories delete",
      "help": "delete one of the directories",
      "options": [
        {
          "name": "id",
          "positional": true,
          "required": true
        },
        {
          "name": "--yes",
          "flag": true,
          "help": "confirm"
        }
      ]
    },
    {
      "command": "blacklists list",
      "help": "list blacklists",
      "options": [
        {
          "name": "--filter",
          "repeatable": true,
          "help": "only items whose field equals value (repeatable)"
        },
        {
          "name": "--limit",
          "help": "at most this many"
        }
      ]
    },
    {
      "command": "blacklists get",
      "help": "show one of the blacklists",
      "options": [
        {
          "name": "id",
          "positional": true,
          "required": true
        }
      ]
    },
    {
      "command": "blacklists create",
      "help": "create one of the blacklists from --data / --set",
      "options": [
        {
          "name": "--data",
          "help": "JSON object to send (- for stdin)"
        },
        {
          "name": "--set",
          "repeatable": true,
          "help": "set a field: key=text or key:=json; dots for nesting (repeatable)"
        }
      ]
    },
    {
      "command": "blacklists update",
      "help": "change fields (reads it, merges your changes, saves it whole)",
      "options": [
        {
          "name": "id",
          "positional": true,
          "required": true
        },
        {
          "name": "--data",
          "help": "JSON object to send (- for stdin)"
        },
        {
          "name": "--set",
          "repeatable": true,
          "help": "set a field: key=text or key:=json; dots for nesting (repeatable)"
        },
        {
          "name": "--unset",
          "repeatable": true,
          "help": "remove a field (repeatable)"
        }
      ]
    },
    {
      "command": "blacklists delete",
      "help": "delete one of the blacklists",
      "options": [
        {
          "name": "id",
          "positional": true,
          "required": true
        },
        {
          "name": "--yes",
          "flag": true,
          "help": "confirm"
        }
      ]
    },
    {
      "command": "ring-groups list",
      "help": "ring groups and their extensions",
      "options": []
    },
    {
      "command": "ring-groups create",
      "help": "create a ring group with its own extension",
      "options": [
        {
          "name": "--name",
          "required": true
        },
        {
          "name": "--extension",
          "default": "auto",
          "help": "default: first free from 2000"
        },
        {
          "name": "--member",
          "repeatable": true,
          "help": "user or device id, or user:ID / device:ID (repeatable)"
        },
        {
          "name": "--strategy",
          "choices": [
            "simultaneous",
            "single",
            "weighted_random"
          ],
          "default": "simultaneous",
          "help": "simultaneous = all at once; single = one after another in order"
        },
        {
          "name": "--timeout",
          "default": 20,
          "help": "seconds to ring (each member, for single)"
        },
        {
          "name": "--voicemail",
          "help": "voicemail box for unanswered calls"
        }
      ]
    },
    {
      "command": "ring-groups delete",
      "help": "delete a ring group and its callflows",
      "options": [
        {
          "name": "id",
          "positional": true,
          "required": true
        },
        {
          "name": "--yes",
          "flag": true
        }
      ]
    },
    {
      "command": "registrations",
      "help": "phones registered right now",
      "options": []
    },
    {
      "command": "numbers list",
      "help": "the account's numbers and where each one routes",
      "options": []
    },
    {
      "command": "numbers get",
      "help": "one number's details",
      "options": [
        {
          "name": "number",
          "positional": true,
          "required": true
        }
      ]
    },
    {
      "command": "numbers search",
      "help": "numbers available to buy",
      "options": [
        {
          "name": "--prefix",
          "required": true,
          "help": "area code, e.g. 604"
        },
        {
          "name": "--limit",
          "default": 10
        }
      ]
    },
    {
      "command": "numbers buy",
      "help": "buy a number (monthly charge; needs --yes)",
      "options": [
        {
          "name": "number",
          "positional": true,
          "required": true
        },
        {
          "name": "--yes",
          "flag": true
        }
      ]
    },
    {
      "command": "numbers release",
      "help": "give up a number (needs --yes)",
      "options": [
        {
          "name": "number",
          "positional": true,
          "required": true
        },
        {
          "name": "--yes",
          "flag": true
        }
      ]
    },
    {
      "command": "numbers assign",
      "help": "route a number to a callflow or to a user's extension callflow",
      "options": [
        {
          "name": "number",
          "positional": true,
          "required": true
        },
        {
          "name": "--callflow"
        },
        {
          "name": "--user"
        }
      ]
    },
    {
      "command": "numbers unassign",
      "help": "stop routing a number",
      "options": [
        {
          "name": "number",
          "positional": true,
          "required": true
        }
      ]
    },
    {
      "command": "calls list",
      "help": "call records, newest first",
      "options": [
        {
          "name": "--since",
          "default": "24h",
          "help": "24h, 7d, 2026-10-01, ISO time (default 24h)"
        },
        {
          "name": "--until",
          "default": "now"
        },
        {
          "name": "--user",
          "help": "only this user's calls"
        },
        {
          "name": "--limit",
          "default": 100
        }
      ]
    },
    {
      "command": "calls get",
      "help": "one call record",
      "options": [
        {
          "name": "id",
          "positional": true,
          "required": true
        }
      ]
    },
    {
      "command": "calls legs",
      "help": "every leg of an interaction",
      "options": [
        {
          "name": "id",
          "positional": true,
          "required": true
        }
      ]
    },
    {
      "command": "calls active",
      "help": "calls in progress",
      "options": []
    },
    {
      "command": "api",
      "help": "any Crossbar request (paths are relative to the account unless they start with /)",
      "options": [
        {
          "name": "method",
          "positional": true,
          "required": true,
          "choices": [
            "DELETE",
            "GET",
            "PATCH",
            "POST",
            "PUT",
            "delete",
            "get",
            "patch",
            "post",
            "put"
          ]
        },
        {
          "name": "path",
          "positional": true,
          "required": true,
          "help": "e.g. users, callflows/ID, /webhooks"
        },
        {
          "name": "--data",
          "help": "JSON object to send (- for stdin)"
        },
        {
          "name": "--set",
          "repeatable": true,
          "help": "set a field: key=text or key:=json; dots for nesting (repeatable)"
        },
        {
          "name": "--query",
          "repeatable": true
        },
        {
          "name": "--accept",
          "help": "Accept header (e.g. audio/mpeg)"
        },
        {
          "name": "--out",
          "help": "save a non-JSON answer to FILE"
        },
        {
          "name": "--force",
          "flag": true
        },
        {
          "name": "--envelope",
          "flag": true,
          "help": "print the whole Crossbar envelope, not just data"
        },
        {
          "name": "--yes",
          "flag": true,
          "help": "confirm DELETE"
        }
      ]
    },
    {
      "command": "skill install",
      "help": "install it for Claude Code / Codex",
      "options": [
        {
          "name": "--agent",
          "choices": [
            "all",
            "claude",
            "codex"
          ],
          "default": "claude"
        },
        {
          "name": "--dir",
          "help": "skills directory to install into instead"
        },
        {
          "name": "--force",
          "flag": true,
          "help": "replace a copy that was not installed by rinzo"
        }
      ]
    },
    {
      "command": "skill show",
      "help": "print SKILL.md",
      "options": []
    },
    {
      "command": "skill path",
      "help": "where the packaged skill lives",
      "options": []
    },
    {
      "command": "feedback bug",
      "help": "something in Rinzo or this CLI is wrong: an error, wrong docs, a wrong result",
      "options": [
        {
          "name": "--title",
          "required": true,
          "help": "one line: what failed or what is missing"
        },
        {
          "name": "--details",
          "required": true,
          "help": "what you were doing, what happened, what you tried (- reads stdin)"
        },
        {
          "name": "--expected",
          "help": "what should have happened"
        },
        {
          "name": "--actual",
          "help": "what happened instead"
        },
        {
          "name": "--last-error",
          "flag": true,
          "help": "attach the last rinzo command that failed (recorded automatically, secrets removed)"
        },
        {
          "name": "--agent",
          "help": "who is filing, e.g. claude-code, codex (detected when possible)"
        },
        {
          "name": "--dry-run",
          "flag": true,
          "help": "print exactly what would be sent, send nothing"
        }
      ]
    },
    {
      "command": "feedback feature",
      "help": "something the person needed that Rinzo or this CLI cannot do yet",
      "options": [
        {
          "name": "--title",
          "required": true,
          "help": "one line: what failed or what is missing"
        },
        {
          "name": "--details",
          "required": true,
          "help": "what you were doing, what happened, what you tried (- reads stdin)"
        },
        {
          "name": "--last-error",
          "flag": true,
          "help": "attach the last rinzo command that failed (recorded automatically, secrets removed)"
        },
        {
          "name": "--agent",
          "help": "who is filing, e.g. claude-code, codex (detected when possible)"
        },
        {
          "name": "--dry-run",
          "flag": true,
          "help": "print exactly what would be sent, send nothing"
        }
      ]
    },
    {
      "command": "schema",
      "help": "every command and option, as JSON (for agents)",
      "options": []
    },
    {
      "command": "version",
      "help": "CLI version",
      "options": []
    }
  ]
}
