Reference
Shared schemas
The named types that procedure inputs and outputs use, in TypeScript notation, as the descriptors define them. A name ending in Out is the lenient output form of the strict input type without it. Index.
AccountGrant · ApiKey · ApiKeyId · AppFormatOut · Appearance · Arch · ArtifactId · ArtifactMetadata · ArtifactSigning · AuthSessionId · AuthSessionInfo · BuildCacheOptions · BuildConfigurationIn · BuildEnvValues · BuildFailure · BuildId · BuildLogLine · BuildOsFamilyIn · BuildSourceInput · BuildTargetIn · BuildTrigger · ClaimName · ClientBinding · CloudArtifact · CloudBuild · CloudBuildSource · CloudRun · CloudScope · CloudScopeOut · CloudShard · CloudUpload · ConnectionId · CredentialCertificate · CredentialId · CredentialMetadata · CredentialProfile · CredentialProjectsIn · Decimal · DeviceSpec · DisplayName · Email · ErrorBody · ErrorCodeOut · ExternalRef · GitRef · GrantId · Invitation · InvitationId · InvitationStatus · IssuerCondition · IssuerId · JsonObject · Member · MemberRole · MemberRoleOut · Month · OidcConnection · Org · OrgId · Orientation · PageCursor · PageLimit · Password · PlannedStep · PlatformId · PresetId · PresetOptions · Project · ProjectId · QuotaClass · QuotaDimension · QuotaLine · ReceivedInvitation · RefPattern · RelativePath · RunId · RunStats · RunStatusOut · RunSuiteSource · Seq · SessionId · ShardId · SignedRequestOut · SigningCredential · Slug · SourceRuleIn · SourceRuleOut · StepId · StepOverride · SubjectTemplate · TimeoutMs · Timestamp · TrustedIssuer · UploadId · User · UserId
AccountGrant
type AccountGrant = {
id: GrantId
clientId: string
clientName: string
orgId: OrgId
orgName: string
projectId?: ProjectId
projectName?: string
resource: string
scopes: CloudScopeOut[]
via: string
createdAt: Timestamp
lastUsedAt?: Timestamp
}Named types: CloudScopeOut, GrantId, OrgId, ProjectId, Timestamp.
ApiKey
type ApiKey = {
id: ApiKeyId
orgId: OrgId
name: string
purpose?: string
start: string
scopes: CloudScopeOut[]
projectId?: ProjectId
status: 'active' | 'revoked' | …
createdBy: UserId
createdAt: Timestamp
expiresAt?: Timestamp
lastUsedAt?: Timestamp
revokedAt?: Timestamp
}Named types: ApiKeyId, CloudScopeOut, OrgId, ProjectId, Timestamp, UserId.
ApiKeyId
type ApiKeyId = stringAppFormatOut
type AppFormatOut = 'iosApp' | 'iosAppArchive' | 'apk' | 'expoProject' | 'catalystApp' | …Appearance
type Appearance = 'light' | 'dark'Arch
type Arch = 'arm64' | 'x86_64'ArtifactId
type ArtifactId = stringArtifactMetadata
type ArtifactMetadata = {
bundleId?: string
version?: string
build?: string
urlSchemes?: string[]
signing?: 'none' | ArtifactSigning
}Named types: ArtifactSigning.
ArtifactSigning
type ArtifactSigning = { credentialId: string; certificateSha256: string; schemes: string[]; verifier: string }AuthSessionId
type AuthSessionId = stringAuthSessionInfo
type AuthSessionInfo = {
id: AuthSessionId
createdAt: Timestamp
updatedAt: Timestamp
expiresAt: Timestamp
reauthenticatedAt?: Timestamp
federated?: boolean
ipAddress?: string
userAgent?: string
current: boolean
}Named types: AuthSessionId, Timestamp.
BuildCacheOptions
type BuildCacheOptions = { restore: boolean; save: boolean }BuildConfigurationIn
type BuildConfigurationIn = 'debug' | 'release'BuildEnvValues
type BuildEnvValues = Record<string, string>BuildFailure
type BuildFailure = { reason: string; message: string; stepId?: string }BuildId
type BuildId = stringBuildLogLine
type BuildLogLine = {
seq: Seq
at: Timestamp
stepId?: string
stream: 'stdout' | 'stderr' | 'runner' | 'controller' | …
line: string
}BuildOsFamilyIn
type BuildOsFamilyIn = 'ios' | 'android'BuildSourceInput
type BuildSourceInput =
| {
kind: 'git'
url: string // 1–2048 chars
ref: GitRef
submodules?: boolean
lfs?: boolean
}
| { kind: 'tarball' }Named types: GitRef.
BuildTargetIn
type BuildTargetIn = 'simulator' | 'emulator' | 'deviceInternal' | 'store'BuildTrigger
type BuildTrigger = {
branch?: GitRef
defaultBranch?: GitRef
pullRequest?: integer // ≥ 1
}Named types: GitRef.
ClaimName
type ClaimName = stringClientBinding
type ClientBinding = {
claim: 'client_id' | 'azp' | null
allowed: string[] // ≤ 32 items; each /^[\x21-\x7e]{1,256}$/
}CloudArtifact
type CloudArtifact = {
artifactId: ArtifactId
projectId: ProjectId
buildId: BuildId
name: string
format: AppFormatOut
contentType: string
bytes: integer
sha256: string
metadata: ArtifactMetadata
createdAt: Timestamp
expiresAt?: Timestamp
}Named types: AppFormatOut, ArtifactId, ArtifactMetadata, BuildId, ProjectId, Timestamp.
CloudBuild
type CloudBuild = {
buildId: BuildId
projectId: ProjectId
status: 'awaitingSource' | 'queued' | 'starting' | 'running' | 'succeeded' | 'failed' | 'errored' | 'canceled' | …
statusDetail?: string
source: CloudBuildSource
osFamily: 'ios' | 'android' | …
target: 'simulator' | 'emulator' | 'deviceInternal' | 'store' | …
configuration?: 'debug' | 'release' | …
appRoot?: string
preset?: { id: string; version: string }
toolchain?: string
image?: { id: string; digest: string }
attempt: integer
timeoutMs: integer
failure?: BuildFailure
error?: ErrorBody
artifactIds: ArtifactId[]
metadata: Record<string, unknown>
envNames?: string[]
uploadId?: UploadId
signingCredentialId?: CredentialId
createdAt: Timestamp
queuedAt?: Timestamp
startedAt?: Timestamp
endedAt?: Timestamp
}Named types: ArtifactId, BuildFailure, BuildId, CloudBuildSource, CredentialId, ErrorBody, ProjectId, Timestamp, UploadId.
CloudBuildSource
type CloudBuildSource = { kind: 'git' | 'tarball' | …; url?: string; ref?: string; revision?: string }CloudRun
type CloudRun = {
runId: RunId
projectId: ProjectId
status: RunStatusOut
shardCount: integer
workers: integer
shards: {
queued: integer
running: integer
passed: integer
failed: integer
errored: integer
timedOut: integer
canceled: integer
}
stats: RunStats
timeoutMs: integer
createdAt: Timestamp
startedAt?: Timestamp
endedAt?: Timestamp
}Named types: ProjectId, RunId, RunStats, RunStatusOut, Timestamp.
CloudScope
type CloudScope = 'runtime:read' | 'runtime:admin' | 'devices:read' | 'devices:acquire' | 'devices:drive' | 'apps:install' | 'apps:debug' | 'logs:read' | 'runs:read' | 'runs:report' | 'account:read' | 'account:write' | 'org:read' | 'org:manage' | 'projects:read' | 'projects:write' | 'keys:read' | 'keys:write' | 'usage:read' | 'builds:read' | 'builds:write' | 'artifacts:read' | 'artifacts:write' | 'signing:use' | 'admin:read' | 'admin:write'CloudScopeOut
type CloudScopeOut = 'runtime:read' | 'runtime:admin' | 'devices:read' | 'devices:acquire' | 'devices:drive' | 'apps:install' | 'apps:debug' | 'logs:read' | 'runs:read' | 'runs:report' | 'account:read' | 'account:write' | 'org:read' | 'org:manage' | 'projects:read' | 'projects:write' | 'keys:read' | 'keys:write' | 'usage:read' | 'builds:read' | 'builds:write' | 'artifacts:read' | 'artifacts:write' | 'signing:use' | 'admin:read' | 'admin:write' | …CloudShard
type CloudShard = {
shardId: ShardId
runId: RunId
index: integer
total: integer
status: RunStatusOut
attempt: integer
sessionIds: SessionId[]
exitCode?: integer
stats?: RunStats
error?: ErrorBody
startedAt?: Timestamp
endedAt?: Timestamp
}Named types: ErrorBody, RunId, RunStats, RunStatusOut, SessionId, ShardId, Timestamp.
CloudUpload
type CloudUpload = {
uploadId: UploadId
projectId: ProjectId
purpose: string
state: 'open' | 'complete' | 'expired' | …
byteBudget: integer
bytesGranted: integer
maxFiles: integer
filesGranted: integer
expiresAt: Timestamp
}Named types: ProjectId, Timestamp, UploadId.
ConnectionId
type ConnectionId = stringCredentialCertificate
type CredentialCertificate = {
serial: string
sha1: string
sha256: string
subject: string
notBefore: Timestamp
notAfter: Timestamp
pem?: string
}Named types: Timestamp.
CredentialId
type CredentialId = stringCredentialMetadata
type CredentialMetadata = {
keyId?: string
issuerId?: string
teamId?: string
appleCertificateId?: string
keyAlias?: string
generated?: boolean
profiles?: CredentialProfile[]
certificate?: CredentialCertificate
}Named types: CredentialCertificate, CredentialProfile.
CredentialProfile
type CredentialProfile = { bundleId: string; uuid: string; name: string; type: string; expiresAt: Timestamp }Named types: Timestamp.
CredentialProjectsIn
type CredentialProjectsIn = 'all' | ProjectId[]Named types: ProjectId.
Decimal
type Decimal = stringDeviceSpec
type DeviceSpec = {
platform: PlatformId
deviceType?: string // 1–128 chars
os?: string // 1–32 chars
arch?: Arch
variant?: string // 1–64 chars
locale?: string // ≤ 35 chars; /^[A-Za-z]{2,8}(-[A-Za-z0-9]{1,8})*$/
timeZone?: string // 1–64 chars
orientation?: Orientation
appearance?: Appearance
labels?: Record<string, string>
}Named types: Appearance, Arch, Orientation, PlatformId.
DisplayName
type DisplayName = stringEmail
type Email = stringErrorBody
type ErrorBody = {
code: ErrorCodeOut
message: string
data: JsonObject
retryable: boolean
requestId: string
}Named types: ErrorCodeOut, JsonObject.
ErrorCodeOut
type ErrorCodeOut = 'VALIDATION' | 'CONTRACT_UNSUPPORTED' | 'UNAUTHENTICATED' | 'FORBIDDEN' | 'NOT_FOUND' | 'CONFLICT' | 'TIMEOUT' | 'RATE_LIMITED' | 'INTERNAL' | 'CAPABILITY_UNSUPPORTED' | 'CAPACITY_UNAVAILABLE' | 'HOST_LOST' | 'SESSION_NOT_READY' | 'SESSION_ENDED' | 'SESSION_BUSY' | 'DEVICE_SPEC_INVALID' | 'DEVICE_BOOT_FAILED' | 'DEVICE_LOST' | 'DEVICE_DRIVER_FAILED' | 'DEVICE_MEDIA_FAILED' | 'DEVICE_INPUT_UNAVAILABLE' | 'APP_NOT_INSTALLED' | 'APP_NOT_RUNNING' | 'APP_INSTALL_FAILED' | 'APP_LAUNCH_FAILED' | 'APP_CRASHED' | 'LOCATOR_NOT_FOUND' | 'LOCATOR_NOT_ACTIONABLE' | 'LOCATOR_STRICT_VIOLATION' | 'LOCATOR_REF_STALE' | 'SECRET_UNAVAILABLE' | 'JS_RUNTIME_UNAVAILABLE' | 'QUOTA_EXCEEDED' | 'ORG_SUSPENDED' | 'PROJECT_SUSPENDED' | 'SERVICE_SUSPENDED' | 'PROJECT_REQUIRED' | 'PLACEMENT_MISMATCH' | 'ENVIRONMENT_HOST_UNSUPPORTED' | 'ENVIRONMENT_XCODE_MISSING' | 'ENVIRONMENT_XCODE_SETUP_INCOMPLETE' | 'ENVIRONMENT_IOS_RUNTIME_MISSING' | 'ENVIRONMENT_ANDROID_SDK_MISSING' | 'ENVIRONMENT_ANDROID_IMAGE_MISSING' | 'ENVIRONMENT_ADB_UNAVAILABLE' | 'ENVIRONMENT_DRIVER_NOT_INSTALLED' | 'ENVIRONMENT_TOOL_MISSING' | 'ENVIRONMENT_UNVERIFIED' | 'ENVIRONMENT_DEVICE_HUB_ACTIVE' | 'ENVIRONMENT_GUI_SESSION_MISSING' | 'ENVIRONMENT_PORTS_UNAVAILABLE' | 'ENVIRONMENT_RESERVED_RESOURCE' | 'ENVIRONMENT_DISK_LOW' | 'ENVIRONMENT_PLATFORM_DISABLED' | …ExternalRef
type ExternalRef = stringGitRef
type GitRef = stringGrantId
type GrantId = stringInvitation
type Invitation = {
id: InvitationId
orgId: OrgId
email: string
role: MemberRoleOut
status: 'pending' | 'accepted' | 'revoked' | 'expired' | …
invitedBy: UserId
createdAt: Timestamp
expiresAt: Timestamp
}Named types: InvitationId, MemberRoleOut, OrgId, Timestamp, UserId.
InvitationId
type InvitationId = stringInvitationStatus
type InvitationStatus = 'pending' | 'accepted' | 'revoked' | 'expired'IssuerCondition
type IssuerCondition = { claim: ClaimName; op: 'eq' | 'glob' | 'in'; value: string | string[] }Named types: ClaimName.
IssuerId
type IssuerId = stringJsonObject
type JsonObject = Record<string, unknown>Member
type Member = { userId: UserId; email: string; name: string; role: MemberRoleOut; joinedAt: Timestamp }Named types: MemberRoleOut, Timestamp, UserId.
MemberRole
type MemberRole = 'owner' | 'admin' | 'member'MemberRoleOut
type MemberRoleOut = 'owner' | 'admin' | 'member' | …Month
type Month = stringOidcConnection
type OidcConnection = {
id: ConnectionId
ownerKind: 'org' | 'deployment' | …
orgId?: OrgId
mode: 'linked' | 'claim' | …
name: string
issuer: string
clientId: string
scopes: string[]
allowedAlgs: ('EdDSA' | 'ES256' | 'RS256' | …)[]
verifiedDomains: string[]
status: 'active' | 'disabled' | …
signInPath: string
createdAt: Timestamp
updatedAt: Timestamp
}Named types: ConnectionId, OrgId, Timestamp.
Org
type Org = {
id: OrgId
name: string
slug: string
status: 'active' | 'suspended' | …
placementScope: 'org' | 'project' | …
createdAt: Timestamp
role?: MemberRoleOut
}Named types: MemberRoleOut, OrgId, Timestamp.
OrgId
type OrgId = stringOrientation
type Orientation = 'portrait' | 'portraitUpsideDown' | 'landscapeLeft' | 'landscapeRight'PageCursor
type PageCursor = stringPageLimit
type PageLimit = integerPassword
type Password = stringPlannedStep
type PlannedStep = {
id: StepId
version: integer // 1–1000
inputs: Record<string, unknown>
}Named types: StepId.
PlatformId
type PlatformId = stringPresetId
type PresetId = stringPresetOptions
type PresetOptions = Record<string, string | number | boolean>Project
type Project = {
id: ProjectId
orgId: OrgId
slug: string
name: string
externalRef?: string
archivedAt?: Timestamp
createdAt: Timestamp
updatedAt: Timestamp
}Named types: OrgId, ProjectId, Timestamp.
ProjectId
type ProjectId = stringQuotaClass
type QuotaClass = stringQuotaDimension
type QuotaDimension = 'placement_units' | 'devices' | 'queued_sessions' | 'builds' | 'test_shards' | 'projects' | 'storage_bytes' | 'device_seconds' | 'build_seconds' | 'test_run_seconds'QuotaLine
type QuotaLine = {
scope: 'org' | 'project' | …
projectId?: ProjectId
kind: 'concurrency' | 'period' | …
dimension: string
class: string
limit?: integer
source: 'org' | 'plan' | 'project' | …
inUse?: integer
used?: Decimal
}Named types: Decimal, ProjectId.
ReceivedInvitation
type ReceivedInvitation = {
id: InvitationId
orgId: OrgId
orgName: string
role: MemberRoleOut
expiresAt: Timestamp
}Named types: InvitationId, MemberRoleOut, OrgId, Timestamp.
RefPattern
type RefPattern = stringRelativePath
type RelativePath = stringRunId
type RunId = stringRunStats
type RunStats = {
expected: integer
unexpected: integer
flaky: integer
skipped: integer
errored: integer
}RunStatusOut
type RunStatusOut = 'queued' | 'running' | 'passed' | 'failed' | 'errored' | 'timedOut' | 'canceled' | …RunSuiteSource
type RunSuiteSource =
| {
dir: string // 2–4096 chars
}
| {
bundle: {
bytes: integer // 1–67108864
sha256: string // /^[0-9a-f]{64}$/
}
}Seq
type Seq = integerSessionId
type SessionId = stringShardId
type ShardId = stringSignedRequestOut
type SignedRequestOut = {
method: 'GET' | 'PUT' | …
url: string
headers: Record<string, string>
expiresAt: Timestamp
}Named types: Timestamp.
SigningCredential
type SigningCredential = {
credentialId: CredentialId
orgId: OrgId
kind: 'ascApiKey' | 'androidUploadKeystore' | 'iosDistributionIdentity' | …
name: string
status: 'active' | 'deleted' | …
projects: 'all' | ProjectId[]
allowTarballs: boolean
parentId?: CredentialId
version: integer
createdBy: string
createdAt: Timestamp
updatedAt: Timestamp
rotatedAt?: Timestamp
lastUsedAt?: Timestamp
deletedAt?: Timestamp
sourceRefs: SourceRuleOut[]
metadata: CredentialMetadata
}Named types: CredentialId, CredentialMetadata, OrgId, ProjectId, SourceRuleOut, Timestamp.
Slug
type Slug = stringSourceRuleIn
type SourceRuleIn = {
repository: string // 1–2048 chars
refs: RefPattern[] // 1–16 items
}Named types: RefPattern.
SourceRuleOut
type SourceRuleOut = { repository: string; refs: string[] }StepId
type StepId = stringStepOverride
type StepOverride = {
op: 'insertBefore' | 'insertAfter' | 'replace' | 'remove' | …
at: StepId
step?: PlannedStep
}Named types: PlannedStep, StepId.
SubjectTemplate
type SubjectTemplate = stringTimeoutMs
type TimeoutMs = integerTimestamp
type Timestamp = stringTrustedIssuer
type TrustedIssuer = {
id: IssuerId
orgId: OrgId
name: string
issuer: string
jwksUri: string
audience: string
acceptedTyp: string[]
allowedAlgs: ('EdDSA' | 'ES256' | 'RS256' | …)[]
clientBinding: { claim: string | null; allowed: string[] }
conditions: { claim: string; op: 'eq' | 'glob' | 'in' | …; value: string | string[] }[]
scopeSource: 'claim' | 'fixed' | …
fixedScopes: CloudScopeOut[]
scopeCeiling: CloudScopeOut[]
subjectTemplate: string
subtenantClaim?: string
projectMapping: 'auto-create' | 'require-existing' | 'fixed' | …
projectId?: ProjectId
maxProjects?: integer
maxTokenLifetimeSeconds: integer
status: 'active' | 'suspended' | …
preset?: string
jwksFetchedAt?: Timestamp
jwksError?: string
createdAt: Timestamp
updatedAt: Timestamp
}Named types: CloudScopeOut, IssuerId, OrgId, ProjectId, Timestamp.
UploadId
type UploadId = stringUser
type User = {
id: UserId
email: string
name: string
emailVerified: boolean
image?: string
createdAt: Timestamp
}Named types: Timestamp, UserId.
UserId
type UserId = string