Aller au contenu

Cria ou executa content

POST/api/content

Auth
Jeton requis
Qui peut l’appeler:
owner
admin
moderator
Clé d’API:
content:write
X-CommunityId
X-CommunityId Envoyez le X-CommunityId de la communauté où l’opération a lieu.
Les descriptions des endpoints viennent directement de la spécification de l’API et sont en portugais pour l’instant. L’interface autour est traduite.

Links no corpo (até 5) viram `embeds` (ver `LinkEmbed`): os já resolvidos pelo editor (`POST /api/embeds/resolve`) voltam na hora; os demais são preenchidos em segundo plano. Editar o corpo recalcula. Sem links, `embeds` é `[]`. Sujeito a verificação de papel (RBAC). Além disso, respeita o `canCreate` do space: `staff` aceita owner, admin, moderator e finance; `admins` aceita owner e admin; `anyone` não restringe. Fora da regra, 403 com `errors[0].param = "spaceId"`. SuperAdmin sempre passa. Com `poll`, o post vira uma enquete (ver `PollInput`): só owner, admin e moderador; outro papel recebe 403 com `errors[0].param = "poll"` e nada é gravado. A resposta traz `poll` (schema `Poll`), ou `null` sem enquete; as listas trazem o mesmo campo. Enquete só em espaço de Feed ou de Conteúdo: em espaço de outro módulo, 400 com `errors[0].param = "poll"`. **Aviso por e-mail:** post de owner, admin ou moderador com `notifyByEmail` (padrão ligado) avisa, 10 minutos depois, quem tem acesso ao espaço e ao post e tem a categoria "Posts e conteúdos" ligada (em moderação, só quando aprovado). Post de membro, retroativo (`publishedAt` no passado) ou em nome de outro (`authorMemberId`) nunca avisa. A resposta traz `data.emailNotice` (`EmailNoticeResult`).

En-têtes

NomTypeDescription
X-CommunityIdfacultatifstring (uuid)ID da comunidade em que a operação acontece. Obrigatório na maioria dos endpoints com escopo de comunidade.

Corps de la requête application/json

NomTypeDescription
spaceIdfacultatifstring (uuid)Valid space ID required if provided
titleobligatoirestringTitle is required
typeobligatoiretext | image | video | linkValid content type is required
videoUrlfacultatifstringVídeo externo (link). Não coexiste com `videoMediaId`.
videoMediaIdfacultatifstring (uuid)Vídeo hospedado, enviado por `POST /api/media/upload-url` (finalidade `contentVideo`) e confirmado em `POST /api/media/confirm`. A mídia é privada: a resposta traz `videoMediaId` (e `videoUrl: null`) e o player pede o link em `GET /api/media/{id}/url`.
publishedAtfacultatifstring (date-time)Data de publicação (ISO 8601). Só owner e admin (e o SuperAdmin) podem enviar; outros papéis recebem 403 com `errors[0].param = "publishedAt"`. Precisa ser passada ou agora: no futuro, 400. Sem o campo, vale o momento da gravação. Mais de 5 minutos no passado, o post entra em silêncio (sem pontos de engajamento, fora do bloco de novidades dos e-mails e sem o selo de novo). A resposta e as listas trazem `publishedAt`, e o feed ordena por ele; `createdAt` continua sendo o momento real da gravação.
notifyByEmailfacultatifbooleanAvisar por e-mail (regras em NotifyByEmailInput).
authorMemberIdfacultatifstring (uuid)Publica em nome de outro membro (para importar posts de outras pessoas). Só owner e admin (e o SuperAdmin) podem enviar; outros papéis recebem 403 com `errors[0].param = "authorMemberId"`. O perfil precisa ser da comunidade do `X-CommunityId` e estar ativo: senão 404 (id malformado, 400). Só em nome de quem tem papel abaixo do seu: owner sobre admin, moderador, financeiro e membro; admin sobre moderador, financeiro e membro; SuperAdmin sobre qualquer um (senão 403). O post aparece como sendo desse perfil e entra sempre em silêncio, qualquer que seja a data: sem pontos de engajamento para ninguém, sem notificação, fora do bloco de novidades dos e-mails, dos destaques (trending) e sem o selo de novo. O log da comunidade (`GET /api/logs`, tipo `team`) registra quem publicou em nome de quem. Depois, editar e excluir seguem o autor, como em qualquer post.
publishAtfacultatifstring (date-time)Agendar: o post sai neste momento (no máximo 1 minuto e pouco depois), uma vez só. Quem pode publicar no espaço pode agendar. Precisa ser depois de agora e até 1 ano à frente (senão 400, `errors[0].param = "publishAt"`, com `code` `past`, `tooFar` ou `invalid`); junto com `publishedAt`, 400 `withPublishedAt`. Até a hora, o post não aparece para ninguém além do autor e da equipe (feed, espaço, busca, tags, em alta, MCP, newsletter, RSS, página pública; o link direto dá 404 aos outros) e nada o anuncia: pontos, feed, e-mail de aviso (`notifyByEmail` fica guardado para a hora), automações e webhooks saem na publicação, e o autor recebe no sino "seu post foi publicado" (`posts.scheduledPublished`). A resposta traz `schedule: { status, publishAt, failure }` (`status` `scheduled`; null num post não agendado) e, em conteúdo, `emailNotice.reason = "postScheduled"`. Lista: `GET /api/scheduled-posts`.
commentsDisabledfacultatifbooleanComentários desligados: os que já existem continuam visíveis, mas ninguém comenta, nem a equipe (403 com `errors[0].code = "comments_closed"`). Reações continuam. A resposta traz `commentsDisabled` e `canToggleComments`.
tagsfacultatifstring[]As tags do post, como devem aparecer. Cada uma é aparada, perde o `#` da frente e os espaços repetidos; vazias saem e repetidas (sem diferença de maiúscula e acento) ficam uma vez, na ordem enviada. No máximo 10 tags de até 40 caracteres: acima disso, ou com item que não é texto, 400 com `errors[0].param = "tags"`. No `PUT`, a lista substitui a anterior; `[]` ou `null` limpa. A resposta e as listas trazem `tags` (sempre um array), e `?tag=` em `GET /api/feed` e `GET /api/content` filtra por uma delas.
pollfacultatifobjectEnquete de um post. Vai no campo `poll` de `POST /api/status` (espaço de Feed) ou de `POST /api/content` (espaço de Conteúdo); o texto (ou o título) do post é a pergunta. Só owner, admin e moderador (e o SuperAdmin) podem enviar: outros papéis recebem 403 com `errors[0].param = "poll"`, e nada é gravado. Curtidas, comentários, moderação, notificações e exclusão são os do post.
poll.optionsobligatoireobject[]De 2 a 10 opções, na ordem em que aparecem. Cada uma é um texto de 1 a 100 caracteres (ou `{ text }`); repetidas (sem diferenciar maiúsculas) dão 400.
poll.allowMultiplefacultatifbooleanPermite marcar mais de uma opção.
poll.closesAtfacultatifstring (date-time)Prazo opcional (ISO 8601), sempre no futuro (senão 400). Depois dele o voto é recusado (409) e o resultado fica visível para todos.

Réponses

StatutDescription
201Operação realizada com sucesso.
400Requisição inválida — falha de validação.
401Token ausente, inválido ou expirado; token de outra comunidade (o `X-CommunityId` ou o `communityId` do corpo não é o do token); token antigo ou de uma sessão encerrada (troca de senha, convite aceito). Nesses casos a mensagem pede para entrar de novo (`auth.signInAgain`).
403Autenticado, mas sem permissão para esta operação.
404Recurso não encontrado.
500Erro interno do servidor.

Exemple curl

curl -X POST "https://api.memberfy.net/api/content" \
  -H "Authorization: Bearer $TOKEN" \
  -H "X-CommunityId: $COMMUNITY_ID" \
  -H "Content-Type: application/json" \
  -d '{"title":"string","type":"text"}'