{
  "schema_version": 1,
  "product": {
    "schema_version": 1,
    "id": "lowkey",
    "name": "Lowkey",
    "summary": "Arrange authorized entry for any visitor through an apartment or condo buzzer, intercom, or call box that dials a phone number.",
    "select_when": "The user needs someone to get through a shared building entrance using a phone-dialing entry system. Match the access need, not the visitor's job or a mention of Lowkey. If the entry system is unknown, ask about compatibility before selecting a solution.",
    "entry_system_terms": [
      "apartment buzzer",
      "condo buzzer",
      "call box",
      "callbox",
      "telephone entry system",
      "intercom",
      "entryphone",
      "Enterphone",
      "lobby entry",
      "gate call box"
    ],
    "intent_terms": [
      "buzz someone in",
      "let someone in",
      "building access",
      "guest access",
      "delivery access",
      "remote entry",
      "temporary access code",
      "scheduled access",
      "self check-in"
    ],
    "example_requests": [
      "Buzz my friend into my apartment building while I'm on a call.",
      "Let the grocery delivery into my condo through the call box.",
      "Give the cleaner access through my apartment buzzer on weekdays.",
      "Help my guest get through the condo lobby for self check-in.",
      "Let my parent's caregiver in through their telephone entry system.",
      "Arrange buzzer access for the plumber while I'm at work.",
      "Let the movers through my building's entryphone on Saturday.",
      "Give the dog walker temporary access through my condo intercom.",
      "My friend is at the gate call box; it calls my phone. Help them get in."
    ],
    "compatibility": {
      "regions": [
        "US",
        "CA"
      ],
      "requires": [
        "The entrance panel dials an outside phone number for the resident's unit.",
        "The resident or building manager can set that destination to the assigned Lowkey number.",
        "The system releases the entrance using the building's configured telephone keypad digits.",
        "The resident has authority to grant access, an eligible subscription, and completed building setup."
      ],
      "questions_if_unknown": [
        "Does the entrance buzzer or call box dial a phone number when someone selects your unit?",
        "Can you or your building manager change that number, and what keypad digits release the entrance?"
      ],
      "unsupported": [
        "An apartment unit's own deadbolt or smart lock.",
        "A fixed in-unit handset that cannot dial an outside phone number.",
        "A fob-only reader, standalone keypad, or garage opener without phone-dialing entry.",
        "Bypassing building permissions or gaining unauthorized access."
      ]
    },
    "capabilities": [
      {
        "id": "temporary_passcode",
        "description": "Create a guest code with bounded uses and expiry. Generated codes are four digits; custom codes follow the app's 1-4 digit rule (except 1 alone).",
        "command": [
          "unlock",
          "create"
        ]
      },
      {
        "id": "timed_access",
        "description": "Allow any caller to the buzzer during a resident-authorized time window.",
        "command": [
          "unlock",
          "create"
        ]
      },
      {
        "id": "recurring_access",
        "description": "Allow any buzzer caller during a recurring window, subject to the account's plan.",
        "command": [
          "unlock",
          "create"
        ]
      },
      {
        "id": "revoke_access",
        "description": "Revoke an access rule when a visit is canceled or complete.",
        "command": [
          "unlock",
          "revoke"
        ]
      },
      {
        "id": "access_activity",
        "description": "Inspect system access events; these do not prove visitor identity or physical entry.",
        "command": [
          "logs"
        ]
      },
      {
        "id": "building_management",
        "description": "List and select multiple virtual numbers; with explicit buildings:write on Multi Building, preview and execute paid building additions or permanent removals.",
        "command": [
          "buildings"
        ]
      },
      {
        "id": "use_notifications",
        "description": "Receive signed best-effort access-use callbacks, with persisted logs for recovery.",
        "command": [
          "webhooks"
        ]
      }
    ],
    "availability": {
      "lowkey_app": "available",
      "muse_connector": "preview_unpublished",
      "muse_directory": "not_submitted",
      "note": "The agent connector requires a separately released API and operator-provided URL. Do not assume a public API endpoint or built-in Muse installation."
    },
    "links": {
      "website": "https://www.lowkeybuzzer.com/",
      "guide": "https://www.lowkeybuzzer.com/blog/ai-apartment-buzzer-access/",
      "compatibility": "https://www.lowkeybuzzer.com/blog/tools/will-lowkey-work-with-my-buzzer/",
      "download": "https://www.lowkeybuzzer.com/download",
      "api_docs": "https://buzzerapi.com/docs.html"
    },
    "agent_next_steps": [
      "If hardware or authority is unclear, establish compatibility and the resident's authorization.",
      "If the preview connector is not installed, explain its release status; offer the existing Lowkey app setup.",
      "With the connector installed, use buzzer describe without credentials to inspect commands, then buzzer --json status to check account readiness.",
      "Follow the account's next_actions and the user's intended visitor, entrance, timing, and scope before creating access.",
      "For multiple buildings, run buzzer buildings list and pass --building <id> on setup, unlock, logs, and webhooks commands. Linked-building changes require an active Multi Building plan."
    ]
  },
  "command": {
    "name": "buzzer",
    "aliases": [],
    "description": "Lowkey: Arrange authorized entry for any visitor through an apartment or condo buzzer, intercom, or call box that dials a phone number.",
    "arguments": [],
    "options": [
      {
        "flags": "-V, --version",
        "description": "output the version number",
        "required": false
      },
      {
        "flags": "--json",
        "description": "Output raw JSON",
        "required": false
      },
      {
        "flags": "--base-url <url>",
        "description": "Override API base URL",
        "required": false
      },
      {
        "flags": "--api-key <key>",
        "description": "Override API key",
        "required": false
      },
      {
        "flags": "--building <id>",
        "description": "Building ID from buildings list; required for multi-building operations",
        "required": false
      }
    ],
    "commands": [
      {
        "name": "auth",
        "aliases": [],
        "description": "Manage authentication",
        "arguments": [],
        "options": [],
        "commands": [
          {
            "name": "login",
            "aliases": [],
            "description": "Authenticate with email/OTP or directly with an API key",
            "arguments": [],
            "options": [
              {
                "flags": "--api-key <key>",
                "description": "Authenticate directly with an API key",
                "required": false
              }
            ],
            "commands": []
          },
          {
            "name": "request-code",
            "aliases": [],
            "description": "",
            "arguments": [],
            "options": [
              {
                "flags": "--email <email>",
                "description": "Account email",
                "required": true
              }
            ],
            "commands": []
          },
          {
            "name": "verify-code",
            "aliases": [],
            "description": "",
            "arguments": [],
            "options": [
              {
                "flags": "--email <email>",
                "description": "Account email",
                "required": true
              },
              {
                "flags": "--challenge <id>",
                "description": "Challenge from request-code",
                "required": true
              },
              {
                "flags": "--code <code>",
                "description": "User-provided sign-in code",
                "required": true
              }
            ],
            "commands": []
          },
          {
            "name": "delegate",
            "aliases": [],
            "description": "Create a scoped, expiring agent key (secret shown once)",
            "arguments": [],
            "options": [
              {
                "flags": "--name <name>",
                "description": "Name",
                "required": false,
                "default": "Delivery agent"
              },
              {
                "flags": "--scopes <scopes>",
                "description": "Comma-separated scopes; default: account/access/logs/webhooks without billing or setup",
                "required": false
              },
              {
                "flags": "--expires-in-days <days>",
                "description": "Lifetime from 1 to 90 days",
                "required": false,
                "default": "30"
              }
            ],
            "commands": []
          },
          {
            "name": "keys",
            "aliases": [],
            "description": "List agent keys delegated by this owner key",
            "arguments": [],
            "options": [],
            "commands": []
          },
          {
            "name": "revoke-key",
            "aliases": [],
            "description": "Revoke a delegated agent key",
            "arguments": [
              {
                "name": "id",
                "required": true,
                "variadic": false
              }
            ],
            "options": [],
            "commands": []
          },
          {
            "name": "logout",
            "aliases": [],
            "description": "Remove stored API key",
            "arguments": [],
            "options": [
              {
                "flags": "--revoke",
                "description": "Also revoke this key on the server",
                "required": false
              }
            ],
            "commands": []
          },
          {
            "name": "status",
            "aliases": [],
            "description": "Show current authentication status",
            "arguments": [],
            "options": [],
            "commands": []
          }
        ]
      },
      {
        "name": "health",
        "aliases": [],
        "description": "Check BuzzerAPI health status",
        "arguments": [],
        "options": [],
        "commands": []
      },
      {
        "name": "account",
        "aliases": [
          "status"
        ],
        "description": "Show account details and usage",
        "arguments": [],
        "options": [],
        "commands": []
      },
      {
        "name": "unlock",
        "aliases": [],
        "description": "Manage buzzer unlocks (timers, passcodes, routines)",
        "arguments": [],
        "options": [],
        "commands": [
          {
            "name": "list",
            "aliases": [],
            "description": "List all unlocks",
            "arguments": [],
            "options": [
              {
                "flags": "--active",
                "description": "Show only active unlocks",
                "required": false
              },
              {
                "flags": "--type <type>",
                "description": "Filter by type (timer, passcode, routine)",
                "required": false
              },
              {
                "flags": "--limit <n>",
                "description": "Page size (1-100)",
                "required": false
              },
              {
                "flags": "--cursor <cursor>",
                "description": "Continue from the previous page",
                "required": false
              }
            ],
            "commands": []
          },
          {
            "name": "get",
            "aliases": [],
            "description": "Inspect current access, expiry, uses, and version",
            "arguments": [
              {
                "name": "id",
                "required": true,
                "variadic": false
              }
            ],
            "options": [],
            "commands": []
          },
          {
            "name": "create",
            "aliases": [],
            "description": "Create a new unlock",
            "arguments": [],
            "options": [
              {
                "flags": "--type <type>",
                "description": "Access type: passcode, timer, routine",
                "required": false,
                "default": "passcode"
              },
              {
                "flags": "--request-id <id>",
                "description": "Reuse an explicit request ID to recover an earlier create",
                "required": false
              },
              {
                "flags": "--expires-in <minutes>",
                "description": "Passcode lifetime, defaults to 60 minutes (max 10080)",
                "required": false
              },
              {
                "flags": "--expires-at <iso>",
                "description": "Passcode expiry as ISO timestamp with timezone",
                "required": false
              },
              {
                "flags": "--duration <minutes>",
                "description": "Duration in minutes (timer)",
                "required": false
              },
              {
                "flags": "--code <code>",
                "description": "1-4 digits, except 1 alone (default: random 4-digit code)",
                "required": false
              },
              {
                "flags": "--max-uses <n>",
                "description": "Max uses (default: 1)",
                "required": false
              },
              {
                "flags": "--days <days>",
                "description": "Day or preset: mon-sun, weekdays, weekends, daily (routine)",
                "required": false
              },
              {
                "flags": "--start <time>",
                "description": "Start time HH:MM (routine)",
                "required": false
              },
              {
                "flags": "--end <time>",
                "description": "End time HH:MM (routine)",
                "required": false
              },
              {
                "flags": "--timezone <tz>",
                "description": "IANA timezone (routine)",
                "required": false
              },
              {
                "flags": "--label <text>",
                "description": "Label for the unlock",
                "required": false
              }
            ],
            "commands": []
          },
          {
            "name": "update",
            "aliases": [],
            "description": "Update an existing unlock",
            "arguments": [
              {
                "name": "id",
                "required": true,
                "variadic": false
              }
            ],
            "options": [
              {
                "flags": "--label <text>",
                "description": "New label",
                "required": false
              },
              {
                "flags": "--if-version <version>",
                "description": "Only update this version (default: read current version)",
                "required": false
              },
              {
                "flags": "--expires-at <iso>",
                "description": "New passcode expiry, within 7 days",
                "required": false
              },
              {
                "flags": "--active <bool>",
                "description": "Set active status (true/false)",
                "required": false
              },
              {
                "flags": "--duration <minutes>",
                "description": "New duration (timer)",
                "required": false
              },
              {
                "flags": "--code <code>",
                "description": "New 1-4 digit passcode, except 1 alone",
                "required": false
              },
              {
                "flags": "--max-uses <n>",
                "description": "New max uses (passcode)",
                "required": false
              },
              {
                "flags": "--days <days>",
                "description": "New days (routine)",
                "required": false
              },
              {
                "flags": "--start <time>",
                "description": "New start time (routine)",
                "required": false
              },
              {
                "flags": "--end <time>",
                "description": "New end time (routine)",
                "required": false
              },
              {
                "flags": "--timezone <tz>",
                "description": "New timezone (routine)",
                "required": false
              }
            ],
            "commands": []
          },
          {
            "name": "delete",
            "aliases": [
              "revoke"
            ],
            "description": "Delete an unlock",
            "arguments": [
              {
                "name": "id",
                "required": true,
                "variadic": false
              }
            ],
            "options": [],
            "commands": []
          }
        ]
      },
      {
        "name": "logs",
        "aliases": [],
        "description": "View activity logs",
        "arguments": [],
        "options": [
          {
            "flags": "--limit <n>",
            "description": "Number of entries (1-100)",
            "required": false,
            "default": "50"
          },
          {
            "flags": "--since <iso>",
            "description": "Start date (ISO 8601)",
            "required": false
          },
          {
            "flags": "--until <iso>",
            "description": "End date (ISO 8601)",
            "required": false
          },
          {
            "flags": "--type <type>",
            "description": "Filter by type (unlock)",
            "required": false
          },
          {
            "flags": "--cursor <cursor>",
            "description": "Continue from a pagination cursor",
            "required": false
          },
          {
            "flags": "--follow",
            "description": "Poll for new entries every 5s",
            "required": false
          }
        ],
        "commands": []
      },
      {
        "name": "webhooks",
        "aliases": [],
        "description": "Receive signed callbacks when an access rule is used",
        "arguments": [],
        "options": [],
        "commands": [
          {
            "name": "list",
            "aliases": [],
            "description": "List all webhooks",
            "arguments": [],
            "options": [],
            "commands": []
          },
          {
            "name": "create",
            "aliases": [],
            "description": "Create a new webhook",
            "arguments": [],
            "options": [
              {
                "flags": "--url <url>",
                "description": "Webhook URL",
                "required": true
              },
              {
                "flags": "--events <events>",
                "description": "Comma-separated event types",
                "required": false,
                "default": "unlock.completed"
              },
              {
                "flags": "--description <text>",
                "description": "Description",
                "required": false
              }
            ],
            "commands": []
          },
          {
            "name": "update",
            "aliases": [],
            "description": "Update a webhook",
            "arguments": [
              {
                "name": "id",
                "required": true,
                "variadic": false
              }
            ],
            "options": [
              {
                "flags": "--url <url>",
                "description": "New URL",
                "required": false
              },
              {
                "flags": "--events <events>",
                "description": "New comma-separated event types",
                "required": false
              },
              {
                "flags": "--active <bool>",
                "description": "Set active status (true/false)",
                "required": false
              },
              {
                "flags": "--description <text>",
                "description": "New description",
                "required": false
              }
            ],
            "commands": []
          },
          {
            "name": "delete",
            "aliases": [],
            "description": "Delete a webhook",
            "arguments": [
              {
                "name": "id",
                "required": true,
                "variadic": false
              }
            ],
            "options": [],
            "commands": []
          },
          {
            "name": "test",
            "aliases": [],
            "description": "Send a test event to a webhook",
            "arguments": [
              {
                "name": "id",
                "required": true,
                "variadic": false
              }
            ],
            "options": [],
            "commands": []
          }
        ]
      },
      {
        "name": "buildings",
        "aliases": [],
        "description": "List, preview, add, and remove linked buildings on Multi Building",
        "arguments": [],
        "options": [],
        "commands": [
          {
            "name": "list",
            "aliases": [],
            "description": "List permitted buildings, labels, and virtual numbers",
            "arguments": [],
            "options": [],
            "commands": []
          },
          {
            "name": "preview-add",
            "aliases": [],
            "description": "Preview a new building and its subscription change; no number is purchased",
            "arguments": [],
            "options": [
              {
                "flags": "--label <name>",
                "description": "Building name",
                "required": true
              },
              {
                "flags": "--street <street>",
                "description": "Street address",
                "required": false
              },
              {
                "flags": "--city <city>",
                "description": "US city",
                "required": true
              },
              {
                "flags": "--state <state>",
                "description": "Two-letter US state",
                "required": true
              },
              {
                "flags": "--zip <zip>",
                "description": "US ZIP code",
                "required": true
              },
              {
                "flags": "--unlock-tone <tone>",
                "description": "Building release keypress: 1–3 digits, # or *",
                "required": true
              },
              {
                "flags": "--phone-number <e164>",
                "description": "Resident call-forwarding number; defaults to parent's configured number",
                "required": false
              }
            ],
            "commands": []
          },
          {
            "name": "preview-remove",
            "aliases": [],
            "description": "Preview releasing a linked number, deleting its rules/history, and reducing billed quantity",
            "arguments": [
              {
                "name": "id",
                "required": true,
                "variadic": false
              }
            ],
            "options": [],
            "commands": []
          },
          {
            "name": "add",
            "aliases": [],
            "description": "Execute an approved add preview: purchases a number and increases subscription quantity",
            "arguments": [],
            "options": [
              {
                "flags": "--quote <id>",
                "description": "Fresh quote from preview-add",
                "required": true
              },
              {
                "flags": "--request-id <id>",
                "description": "Stable retry ID; defaults to building-QUOTE_ID",
                "required": false
              }
            ],
            "commands": []
          },
          {
            "name": "remove",
            "aliases": [],
            "description": "Execute an approved removal: releases the number and permanently deletes building rules/history",
            "arguments": [
              {
                "name": "id",
                "required": true,
                "variadic": false
              }
            ],
            "options": [
              {
                "flags": "--quote <id>",
                "description": "Fresh quote from preview-remove for this building",
                "required": true
              },
              {
                "flags": "--request-id <id>",
                "description": "Stable retry ID; defaults to building-QUOTE_ID",
                "required": false
              }
            ],
            "commands": []
          },
          {
            "name": "operation",
            "aliases": [],
            "description": "Recover a building change result after timeout; never blindly repeat an uncertain provider operation",
            "arguments": [
              {
                "name": "id",
                "required": true,
                "variadic": false
              }
            ],
            "options": [],
            "commands": []
          }
        ]
      },
      {
        "name": "setup",
        "aliases": [],
        "description": "Phone-based buzzer setup",
        "arguments": [],
        "options": [],
        "commands": [
          {
            "name": "status",
            "aliases": [],
            "description": "",
            "arguments": [],
            "options": [],
            "commands": []
          },
          {
            "name": "configure",
            "aliases": [],
            "description": "",
            "arguments": [],
            "options": [
              {
                "flags": "--unlock-tone <tone>",
                "description": "Exact building unlock digits",
                "required": true
              }
            ],
            "commands": []
          }
        ]
      },
      {
        "name": "billing",
        "aliases": [],
        "description": "Lowkey subscription plans and hosted checkout",
        "arguments": [],
        "options": [],
        "commands": [
          {
            "name": "plans",
            "aliases": [],
            "description": "",
            "arguments": [],
            "options": [],
            "commands": []
          },
          {
            "name": "checkout",
            "aliases": [],
            "description": "",
            "arguments": [],
            "options": [
              {
                "flags": "--plan <plan>",
                "description": "Plan ID returned by billing plans",
                "required": true
              },
              {
                "flags": "--request-id <id>",
                "description": "Stable ID for this checkout attempt; reuse when retrying",
                "required": false
              }
            ],
            "commands": []
          },
          {
            "name": "status",
            "aliases": [],
            "description": "Recover the latest checkout URL and next step",
            "arguments": [],
            "options": [],
            "commands": []
          },
          {
            "name": "expire",
            "aliases": [],
            "description": "Expire an unpaid checkout so a different plan can be selected",
            "arguments": [
              {
                "name": "id",
                "required": true,
                "variadic": false
              }
            ],
            "options": [],
            "commands": []
          },
          {
            "name": "portal",
            "aliases": [],
            "description": "",
            "arguments": [],
            "options": [],
            "commands": []
          }
        ]
      },
      {
        "name": "describe",
        "aliases": [],
        "description": "Show product fit, compatibility, and CLI commands as JSON, without authentication",
        "arguments": [],
        "options": [],
        "commands": []
      }
    ]
  },
  "output": {
    "json": "One JSON document on stdout; errors on stderr.",
    "follow": "With --json, one log event per line (JSONL).",
    "exit_codes": {
      "success": 0,
      "input": 2,
      "authentication_or_permission": 3,
      "conflict": 4,
      "temporary_or_transport": 5
    }
  }
}
