Skip to content
Studio DocsContact us

Integrate

Studio API and API keys

Everything your team does in the studio app can be automated through the studio API. Access is by account only: every call is made with a signed-in session or an API key your organization issued.

Overview

  • The API lives under /api/b2b/v1 and speaks JSON.
  • There is no anonymous access. The machine-readable API reference (an OpenAPI document) and the contract endpoints that list scopes, rate limits, error codes and deprecations are available to signed-in members and to API keys, not to the public.
  • List endpoints are paged with cursors.
  • Live streams are opened with a short-lived stream ticket, which is single-use and valid for 60 seconds.

API keys

Owners and Admins create API keys in the studio app. Each key has:

  • a level, which sets the most it can ever do;
  • scopes, which narrow the level to what your tooling needs;
  • optionally, a restriction to specific groups, hosts or servers;
  • optionally, an IP allow-list, so the key only works from your own addresses;
  • optionally, its own rate limit, from 1 to 600 requests a minute (60 by default);
  • an expiry date.

The key's secret is shown once, when it is created. A key can never do more than the member who owns it can do today: if that person's role is reduced, their keys are reduced with it.

Rotation and revocation

Rotating a key issues a successor and keeps the old key working for a grace period you choose (24 hours by default, up to 168), so you can roll the new secret out without downtime. Any key can be revoked at any time.

Keys are created, edited and rotated only from a signed-in member session. A key can never create another key.

What keys cannot reach

Some things are for people only, whatever a key's scopes: single sign-on and SCIM settings, accepting legal documents, and opening Remote Desktop or terminal sessions. Keys are not subject to the multi-factor authentication requirement, which is another reason to give each key only the scopes it needs and an IP allow-list.

Key levels

A key's scopes must fit inside its level. The levels, from most to least powerful:

LevelAPI nameScopes it can hold
Full accessfull_accessAll
Deploy and configdeploy_config36
Operatoroperator28
Read-onlyread_only20
Monitoring onlymonitoring_only2

The Monitoring only level is meant for dashboards and holds exactly monitoring:read and alerts:read.

Scopes

ScopeAreaAllowsLevels
hardware:readHardwareView hardware and capacityFull access, Deploy and config, Operator, Read-only
hardware:writeHardwareRent hardware and edit its assignmentFull access, Deploy and config
hardware:releaseHardwareRelease rented hardwareFull access
groups:readFleetView groupsFull access, Deploy and config, Operator, Read-only
groups:writeFleetCreate, edit and scale groupsFull access, Deploy and config
instances:readFleetView instances and their stateFull access, Deploy and config, Operator, Read-only
instances:deployFleetDeploy and delete instancesFull access, Deploy and config
instances:lifecycleFleetStart, stop and restart instancesFull access, Deploy and config, Operator
instances:consoleFleetSend console commandsFull access, Deploy and config, Operator
console:readFleetRead live console output and historyFull access, Deploy and config, Operator
games:readBuildsView games and definitionsFull access, Deploy and config, Operator, Read-only
games:writeBuildsCreate and edit game definitionsFull access, Deploy and config
games:ingestBuildsUpload buildsFull access, Deploy and config
config:readConfigView configurationFull access, Deploy and config, Operator, Read-only
config:writeConfigChange configurationFull access, Deploy and config
backups:readDataList backups and their settingsFull access, Deploy and config, Operator, Read-only
backups:writeDataCreate and restore backupsFull access, Deploy and config, Operator
backups:downloadDataDownload a backup archiveFull access
files:readDataDownload instance filesFull access, Deploy and config, Operator, Read-only
files:writeDataUpload instance filesFull access, Deploy and config
schedules:readOperateView scheduled eventsFull access, Deploy and config, Operator, Read-only
schedules:writeOperateCreate and edit schedulesFull access, Deploy and config, Operator
remote:sftpOperateOpen an SFTP session against an instanceFull access, Deploy and config, Operator
remote:sessionsOperateEnd someone else's remote sessionFull access
monitoring:readObserveRead metricsFull access, Deploy and config, Operator, Read-only, Monitoring only
monitoring:writeObserveConfigure a telemetry push targetFull access
alerts:readObserveRead alerts and silencesFull access, Deploy and config, Operator, Read-only, Monitoring only
alerts:acknowledgeObserveAcknowledge alerts and create silencesFull access, Deploy and config, Operator
alerts:writeObserveEdit contact points, routes and quiet hoursFull access, Deploy and config
webhooks:readObserveView webhooks and their delivery historyFull access, Deploy and config, Operator, Read-only
webhooks:writeObserveCreate, edit, test and replay webhooksFull access, Deploy and config
audit:readObserveRead the audit logFull access, Operator, Read-only
members:readAccountView members and their rolesFull access, Operator, Read-only
members:writeAccountInvite, edit and remove membersFull access
org:readAccountRead organization settingsFull access, Deploy and config, Operator, Read-only
org:writeAccountChange organization settingsFull access
org:exportAccountExport the organization's dataFull access
keys:readAccountList API keys and their usageFull access, Deploy and config, Operator, Read-only
keys:revokeAccountRevoke an API keyFull access
billing:readAccountRead invoices and usageFull access, Operator, Read-only
billing:writeAccountAdd credit and change billing settingsFull access
credentials:readAccountView stored credentials — labels and status, never a secretFull access, Deploy and config, Operator, Read-only
credentials:writeAccountStore studio credentials (Steam, registry, IdP)Full access, Deploy and config
legal:readAccountRead legal documents and this org's acceptance historyFull access, Deploy and config, Operator, Read-only
support:readAccountRead support tickets and their repliesFull access, Deploy and config, Operator, Read-only
support:writeAccountOpen, reply to, close and reopen support ticketsFull access, Deploy and config, Operator
reseller:readResellerRead reseller settings, theme and domainsFull access, Deploy and config, Operator, Read-only
reseller:writeResellerChange reseller branding, domains and pricingFull access, Deploy and config

These scopes are refused outright and can never be issued: keys:write, builds:read, builds:write, metrics:read and legal:accept.

Rate limits

Requests are counted over a rolling minute in several buckets at once, and a request must fit in all of them:

BucketRequests a minuteWeighted by route
Before sign-in, per IP address60No
Per API key (the key's own limit)60Yes
Per signed-in member120Yes
Per organization, keys and members together1200 unless agreed otherwiseNo

In the weighted buckets, the limit is multiplied by the weight of the route being called, so light calls can be made more often than heavy ones:

Route typeWeightApplies to
pollx10Dashboard rollups, realtime-stats
readx5Every other GET
writex2POST/PUT/PATCH/DELETE that change configuration
searchx1Full-text search
controlx0.5Start, stop, restart, deploy, delete
downloadx1/3File and backup downloads
uploadx1/6Build ingest, file upload
streamx1/6Stream-ticket minting

Separately, no single key or member can make more than 600 requests a minute, however the calls are weighted.

A refused request answers 429 with a Retry-After header, and responses carry X-RateLimit-* headers describing the bucket.

Errors

Errors are returned as JSON problem documents in the RFC 9457 shape (type, title, status, detail), with a stable machine-readable code and a requestId. Quote the requestId in a support ticket and we can find the exact request.

An error code never changes meaning once it has shipped; a condition whose meaning changes gets a new code.

Idempotency

Send an Idempotency-Key header (up to 255 characters) on a POST and a retry of the same request is answered from the first result instead of being carried out twice. Keys are remembered for 24 hours.

  • A replayed answer carries Idempotency-Replayed: true.
  • The same key with a different body is refused with 422 (IDEMPOTENCY_KEY_REUSED).
  • The same key while the first request is still running is refused with 409 (IDEMPOTENCY_IN_PROGRESS).

Versioning

  • The version is the path prefix. Within v1, new response fields, optional request fields, enum values, routes and scopes can be added at any time, so clients must ignore fields they do not recognise.
  • A breaking change is released under a new prefix, served alongside v1 rather than replacing it.
  • A route that is going away keeps working and answers with Deprecation, Sunset and Link headers, with at least 365 days between deprecation and sunset. A contract endpoint lists everything currently deprecated.

Talk to our studio team

Pricing and commercial terms: contact us for more information.

Hardware availability, contract terms and service commitments are agreed with each studio.