Developers

Build access workflows as code

OpenApp exposes organizations, devices, entities, zones, policies, invites, and audit over a public HTTP API. Use official SDKs when you want typed clients with shared auth and retries, or call OpenAPI directly from any stack. OpenApp is ingress-only software, not a listed access-control or fire system — see [Compliance](/compliance).

OpenApp is ingress-only software, not a listed fire or escape-door system. Occupants must be able to exit without a phone or the cloud. Compliance

Product capabilities

  • Official SDKs

    Python (PyPI openapp-sdk), TypeScript (@tomers/openapp-sdk), Rust (crates.io), Go (source module).

  • Same contract everywhere

    Types and behavior track the public OpenAPI document so editors stay honest.

  • Automation ready

    Webhooks for audit streams, scripting for light orchestration, and MCP for agents that operate access safely.

Languages today

Python, Rust, TypeScript/Node, and Go are available. .NET, Ruby, and PHP are on the roadmap.

Want another language?

If you need a language on our roadmap prioritized - or support for a language that is not listed - contact us.

Same guest-invite flow in four languages

Official SDKs share auth, retries, and the public OpenAPI contract.

guest invitations
"""Create a time-bound access invite for guests."""

# SDK docs: https://openapp.house/docs/sdk/python/

from openapp_sdk import Client

# Replace the placeholder values below with your org's values from the dashboard.
# OPENAPP_API_KEY: generate at https://openapp.house/dashboard/settings/api-keys
OPENAPP_API_KEY = (
    "https://openapp.house_openapp_9kHWAeFWbMqPg0hMKshNGba7scA6mfmISG7mgI7Eok8"
)
ORG_ID = "01KSYAX0BS1K7Y6R997XE1EWHY"
INTEGRATION_NAME = "Virtual Access Demo"  # name shown in the dashboard
PORTAL_NAME = "Lobby Portal"  # name shown in the dashboard
EXPIRES_IN = "1w"  # One week; you can also set exact dates with valid_from / valid_to.


def main() -> None:
    client = Client.connect(api_key=OPENAPP_API_KEY, org_id=ORG_ID)
    integration = client.integrations.get_by_name(INTEGRATION_NAME)
    portal = client.integrations.get_access_portal_by_name(
        integration["id"], PORTAL_NAME
    )
    invite = client.integrations.create_access_invite(
        integration["id"],
        portal_ids=[portal["id"]],
        name="Year-end celebration",
        expires_in=EXPIRES_IN,
        max_uses=50,
        invitee_message={"en": "Welcome — use this link during the party hour."},
    )
    # Share this URL with your guests.
    print(invite["invite_url"])


if __name__ == "__main__":
    main()

FAQ

Where do you get an API key?
Sign in to the dashboard and create API credentials for your organization.
Is there a sandbox?
Yes - virtual demo devices and the docs cover the usual scenarios. Contact us if you need a trial setup in your environment.