Maintenance in progress
This section is currently being expanded and updated. Some content may not yet be available or may be incomplete. For urgent questions, please reach out at info@scailabs.ai.
This section is currently being expanded and updated. Some content may not yet be available or may be incomplete. For urgent questions, please reach out at info@scailabs.ai.
Desktop editors, terminal clients, and native apps you can install directly. Not SDKs.
No releases yet — teams publish here via their docs API key's downloads:write:<product> scope.
Latest releases for each ScaiLabs product. Updated automatically by each team's publishing pipeline.
ScaiLog Python 1.0.2 — SDK and agent in one wheel. Two fixes over 1.0.0: - CRITICAL: the split-topology agent (scailog-agent) no longer flattens per-entry tenants (PI was being encrypted under the agent's --tenant, making the right tenant erasure/DSAR unreachable). - The [agent] extra was missing PyYAML, so pip install scailog[agent] produced an agent that crashed on import. Fixed. Upgrade the agent: pip install "scailog[agent]==1.0.2" The agent has always been part of this package
Download .whlScaiLog Go SDK 1.0.1 — source distribution. Same SDK code as the 1.0.0 line (per-entry tenancy, _global namespace)
Download .gzScaiLog 1.0.0 — first stable release. - Per-entry tenancy: tenant is resolved per entry (explicit argument, then request context, then logger default). A process serving many tenants no longer needs a logger per tenant. - Global namespace: use the reserved tenant _global for events belonging to no tenant (bootstrap, system-wide failure). - BREAKING: the fallback to the reserved default tenant is gone. A logger with no tenant from any source now fails loudly rather than silently mislabelling every entry. Set SCAILOG_TENANT, bind per request, or pass it per call. Semantic versioning applies from 1.0.0: no breaking change before 2.0.0. The Go archive is source-only
Download .nupkgScaiLog 1.0.0 — first stable release. - Per-entry tenancy: tenant is resolved per entry (explicit argument, then request context, then logger default). A process serving many tenants no longer needs a logger per tenant. - Global namespace: use the reserved tenant _global for events belonging to no tenant (bootstrap, system-wide failure). - BREAKING: the fallback to the reserved default tenant is gone. A logger with no tenant from any source now fails loudly rather than silently mislabelling every entry. Set SCAILOG_TENANT, bind per request, or pass it per call. Semantic versioning applies from 1.0.0: no breaking change before 2.0.0. The Go archive is source-only
Download .tgzScaiKey Go SDK **v1.0.1** — first usable release. Full admin, directory, OAuth/OIDC and webhook coverage, with no third-party dependencies. > **1.0.0 is superseded and should not be used.** It declared the module path > `github.com/scailabs/scaikey-go`, which does not resolve — `go get` against it > fails. 1.0.1 is identical in behaviour and corrects the module path to > `scailabs.ai/scaikey-go`. No API changes. Requires Go 1.22 or later. Module path `scailabs.ai/scaikey-go`. Download the tarball below, unpack it, and reference it with a `replace` directive in your `go.mod` — or vendor the source directly: ```go require scailabs.ai/scaikey-go v1.0.1 replace scailabs.ai/scaikey-go => ./scaikey-go-1.0.1 ``` The `replace` directive is interim: the module path is stable and will resolve through `go get` once ScaiLabs' own git environment serves it, at which point you drop that line and nothing else changes. ### Standard library only The SDK imports nothing outside the Go standard library. Adding it cannot pull a dependency tree into your build or collide with your existing version pins — a direct response to the Storey team's report that SDK dependencies were harder to accommodate than the SDK itself. ### What's covered | Area | Surface | |---|---| | Directory | `Users`, `Groups` (direct + effective members, nested and parent groups) | | Tenancy | `Tenants`, `Partners` | | Applications | list, get, create, update, delete, rotate secret, effective users | | Federation | `IdentityProviders` — list, get, sync, test connection | | Operations | `Sessions` (list, revoke), `Audit` | | Public | unauthenticated application lookup | | OAuth / OIDC | PKCE, authorization code, refresh, client credentials, userinfo, introspection, revocation, discovery (cached 15 min), RP-initiated logout | | Webhooks | HMAC-SHA256 signature verification with replay protection | Every call takes a `context.Context`. Errors are typed — `NotFoundError`, `AuthorizationError`, `RateLimitError` and the rest — and match with `errors.As`, all embedding `*APIError` for status code, error code and raw body. ### Logout is modelled explicitly `OAuthClient.LogoutURL()` builds the OIDC end-session URL for the correct realm. This is deliberate: ScaiKey serves six routes with "logout" in the path, four of which are POST-only portal APIs. Sending a browser to one of those returns 405 and the user is never signed out — a failure integrating teams have actually hit. The SDK makes that unreachable. The doc comment states the three things that make logout work, because each has caused a real incident: redirect the browser rather than calling it server-side (a back-channel request carries no SSO cookie), send `IDTokenHint` so refresh tokens can be revoked, and remember that access tokens are **not** revoked because they are self-contained JWTs. ### Base URLs and realm paths Pass the **origin**. A base URL already carrying an API prefix (`/api/v1`, `/api/v1/platform`, ...) is accepted and reduced, so configurations copied from older documentation keep working. The realm asymmetry is modelled explicitly rather than guessed at: | | discovery | jwks | |---|---|---| | tenant | `/api/v1/auth/tenants/<slug>/.well-known/openid-configuration` | `.../.well-known/jwks.json` | | platform | `/api/v1/platform/`**`oauth`**`/.well-known/openid-configuration` | `/api/v1/platform/.well-known/jwks.json` | Note the trap: platform discovery carries an `oauth` segment and platform jwks does not, so a blanket rule fixes one and breaks the other. Both are pinned by unit tests. (ScaiKey has since begun serving platform discovery at both paths; the SDK uses the `oauth` form so it keeps working against older instances.) ### Live contract tests ```bash SCAIKEY_BASE_URL=https://scaikey.scailabs.ai \ SCAIKEY_TENANT_SLUG=<slug> \ go test -run Contract -v ./... ``` Four SDK releases across three languages were rolled back for what was, every time, a model-vs-endpoint disagreement — a path the SDK built that the server did not serve, or a field the SDK expected that the response did not carry. Unit tests cannot see any of that. The suite asserts that every URL the SDK constructs resolves to a real route (a 401 or 403 proves routing succeeded; a 404 is the bug), that both discovery documents resolve *and* every endpoint they advertise resolves, that the end-session endpoint answers a GET with a redirect, and that list envelopes decode into non-empty models. It was verified to fail on regression, not merely to pass: injecting a wrong admin path produced *"route does not exist (404): the SDK builds a path this server does not serve"*, and pointing logout at a portal route produced *"rejected GET with 405 (Allow: POST) — a browser redirect cannot log anyone out"*. Webhook signing was cross-checked against the server's own algorithm: a signature produced by the platform's implementation verifies in Go. ### Documentation <https://www.scailabs.ai/docs/scaikey/tutorials/web-app-login-and-logout>
Download .gz@scailabs/scaikey **v1.0.3** — adds group membership enumeration. Purely additive. ### Added The `GroupsClient` had only `list()` — no way to read a group's members, which Python and .NET have both had since 1.0.0. Anything driving group-derived permissions from TypeScript had to drop to raw HTTP. - **`groups.listMembers(groupId)`** — a group's direct members. - **`groups.listEffectiveMembers(groupId)`** — direct members plus those inherited from nested (child) groups. - **`groups.addMember(groupId, userId)`** / **`groups.removeMember(...)`** - **`groups.listNestedGroups(groupId)`** — groups nested inside this one. - **`groups.listParentGroups(groupId)`** — groups containing this one. - **`GroupMember`** and **`NestedGroup`** types. `GroupMember` models what the endpoints actually return — the *user* projection, `{id, email, display_name, status}` — not a membership row, so there is no `group_id` or `added_at`. (The Python SDK declared those as required and failed on every call until 1.1.5; this ships pinned to the real shape from the start, and is verified against a live server.) ### Also Contract tests now cover the new methods, so the shape is checked against a real ScaiKey rather than a fixture. Run with `SCAIKEY_CONTRACT_URL` and `SCAIKEY_CONTRACT_TOKEN` set; skipped otherwise. ### In 1.0.2 Fixed OIDC discovery for GLOBAL applications — the platform document sits under an extra `/oauth` segment, so `getOidcConfiguration()` 404'd for every cross-tenant app. ### In 1.0.1 One base URL now serves every client: pass the origin and each client builds its own prefix. Base URLs carrying an API prefix are reduced to the origin, so existing configurations keep working.
Download .tgz**v1.0.2** — fixes OIDC discovery for GLOBAL applications, and IdP payload parsing. Backward compatible. ### Fixed - **`getOidcConfiguration()` / `GetOidcConfigurationAsync()` 404'd for every GLOBAL application.** It built `/api/v1/platform/.well-known/openid-configuration`; the real document sits under an extra segment — `/api/v1/platform/`**`oauth`**`/.well-known/openid-configuration`. The two flavours are genuinely asymmetric on the server: | | discovery path | |---|---| | tenant | `/api/v1/auth/tenants/<slug>/.well-known/openid-configuration` | | platform | `/api/v1/platform/`**`oauth`**`/.well-known/openid-configuration` | A trap for anyone tempted to simplify this: platform **jwks** is at `/api/v1/platform/.well-known/jwks.json` — *without* the `oauth` segment. A blanket rule fixes discovery and breaks jwks. Both shapes are modelled explicitly and pinned by tests, including one guarding the jwks path. Reported against the Python SDK by the Storey team; the same construction existed here. ### Fixed (.NET only) - **`IdentityProvider.ProviderType` silently kept its default value.** The model bound only `provider_type`, but the admin list sends `type` and the tenant-scoped list sends `protocol`. Neither populated the property, so it deserialized to the first enum value — a wrong answer rather than an error. Enablement is likewise sent as a `status` string ("ACTIVE"/"INACTIVE") by the admin list. All spellings are now accepted. ### Upgrading No code changes required. ### In 1.0.1 One base URL now serves every client: pass the origin (`https://scaikey.scailabs.ai`) and each client builds its own prefix. Base URLs that already carry an API prefix are reduced to the origin, so existing configurations keep working. Tenant OAuth previously omitted the `/auth` segment and had never resolved.
Download .nupkgScaiKey Python SDK **v1.1.6** — makes the package PEP 561 typed and fixes OIDC discovery for GLOBAL applications. Both reported by the Storey team. ### Fixed - **`get_oidc_configuration()` 404'd for every GLOBAL application.** It built `/api/v1/platform/.well-known/openid-configuration`; the real path carries an extra segment — `/api/v1/platform/**oauth**/.well-known/openid-configuration`. The two flavours are genuinely asymmetric on the server and the SDK applied the tenant rule to both: | | discovery path | |---|---| | tenant | `/api/v1/auth/tenants/<slug>/.well-known/openid-configuration` | | platform | `/api/v1/platform/`**`oauth`**`/.well-known/openid-configuration` | Note the trap for anyone tempted to "simplify" this: platform **jwks** lives at `/api/v1/platform/.well-known/jwks.json` — *without* the `oauth` segment. A blanket rule fixes discovery and breaks jwks. Both shapes are now modelled explicitly and pinned by tests, including one that guards the jwks path. ### Added - **`py.typed` marker (PEP 561).** The package shipped with full annotations but no marker, so type checkers ignored them and consumers needed a scoped `mypy` override. Type checking now works out of the box — you can drop the override. - **Live contract coverage for discovery.** Both discovery forms are now exercised against a real server, alongside the twelve model checks added in 1.1.5. This is the gap that let the discovery bug ship: the contract suite covered every *model*, but not the OAuth helper. ### Upgrading No code changes required. ### Earlier in this line 1.1.5 fixed the remaining model-vs-endpoint mismatches (`GroupMember`, `IdentitySource`, `IdentityProvider`) and added the live contract suite; 1.1.4 fixed URL construction; 1.1.3 fixed pagination and added `applications.get_effective_users()`; 1.1.2 fixed a form-encoding bug that broke every authenticated call; 1.1.1 declared the missing `email-validator` dependency. Nothing has been removed across 1.0.0 → 1.1.6. The only breaking change in the line remains `OAuthClient.decode_id_token` becoming async in 1.1.0.
Download .whl**ScaiVault certificate agent v1.0.0** — renews ScaiVault-managed TLS certificates on a host and reloads the service that uses them. Install with pip
Download .whlOfficial .NET client for ScaiVault. Idiomatic C# over HttpClient, async-only, with System.Text.Json source-generated converters. Targets net8.0. Authenticates with ScaiKey JWTs or ScaiVault API keys (X-API-Key, auto-detected on key_ prefix). Covers all 127 endpoints across secrets, policies, rotation, PKI, ACME, dynamic credentials, federation, subscriptions, webhooks, identity, audit, and batch. Use ScaiVaultClient via AddSingleton for ASP.NET Core. MIT.
Download .nupkgOfficial TypeScript and JavaScript client for ScaiVault. Promise-based, full type inference, ships ESM and CommonJS bundles. Node 18+ with zero runtime dependencies via native fetch. Authenticates with ScaiKey JWTs or ScaiVault API keys (X-API-Key, auto-detected on key_ prefix). Covers all 127 endpoints across secrets, policies, rotation, PKI, ACME, dynamic credentials, federation, subscriptions, webhooks, identity, audit, and batch. MIT.
Download .tgzOfficial Python client for ScaiVault. Async-first with a sync wrapper, typed Pydantic models, and connection-pooled httpx under the hood. Python 3.10+. Authenticates with ScaiKey JWTs or ScaiVault API keys (X-API-Key, auto-detected on key_ prefix). Covers all 127 endpoints across secrets, policies, rotation, PKI, ACME, dynamic credentials, federation, subscriptions, webhooks, identity, audit, and batch. MIT.
Download .whlScaiScribe SDK — v0.1.1 alpha. See https://www.scailabs.ai/docs/scaiscribe/changelog
Download .tgzScaiScribe SDK — v0.1.1 alpha. See https://www.scailabs.ai/docs/scaiscribe/changelog
Download .nupkgScaiScribe SDK — v0.1.1 alpha. See https://www.scailabs.ai/docs/scaiscribe/changelog
Download .whlPagination & filter alignment with the ScaiAtlas API. - List/search now send `page_size` (was `per_page`) and parse the server's `{data, page, page_size, total, total_pages}` envelope, so paginated calls return results instead of empty pages. - `search.models` uses a single `tag` filter and `sort`/`order` (`updated|created|name|downloads` × `asc|desc`); removed the unused `status` filter from `versions.list`. - The Python surface (`per_page` kwarg, `.items`, `.pagination`) is unchanged. Builds on 0.1.1 (schema/field alignment).
Download .gzPagination & filter alignment with the ScaiAtlas API. - List/search now send `page_size` (was `per_page`) and parse the server's `{data, page, page_size, total, total_pages}` envelope, so paginated calls return results instead of empty pages. - `search.models` uses a single `tag` filter and `sort`/`order` (`updated|created|name|downloads` × `asc|desc`); removed the unused `status` filter from `versions.list`. - The Python surface (`per_page` kwarg, `.items`, `.pagination`) is unchanged. Builds on 0.1.1 (schema/field alignment).
Download .whlOfficial .NET client for ScaiGrid, targeting .NET 8 LTS. 0.2.0 adds the ScaiEcho sub-client — client.ScaiEcho.AnalyzeAsync for batch pyannote analysis and client.ScaiEcho.DiarizeStreamAsync for standalone real-time diarization. Streaming via IAsyncEnumerable of DiarizeSegment using the built-in System.Net.WebSockets.ClientWebSocket, no extra dependencies. Both bearer-header and bearer-subprotocol WebSocket auth. Backfills Transcribe and Speakers CRUD. MIT.
Download .nupkgOfficial TypeScript and JavaScript client for ScaiGrid. 0.2.0 adds the ScaiEcho sub-client — client.scaiecho.analyze() for batch pyannote analysis and client.scaiecho.diarizeStream() for standalone real-time diarization. Streaming uses the platform WebSocket — native on Node 22+ and all browsers, install ws on older Node. Both bearer-header and bearer-subprotocol auth modes. Backfills transcribe and speakers CRUD. ESM and CommonJS bundles, MIT.
Download .tgzOfficial Python client for ScaiGrid. 0.2.0 adds first-class ScaiEcho support — client.scaiecho.analyze() for batch pyannote analysis and client.scaiecho.diarize_stream() for standalone real-time diarization. Sync and async clients sharing one surface. Streaming uses the optional websockets library, install with pip install scailabs-scaigrid[ws]. Both bearer-header and bearer-subprotocol WebSocket auth modes. Backfills transcribe and speakers CRUD. Python 3.10+, MIT.
Download .whlOfficial Python client for ScaiDrive. Async-first (httpx) with a sync wrapper sharing the same surface. Resumable uploads with streaming sha256, Range downloads with local hash verification. 95 methods across 9 resources, Python 3.10+.
Download .whlOfficial TypeScript and JavaScript client for ScaiDrive. Async, fetch-based, ESM + CJS bundles with .d.ts, Node 18+. Resumable uploads with content_sha256 verification, Range-aware streaming downloads, X-Content-SHA256 + ETag integrity. 95 methods across 9 resources (files, folders, shares, external links, permissions, quotas, search, sync, users).
Download .tgzOfficial .NET client for ScaiDrive targeting .NET 8 LTS. Async-first throughout with CancellationToken on every method. Resumable uploads with content_sha256, Range downloads with X-Content-SHA256 integrity. Constructor overloads for owned-HttpClient and IHttpClientFactory injection. 95 methods across 9 resources.
Download .nupkg**ScaiDNS SDK v0.1.0** — first published release. Resource coverage (all three SDKs at parity): - Domains, Records, Reverse Zones, DNSSEC, Templates - Import / Export (incl. multipart file upload) - API Keys, Access Grants, Roles - Users, Groups, Admin (platform config, tenants, audit logs, stats, sync status) - Me / auth context See the API reference at https://scailabs.ai/docs/scaidns/reference for the full endpoint inventory.
Download .whl**ScaiDNS SDK v0.1.0** — first published release. Resource coverage (all three SDKs at parity): - Domains, Records, Reverse Zones, DNSSEC, Templates - Import / Export (incl. multipart file upload) - API Keys, Access Grants, Roles - Users, Groups, Admin (platform config, tenants, audit logs, stats, sync status) - Me / auth context See the API reference at https://scailabs.ai/docs/scaidns/reference for the full endpoint inventory.
Download .tgz**ScaiDNS SDK v0.1.0** — first published release. Resource coverage (all three SDKs at parity): - Domains, Records, Reverse Zones, DNSSEC, Templates - Import / Export (incl. multipart file upload) - API Keys, Access Grants, Roles - Users, Groups, Admin (platform config, tenants, audit logs, stats, sync status) - Me / auth context See the API reference at https://scailabs.ai/docs/scaidns/reference for the full endpoint inventory.
Download .nupkgInitial public release of the ScaiSend SDK. - All 19 endpoints covered: mail send, full template CRUD with versions, bounce / spam / global / group suppression management. - Built-in retry on 429 and 5xx with exponential backoff + jitter
Download .tgzInitial public release of the ScaiSend SDK. - All 19 endpoints covered: mail send, full template CRUD with versions, bounce / spam / global / group suppression management. - Built-in retry on 429 and 5xx with exponential backoff + jitter
Download .whlInitial public release of the ScaiSend SDK. - All 19 endpoints covered: mail send, full template CRUD with versions, bounce / spam / global / group suppression management. - Built-in retry on 429 and 5xx with exponential backoff + jitter
Download .nupkgOfficial Python SDK 1.0 — full backend coverage. Sync + async clients. Typed errors. CLI.
Download .whlOfficial TypeScript/JavaScript SDK 1.0 — works in Node 18+ and modern browsers. ESM + CJS builds, full type definitions, fetch-based.
Download .tgzOfficial .NET SDK 1.0 — targets .NET 8. HttpClient-based, thread-safe, System.Text.Json with records.
Download .nupkgScaiLabs software is dual-licensed. Pick the option that fits your situation.
Which license applies to your use case, and how the dual licensing works. View · Download .md
Default free-use license. Source-available with copyleft-style obligations for derivative works and services. View · Download .md
For organisations that need to ship ScaiLabs software in closed-source products or as part of a commercial service. View · Download .md
Questions about which license applies to your situation? Reach out at licensing@scailabs.ai.
Can’t find what you’re looking for? Our team can help with custom integrations, deployment guidance, and technical support.
Get in Touch →