Detalha sections & spaces por id
GET/api/spaces/{id}
- Auth
- Public
- Qui peut l’appeler:
- owner
- admin
- moderator
- finance
- Clé d’API:
- community:read
- X-CommunityId
X-CommunityIdEnvoyez le X-CommunityId de la communauté où l’opération a lieu.
Autenticação opcional: o conteúdo retornado varia conforme o membro autenticado.
Responde 403 quando o leitor não alcança o item. A regra é a mesma da listagem e vale também para o deep link por slug. Desde 2026-10-26 o 403 (aqui e em toda rota guardada por space) traz `data: { reason, actions, productIds?, subscriptionGroupIds? }` para a tela oferecer o próximo passo: `reason` é `plan` (uma compra ou assinatura abre; com os produtos ativos e os planos que abrem), `group` (só alguns grupos: peça à equipe), `approval` (há um pedido de cadastro da pessoa esperando a equipe) ou `other` (entrar, participar da comunidade, ou nada a dizer); `actions`: `signIn`, `joinCommunity`, `seePlans`, `buy`, `askTeam`.
Só o space que o leitor vê **com cadeado** se explica, e o `data` ganha `lockReason` e `space: { id, title, slug, icon, description, module, sectionId }` (a tela de oferta). O visitante recebe `signIn` e, se a área é paga, também `buy`/`seePlans` com os ids. O membro sem plano numa comunidade de cadastro pago recebe `reason: plan` com `seePlans` (e `buy` com os ids, se o space pede um produto), nunca `joinCommunity`. Nada à venda cai em `askTeam`. Um space oculto ("Ocultar", só administração, extensão fora do plano) responde `data: { reason: other, actions: [] }`, sem título nem o que libera; o do módulo Link nunca traz a URL.
**Badge:** um space (ou a seção dele) fechado por badge responde `reason: badge` (`lockReason: badge` no cadeado), com a ação `earnBadge`, `badges` (só os **públicos**: `[{ id, name, imageUrl, description }]`; a descrição é onde a equipe diz como conquistar) e `hasHiddenBadge` (`true` quando um badge privado também abre; dele nunca sai nome, imagem nem id). Se o space também vende algo, vêm `buy`/`seePlans`, os ids e as `offers` depois do caminho do badge (engajamento primeiro). Grupo só aparece (`askTeam`) quando nenhum outro caminho existe. O visitante recebe `signIn` com `badges` e `hasHiddenBadge`, sem progresso. Revogar ou apagar o badge fecha o acesso na próxima requisição.
**Nível:** um space (ou a seção dele) aberto "a partir do nível N" responde `reason: level` (`lockReason: level`), a ação `earnPoints` e `level: { id, level, name, minPoints, imageUrl }`. Para o membro com a gamificação ligada vem também `progress: { points, pointsToGo, currentLevel, requirements }`: os pontos da própria pessoa, quantos faltam, o nível atual e as exigências de atividade desse nível com o que ela fez nesta semana (`[{ actionType, spaceId, spaceName, spaceHidden, minCount, thisWeek }]`, os mesmos números do perfil). O nível vem antes do badge, que vem antes da compra. O visitante recebe `level` sem `progress`. Cair de nível (pontos tirados ou a semana sem a atividade) fecha na próxima requisição; subir abre na hora.
O 403 de um space com cadeado traz também `canContactTeam` (boolean): `true` só quando `actions` tem `askTeam`, quem lê é membro, o chat da comunidade está ligado e há alguém da equipe para atender (admin ou moderador online, senão o owner; disponível para conversar e sem bloqueio). O botão "Fale com a equipe" chama `POST /api/chat/contact-team` e só deve aparecer com `true`.
Desde 2026-10-30, o 403 de um space com cadeado cujo próximo passo é comprar ou assinar (`actions` com `buy` ou `seePlans`) traz também `offers: { plans, addOns, products }`, os cards da tela de oferta, nas **mesmas formas** de `GET /api/storefront/spaces/{spaceId}/products`: `plans` (cada plano público e ativo que abre o space, com `fromPrice`, as `options` à venda e `unlocks`, os spaces que o plano abre e que quem lê enxerga no menu; cada opção com `savingsPercentage`, o "Economize X%" da regra única, contado sobre todas as opções do plano; um plano alcançado só por uma das suas opções de cobrança traz só essa opção), `addOns` (os adicionais que abrem, com `availability` para quem lê: `owned`, `add` + `subscriptionId`, `upgrade` ou `subscribe`, e os `plans` que os aceitam) e `products` (os avulsos `ONE_TIME` e `INSTALLMENT`). Só o que `productIds` e `subscriptionGroupIds` apontam, ativo e da comunidade do header; com `seePlans` sem ids (space "Assinantes", qualquer plano), todos os planos públicos. Nunca plano `link_only`, produto inativo, rascunho ou de sistema, nem custo de provedor. Vale também para o visitante deslogado. Um space só de grupos (`reason: group`) não traz `offers` nem nomeia o grupo.
`productIds`, a ação `buy` e `offers.products` só trazem o que o `POST /api/checkout` venderia a quem lê (o mesmo critério do 403 `notPurchasable`: avulso com link direto ou numa Loja que a pessoa abre; evento, curso ou download no space dele que a pessoa abre), nunca opção de cobrança fora de plano; sem nada à venda, cai em `askTeam`. `subscriptionGroupIds` nunca traz plano `link_only`.
A resposta traz, **para quem administra**, os campos opcionais novos `access` (o que o próprio space exige), `requiredBySection` (o que a seção exige — combina com **E**, não é mais item da mesma lista, e vem com `sectionId`, `sectionTitle` e `visibility`) e `accessFromProducts` (os produtos ligados pela tela de produtos, que a tela de space não edita; `access` e `requiredBySection` trazem também `badges`, `[{ id, name, imageUrl, visibility }]`; um badge **privado** só sai para owner e admin: moderador e financeiro recebem só os públicos e `hasHiddenBadge: true`; e `minLevel`, `{ id, level, name, minPoints, imageUrl }` ou `null`), e `adminOnly` (`true` quando só a equipe abre o space — Privada sem ninguém em "Quem tem acesso", nem por produto, ou dentro de uma seção assim).
Para todo leitor, `layout`: como o space lista os itens (`feed`, `cards`, `list`, `compact`, `grid`, `calendar`); `null` = o padrão do módulo (`layouts.default` em `GET /api/spaces/modules`).
Paramètres
| Nom | Emplacement | Type | Description |
|---|---|---|---|
idobligatoire | path | string (uuid) |
En-têtes
| Nom | Type | Description |
|---|---|---|
X-CommunityIdfacultatif | string (uuid) | ID da comunidade em que a operação acontece. Obrigatório na maioria dos endpoints com escopo de comunidade. |
Réponses
| Statut | Description |
|---|---|
200 | Operação realizada com sucesso. |
400 | Requisição inválida — falha de validação. |
403 | O leitor não abre este space; `data` diz por quê e o próximo passo. |
404 | Recurso não encontrado. |
500 | Erro interno do servidor. |
Exemple curl
curl -X GET "https://api.memberfy.net/api/spaces/<id>" \
-H "X-CommunityId: $COMMUNITY_ID"