Atualizar e apagar post
Altera parcialmente um post, reagenda ou apaga.
Atualizar post
Atualiza só os campos enviados. Ao mudar o estado para published sem enviar published_at, a data de publicação é preenchida com o momento atual (se o post nunca foi publicado). Reagendar é só enviar um novo published_at.
/api/v1/admin/blog/posts/{id}AdminAltera campos de um post
Rota ligada ao módulo blog: com o módulo desligado a resposta é 403. Leitura exige manage_content ou view_content; escrita exige manage_content.
Parâmetros de caminho
iduuidobrigatórioIdentificador do post.
Corpo da requisição
titlestringTítulo do post.
slugstringTrecho da URL. Na criação, se já existe, a plataforma acrescenta
-2, -3...; na atualização, um slug repetido é recusado.excerptstringResumo para as listas.
bodystringTexto do post. HTML é sanitizado (scripts e atributos de evento saem).
featured_imagestringURL da imagem de destaque.
category_iduuidCategoria do blog (veja Categorias).
statusstringpadrão: draftdraftpublishedarchivedEstado do post.
tagsarrayEtiquetas (strings).
meta_titlestringTítulo para buscadores.
meta_descriptionstringDescrição para buscadores.
published_atstringQuando vai ao ar (RFC 3339). Uma data futura agenda o post: a vitrine o esconde até lá. Sem ela, um post
published sai agora.vendor_iduuidAtribui o post a um seller. Omita para post da loja.
Exemplo de requisição (Atualizar post)
bash
curl -X PUT "$BASE_URL/api/v1/admin/blog/posts/91af684b-cf41-4243-a37d-a133a39d6ed3" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"status": "published"
}'Resposta (Atualizar post)
200Post atualizado
json
{
"id": "91af684b-cf41-4243-a37d-a133a39d6ed3",
"title": "Como escolher o mouse perfeito",
"slug": "como-escolher-o-mouse-perfeito",
"excerpt": "Guia prático com 5 passos.",
"body": "<h2>Por que o mouse importa</h2><p>...</p>",
"author_id": "d4613dde-ac7a-431c-9232-50d8cd6ad5fc",
"category_id": "4e733a25-349a-4598-a916-a0984fc4aa76",
"category_name": "Guia de compras",
"tags": [
"mouse",
"periféricos"
],
"meta_title": "Como escolher o mouse perfeito",
"meta_description": "Guia prático com 5 passos.",
"published_at": "2026-09-09T14:52:00Z",
"view_count": 0,
"created_at": "2026-09-09T14:52:13.16253Z",
"updated_at": "2026-09-09T14:56:05.04101Z",
"post_id": "91af684b-cf41-4243-a37d-a133a39d6ed3",
"page_id": "91af684b-cf41-4243-a37d-a133a39d6ed3",
"page_title": "Como escolher o mouse perfeito",
"seo_name": "como-escolher-o-mouse-perfeito",
"description": "<h2>Por que o mouse importa</h2><p>...</p>",
"short_description": "Guia prático com 5 passos.",
"timestamp": 1788965533,
"updated_timestamp": 1788965765,
"published_timestamp": 1788965520,
"company_id": "d4613dde-ac7a-431c-9232-50d8cd6ad5fc",
"status": "A"
}Campos da resposta
iduuidIdentificador do post.
titlestringTítulo.
slugstringTrecho da URL pública do post. Único.
excerptstringResumo mostrado nas listas. Ausente quando vazio.
bodystringTexto do post (HTML sanitizado ou Markdown, conforme foi enviado).
featured_imagestringURL da imagem de destaque. Ausente quando não há.
author_iduuidUsuário que criou o post.
category_iduuidCategoria do post. Ausente quando não tem.
category_namestringNome da categoria, para exibir.
statusstringLetra do estado:
A publicado, R rascunho, D arquivado.tagsarrayEtiquetas livres (strings).
meta_titlestringTítulo para buscadores. Se você não enviar, copia o título.
meta_descriptionstringDescrição para buscadores. Se você não enviar, usa os primeiros 160 caracteres do texto.
published_atstringQuando o post vai ao ar (RFC 3339). Data futura = agendado. Ausente em rascunho.
view_countintegerVisualizações na vitrine.
vendor_iduuidSeller dono do post. Ausente em post da loja.
created_atstringCriação, RFC 3339.
updated_atstringÚltima alteração, RFC 3339.
Erros (Atualizar post)
| Status | Quando | Exemplo de corpo |
|---|---|---|
| 401 | Token ausente, inválido ou expirado. | {"error":"invalid or expired token"} |
| 403 | O administrador não tem o privilégio exigido. | {"error":"insufficient privileges","required":"manage_content"} |
| 500 | Post inexistente, slug já usado por outro post, ou id que não é UUID. Todos respondem 500. | {"error":"failed to update blog post","detail":"blog post not found"} |
Apagar post
Remove o post e libera o slug. O sitemap da loja é atualizado. Para tirar um post do ar sem perdê-lo, mude o estado para archived ou draft.
/api/v1/admin/blog/posts/{id}AdminApaga um post definitivamente
Rota ligada ao módulo blog: com o módulo desligado a resposta é 403. Leitura exige manage_content ou view_content; escrita exige manage_content.
Parâmetros de caminho
iduuidobrigatórioIdentificador do post.
Exemplo de requisição (Apagar post)
bash
curl -X DELETE "$BASE_URL/api/v1/admin/blog/posts/91af684b-cf41-4243-a37d-a133a39d6ed3" \
-H "Authorization: Bearer $TOKEN"Resposta (Apagar post)
200Post apagado
json
{
"message": "blog post deleted"
}Erros (Apagar post)
| Status | Quando | Exemplo de corpo |
|---|---|---|
| 401 | Token ausente, inválido ou expirado. | {"error":"invalid or expired token"} |
| 403 | O administrador não tem o privilégio exigido. | {"error":"insufficient privileges","required":"manage_content"} |
| 500 | O post não existe (ou já foi apagado), ou o id não é UUID. | {"error":"failed to delete blog post","detail":"blog post not found"} |