Docs
BlogHomeStart building

Mobile Apps

Turn your web app into store-ready Android and iOS apps.


A project's mobile app is a native shell that opens the published site, so publish first. Ask the agent for a mobile app ("make it work as a mobile app") and it prepares the project; then build here. Mobile apps need a paid plan.

  • Builds run on Totalum's build servers one at a time for everyone: a build may wait in a queue (queuePosition) and can be cancelled while it waits. Each project builds at most once per hour.
  • A build is metered by its build time, in credits; a reservation of 13.3 credits is held when it starts (creditsCharged) and settled on the real build time when it ends (given back when it fails). Queue time is never charged.
  • Faster builds on your own Codemagic account: set your Codemagic API token (Set Signing Key with slot = codemagic; in Codemagic: Account settings → API token). Builds then run on your Codemagic account: they start at once (no queue, no hourly limit), Totalum charges no build credits (creditsCharged: 0) and Codemagic bills its build minutes to you. Store uploads to TestFlight still run on Totalum's build servers.
  • Signed builds (aab, apk with a key, ipa) need the signing key (Set Signing Key); unsigned debug builds do not.
  • With "send to stores on publish" (Set Mobile Settings) every successful publish builds and uploads the signed apps to the Google Play internal track and TestFlight.

Signing, stores, settings and store uploads are the account owner's.

#Create Mobile Build

POST/api/v1/vcaas/projects/:projectId/mobile/buildsapi-keyMetered (build time)

Start a build. Answers 202 with the build queued.

Path parameters

ParameterTypeDescription
projectIdstringThe project id

Body parameters

FieldTypeRequiredDescription
platformstringYes"android" or "ios"
artifactstringNoAndroid: "debug-apk", "apk" (default) or "aab" (for Google Play). iOS: "simulator-app" (default, no Apple account needed) or "ipa" (signed, for TestFlight)
modestringNo"remote_shell" (Android default: the app loads the site) or "hybrid" (iOS default: a bundled shell that loads the site)
signedbooleanNoAndroid: sign the apk (default: signed when a key is set)

Response fields

FieldTypeDescription
data.buildIdstringThe build
data.statusstring"queued"
data.creditsReservednumberCredits held for the build
data.creditsChargednumberCredits taken now (the reservation)

Example request

curl -X POST \
  -H "api-key: tlm_sk_your_key" \
  -H "Content-Type: application/json" \
  -d '{"platform":"android","artifact":"aab"}' \
  https://builder-api.totalum.app/api/v1/vcaas/projects/barber-bookings/mobile/builds
Success · 202 Accepted
json
{ "errors": null, "data": { "buildId": "mb_01k6y4", "status": "queued", "creditsReserved": 13.3, "creditsCharged": 13.3 } }

Error codes

CodeHTTPMeaning
VALIDATION_ERROR400The artifact does not match the platform
PLAN_REQUIRED403Mobile builds need a paid plan
OWNER_ONLY403A signed build is the owner's
FEATURE_DISABLED403That build type is not available yet
MOBILE_REQUIRES_PUBLISHED_PROJECT409Publish first: the app opens the published site
SIGNING_NOT_CONFIGURED409A signed build without a signing key
MOBILE_BUILD_RUNNING409A build is already running
PROCESS_IN_PROGRESS409A signed Android build while a prompt runs
INSUFFICIENT_CREDITS402Not enough credits
MOBILE_BUILD_RATE_LIMITED429One build per hour; errorDetails.retryAt says when
End of Create Mobile BuildNext endpointGETList Mobile Builds

#List Mobile Builds

GET/api/v1/vcaas/projects/:projectId/mobile/buildsapi-keyFree

The project's builds, newest first.

Path parameters

ParameterTypeDescription
projectIdstringThe project id

Response fields

FieldTypeDescription
data.buildsobject[]Builds, with the fields of Get Mobile Build

Example request

curl -H "api-key: tlm_sk_your_key" \
  https://builder-api.totalum.app/api/v1/vcaas/projects/barber-bookings/mobile/builds
Success · 200 OK
json
{ "errors": null, "data": { "builds": [{ "id": "mb_01k6y4", "platform": "android", "mode": "remote_shell", "status": "success", "startedAt": "2026-10-08T13:00:10.000Z", "finishedAt": "2026-10-08T13:06:40.000Z", "artifact": { "type": "aab", "sizeBytes": 4194304, "expiresAt": "2026-11-07T13:06:40.000Z" }, "signed": true, "versionName": "1.0.3", "versionCode": 3, "trigger": "user", "hasLog": true }] } }
End of List Mobile BuildsNext endpointGETGet Mobile Build

#Get Mobile Build

GET/api/v1/vcaas/projects/:projectId/mobile/builds/:buildIdapi-keyFree

One build. Poll it until status is "success", "failed" or "cancelled".

Path parameters

ParameterTypeDescription
projectIdstringThe project id
buildIdstringThe build id

Response fields

FieldTypeDescription
data.idstringBuild id
data.platformstring"android" or "ios"
data.modestring"remote_shell" or "hybrid"
data.statusstring"queued", "running", "success", "failed" or "cancelled"
data.queuePositionnumber | undefinedPlace in the queue while queued
data.startedAtstring | nullStart
data.finishedAtstring | nullEnd
data.artifactobject | null{ type, sizeBytes, expiresAt } once built
data.signedbooleanSigned build
data.signingFingerprintSha256string | undefinedCertificate fingerprint
data.versionNamestring | undefinedVersion name
data.versionCodenumber | undefinedVersion code
data.triggerstring | undefined"user" or "publish"
data.errorobject | undefined{ code, message, logExcerpt? } of a failed build
data.hasLogboolean | undefinedA full log is available

Example request

curl -H "api-key: tlm_sk_your_key" \
  https://builder-api.totalum.app/api/v1/vcaas/projects/barber-bookings/mobile/builds/mb_01k6y4
Success · 200 OK
json
{ "errors": null, "data": { "id": "mb_01k6y4", "platform": "android", "mode": "remote_shell", "status": "queued", "queuePosition": 2, "startedAt": null, "finishedAt": null, "artifact": null, "signed": true } }

Error codes

CodeHTTPMeaning
MOBILE_BUILD_NOT_FOUND404No such build

#Get Mobile Build Download

GET/api/v1/vcaas/projects/:projectId/mobile/builds/:buildId/downloadapi-keyFree

A 15-minute link to the built file.

Path parameters

ParameterTypeDescription
projectIdstringThe project id
buildIdstringThe build id

Response fields

FieldTypeDescription
data.urlstringDownload URL
data.fileNamestringFile name
data.typestringThe artifact type

Example request

curl -H "api-key: tlm_sk_your_key" \
  https://builder-api.totalum.app/api/v1/vcaas/projects/barber-bookings/mobile/builds/mb_01k6y4/download
Success · 200 OK
json
{ "errors": null, "data": { "url": "https://files.totalum.app/mobile/mb_01k6y4/app-release.aab?sig=…", "fileName": "barber-bookings-1.0.3.aab", "type": "aab" } }

Error codes

CodeHTTPMeaning
MOBILE_BUILD_NOT_READY409The build has no file (yet)
DOWNLOAD_EXPIRED410The file has expired
End of Get Mobile Build DownloadNext endpointGETGet Mobile Build Log

#Get Mobile Build Log

GET/api/v1/vcaas/projects/:projectId/mobile/builds/:buildId/logapi-keyFree

A 15-minute link to the build's full log. Ask the agent to fix a failed build ("the Android build fails"): it reads the log itself.

Path parameters

ParameterTypeDescription
projectIdstringThe project id
buildIdstringThe build id

Response fields

FieldTypeDescription
data.urlstringLog URL
data.fileNamestring"build.log"

Example request

curl -H "api-key: tlm_sk_your_key" \
  https://builder-api.totalum.app/api/v1/vcaas/projects/barber-bookings/mobile/builds/mb_01k6y4/log
Success · 200 OK
json
{ "errors": null, "data": { "url": "https://files.totalum.app/mobile/mb_01k6y4/build.log?sig=…", "fileName": "build.log" } }

Error codes

CodeHTTPMeaning
MOBILE_BUILD_NOT_READY409The build has no log
End of Get Mobile Build LogNext endpointPOSTCancel Mobile Build

#Cancel Mobile Build

POST/api/v1/vcaas/projects/:projectId/mobile/builds/:buildId/cancelapi-keyFree

Cancel a build that is still waiting in the queue (its reservation is given back). A build that has started runs to its end.

Path parameters

ParameterTypeDescription
projectIdstringThe project id
buildIdstringThe build id

Response fields

FieldTypeDescription
dataobjectThe build after cancelling, as in Get Mobile Build

Example request

curl -X POST -H "api-key: tlm_sk_your_key" \
  https://builder-api.totalum.app/api/v1/vcaas/projects/barber-bookings/mobile/builds/mb_01k6y4/cancel
Success · 200 OK
json
{ "errors": null, "data": { "id": "mb_01k6y4", "platform": "android", "mode": "remote_shell", "status": "cancelled", "startedAt": null, "finishedAt": "2026-10-08T13:01:00.000Z", "artifact": null, "signed": true } }

Error codes

CodeHTTPMeaning
MOBILE_BUILD_NOT_CANCELLABLE409The build is no longer waiting in the queue

#Upload Build To Store

POST/api/v1/vcaas/projects/:projectId/mobile/builds/:buildId/store-uploadapi-keyFree (Android) · metered (iOS)

Send a signed build to its store: an aab to the Google Play internal track, an ipa to TestFlight. Promotion to production stays your step in each store's console. At most 10 store uploads a day.

Path parameters

ParameterTypeDescription
projectIdstringThe project id
buildIdstringA signed aab or ipa build

Response fields

FieldTypeDescription
data.uploadIdstringThe upload
data.storestring"google-play" or "app-store"
data.trackstring"internal" or "testflight"
data.statusstring"queued"
data.creditsReservednumberCredits held

Example request

curl -X POST -H "api-key: tlm_sk_your_key" \
  https://builder-api.totalum.app/api/v1/vcaas/projects/barber-bookings/mobile/builds/mb_01k6y4/store-upload
Success · 202 Accepted
json
{ "errors": null, "data": { "uploadId": "su_01k6y5abcdefghjkmnpqrstvwx", "store": "google-play", "track": "internal", "status": "queued", "creditsReserved": 0 } }

Error codes

CodeHTTPMeaning
MOBILE_BUILD_NOT_SIGNED409Only a signed aab or ipa
STORE_NOT_CONFIGURED409Connect the store first
STORE_UPLOAD_RUNNING409An upload is already running
STORE_UPLOAD_LIMIT_REACHED42910 uploads today
End of Upload Build To StoreNext endpointGETList Store Uploads

#List Store Uploads

GET/api/v1/vcaas/projects/:projectId/mobile/store-uploadsapi-keyFree

The project's store uploads.

Path parameters

ParameterTypeDescription
projectIdstringThe project id

Response fields

FieldTypeDescription
data.uploads[].idstringUpload id
data.uploads[].buildIdstringThe build
data.uploads[].storestring"google-play" or "app-store"
data.uploads[].trackstring"internal" or "testflight"
data.uploads[].statusstring"queued", "uploading", "processing", "success", "failed" or "manual_required" (Google Play's first upload of an app must be made by hand)
data.uploads[].versionNamestringVersion name
data.uploads[].versionCodenumberVersion code
data.uploads[].consoleUrlstring | nullLink to the store console
data.uploads[].errorobject | undefined{ code, message }
data.uploads[].createdAtstringISO 8601
data.uploads[].finishedAtstring | nullISO 8601

Example request

curl -H "api-key: tlm_sk_your_key" \
  https://builder-api.totalum.app/api/v1/vcaas/projects/barber-bookings/mobile/store-uploads
Success · 200 OK
json
{ "errors": null, "data": { "uploads": [{ "id": "su_01k6y5abcdefghjkmnpqrstvwx", "buildId": "mb_01k6y4", "store": "google-play", "track": "internal", "status": "success", "versionName": "1.0.3", "versionCode": 3, "consoleUrl": "https://play.google.com/console/…", "createdAt": "2026-10-08T13:07:00.000Z", "finishedAt": "2026-10-08T13:09:00.000Z" }] } }
End of List Store UploadsNext endpointGETGet Store Upload

#Get Store Upload

GET/api/v1/vcaas/projects/:projectId/mobile/store-uploads/:uploadIdapi-keyFree

One store upload, with the fields of List Store Uploads.

Path parameters

ParameterTypeDescription
projectIdstringThe project id
uploadIdstringThe upload id

Response fields

FieldTypeDescription
dataobjectThe upload

Example request

curl -H "api-key: tlm_sk_your_key" \
  https://builder-api.totalum.app/api/v1/vcaas/projects/barber-bookings/mobile/store-uploads/su_01k6y5abcdefghjkmnpqrstvwx
Success · 200 OK
json
{ "errors": null, "data": { "id": "su_01k6y5abcdefghjkmnpqrstvwx", "buildId": "mb_01k6y4", "store": "google-play", "track": "internal", "status": "processing", "versionName": "1.0.3", "versionCode": 3, "consoleUrl": null, "createdAt": "2026-10-08T13:07:00.000Z", "finishedAt": null } }

#Get Mobile Settings

GET/api/v1/vcaas/projects/:projectId/mobile/settingsapi-keyFree

The app name and whether publishing also sends the apps to the stores.

Path parameters

ParameterTypeDescription
projectIdstringThe project id

Response fields

FieldTypeDescription
data.sendToStoresOnPublishbooleanEvery successful publish builds and uploads the signed apps
data.appNamestring | nullThe name under the icon (≤ 30 characters); null = the store listing title, else the site's name

Example request

curl -H "api-key: tlm_sk_your_key" \
  https://builder-api.totalum.app/api/v1/vcaas/projects/barber-bookings/mobile/settings
Success · 200 OK
json
{ "errors": null, "data": { "sendToStoresOnPublish": false, "appName": "Barber Book" } }
End of Get Mobile SettingsNext endpointPUTSet Mobile Settings

#Set Mobile Settings

PUT/api/v1/vcaas/projects/:projectId/mobile/settingsapi-keyFree

Change either setting. Turning on sendToStoresOnPublish needs a connected store.

Path parameters

ParameterTypeDescription
projectIdstringThe project id

Body parameters

FieldTypeRequiredDescription
sendToStoresOnPublishbooleanNo¹Build and upload on every publish
appNamestring | nullNo¹1–30 characters; null = default

¹ At least one.

Response fields

FieldTypeDescription
data.sendToStoresOnPublishbooleanAfter the change
data.appNamestring | nullAfter the change

Example request

curl -X PUT \
  -H "api-key: tlm_sk_your_key" \
  -H "Content-Type: application/json" \
  -d '{"appName":"Barber Book"}' \
  https://builder-api.totalum.app/api/v1/vcaas/projects/barber-bookings/mobile/settings
Success · 200 OK
json
{ "errors": null, "data": { "sendToStoresOnPublish": false, "appName": "Barber Book" } }

Error codes

CodeHTTPMeaning
STORE_NOT_CONFIGURED409Connect Google Play or the App Store first
End of Set Mobile SettingsNext endpointGETGet Signing Key

#Get Signing Key

GET/api/v1/vcaas/projects/:projectId/mobile/signing/:slotapi-keyFree

The signing key of one platform (metadata only, never a secret). slot is android, ios, or codemagic (your own Codemagic API token: configured, tokenHint = its last 4 characters, addedAt).

Path parameters

ParameterTypeDescription
projectIdstringThe project id
slotstring"android", "ios" or "codemagic"

Response fields

FieldTypeDescription
data.configuredbooleanA key is set
data.sourcestring | nullAndroid: "uploaded" or "generated"
data.keyAliasstring | nullAndroid key alias
data.fingerprintSha256string | nullAndroid certificate fingerprint
data.validUntilstring | nullAndroid certificate expiry
data.keystoreDownloadAvailablebooleanAndroid: a generated keystore can still be downloaded
data.keyId, data.issuerId, data.teamId, data.bundleId, data.validatedAtstring | nulliOS: the App Store Connect key
data.createdAt, data.lastUsedAtstring | nullDates

Example request

curl -H "api-key: tlm_sk_your_key" \
  https://builder-api.totalum.app/api/v1/vcaas/projects/barber-bookings/mobile/signing/android
Success · 200 OK
json
{ "errors": null, "data": { "configured": true, "source": "generated", "keyAlias": "upload", "fingerprintSha256": "AB:CD:…", "validUntil": "2051-10-08T00:00:00.000Z", "keystoreDownloadAvailable": false, "createdAt": "2026-10-08T12:50:00.000Z", "lastUsedAt": "2026-10-08T13:00:10.000Z" } }

#Set Signing Key

PUT/api/v1/vcaas/projects/:projectId/mobile/signing/:slotapi-keyFree

Set the signing key. Android (slot = android): multipart/form-data with the keystore file (keystore, a .jks/.keystore up to 64 KB) and its passwords — or generate one with Android Signing Action. iOS (slot = ios): JSON with the App Store Connect API key, checked against Apple. Codemagic (slot = codemagic): JSON { "apiToken": "…" }, checked against Codemagic; Totalum adds a totalum-mobile-builds app to that Codemagic account and runs the project's next builds there (refused 409 MOBILE_BUILD_RUNNING while a build runs).

Path parameters

ParameterTypeDescription
projectIdstringThe project id
slotstring"android", "ios" or "codemagic"

Body parameters

FieldTypeRequiredDescription
keystorefileAndroidThe keystore file
keyAliasstringAndroidKey alias
storePasswordstringAndroid6–200 characters
keyPasswordstringAndroid6–200 characters
apiKeyP8stringiOSThe .p8 key, PEM text
keyIdstringiOS10-character key id
issuerIdstringiOSIssuer UUID
bundleIdstringiOSThe app's bundle id (com.example.app)
apiTokenstringCodemagicYour Codemagic API token (Account settings → API token)

Response fields

FieldTypeDescription
dataobjectThe key, as in Get Signing Key

Example request

curl -X PUT \
  -H "api-key: tlm_sk_your_key" \
  -F "keystore=@./upload-keystore.jks" -F "keyAlias=upload" \
  -F "storePassword=your-store-password" -F "keyPassword=your-key-password" \
  https://builder-api.totalum.app/api/v1/vcaas/projects/barber-bookings/mobile/signing/android
Success · 200 OK
json
{ "errors": null, "data": { "configured": true, "source": "uploaded", "keyAlias": "upload", "fingerprintSha256": "AB:CD:…", "validUntil": "2051-10-08T00:00:00.000Z", "keystoreDownloadAvailable": false, "createdAt": "2026-10-08T12:50:00.000Z", "lastUsedAt": null } }

Error codes

CodeHTTPMeaning
SIGNING_INVALID_KEYSTORE400The keystore was refused (errorDetails.reason: parse, password, alias, expired, weak_key)
SIGNING_ALREADY_CONFIGURED409Delete the current keystore first
VALIDATION_ERROR400Codemagic refused the API token
PLAN_REQUIRED403Needs a paid plan
OWNER_ONLY403Owner only

#Android Signing Action

POST/api/v1/vcaas/projects/:projectId/mobile/signing/android/:actionapi-keyFree

action = generate: create an Android upload key (RSA 4096, 25 years, alias upload) and get a one-time, 15-minute token to download it. action = keystore-download: exchange that token for the keystore file and its passwords — keep them safe; Google Play needs the same key for every update.

Path parameters

ParameterTypeDescription
projectIdstringThe project id
actionstring"generate" or "keystore-download"

Body parameters

FieldTypeRequiredDescription
commonNamestringNogenerate: certificate name
organizationstringNogenerate: organisation
countryCodestringNogenerate: two-letter country
tokenstringNokeystore-download: the token from generate

Response fields

FieldTypeDescription
data.keystoreDownloadobjectgenerate: { token, expiresAt } plus the key's fields
data.urlstringkeystore-download: a single-use URL (5 minutes)
data.fileNamestring"upload-keystore.jks"
data.keyAlias, data.storePassword, data.keyPasswordstringkeystore-download: shown once

Example request

curl -X POST \
  -H "api-key: tlm_sk_your_key" \
  -H "Content-Type: application/json" \
  -d '{"organization":"Barber Shop SL","countryCode":"ES"}' \
  https://builder-api.totalum.app/api/v1/vcaas/projects/barber-bookings/mobile/signing/android/generate
Success · 200 OK
json
{ "errors": null, "data": { "configured": true, "source": "generated", "keyAlias": "upload", "fingerprintSha256": "AB:CD:…", "validUntil": "2051-10-08T00:00:00.000Z", "keystoreDownloadAvailable": true, "createdAt": "2026-10-08T12:50:00.000Z", "lastUsedAt": null, "keystoreDownload": { "token": "kd_9f2c…", "expiresAt": "2026-10-08T13:05:00.000Z" } } }

Error codes

CodeHTTPMeaning
SIGNING_ALREADY_CONFIGURED409A key exists; delete it first
KEYSTORE_NOT_DOWNLOADABLE409An uploaded keystore is never downloadable
KEYSTORE_DOWNLOAD_EXPIRED410The token was used or expired
End of Android Signing ActionNext endpointDELETEDelete Signing Key

#Delete Signing Key

DELETE/api/v1/vcaas/projects/:projectId/mobile/signing/:slotapi-keyFree

Remove a platform's signing key (or, with slot = codemagic, your Codemagic API token: builds go back to Totalum's build servers). Answers 204 with no body.

Path parameters

ParameterTypeDescription
projectIdstringThe project id
slotstring"android", "ios" or "codemagic"

Response fields

FieldTypeDescription
(none)204 No Content

Example request

curl -X DELETE -H "api-key: tlm_sk_your_key" \
  https://builder-api.totalum.app/api/v1/vcaas/projects/barber-bookings/mobile/signing/android

Error codes

CodeHTTPMeaning
MOBILE_BUILD_RUNNING409A signed build is using the key

#List Store Connections

GET/api/v1/vcaas/projects/:projectId/mobile/storesapi-keyFree

The connected store accounts (metadata only).

Path parameters

ParameterTypeDescription
projectIdstringThe project id

Response fields

FieldTypeDescription
data.googlePlayobject | null{ clientEmail, packageName, packageFound, validatedAt }
data.appStoreobject | null{ appAppleId, bundleId, validatedAt }

Example request

curl -H "api-key: tlm_sk_your_key" \
  https://builder-api.totalum.app/api/v1/vcaas/projects/barber-bookings/mobile/stores
Success · 200 OK
json
{ "errors": null, "data": { "googlePlay": { "clientEmail": "uploader@my-play.iam.gserviceaccount.com", "packageName": "com.barbershop.book", "packageFound": true, "validatedAt": "2026-10-08T12:55:00.000Z" }, "appStore": null } }
End of List Store ConnectionsNext endpointGETGet Store Connection

#Get Store Connection

GET/api/v1/vcaas/projects/:projectId/mobile/stores/:storeapi-keyFree

One store's connection (metadata only). The answer has only that store's field: googlePlay for google-play, appStore for app-store; null when it is not connected.

Path parameters

ParameterTypeDescription
projectIdstringThe project id
storestring"google-play" or "app-store"

Response fields

FieldTypeDescription
data.googlePlayobject | nullgoogle-play only: { clientEmail, packageName, packageFound, validatedAt }
data.appStoreobject | nullapp-store only: { appAppleId, bundleId, validatedAt }

Example request

curl -H "api-key: tlm_sk_your_key" \
  https://builder-api.totalum.app/api/v1/vcaas/projects/barber-bookings/mobile/stores/app-store
Success · 200 OK
json
{ "errors": null, "data": { "appStore": null } }
End of Get Store ConnectionNext endpointPUTConnect Store

#Connect Store

PUT/api/v1/vcaas/projects/:projectId/mobile/stores/:storeapi-keyFree

Connect a store account. Google Play: a Play Console service-account key (the JSON Google downloads) with release rights on the app, and the package name; a package Google does not know yet is stored with packageFound: false and its first bundle must be uploaded by hand. App Store: uses the iOS signing key; the app is found by its bundle id (or give appAppleId). The answer has only the store you connected.

Path parameters

ParameterTypeDescription
projectIdstringThe project id
storestring"google-play" or "app-store"

Body parameters

FieldTypeRequiredDescription
serviceAccountJsonstringGoogle PlayThe service-account JSON, as text
packageNamestringGoogle Playcom.example.app
appAppleIdstringNoApp Store: the app's Apple id

Response fields

FieldTypeDescription
data.googlePlayobjectgoogle-play only: the connection, as in List Store Connections
data.appStoreobjectapp-store only: the connection, as in List Store Connections

Example request

curl -X PUT \
  -H "api-key: tlm_sk_your_key" \
  -H "Content-Type: application/json" \
  -d '{"packageName":"com.barbershop.book","serviceAccountJson":"{\"type\":\"service_account\",…}"}' \
  https://builder-api.totalum.app/api/v1/vcaas/projects/barber-bookings/mobile/stores/google-play
Success · 200 OK
json
{ "errors": null, "data": { "googlePlay": { "clientEmail": "uploader@my-play.iam.gserviceaccount.com", "packageName": "com.barbershop.book", "packageFound": true, "validatedAt": "2026-10-08T12:55:00.000Z" } } }

Error codes

CodeHTTPMeaning
VALIDATION_ERROR400Invalid key or package name
SIGNING_NOT_CONFIGURED409App Store: add the iOS signing key first

#Disconnect Store

DELETE/api/v1/vcaas/projects/:projectId/mobile/stores/:storeapi-keyFree

Remove a store connection. Answers 204 with no body.

Path parameters

ParameterTypeDescription
projectIdstringThe project id
storestring"google-play" or "app-store"

Response fields

FieldTypeDescription
(none)204 No Content

Example request

curl -X DELETE -H "api-key: tlm_sk_your_key" \
  https://builder-api.totalum.app/api/v1/vcaas/projects/barber-bookings/mobile/stores/google-play
End of Disconnect Store Back to top