/workspaceRenames the workspace, changes its slug, or toggles virtual environments. Every field is optional and applied independently; an empty body {} is accepted and succeeds, returning the workspace unchanged.
The workspace icon cannot be changed here. The controller reads name, slug and virtualEnvsEnabled and silently ignores every other key in the body. Upload icons in the dashboard.
Changing the slug changes every dashboard URL for the workspace and any exposed-environment URL built from it. Old slugs are not reserved or redirected, so another workspace can claim the one you release.
virtualEnvsEnabled is the workspace half of the two-flag gate on exposed environments. Turning it on exposes nothing by itself; each environment still needs its own opt-in through POST /projects/{slug}/environments/{environmentSlug}/expose. Turning it off is a kill switch: every exposed feed in the workspace stops serving immediately.
Emits the workspace.updated webhook event, with changes naming the fields that moved. The response payload deliberately omits createdAt, which GET /workspace does return.
Requires the workspace:write scope.
curl --request PATCH \
--url 'https://api.envless.cloud/workspace' \
--header 'Authorization: Bearer ev_sk_xxxxxxxxxxxx' \
--header 'Content-Type: application/json' \
--data '{
"name": "Billing",
"slug": "billing",
"virtualEnvsEnabled": true
}'https://api.envless.cloud/workspaceResponse headers
Authorization
AuthorizationstringrequiredheaderBearer token: an Envless API key (
ev_sk_…), created in the dashboard or withPOST /keys. The key is bound to one workspace; every request runs inside it.
Request body
application/json · optional
namestringmin length 3max length 50New display name, 3 to 50 characters.
slugstringmin length 3max length 50pattern ^[a-z0-9]+(?:-[a-z0-9]+)*$New URL slug, 3 to 50 characters, lowercase letters, digits and single hyphens only. Must be globally unique across all Envless workspaces.
virtualEnvsEnabledbooleanAllows environments in this workspace to be exposed publicly. Off by default. Turning it off immediately stops every exposed feed in the workspace.
Responses
200OK
Update the current workspace succeeded.
successbooleanrequiredcodeintegerrequiredThe HTTP status of this response, repeated in the body.
messagestringrequirederrornullrequireddataobjectrequiredShow child attributesHide child attributes
idstringrequirednamestringrequiredslugstringrequirediconstring | nullvirtualEnvsEnabledbooleanrequired
_reqobjectShow child attributesHide child attributes
reqIdstringresTimeinteger | null
{
"success": true,
"code": 200,
"message": "OK",
"error": null,
"data": {
"id": "<string>",
"name": "<string>",
"slug": "<string>",
"icon": "<string>",
"virtualEnvsEnabled": true
},
"_req": {
"reqId": "<string>",
"resTime": 1
}
}Error envelope
Every failure below returns the same shape with success: false; branch on error.code, never on message.
successbooleanrequiredcodeintegerrequiredThe HTTP status of this response, repeated in the body.
messagestringrequirederrorobjectrequiredMachine-readable failure detail. Null on success.
Show child attributesHide child attributes
codeenum<string>requiredStable error code. Branch on this, never on
message.Options:
"auth.api_key_required","auth.api_key_not_found","auth.api_key_user_missing","auth.api_key_owner_not_member","auth.scope_missing","auth.scope_ceiling_exceeded","auth.key_project_restricted","auth.product_restricted","auth.permission_denied","auth.self_mutation_forbidden","auth.step_up_required","auth.step_up_fresh_required","auth.cli_token_not_accepted","auth.two_factor_required","auth.workspace_two_factor_required","auth.two_factor_invalid","auth.two_factor_replayed","auth.two_factor_locked","auth.two_factor_not_enabled","auth.two_factor_already_enabled","request.body_must_be_json","request.body_invalid","request.body_too_large","request.rate_limited","request.invalid_pagination","workspace.not_found","workspace.slug_conflict","workspace.limit_reached","workspace.delete_last","workspace.delete_too_early","workspace.delete_has_projects","domain.not_configured","domain.not_found","domain.invalid","domain.taken","domain.attempt_limit","product.not_found","product.slug_conflict","product.locked","project.not_found","project.ambiguous_product","project.slug_conflict","environment.not_found","environment.slug_conflict","environment.expose_disabled","environment.expose_private_product","variable.not_found","variable.name_conflict","variable.ciphertext_invalid","variable.baseline_drifted","version.not_found","member.not_found","member.already_exists","member.self_invite","member.self_mutation","member.owner_immutable","member.owner_cannot_leave","member.seat_limit","invite.already_pending","role.owner_not_assignable","role.limit_reached","role.immutable","role.in_use","invite.not_found","invite.expired","role.not_found","role.name_conflict","key.not_found","key.limit_reached","webhook.not_found","webhook.delivery_not_found","plan.limit_reached","plan.upgrade_required","request.not_found","request.method_not_allowed","request.conflict","auth.unauthorized","auth.forbidden","request.invalid","server.error"resourcestringThe resource or scope the failure relates to.
fieldstringThe request field that caused the failure.
dataobject | nullrequiredNull on most failures. A plan limit carries
{ limit, current }._reqobjectShow child attributesHide child attributes
reqIdstringresTimeinteger | null
{
"success": false,
"code": 400,
"message": "Something went wrong.",
"error": {
"code": "auth.api_key_required",
"resource": "<string>",
"field": "<string>"
},
"data": {},
"_req": {
"reqId": "<string>",
"resTime": 1
}
}400Bad Request
request.body_must_be_json- the body is absent or not valid JSON.request.invalid-nameorslugfails validation: wrong length, or a slug with anything other than lowercase letters, digits and single hyphens; the reason is inmessage.
401Unauthorized
auth.api_key_required- theAuthorizationheader is missing, or its value does not start withev_sk_.auth.api_key_not_found- the key is unknown, inactive or revoked.auth.api_key_user_missing- the key is valid but its owner no longer exists.auth.api_key_owner_not_member- the key's owner is no longer a member of the key's workspace.
403Forbidden
auth.workspace_two_factor_required- the workspace requires two-factor authentication and the key's owner has not turned it on.auth.scope_missing- the key lacks a scope this operation requires;error.resourcenames it.
404Not Found
request.not_found - the workspace has been deleted.
409Conflict
request.conflict - another workspace already owns the requested slug.
413Payload Too Large
request.body_too_large - the request body is larger than 1 MiB (1,048,576 bytes).
500Internal Server Error
server.error - an unexpected error; retry with backoff.
503Service Unavailable
server.error - the API is in maintenance mode or is missing its configuration; retry with backoff.