> ## Documentation Index
> Fetch the complete documentation index at: https://docs.squarecloud.app/llms.txt
> Use this file to discover all available pages before exploring further.

# SDK Python: workspaces e membros

> Crie e gerencie workspaces, convide membros, defina cargos e compartilhe aplicações com client.workspaces. Acesse uma aplicação compartilhada pelo id composto.

Um workspace compartilha aplicações com outros usuários da Square Cloud, cada um com um cargo. `client.workspaces` gerencia os workspaces, `client.workspaces.members` seus membros e `client.workspaces.apps` as aplicações compartilhadas.

Criar workspaces requer um plano Standard, Pro ou Enterprise.

Os exemplos usam o `client` de [Criando o cliente](/pt-br/sdks/py/client#criando-o-cliente). `workspace_id` é o id de um workspace (`workspaces.list()` lista todos), `app_id` o id de uma das suas aplicações e `member_id` o `id` de um membro.

## Workspaces

```python theme={"system"}
created = client.workspaces.create("My team")
workspace_id = created["id"]

workspaces = client.workspaces.list()
workspace = client.workspaces.get(workspace_id)

print(workspace["name"], workspace["owner"], workspace["createdAt"])

for member in workspace["members"]:
    print(member["id"], member["name"], member["group"], member["joinedAt"])
for app in workspace["applications"]:
    print(app["id"], app["name"], app["lang"], app["ram"])

client.workspaces.leave(workspace_id)   # as a member
client.workspaces.delete(workspace_id)  # as the owner
```

| Campo | Descrição |
| - | - |
| `id` | 32 caracteres hexadecimais (workspaces mais antigos mantêm um id de 40 caracteres) |
| `name` | Nome do workspace (de 1 a 32 caracteres) |
| `owner` | Id do usuário dono |
| `members` | `{ id, name, group, joinedAt }`. `name` é `None` quando não pode ser resolvido (uma conta excluída) |
| `applications` | `{ id, name, desc, ram, lang, domain?, custom? }` |
| `createdAt` | Data de criação |

O dono não pode sair (400 `CANNOT_LEAVE_OWNER`): exclua o workspace em vez disso.

## Membros

Adicionar um membro requer um **código de convite** que o membro gera com `members.invite_code()`. O código é válido por **5 minutos**.

```python theme={"system"}
# The member runs this and sends you the code
code = client.workspaces.members.invite_code()

# The owner adds them with a role
client.workspaces.members.add(workspace_id, code, "maintain")

client.workspaces.members.update(workspace_id, member_id, "view")
client.workspaces.members.remove(workspace_id, member_id)
```

Cargos (`group`): `view`, `manager`, `maintain` e `admin`. Chamar um método que seu cargo não permite resulta em 403 `PERMISSION_DENIED`.

## Aplicações compartilhadas

```python theme={"system"}
client.workspaces.apps.add(workspace_id, app_id)
client.workspaces.apps.remove(workspace_id, app_id)
```

Um workspace pode conter até 100 aplicações (400 `APPLICATIONS_LIMIT_REACHED`).

### Atuando sobre uma aplicação compartilhada

Para atuar sobre uma aplicação compartilhada com você, passe o id composto `<appId>-<workspaceId>` para qualquer método de `client.apps`. `workspaces.get()` e `workspaces.list()` retornam ids brutos, então monte-o você mesmo:

```python theme={"system"}
workspace = client.workspaces.get(workspace_id)

for app in workspace["applications"]:
    status = client.apps.status(f"{app['id']}-{workspace['id']}")
    print(app["name"], status["running"])

# Status of every app of the workspace in one request
statuses = client.apps.status_all(workspace_id=workspace_id)
```

## Erros

As rotas de workspace enviam os ids no corpo da requisição, então um id vazio resulta em 400 `INVALID_ID` vindo do servidor (não é um erro local). A exceção é `workspaces.get()`, cujo id fica no caminho da URL: nele, um id vazio falha localmente.

| Status | Código | Quando |
| - | - | - |
| 400 | `INVALID_NAME` | O nome não tem de 1 a 32 caracteres |
| 400 | `WORKSPACE_LIMIT_REACHED`, `MEMBERS_LIMIT_REACHED`, `APPLICATIONS_LIMIT_REACHED` | Um limite do plano ou do workspace foi atingido |
| 400 | `INVALID_CODE` | O código de convite está ausente, malformado ou expirado |
| 400 | `INVALID_GROUP` | O cargo não é `view`, `manager`, `maintain` nem `admin` |
| 400 | `CANNOT_INVITE_OWNER`, `CANNOT_EDIT_OWNER`, `CANNOT_LEAVE_OWNER` | A ação não se aplica ao dono |
| 400 | `MEMBER_ALREADY_ADDED`, `APP_ALREADY_IN_WORKSPACE` | Já está no workspace |
| 403 | `UPGRADE_REQUIRED` | O plano não permite criar workspaces |
| 403 | `PERMISSION_DENIED` | Seu cargo não permite a ação |
| 404 | `WORKSPACE_NOT_FOUND`, `MEMBER_NOT_FOUND`, `APP_NOT_FOUND` | Não encontrado |

## Próximos passos

<CardGroup cols={3}>
  <Card title="IA" icon="robot" href="/pt-br/sdks/py/ai">
    Chat completions pelo AI Gateway.
  </Card>

  <Card title="Referência da API de workspaces" icon="code" href="/pt-br/api-reference/endpoint/workspace/list">
    Os endpoints REST por trás destes métodos.
  </Card>

  <Card title="Workspaces pela CLI" icon="terminal" href="/pt-br/cli-reference/workspaces">
    As mesmas ações pelo terminal.
  </Card>
</CardGroup>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.