POSTCriar post
Cria um post do blog, publicado, agendado ou em rascunho.
Cria um post. O autor é o administrador do token. Se status for published e você não enviar published_at, o post sai agora; com uma data futura ele fica agendado. O texto é sanitizado e os campos de SEO vazios são preenchidos a partir do título e do texto.
/api/v1/admin/blog/postsAdminCria um post do blog
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.
Corpo da requisição
titlestringobrigatórioTítulo do post.
slugstringobrigatórioTrecho 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.
descriptionsobjectConteúdo por idioma, com chave no código do idioma. Cada valor tem
title, body, excerpt, meta_title e meta_description.Exemplo de requisição
bash
curl -X POST "$BASE_URL/api/v1/admin/blog/posts" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"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>",
"category_id": "4e733a25-349a-4598-a916-a0984fc4aa76",
"status": "published",
"tags": [
"mouse",
"periféricos"
]
}'Resposta
201Post criado
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
| 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"} |
| 400 | Corpo inválido, ou falta title ou slug. | {"error":"title and slug are required"} |
| 500 | Categoria inexistente ou outra falha ao gravar. | {"error":"failed to create blog post","detail":"..."} |