Skip to content

Workspaces ​

A workspace contains resources, members, and billing. You can belong to multiple workspaces, each with its own role and write grants.

Workspace responses contain id and name strings, an owner object with id and name, and a flags array. They do not include your role. Use the member endpoints to read roles and write grants.

User-scoped endpoints accept your user ID or @me as uid. Ordinary callers can list and create only their own workspaces.

Search workspaces ​

GET/v1/users/{uid}/workspacesSearch workspaces

Lists the workspaces the user belongs to.

Path parameters

NameTypeRequiredDescription
uidstringyesUser ID, or @me for the current user

Query parameters

NameTypeRequiredDescription
qstringnoQuick search by name or ID
idstring[]noList of workspace IDs to filter
namestringnoWorkspace name to filter
ownerstring[]noList of owner user IDs to filter

Plus the shared pagination query parameters.

Returns 200 OK with a keyset-paged list of workspace objects.

Create a workspace ​

POST/v1/users/{uid}/workspacesCreate a workspace

Creates a workspace owned by the given user. We grant its owner the owner role and write access to all resource kinds. Ordinary users may own at most three workspaces.

Path parameters

NameTypeRequiredDescription
uidstringyesUser ID, or @me for the current user

Request body

The JSON body is required.

FieldTypeRequiredDescription
namestringyesWorkspace name. 4-32 characters.

Returns 200 OK with the workspace object.

json
{
  "name": "my-workspace"
}
bash
curl -X POST https://api.galaxygate.net/v1/users/@me/workspaces \
  -H "Authorization: Bearer $GALAXYGATE_TOKEN" \
  -H "Content-Type: application/json" \
  -A 'curl/8.5' \
  -d '{ "name": "my-workspace" }'

Fetch a workspace ​

GET/v1/workspaces/{wid}Fetch a workspace

Requires membership in the workspace.

Path parameters

NameTypeRequiredDescription
widstringyesWorkspace ID

Returns 200 OK with the workspace object.

Update a workspace ​

PATCH/v1/workspaces/{wid}Update a workspace

Send only the fields you are changing. Renaming and changing SSH password authentication require admin or owner. Changing mfa_required or order_approval_required requires owner. Enabling mfa_required fails unless every member already has two-factor authentication enabled.

Path parameters

NameTypeRequiredDescription
widstringyesWorkspace ID

Request body

The JSON body is required.

FieldTypeRequiredDescription
disable_ssh_passwordbooleannoDisable SSH password authentication when SSH keys are present
mfa_requiredbooleannoRequire all members to have two-factor authentication enabled
namestringnoWorkspace name. 4-32 characters.
order_approval_requiredbooleannoHold orders from members other than the owner until the owner approves them

Returns 200 OK with the updated workspace object.

json
{
  "order_approval_required": true
}

Delete a workspace ​

DELETE/v1/workspaces/{wid}Delete a workspace

Permanently deletes an empty workspace. Requires owner and elevated authentication. Cancel all billed services and delete all resources first.

Path parameters

NameTypeRequiredDescription
widstringyesWorkspace ID

Returns 204 No Content with an empty body.

Fetch quota usage ​

GET/v1/workspaces/{wid}/quotaFetch quota usage

Returns workspace limits rather than current resource usage.

Path parameters

NameTypeRequiredDescription
widstringyesWorkspace ID

Returns 200 OK with a quota object:

FieldTypeDescription
firewall_rules_per_ipintegerMaximum number of firewall rules per IP address
idstring or nullQuota ID, or null when the workspace uses the default limits
iso_countintegerMaximum number of ISOs that can be uploaded
iso_storage_bytesintegerMaximum total ISO size that can be stored (in bytes)
max_bgp_prefixesintegerMaximum number of BGP prefixes that can be announced
max_cpu_coresintegerMaximum vCPUs across the workspace's servers
max_instancesintegerMaximum number of servers the workspace can hold
max_memory_bytesintegerMaximum memory across the workspace's servers (in bytes)
max_ssh_keysintegerMaximum number of SSH keys that can be uploaded
max_storage_bytesintegerMaximum disk across the workspace's servers (in bytes)
max_vpcsintegerMaximum number of VPCs that can be created
ownerobjectWorkspace this quota applies to

Fetch topology ​

GET/v1/workspaces/{wid}/topologyFetch topology

Returns instances, floating IPs, VPCs, dediboxes, and network load balancers with their associations.

Path parameters

NameTypeRequiredDescription
widstringyesWorkspace ID

Returns 200 OK with a topology object:

FieldTypeDescription
instancesobject[]Instance views with id, name, online, sku, and state
ipsobject[]Floating IPs with id, instance_id, address, and protected
vpcsobject[]VPCs with id, name, range, and nullable vni
dediboxesobject[]Dedibox views
net_balancersobject[]Network load balancers with member associations

Invites ​

An invite sends a single-use code to the specified email address. Pending invites expire after seven days. Accepting an invite creates membership with its role and write grants.

Roles are member, admin, and owner. Invite request schemas enumerate all three, but we reject owner because workspace ownership is unique. You may grant only a role below your own. An admin can invite a member. An owner can invite a member or admin.

Writable kinds are instance, dedibox, app, image, net_balancer, disk, and floating_ip. Use * for all kinds. Omitted, null, or empty write_kinds grants no write access. The same values apply to member grant endpoints.

Invite detail responses contain the following fields. We send the code by email and do not return it in the response.

FieldTypeDescription
acceptedstring or nullWhen accepted, if it has been. ISO 8601 timestamp.
emailstring or nullInvited email
expiresstring or nullExpiry time. ISO 8601 timestamp.
idstringInvite ID
rolestring or nullGranted governance role
workspace_idstringWorkspace ID
workspace_namestring or nullWorkspace name
write_kindsstring[]Kinds the member may write

Search workspace invites ​

GET/v1/workspaces/{wid}/invitesSearch workspace invites

Lists pending invites. Requires workspace membership.

Path parameters

NameTypeRequiredDescription
widstringyesWorkspace ID

Query parameters

NameTypeRequiredDescription
qstringnoQuick search by email or ID
idstring[]noList of invite IDs to filter
emailstringnoInvited email to filter
rolestringnoGranted governance role to filter
workspacestring[]noList of workspace IDs to filter

Plus the shared pagination query parameters.

Returns 200 OK with a keyset-paged list of invite summaries. Each summary has id, email, workspace with id and name, role, write_kinds, expires, and accepted.

Search user invites ​

GET/v1/users/{uid}/invitesSearch user invites

Lists pending invitations addressed to the user. Ordinary callers can list only their own invites.

Path parameters

NameTypeRequiredDescription
uidstringyesUser ID, or @me for the current user

Query parameters

NameTypeRequiredDescription
qstringnoQuick search by email or ID
idstring[]noList of invite IDs to filter
emailstringnoInvited email to filter
rolestringnoGranted governance role to filter
workspacestring[]noList of workspace IDs to filter

Plus the shared pagination query parameters.

Returns 200 OK with the same keyset-paged invite summaries as workspace invite search.

Create an invite ​

POST/v1/workspaces/{wid}/invitesCreate an invite

Sends the single-use code to email. The granted role must be below your own. We reject owner.

Path parameters

NameTypeRequiredDescription
widstringyesWorkspace ID

Request body

The JSON body is required.

FieldTypeRequiredDescription
emailstringyesEmail address to invite
rolestringyesGovernance role. Values: member, admin, owner.
write_kindsstring[] or nullnoResource kinds the member may write, ['*'] for all, empty or null for read-only

Returns 201 Created with the invite detail object.

json
{
  "email": "[email protected]",
  "role": "member",
  "write_kinds": [
    "instance",
    "disk"
  ]
}

Look up a pending invite by code ​

GET/v1/invites/lookupLook up a pending invite by code

Does not require authentication. Returns 404 Not Found once the invite has been accepted or expired.

Query parameters

NameTypeRequiredDescription
codestringyesInvite code from the invitation email

Returns 200 OK with the invite detail object.

Accept an invite ​

POST/v1/invitesAccept an invite

Adds the authenticated user to the workspace. Rejects expired or accepted codes, an email mismatch, and existing membership. A workspace requiring two-factor authentication rejects users who have not enabled it.

Request body

The JSON body is required.

FieldTypeRequiredDescription
codestringyesInvite code

Returns 200 OK with the accepted invite detail object.

json
{
  "code": "invite-code-from-email"
}

Fetch an invite ​

GET/v1/invites/{iid}Fetch an invite

Requires membership in the invite's workspace.

Path parameters

NameTypeRequiredDescription
iidstringyesInvite ID

Returns 200 OK with the invite detail object.

Update an invite ​

PATCH/v1/invites/{iid}Update an invite

Updates a pending invite's role and replaces its write grants. We reject accepted invites and owner. The granted role must be below your own. Omitting write_kinds clears its write grants.

Path parameters

NameTypeRequiredDescription
iidstringyesInvite ID

Request body

The JSON body is required.

FieldTypeRequiredDescription
rolestringyesGovernance role. Values: member, admin, owner.
write_kindsstring[] or nullnoResource kinds the member may write, ['*'] for all, empty or null for read-only

Returns 200 OK with the updated invite detail object.

json
{
  "role": "member",
  "write_kinds": [
    "instance"
  ]
}

Delete an invite ​

DELETE/v1/invites/{iid}Delete an invite

Deletes the invitation record. Requires admin or owner. Deleting an accepted invitation does not remove membership. Use the member endpoint to revoke access.

Path parameters

NameTypeRequiredDescription
iidstringyesInvite ID

Returns 202 Accepted with an empty body.

Members ​

Membership is separate from invitation records. Reading members requires membership in the workspace. Changing a member or their grants requires a role strictly above that member. You cannot manage yourself or a peer. Changing a role also requires a role above the new role.

List members ​

GET/v1/workspaces/{wid}/membersList members

Lists workspace members with their role and write grants.

Path parameters

NameTypeRequiredDescription
widstringyesWorkspace ID

Query parameters

NameTypeRequiredDescription
qstringnoQuick search by ID, name or email
idstring[]noList of user IDs to filter
namestringnoUser name to filter, matching any part of the name
emailstringnoUser email to filter, matching any part of the address

Plus the shared pagination query parameters.

Returns 200 OK with a keyset-paged list. Each item has id, name, email, role, and write_kinds.

Fetch a member ​

GET/v1/workspaces/{wid}/members/{uid}Fetch a member

Accepts @me for the current member. Returns 404 Not Found if the user is not a member.

Path parameters

NameTypeRequiredDescription
widstringyesWorkspace ID
uidstringyesUser ID, or @me for the current user

Returns 200 OK with a member object:

FieldTypeDescription
emailstringUser email
namestringUser name
rolestringGovernance role
user_idstringUser ID
write_kindsstring[]Kinds the member may write

Change a member role ​

PUT/v1/workspaces/{wid}/members/{uid}Change a member role

Changes an existing member's role. Membership must already exist. Ownership cannot be granted through this endpoint.

Path parameters

NameTypeRequiredDescription
widstringyesWorkspace ID
uidstringyesUser ID of the member to manage

Request body

The JSON body is required.

FieldTypeRequiredDescription
rolestringyesGovernance role. Values: member, admin.

Returns 204 No Content with an empty body.

json
{
  "role": "member"
}

Remove a member ​

DELETE/v1/workspaces/{wid}/members/{uid}Remove a member

Removes membership and all write grants.

Path parameters

NameTypeRequiredDescription
widstringyesWorkspace ID
uidstringyesUser ID of the member to manage

Returns 204 No Content with an empty body.

Set write grants ​

PUT/v1/workspaces/{wid}/members/{uid}/grantsSet write grants

Replaces all writable kinds for an existing member. An omitted, null, or empty write_kinds clears every write grant.

Path parameters

NameTypeRequiredDescription
widstringyesWorkspace ID
uidstringyesUser ID of the member to manage

Request body

The JSON body is required.

FieldTypeRequiredDescription
write_kindsstring[] or nullnoThe kinds the member may write, replaces the member's current set. An empty list or null clears every write grant

Returns 204 No Content with an empty body.

json
{
  "write_kinds": [
    "instance",
    "disk"
  ]
}

Grant write on a kind ​

PUT/v1/workspaces/{wid}/members/{uid}/grants/{kind}Grant write on a kind

Grants write access to a resource kind for an existing member.

Path parameters

NameTypeRequiredDescription
widstringyesWorkspace ID
uidstringyesUser ID of the member to manage
kindstringyes. Values: instance, dedibox, app, image, net_balancer, disk, floating_ip, *.

Returns 204 No Content with an empty body.

Revoke write on a kind ​

DELETE/v1/workspaces/{wid}/members/{uid}/grants/{kind}Revoke write on a kind

Removes the write grant for the specified kind.

Path parameters

NameTypeRequiredDescription
widstringyesWorkspace ID
uidstringyesUser ID of the member to manage
kindstringyes. Values: instance, dedibox, app, image, net_balancer, disk, floating_ip, *.

Returns 204 No Content with an empty body.