Ubriot Docs

HTTP API

Base URL, authentication with API keys, the main endpoints for apps, builds, submissions and OTA updates, and the error format of the Ubriot API.

The ubriot CLI and the ubriot-mcp server both use this API. Prefer them where they cover the task; use the API directly when you need something they do not do.

Base URL and auth

  • Base URL: https://api.ubriot.dev/api/v1
  • Health check, no auth: GET https://api.ubriot.dev/api/v1/health returns {"ok":true,...}.
  • Auth: Authorization: Bearer <token>, where the token is an API key (ubk_...) from ubriot.dev/dashboard/api-keys or a session token from signing in.
  • Request and response bodies are JSON. Wherever a path has :appId or :id for an app, the numeric id or the app slug both work.
curl -s https://api.ubriot.dev/api/v1/ubriot/apps \
  -H "Authorization: Bearer $UBRIOT_TOKEN"

There is no published OpenAPI document yet. The endpoints below are the stable ones the CLI and MCP server depend on.

Main endpoints

Paths are relative to the base URL. "Key" means an API key works; "Session" means it needs a signed-in session.

Method and pathAuthWhat it does
GET /ubriot/appsKeyList apps.
POST /ubriot/appsKeyCreate an app: name, slug, optional repoUrl, defaultBranch, iosBundleIdentifier, androidApplicationId, expoProjectRoot.
GET /ubriot/apps/:appIdKeyGet one app.
PATCH /ubriot/apps/:appIdKeyUpdate app settings.
GET /ubriot/apps/:appId/readinessKeyCredential and configuration checklist.
GET /ubriot/apps/:appId/activityKeyWho changed what on the app.
POST /ubriot/apps/:appId/buildsKeyQueue a build: platform (ios or android), optional profile, branch, repoUrl.
GET /ubriot/apps/:appId/buildsKeyList an app's builds.
GET /ubriot/buildsKeyList recent builds across apps.
GET /ubriot/builds/queueKeyWhy queued builds have not started.
GET /ubriot/builds/last-goodKeyLast successful build per app, platform and profile.
GET /ubriot/builds/:idKeyBuild status, error and submission state.
GET /ubriot/builds/:id/logsKeyBuild log.
GET /ubriot/builds/:id/artifactsKeyBuild artifacts.
GET /ubriot/artifacts/:id/linkKeyA download link for an artifact.
POST /ubriot/builds/:id/cancelKeyCancel a queued or running build.
POST /ubriot/builds/:id/submit-testflightKeyUpload an iOS build to TestFlight.
POST /ubriot/builds/:id/submit-google-playKeyUpload an Android build to Google Play: optional track, releaseStatus, rolloutPercentage, releaseNotes.
GET /ubriot/apps/:appId/updatesKeyList OTA updates.
POST /ubriot/apps/:appId/channels/:channel/rollbackKeyRoll an OTA channel back.
GET /ubriot/apps/:appId/healthKeyRelease health status.
GET /ubriot/analytics/buildsKeyBuild analytics.
/ubriot/apps/:appId/credentials, /ubriot/account/credentialsSessionSigning credentials.
/ubriot/apps/:appId/channelsSessionList, create and repoint OTA channels.
/ubriot/apps/:appId/push/server-keysSessionPush server keys.
/ubriot/api-keysSessionCreate, list and revoke API keys.

Publishing an OTA update means uploading an exported JavaScript bundle and its assets. Use ubriot update rather than calling the update endpoints directly.

Sending push from your backend uses a push server key in the x-ubriot-push-key header, not an API key. See Notify.

Errors

Errors return an HTTP status and a JSON body:

{ "statusCode": 401, "message": "Missing token", "error": "Unauthorized" }

message is a plain sentence, and for billing and setup problems it says what to do next, for example Verify a payment card at ubriot.dev/dashboard/billing to start your 14-day trial. Some validation errors return message as an array of strings.

Newer errors also carry a stable code and a doc_url to the guide that fixes them:

{ "statusCode": 403, "code": "email_not_verified", "message": "Verify this account's email address before starting builds or store submissions. ...", "doc_url": "https://docs.ubriot.dev/quickstart#verify-email" }
codeStatusMeaning
email_not_verified403Starting a build or a TestFlight or Google Play submission before the account's email is verified. A person verifies it from the dashboard banner; see Verify your email.
account_paused403Signing in with the correct password to an account that was paused. See Create and verify your account.
signup_network_blocked, signup_rate_limited, captcha_required, captcha_failed, captcha_unavailable403, 429, 400, 403, 503Account creation only. See Create and verify your account.
StatusUsual causeWhat to do
400A missing or invalid field, or a submission already running for the build.Read message and fix the request.
401Missing, revoked or wrong token, or an API key used on a session-only route.Check the token, or sign in for session-only routes.
403No trial or plan, an unverified email (email_not_verified), or no access to that app.A person fixes billing at ubriot.dev/dashboard/billing or verifies the email from the dashboard.
404The app or build does not exist or belongs to another account.Check the id with GET /ubriot/apps.
429Rate limited.Wait and retry with backoff.

Older errors do not carry a code or a doc_url yet, and writes do not accept an idempotency key. Before retrying a write that may have succeeded, check its effect first, for example list builds before queueing another one.

On this page