Documentation

Ship your first asset in five minutes.

Upload it once, deploy a version to an environment, and load it from a URL that never changes. Pick the way that suits you — every path ends at the same asset.

Umber CLI

Already have assets in your code? Move them in one command.

Images, video and documents bundled into an HTML, React or React Native project are the duplicates Umber removes. umber assets migrate takes them out of the bundle and points your code at one hosted copy.

  1. 1
    ScanFinds every asset and every line of code that references it.
  2. 2
    UploadSends each asset to your workspace as a new Umber asset.
  3. 3
    DeployMakes it live in your environment, so its URL serves it straight away.
  4. 4
    RewriteReplaces local paths in your code with Umber URLs, keeping a backup of every file it edits.
# install (Node.js 20+)
$ npm install -g @umbercloud/cli

# sign in through your browser — no key to paste
$ umber login
✓ Logged in as you@yourcompany.com
  env      dev

# see what would move, then move it
$ umber assets scan
$ umber assets migrate --dry-run
$ umber assets migrate

Safe to run, safe to re-run

scan and --dry-run change nothing. A real run backs up each file before editing it to .umber-backup/, and records what it migrated, so running it again only picks up what's new.

CommandWhat it does
umber loginOpens your browser to sign in and creates a scoped platform API key for the CLI. Owners and Admins can log in this way.--api-key --domain --env (for CI)
umber whoami · umber logoutShow the active workspace, environment and platform; remove saved credentials.
umber env listList your workspace's environments, so you know where you're deploying.
umber assets scanReport assets, references and anything that needs a manual look. Uploads nothing, edits nothing.
umber assets migrateUpload, deploy and rewrite references in one go.--dry-run --env --pin-versions --no-deploy --report out.md
umber assets upload <files…>Upload and deploy specific files without touching your code.
umber assets listList the assets in your workspace.
umber billingThis month's pay-as-you-go usage and estimate: storage, delivery, environments, API calls.--month 2026-10

Run it in CI

No browser in a pipeline: use a platform API key with the CLI's scopes, and name the member the uploads belong to.

export UMBER_API_KEY=umber_sk_…
export UMBER_DOMAIN_ID=…
export UMBER_ENV=prod
export UMBER_EMAIL=ci@yourcompany.com
umber assets migrate --yes

Your code, after

Local paths become the asset's URL on your workspace's delivery domain. Upgrade the asset later and this line never changes.

// before
<img src="./images/hero.png" />

// after
<img src="https://adn.umbercloud.io/api/va
  /{workspace}/hero/dev/generic" />

Full CLI reference →  ·  Migration guide →

MCP · AI agents

Ask your AI agent to ship the asset.

Umber's MCP server connects Claude Code, Cursor, VS Code or your own agent to your workspace. The agent finds assets, uploads new versions, deploys them and rolls back, with your platform API key and nothing more.

  • Find the hero banner and tell me which environments it's live in.
  • Upload designs/hero-v2.png as a new version of hero-banner and deploy it to staging.
  • Production is serving the wrong logo. Roll brand-logo back in production.
  • How much bandwidth have we used this month?
# local: runs through the CLI, signs in with your browser
$ npx @umbercloud/cli login
$ claude mcp add umber -- npx -y @umbercloud/cli mcp

# hosted: nothing to install, a platform API key
$ claude mcp add --transport http umber \
    https://mcp.umbercloud.io \
    --header "Authorization: Bearer umber_sk_…" \
    --header "X-Umber-Domain: {domainId}"
// Cursor, Claude Desktop and most other clients
{
  "mcpServers": {
    "umber": {
      "command": "npx",
      "args": ["-y", "@umbercloud/cli", "mcp"]
    }
  }
}
ToolsWhat the agent can do
whoami · list_environmentsSee which workspace it's in, who it acts as, and the environments it can use.
search_assets · get_asset · get_asset_urlFind assets, see their versions and where each is deployed, and get delivery URLs.
upload_fileCreate an asset or add a version to one. Uploading never deploys.
deploy_version · rollback_assetMake a version what an environment's URL serves, or put the previous one back.
list_collections · get_collectionBrowse collections and their items.
create_collection · add_collection_itemCreate a collection and fill it. Adding to a collection that's already live asks you first.
get_usageThis month's usage and cost estimate.

Local or hosted — or both

Same tools, same kind of key.

  • Local (umber mcp): runs on your machine with Node.js 20+, signs in through your browser, and uploads any local file.
  • Hosted (https://mcp.umbercloud.io): nothing to install. Send a platform API key and your domain ID as headers. Suits agents in the cloud or CI, and clients that only take a URL.

The agent gets your key's permissions, no more

  • Every action is a v2 API call, checked against the key's scopes and the role of the person it acts as.
  • Uploading and deploying are separate steps. The hosted server refuses a deploy until an environment is named.
  • No tool deletes assets, versions, collections or environments.
  • Add --read-only (local) or X-Umber-Read-Only: true (hosted) to allow reads only.

Full MCP guide: VS Code, keys, scopes and every tool →

API · v2

Upload, deploy and roll back over plain HTTPS.

Every call goes to https://api.umbercloud.io/api/v2/{domainId} with a platform API key as a bearer token. Create keys on the Organization page of the dashboard and give each one only the scopes it needs.

01 · assets:write

Create the asset

The logical asset that will hold every version. assetType 0001 is an image. Set secured to false to serve it from a public URL.

# once per shell
export API=https://api.umbercloud.io/api/v2/$DOMAIN

curl -X POST $API/va \
  -H "Authorization: Bearer $UMBER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "assetId": "hero-banner", "assetName": "Hero banner",
        "assetType": "0001", "secured": false,
        "createdBy": "you@yourcompany.com" }'
02 · assets:write

Upload a version

Each upload becomes the next version of the same asset. The response gives its versionId. Large files can use the two-step streamed upload instead.

curl -X POST "$API/va/hero-banner/versions?targetPlatformId=generic" \
  -H "Authorization: Bearer $UMBER_API_KEY" \
  -F "assetFile=@hero.png" \
  -F "versionName=Hero banner v1" \
  -F "createdBy=you@yourcompany.com"

# 201 Created → { "version": 1, "versionId": "GEN1", … }
03 · deploy

Deploy it to an environment

Deploy the version LIVE in the environment, then make it the DEFAULT — the version the environment's URL serves.

# 1) add it to prod
curl -X POST "$API/va/hero-banner/versions/GEN1/deploy?targetPlatformId=generic" \
  -H "Authorization: Bearer $UMBER_API_KEY" -H "Content-Type: application/json" \
  -d '{ "envId": "prod", "intent": "LIVE", "createdBy": "you@yourcompany.com" }'

# 2) make it what prod serves
curl -X POST "$API/va/hero-banner/versions/GEN1/deploy?targetPlatformId=generic" … \
  -d '{ "envId": "prod", "intent": "DEFAULT", "updatedBy": "you@yourcompany.com" }'
04 · public URL

Load it anywhere

A plain GET — from a browser, a mobile app or a game engine. When you promote version 2 later, this URL serves it with no change to your code.

<img src="https://adn.umbercloud.io/api/va/$DOMAIN
  /hero-banner/prod/generic">

# pin a specific version instead of the environment's default
…/hero-banner/prod/generic?version=1
05 · deploy

Roll back in one call

Promoted the wrong version? Put the previous default back, and every app follows — no release.

curl -X POST "$API/va/hero-banner/versions/rollback?targetPlatformId=generic" \
  -H "Authorization: Bearer $UMBER_API_KEY" -H "Content-Type: application/json" \
  -d '{ "envId": "prod", "updatedBy": "you@yourcompany.com" }'
Moving from the old API? v2 is the only supported API. It takes a platform API key (umber_sk_…) as Authorization: Bearer; the old environment download keys in an apikey header are not accepted. See API keys and authentication.

Browse the docs