OpenApp SDKs

Typed SDKs for your stack. Same wire, same behavior.

Idiomatic clients for automation, PMS integration, and physical access orchestration. Full coverage of the public OpenApp API, generated from the same contract that powers the reference — so types match the wire, always.

Available SDKs

All SDKs share the same wire contract, error model, and authentication scheme as the public OpenApp API.

Python
Available

Async-first client (AsyncClient) plus a synchronous facade (Client), typed via py.typed, with optional Pydantic v2 integration.

Rust
Available

Async Client built on openapp-sdk-core. Published to crates.io as openapp-sdk.

TypeScript / Node
Available

OpenAPI-generated types plus an async AsyncClient over the shared core bridge. Published as @tomers/openapp-sdk.

Go
Available

OpenAPI-generated client with transport through openapp-sdk-core for consistent auth, retries, and error mapping.

On the roadmap
Planned

Additional languages under consideration:

  • .NET (C#)
  • Ruby
  • PHP

Need another language? Tell us which one.

What you get

Every OpenApp SDK is designed around the same principles, so you can reach for whichever language fits your stack without giving up ergonomics or safety.

  • Batteries included
    Authentication, automatic retries with backoff, and structured telemetry are handled for you out of the box.
  • Typed, always current
    Idiomatic types for every resource and response, generated from the same contract that powers our API reference — so your editor's autocomplete is never behind the API.
  • Consistent across languages
    The same authentication, retry, and error-handling behavior across every official SDK. Learn one, know them all.
python · sync example
10 LOC end-to-end
from openapp_sdk import Client
from openapp_sdk.errors import ApiError

client = Client.connect(api_key="https://api.openapp.house/api/v1_openapp_YOUR_SECRET")

try:
    whoami = client.auth.whoami()
    print(whoami["email"])
    for org in client.orgs.list():
        print(org["id"], org["name"])
except ApiError as err:
    print(f"{err.status} {err.code}: {err.message}")

Ready to build?

Grab an API key from the dashboard, install the SDK, and you're shipping. Questions, roadmap feedback, or want early access to a new language binding? Get in touch.