Reference
credentials
Store signing credentials: an App Store Connect key, an Android upload keystore, held by the credentials service; reads return metadata only, and every change is trust-class. Index · shared schemas · errors.
| Procedure | Summary | REST | MCP tool | Stability |
|---|---|---|---|---|
credentials.list | List an org's signing credentials, newest first: metadata only (kind, allow-lists, team and key ids, certificate serial, digests and expiry, profile UUIDs) | GET | — | experimental |
credentials.get | A signing credential: metadata only | GET | — | experimental |
credentials.uploadAscKey | Store an App Store Connect API key (its .p8 PEM, key id and issuer id) for the credentials service to provision distribution certificates and profiles with; it never leaves the service. Trust class. | POST | — | experimental |
credentials.createAndroidKeystore | Generate an Android upload keystore in the credentials service (PKCS12, RSA 4096, 10,000 days); its key never leaves the service. Trust class. | POST | — | experimental |
credentials.uploadAndroidKeystore | Store an Android upload keystore you already have (PKCS12 or JKS, at most 64 KiB, with its passwords and alias); the service opens it in an isolated child, keeps it as PKCS12 and never returns it. Trust class. | POST | — | experimental |
credentials.rotate | Replace a credential's secret, keeping its id and allow-lists: a new App Store Connect key, or a new (generated or uploaded) Android upload keystore. The old secret is removed from the database; a database backup taken before still holds it, sealed, until the backup ages out. Trust class. | POST | — | experimental |
credentials.updateAllowList | Set which projects and source refs may sign with a credential (re-encrypted, since both lists and the tarball opt-in are bound into the secret's additional data). Trust class. | POST | — | experimental |
credentials.delete | Delete a credential: its secret is removed from the database (a database backup taken before still holds it, sealed, until the backup ages out) and its metadata kept as deleted (deleted: false when it already was). Builds that name it fail to sign. An iOS identity's Apple certificate is not revoked. Trust class. | POST | — | experimental |
credentials.list
List an org's signing credentials, newest first: metadata only (kind, allow-lists, team and key ids, certificate serial, digests and expiry, profile UUIDs)
| REST | GET /v1/credentials/list (input as query parameters) |
| RPC | /rpc/v2/credentials/list |
| MCP | not a tool (a cloud platform procedure; the cloud MCP surface is the curated device tools); hints: read-only, idempotent |
| Auth | signing:use |
| Tenancy | org |
| Troupe Cloud | answered by the control plane |
| Stability | experimental, since 1.0 |
Input:
{ orgId: OrgId; includeDeleted?: boolean }Output:
{ credentials: SigningCredential[] }Named types: OrgId, SigningCredential.
credentials.get
A signing credential: metadata only
| REST | GET /v1/credentials/get (input as query parameters) |
| RPC | /rpc/v2/credentials/get |
| MCP | not a tool (a cloud platform procedure; the cloud MCP surface is the curated device tools); hints: read-only, idempotent |
| Auth | signing:use |
| Tenancy | org |
| Troupe Cloud | answered by the control plane |
| Stability | experimental, since 1.0 |
Input:
{ orgId: OrgId; credentialId: CredentialId }Output:
{ credential: SigningCredential }Named types: CredentialId, OrgId, SigningCredential.
credentials.uploadAscKey
Store an App Store Connect API key (its .p8 PEM, key id and issuer id) for the credentials service to provision distribution certificates and profiles with; it never leaves the service. Trust class.
| REST | POST /v1/credentials/upload-asc-key (input as a JSON body) |
| RPC | /rpc/v2/credentials/uploadAscKey |
| MCP | not a tool (a cloud platform procedure; the cloud MCP surface is the curated device tools); hints: none |
| Auth | org:manage; trust-class: locally only the runtime owner token; in the cloud only an interactive user session re-authenticated within 15 minutes; never an API key or an MCP token |
| Tenancy | org |
| Troupe Cloud | answered by the control plane |
| Stability | experimental, since 1.0 |
Input:
{
orgId: OrgId
name: DisplayName
keyId: string // /^[A-Z0-9]{10}$/
issuerId: string // /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/
privateKeyPem: string // 1–4096 chars
projects: CredentialProjectsIn
sourceRefs: SourceRuleIn[] // ≤ 16 items
allowTarballs?: boolean
}Output:
{ credential: SigningCredential }Errors: U, NOT_FOUND, ORG_SUSPENDED, CONFLICT, CAPACITY_UNAVAILABLE.
Named types: CredentialProjectsIn, DisplayName, OrgId, SigningCredential, SourceRuleIn.
credentials.createAndroidKeystore
Generate an Android upload keystore in the credentials service (PKCS12, RSA 4096, 10,000 days); its key never leaves the service. Trust class.
| REST | POST /v1/credentials/create-android-keystore (input as a JSON body) |
| RPC | /rpc/v2/credentials/createAndroidKeystore |
| MCP | not a tool (a cloud platform procedure; the cloud MCP surface is the curated device tools); hints: none |
| Auth | org:manage; trust-class: locally only the runtime owner token; in the cloud only an interactive user session re-authenticated within 15 minutes; never an API key or an MCP token |
| Tenancy | org |
| Troupe Cloud | answered by the control plane |
| Stability | experimental, since 1.0 |
Input:
{
orgId: OrgId
name: DisplayName
commonName?: DisplayName
projects: CredentialProjectsIn
sourceRefs: SourceRuleIn[] // ≤ 16 items
allowTarballs?: boolean
}Output:
{ credential: SigningCredential }Errors: U, NOT_FOUND, ORG_SUSPENDED, CONFLICT, CAPACITY_UNAVAILABLE.
Named types: CredentialProjectsIn, DisplayName, OrgId, SigningCredential, SourceRuleIn.
credentials.uploadAndroidKeystore
Store an Android upload keystore you already have (PKCS12 or JKS, at most 64 KiB, with its passwords and alias); the service opens it in an isolated child, keeps it as PKCS12 and never returns it. Trust class.
| REST | POST /v1/credentials/upload-android-keystore (input as a JSON body) |
| RPC | /rpc/v2/credentials/uploadAndroidKeystore |
| MCP | not a tool (a cloud platform procedure; the cloud MCP surface is the curated device tools); hints: none |
| Auth | org:manage; trust-class: locally only the runtime owner token; in the cloud only an interactive user session re-authenticated within 15 minutes; never an API key or an MCP token |
| Tenancy | org |
| Troupe Cloud | answered by the control plane |
| Stability | experimental, since 1.0 |
Input:
{
orgId: OrgId
name: DisplayName
keystoreBase64: string // 4–87386 chars; /^[A-Za-z0-9+/]+={0,2}$/
storePassword: string // 1–128 chars
keyAlias: string // /^[A-Za-z0-9._-]{1,64}$/
keyPassword?: string // 1–128 chars
projects: CredentialProjectsIn
sourceRefs: SourceRuleIn[] // ≤ 16 items
allowTarballs?: boolean
}Output:
{ credential: SigningCredential }Errors: U, NOT_FOUND, ORG_SUSPENDED, CONFLICT, CAPACITY_UNAVAILABLE.
Named types: CredentialProjectsIn, DisplayName, OrgId, SigningCredential, SourceRuleIn.
credentials.rotate
Replace a credential's secret, keeping its id and allow-lists: a new App Store Connect key, or a new (generated or uploaded) Android upload keystore. The old secret is removed from the database; a database backup taken before still holds it, sealed, until the backup ages out. Trust class.
| REST | POST /v1/credentials/rotate (input as a JSON body) |
| RPC | /rpc/v2/credentials/rotate |
| MCP | not a tool (a cloud platform procedure; the cloud MCP surface is the curated device tools); hints: none |
| Auth | org:manage; trust-class: locally only the runtime owner token; in the cloud only an interactive user session re-authenticated within 15 minutes; never an API key or an MCP token |
| Tenancy | org |
| Troupe Cloud | answered by the control plane |
| Stability | experimental, since 1.0 |
Input:
{
orgId: OrgId
credentialId: CredentialId
ascKey?: {
keyId: string // /^[A-Z0-9]{10}$/
issuerId: string // /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/
privateKeyPem: string // 1–4096 chars
}
androidKeystore?: {
keystoreBase64: string // 4–87386 chars; /^[A-Za-z0-9+/]+={0,2}$/
storePassword: string // 1–128 chars
keyAlias: string // /^[A-Za-z0-9._-]{1,64}$/
keyPassword?: string // 1–128 chars
}
}Output:
{ credential: SigningCredential }Errors: U, NOT_FOUND, ORG_SUSPENDED, CONFLICT, CAPACITY_UNAVAILABLE.
Named types: CredentialId, OrgId, SigningCredential.
credentials.updateAllowList
Set which projects and source refs may sign with a credential (re-encrypted, since both lists and the tarball opt-in are bound into the secret's additional data). Trust class.
| REST | POST /v1/credentials/update-allow-list (input as a JSON body) |
| RPC | /rpc/v2/credentials/updateAllowList |
| MCP | not a tool (a cloud platform procedure; the cloud MCP surface is the curated device tools); hints: none |
| Auth | org:manage; trust-class: locally only the runtime owner token; in the cloud only an interactive user session re-authenticated within 15 minutes; never an API key or an MCP token |
| Tenancy | org |
| Troupe Cloud | answered by the control plane |
| Stability | experimental, since 1.0 |
Input:
{
orgId: OrgId
credentialId: CredentialId
projects: CredentialProjectsIn
sourceRefs: SourceRuleIn[] // ≤ 16 items
allowTarballs?: boolean
}Output:
{ credential: SigningCredential }Errors: U, NOT_FOUND, ORG_SUSPENDED, CONFLICT, CAPACITY_UNAVAILABLE.
Named types: CredentialId, CredentialProjectsIn, OrgId, SigningCredential, SourceRuleIn.
credentials.delete
Delete a credential: its secret is removed from the database (a database backup taken before still holds it, sealed, until the backup ages out) and its metadata kept as deleted (deleted: false when it already was). Builds that name it fail to sign. An iOS identity's Apple certificate is not revoked. Trust class.
| REST | POST /v1/credentials/delete (input as a JSON body) |
| RPC | /rpc/v2/credentials/delete |
| MCP | not a tool (a cloud platform procedure; the cloud MCP surface is the curated device tools); hints: idempotent, destructive |
| Auth | org:manage; trust-class: locally only the runtime owner token; in the cloud only an interactive user session re-authenticated within 15 minutes; never an API key or an MCP token |
| Tenancy | org |
| Troupe Cloud | answered by the control plane |
| Stability | experimental, since 1.0 |
Input:
{ orgId: OrgId; credentialId: CredentialId }Output:
{ deleted: boolean }Errors: U, NOT_FOUND, CONFLICT, CAPACITY_UNAVAILABLE.
Named types: CredentialId, OrgId.