Mirror:plans-and-limitspublishes the plan, runtime, database, Data tab and deploy limit tables from this page in summarized form. Changed a number here? Updateplans-and-limits,overviewandapi-reference/limitationsin the same pass.
1. Overview
Vertra Cloud is a Brazilian cloud hosting platform for deploying applications and managed databases. It supports 10+ languages, 4 database types, real-time monitoring, custom domains, an MCP server for your AI agent, collaborative workspaces and a VSCode extension. SLA: 99.99% availability, on every plan. This is the only SLA number the platform states — marketing, plan cards, the Enterprise page, the Terms of Use and the public docs all say 99.99% and nothing else.- Site: https://vertracloud.app
- Dashboard: https://vertracloud.app/dashboard
- API: https://api.vertracloud.app
- Documentation: https://docs.vertracloud.app
- CLI (guide):
curl -fsSL https://cli.vertracloud.app/install | shon macOS/Linux,irm https://cli.vertracloud.app/install | iexon Windows (PowerShell) - MCP server (guide): remote endpoint
https://mcp.vertracloud.app/mcp(OAuth), or local withnpx -y @vertracloud/mcpand aVERTRA_API_KEY - SDKs (guide):
npm install @vertracloud/sdk-api·pip install vertracloud-sdk-api·go get github.com/vertracloud/sdk-api-go - VS Code extension (guide):
code --install-extension VertraCloud.vertra-cloud - GitHub Actions (guide):
vertracloud/github-action
2. Supported Languages
3. Databases
The port is unique per database — not the engine’s default — and is shown on the database page.
All databases generate TLS certificates automatically (CA, server, client). Every engine requires TLS
and a client certificate — a password alone never connects.
How to connect to each database
- Host:
<database-id-without-hyphens>.db.usa1.vertraweb.app. Port: unique per database (not 5432/27017/6379/3306) — copy it from the database page orGET /v1/databases/{id}. - Files (Certificates tab or
GET /v1/databases/{id}/credentials/certificate):certificate-<id>.crt= client certificate,certificate-<id>.key= client private key,certificate-<id>.pem= bundle of client key + client certificate + the CA. Use the.pemas the CA file everywhere, and as the certificate-key file for MongoDB. - The server certificate matches the host, so full verification works.
Node.js examples for each driver (pg, mongodb, ioredis, mysql2) are on the
Databases page.
Minimum RAM: 1,024 MB for PostgreSQL, MongoDB and MySQL; 512 MB for Redis.
Storage: 6 GB + 1 GB for every 512 MB of allocated RAM, rounded up to the GB — the quota
is always a whole number of GB (e.g.: 512 MB → 7 GB; 1 GB → 8 GB; 2 GB → 10 GB;
4 GB → 14 GB). No existing database loses space when the formula changes — the ceiling only grows.
Operations: Start, Stop, Restart, Reset (destructive, limited to 1 per hour), Reset Password, Reset Certificates, Snapshot Download/Restore.
Data manager (the “Data” tab)
Browse and edit the database’s content from the dashboard (/v1/databases/{id}/data/*), without
exposing the password or the connection string. Dashboard session only: an API key gets a 403 on these
routes, regardless of scope. SQL: schemas, tables, columns, indexes, rows and a SQL console.
MongoDB: collections, indexes and documents. Redis: keys via SCAN, value by type, TTL.
Minimum plan: Intermediary. The entire tab (the 21 routes under
/v1/databases/{id}/data/*) is
unlocked from Intermediary up. The gate checks the plan of the database’s owner, not the
plan of whoever is accessing it — a workspace member on Free can use the Data tab on a database whose owner has the required plan, and
an owner on Free doesn’t get the feature by inviting someone on a higher plan. Below that the API returns
PLAN_RESTRICTED_FEATURE (403) and the dashboard shows the plan card instead of the explorer.
Permission: read access is granted to any workspace member; write access and the SQL console are owner or admin
only (the database owner can always do it). Every mutation becomes an activity in the database log, with the operation
and the object — never the content.
What deliberately doesn’t exist: an administrative command or arbitrary code execution
in the Redis or Mongo console. In SQL the limit is time, size and concurrency.
4. Plans and Pricing
A count ceiling only exists on Free (1 app, no databases). On paid plans the real limit is the
plan’s RAM: from Economy up there is no count ceiling, and what refuses a creation is
INSUFFICIENT_MEMORY — a 100 MB app fits 10 times in a Pro plan. Minimums that consume that RAM: application 100 MB, Redis 512 MB, Postgres/MySQL/Mongo 1,024 MB.
vCPU per Application
The vCPU column in the table above is the ceiling per application on the plan, not a total split across the account’s projects. An application with 2 GB (2,048 MB) or more of RAM gets the plan’s full vCPU. Below 2 GB, it gets 1/3 of the plan’s vCPU, with a floor of 1 vCPU — except when the plan’s own vCPU is already lower than 1 (Free, Economy and Pro), in which case the application still gets the plan’s full vCPU anyway (there’s nothing to round down). More RAM never results in less vCPU.AI Agents (MCP)
Vertra doesn’t host chat or an AI model. Connect Claude, Codex, Cursor or another MCP client to the official server to operate applications, databases, files, logs and deploys with your API key. Internal validations happen during the application’s lifecycle, such as deploy, rebuild and restart; they are not a separate product surface.Enterprise Pricing
The Free plan is currently “suspended”; while it existed it ran with 100 MB of RAM “free”.
Plan IDs (plan_id)
Features by Plan
The file manager is the dashboard’s Files tab and its HTTP routes; ownership and path rules follow the same rules across the API, the CLI and the MCP.Three different things the docs often blur together:
- Publish (Pro+) — having a site: the application gets a
*.vertraweb.appsubdomain and becomes reachable over the internet. On Pro the subdomain is randomly assigned by the platform. On Pro, the site’s HTML pages also show the “Powered by Vertra Cloud” badge in the bottom-right corner; from Scale up it doesn’t appear. Switching plans turns the badge on or off immediately, without a redeploy. - Choose the subdomain (Scale+) — choosing the subdomain name, at creation or later
(
PATCH /v1/apps/{id}/network/subdomain). Without it the user can publish, but can’t choose the name. - Custom domain (Intermediary+) — pointing a domain you own to the application.
Free Plan Limits
Free is an evaluation plan: it exists to test the platform before using it in production.- Maximum 1 app — databases can’t be created on Free
- RAM: 100 MB “free”
- Projects inactive for 30+ days are automatically deleted
- Email notifications on days 7, 23, 27 before deletion
- No web publishing, no file manager
5. Application Types
Display name limit for application, database and workspace: maximum 50 characters.
The type is not decided once and for all at creation. An application created without web publishing can be
published later (
POST /v1/apps/{id}/network/publish) and unpublished again
(DELETE /v1/apps/{id}/network/publish), which switches the type between 1 and 2. Two consequences
users need to be told about:
- Turning it on and off recreates the container, so the application restarts — network rules and the exposed port only exist from the moment the container is created.
- When turning it off, the subdomain is released: there is no reservation, someone else can claim it. The custom domain is also removed (including the hostname on the CDN).
MEMORY_BELOW_MINIMUM with details: { current_mb, minimum_mb }.
Storage
Every application gets 10 GB of storage, regardless of allocated RAM (before 09/14/2026 the ceiling was 6 GB + 2 GB for every 2 GB of RAM). Exceeding the ceiling refuses writes; lowering RAM doesn’t lower the storage ceiling, which is fixed per application.Bandwidth Limits by Memory
Above 10 GB of RAM, the limit grows by roughly 50 Mbit per additional 256 MB.
Lifecycle
Build Command (build_command)
An optional per-application field, available on all plans. It runs on every deploy — creation, zip upload, GitHub deploy, dependency reinstall or a change to the command itself —, always after dependency installation and before the application starts. A plain restart doesn’t rerun the build if the previous build succeeded with the same command. The build runs in a build environment isolated from the application: 2× the application’s RAM (minimum 1,024 MB, maximum 4,096 MB), 2× the application’s vCPU (minimum 1, maximum 2), with a 10-minute time limit. If the command fails → the deploy fails and the application doesn’t start (BUILD_FAILED);
if it times out → BUILD_TIMEOUT.
The build environment has twice the application’s bandwidth (the same bandwidth-by-RAM table, ×2) —
downloading dependencies weighs more than serving traffic, and the window is short. Exceeding it interrupts the deploy, the same as happens with the application
while it’s running.
Common examples:
The application needs to listen on port 80 — this applies to every Website-type application, with or
without
build_command. When creating an application from the dashboard from a zip, the platform suggests the
build and start commands above based on the dependencies declared in package.json (Next.js, Nuxt,
SvelteKit, Remix, React Router, Astro, Gatsby and Vite); the user can edit both before
creating it. A project without a recognized framework starts from the main file, with no build command.
Configuration File (vertracloud.config)
An optionalKEY=value file at the root of the uploaded zip. It only pre-fills the
creation/upload form — the actual configuration lives in the dashboard (Settings tab).
Recognized keys: NAME, DESCRIPTION, MAIN, MEMORY, START, BUILD, VERSION,
SUBDOMAIN; any other key (including the old AUTORESTART) is ignored. VERSION pre-fills the
wizard on zip upload and is used on creation from a snapshot; the version confirmed in the wizard is
the one the application runs, and a version that doesn’t exist for the language is refused with
INVALID_VERSION. vertracloud.config.json is also accepted, with lowercase keys.
If the zip has .env.production, .env.production.local, .env.local or .env (in that order),
the creation flow pre-fills the environment variables from the first non-empty one.
Subdomains
- Format:
your-app.vertraweb.app - Unique per application
- Web publishing (getting a subdomain) available from the Pro plan
- Choosing the name of the subdomain requires the Scale+ plan; below that the platform assigns a random name
- Accepted format when choosing: 3 to 50 characters,
^[a-z0-9][a-z0-9-]*[a-z0-9]$ - Renamable later via
PATCH /v1/apps/{id}/network/subdomain(minimum 5 minutes between changes)
Custom Domains
- Available from the Intermediary plan
- Configure a CNAME record in DNS pointing to the provided address
- SSL provisioned automatically after DNS validation
- Limit: 1 custom domain per application
6. Auto-Restart and Crash Loop Detection
- Containers that crash are restarted automatically — the default on every plan, including Free, always on, with no option to turn it off
- Exit code 0 (normal termination) does NOT trigger a restart
- Crash loop: 5 crashes in 10 minutes → auto-restart disabled for 24 hours
- Cooldown: Minimum 1 hour between consecutive restarts
- Stability: The container needs to stay online for 60+ seconds to count as stable
7. Platform Protections (Vertra Shield)
Vertra Shield protects every application and database on the platform. In situations that could affect availability, Shield may pause an application temporarily; the dashboard shows the reason and a countdown.Shield Cooldown (visible pause)
When Shield pauses an application, the dashboard shows a notice with the reason and the time remaining, and the start and restart actions become temporarily unavailable. The cooldown can grow after repeated occurrences, up to a limit of 1 hour. Shield only stops the application — it never deletes it, its files or its data. Start, restart, deploy, configuration changes and deleting the application wait until the pause ends.8. SSL/TLS
- All sites get automatic SSL/TLS certificates
- Automatic renewal before expiration
- HTTP → HTTPS redirect enabled by default
- Custom domains also get automatic SSL
- All database connections require TLS
9. Snapshots
- Manual snapshot creation for apps and databases — at most 1 every 5 minutes on the same
project and 10 per hour across every resource on the account; exceeding either
returns
SNAPSHOT_RATE_LIMITED(429) withdetails: { scope: "resource" | "account", retry_after } - Restore from any earlier snapshot (30-second cooldown)
- Download the snapshot content as a ZIP
- Available from the Scale plan (manual backups)
- Deleting or resetting a database automatically takes a safety snapshot before
destroying the data, on every plan. If the backup fails, the action is blocked (
SNAPSHOT_FAILED) and the database is neither deleted nor reset. This forced snapshot has its own ceiling, separate from the manual-creation one: at most 2 attempts per hour on the same database, and 10 per hour across all databases on the account — exceeding either returnsFORCED_SNAPSHOT_RATE_LIMITand also blocks the action. It only applies to databases (delete and reset); applications don’t have this behavior.
10. Workspaces
Team collaboration with granular permissions and customizable roles. Available only on the Enterprise plan. The workspace owner retains control over owner-exclusive management actions.The 19 permissions
Actions that are owner-only, regardless of any role: linking/unlinking a project,
renaming/deleting the workspace, transferring ownership, GitHub deploy webhook and turning
web publishing on/off.
Seed roles
Every workspace is born with 4 roles, which are renamable and deletable (they become ordinary roles; they count toward the tier ceiling just like any other):Custom role ceiling by tier (Enterprise)
The 4 seed roles count toward the ceiling.Members by tier (Enterprise)
The progression never decreases when moving up a tier (5 at the lowest and 24 at the highest). A pending invite counts.Invites
Two forms, both requiringmembers:manage:
- Email: tied to a specific address, expires in 7 days.
WORKSPACE_INVITE_EMAIL_MISMATCHif accepted by an account with a different email. - Link: multi-use, fixed 24h expiration, optional
max_uses. Revocable at any time.
expires_in_days — an access expiration applied to the member who joins through
it; null/absent = no expiration. A pending invite counts toward the plan’s member limit.
Every account has the workspace_invites_enabled toggle (APIUser) to refuse email invites;
when off, a new email invite for that account fails with WORKSPACE_INVITES_DISABLED.
Folders and favorites
Folders and favorites organize applications and databases without changing the resources. The organization is persisted on the account and has two scopes:- Personal: the account’s individual view, returned by
GET /v1/users/me. - Workspace: the member’s individual view inside a workspace, returned by
GET /v1/workspaces/:id. It is not shared with the other members.
neutral, red, orange, yellow, green, blue and purple. resource_type only accepts
application and database. Favorites and folders are independent of each other.
Creating, editing, deleting, moving and favoriting generates an activity. The action can come from the dashboard, a
workflow or a client authenticated with an API key, such as the CLI, the MCP and the VS Code extension.
The client doesn’t send origin or author_id; the API records the origin and the author automatically.
The project list and Flow use the same persisted organization. In Flow, the folder and the favorite
show up alongside the resources, but groups created on the canvas remain local and independent.
Folders are not Flow groups. A group organizes elements on Flow’s local canvas, while a
folder organizes resources within the account or workspace. There is no group_id, sync or migration between
the two concepts.
Action requests
A member who lacks the permission for a sensitive action (app_delete, database_delete,
snapshot_create, snapshot_restore) can open an action request; whoever has
members:manage and the permission for that action approves or rejects it. It expires in 24h without a decision
(WORKSPACE_ACTION_REQUEST_EXPIRED).
Retention
Deleting a workspace is a logical deletion: the name becomes available again for a new workspace; an expired Enterprise plan freezes writes (invite, action, edit), never deletes data.Route → permission
Error codes
11. File Manager
- Available from the Pro plan
- Browse and edit files directly in the dashboard
- Syntax highlighting for all languages
- Upload via drag-and-drop (files or ZIP)
- File tree up to 6 levels deep
- Create, edit, move, delete files and folders
- Lists every directory of the project, including dependency folders such as
node_modules; only the file tree endpoint (GET /v1/apps/{id}/files/tree) skips dependency and build folders to stay small vertracloud.configdoesn’t exist on the volume: it’s generated from the database on download and on snapshot (see §Configuration File)- Storage: 10 GB fixed per application (see §5 Storage)
12. Deploy
Methods
- ZIP upload via dashboard or API
- GitHub integration — repository selection (including private ones)
- GitHub webhooks — automatic deploy on push (Intermediary+ plans)
- VSCode extension — deploy straight from the editor
Process
Code upload → Dependency installation → Build (if there’s abuild_command) → Container startup → Subdomain assignment → SSL provisioning
Upload Limits
- Maximum ZIP size: 100 MB
- Maximum dependency install time: 15 minutes (
INSTALL_TIMEOUTif exceeded) - Maximum build command time: 10 minutes (
BUILD_TIMEOUTif exceeded) - 1 exposed port per application
Deploy-per-Hour Limit
A per-account ceiling, renewed on a 3,600-second window. Counted: creating an application, uploading a zip, deploying via GitHub (manual or via push), reinstalling dependencies and changing the build command. Not counted: restarting and stopping.
If exceeded →
429 DEPLOY_RATE_LIMITED with details.limit, details.window_seconds (3,600) and
details.retry_after (seconds until it clears). A GitHub push arriving beyond the limit is
ignored (it doesn’t get queued) and appears in the activity history.
Files Excluded from the ZIP
The dashboard automatically strips from the zip, before uploading:node_modules, .local, venv, .venv,
__pycache__, .next, vendor, .bundle, target and .gradle.
- JavaScript/TypeScript:
node_modules,.npm,package-lock.json,.next - Python:
venv,.venv,.cache,__pycache__,.env - Go:
vendor - Rust:
target - Java:
target,.gradle - PHP/Ruby:
vendor
dist/andbuild/(build output) are not removed automatically — if yourmain/startpoints inside them (common in projects that bundle before deploying), the platform needs these files. Only exclude them from the zip if the real entry point is outside of them.
13. Plan Downgrade
- Available via dashboard or API:
POST /v1/users/me/downgrade - Formula:
newDays = remainingDays × (currentPrice / targetPrice) - Restrictions: FREE and ECONOMY cannot downgrade
- Checks: Memory usage must fit the target plan, rate limit (1x every 3 hours)
- Impact: Reduced memory limit, higher-plan features disabled, workspaces lost when leaving Enterprise
14. VSCode Extension
- Available on the VS Code Marketplace (search “Vertra Cloud”)
- Features: Quick deploy, app management, file management, real-time monitoring
- Requirements: VS Code 1.80+, active Vertra account, internet connection
- Deploy via the command palette:
Ctrl+Shift+P→ “Vertra: Deploy”
15. Authentication Methods
- Discord OAuth — Login and account linking
- GitHub OAuth — Login and account linking
- Google OAuth — Login and account linking
- Magic Link — Passwordless authentication by email
- API key — For programmatic access (managed from the dashboard settings); up to 10
keys per account, each with a name, scopes and optional allowed IPs. New format
vc_live_+ 48 hex characters, shown only once; older keys (64 hex) remain valid with all scopes. Full detail in §16. - Account switching — Up to 5 saved accounts in the same browser
16. API Reference
Authentication
Send an API key in theAuthorization header as a Bearer token:
API Keys
A new key has thevc_live_ prefix followed by 48 hexadecimal characters and is shown only once when it is created or rotated. Older keys with 64 hexadecimal characters remain valid.
An account can have up to 10 keys, each with a name, access scopes and an optional list of
up to 20 allowed IPs or CIDRs. An empty list allows calls from any IP address.
The key needs the scope required by the endpoint. The read, write and full presets select
common sets; scopes can also be chosen individually.
Workspace permissions also apply to key-authenticated calls. Key management, browsing the
Data tab, downgrade, new invites, ownership transfer, deciding on action requests and
querying/exporting activities all require a dashboard session.
A key without the required scope gets
403 API_KEY_SCOPE_DENIED; a disallowed IP gets
403 API_KEY_IP_DENIED. An invalid key gets 401 API_KEY_INVALID. Key management is done
from the dashboard.
Rate Limiting
The API applies fixed per-route limits, plus per-minute and per-day per-account limits for API key calls. The daily quota renews at midnight, Brasília time. Key-authenticated responses includex-ratelimit-limit, x-ratelimit-remaining, x-ratelimit-reset, x-quota-limit,
x-quota-remaining and x-quota-reset. When a limit is hit, the response is 429 RATE_LIMIT_EXCEEDED or 429 DAILY_QUOTA_EXCEEDED, with details and the time to retry.
The fixed per-route limits cover lifecycle operations, database reset, subdomain changes,
data queries and activity export.
Response Format
- Success:
{ "response": { ... } } - Error:
{ "code": "ERROR_CODE", "message": "..." }
Common Error Codes
Main Endpoints
The list below corresponds to the public API endpoints. Request and response schemas are in the API Reference. Per-route limits are detailed in API Limitations.Applications
Databases
Users and account
Workspaces
Billing
Redeem
Services
17. Environment Variables
- Injected into the container at startup
- Managed via dashboard or API
- Limits: Maximum 25 variables, key max 100 characters, value max 1,000 characters
- Encrypted at rest
- Forbidden keys:
PORT,HOST,PATH,HOME,USER,SHELL - The platform sets
PORT=80andHOST=0.0.0.0in the container
18. Automatic Cleanup (Free Plan)
The Free plan is currently “suspended”; this rule applies to Free projects that still exist. Free-plan projects inactive for more than 30 days are automatically deleted:19. Common Problems and Fixes
Platform
- App crashing / OOMKilled: Insufficient memory. Increase the allocated RAM. Java/Puppeteer need 512 MB+.
- Crash loop (auto-restart disabled): 5 crashes in 10 min. Check the logs, fix the root error, redeploy.
- App stops immediately (exit code 0): The process has nothing keeping it alive. Make sure the bot is logged in or the server is listening.
- ZIP too large: Exclude
node_modules,venv,.git,vendor,target,__pycache__. - Dependency installation exceeds 15 minutes (
INSTALL_TIMEOUT): Remove unnecessary dependencies. - Build command exceeds 10 minutes (
BUILD_TIMEOUT): Simplify thebuild_commandor the framework’s build step. - Site times out: Bind to
0.0.0.0(notlocalhost). Use thePORTvalue. - Custom domain doesn’t work: Intermediary+ plan, correct CNAME, wait for DNS propagation.
- Database connection refused: TLS is required. Download certificates from the dashboard.
- Project limit: Free (“suspended”) = 1 app, no databases. Upgrade for more.
- Email not received: Check spam. Try another method (Discord, GitHub, Google).
Node.js / JavaScript
Cannot find module 'xxx': The package isn’t inpackage.json’sdependencies(it may be indevDependencies).missing script: start: Add"start": "node index.js"underscriptsinpackage.json.Cannot use import statement outside a module: Add"type": "module"topackage.json, or userequire().ERR_REQUIRE_ESM: The package only supports ESM. Use ESM or an older version (e.g.:node-fetch@2).ERESOLVE dependency tree: Create.npmrcwithlegacy-peer-deps=true.EADDRINUSE: Port already in use. Only oneapp.listen()in the code.- Native modules fail (better-sqlite3): Don’t upload
node_modules/. The platform compiles for Linux.
TypeScript
tsx / ts-node: command not found: Addtsxtodependencies.TSError: Unable to compile: Includetsconfig.json. Fix TS errors before deploying.
Python
ModuleNotFoundError: The module isn’t inrequirements.txt. Generate it withpip freeze > requirements.txt.requirements.txtnot found: Check the exact name and extension (watch out for.txt.txton Windows).SyntaxError: invalid syntax: The selected Python version doesn’t support the feature used. Upgrade the version.UnicodeDecodeError: Save files as UTF-8. Useencoding='utf-8'when opening files.- Flask/Django not reachable: Use Gunicorn:
gunicorn app:app --bind 0.0.0.0:80.
Go
go.mod not found: Rungo mod initandgo mod tidy. Includego.modandgo.sum.- Incompatible binary: Compile for Linux:
GOOS=linux GOARCH=amd64 go build.
Java
no main manifest attribute: Configure the build tool to create a fat JAR with Main-Class.OutOfMemoryError: Java needs 512 MB+. Use flags:-Xmx256m -Xms128m.
Discord Bots
Invalid token/Improper token: Generate a new token in the Developer Portal. Set it as an environment variable.DisallowedIntents: Enable privileged intents in the Developer Portal (Message Content, Server Members, Presence).ClientMissingIntents: Specify intents in your code:new Client({ intents: [...] }).- Bot goes offline randomly: Insufficient memory or an outdated discord.js/discord.py.
on_messagedoesn’t fire (discord.py): Missingintents.message_content = True+ enabling it in the Developer Portal.
Environment Variables
- Undefined/null values: Configure via the dashboard, don’t rely on a
.envfile. .envdoesn’t work: The platform doesn’t read.env. Use the dashboard’s variables interface.
20. Discount Coupons
A coupon can be percentage-based or a fixed amount (applied once to the total, never taking the price negative), can have a validity window, redemption limit and plan or duration restrictions. An order of R$0 (a 100% coupon) is delivered instantly, without PIX. A coupon rejected at checkout returns one of the codesCOUPON_INVALID, COUPON_INACTIVE, COUPON_NOT_STARTED, COUPON_EXPIRED,
COUPON_EXHAUSTED, COUPON_USER_LIMIT, COUPON_AUDIENCE, COUPON_PLAN, COUPON_DURATION.
21. Data Retention
What Vertra Cloud keeps about your account and projects, and for how long. The legal text is the Privacy Policy; this table is the practical summary.
Your API key requests are visible to you in the dashboard, and the activity history lists lifecycle
events, file manager changes, restored snapshots, domains, protection incidents, purchases, code
redemptions and actions started by a connected agent.