Primeiros passos
A API foi feita para integrações e agentes que produzem conteúdo. Toda criação começa como rascunho e fica vinculada à chave que a criou.
No painel administrativo, abra Blog → Integrações.
A chave completa é exibida uma única vez.
Use HTML ou declare Markdown explicitamente.
Autenticação
Envie a chave no cabeçalho Authorization de todas as requisições. Nunca coloque o token na URL ou no conteúdo do post.
Authorization: Bearer SUA_CHAVEPermissões
draft:createCria rascunhosdraft:readLista e consultadraft:updateEdita rascunhosdraft:deleteExclui rascunhosEndpoints
/api/cms/postsCriar rascunhoGET /api/cms/postsListar rascunhosGET /api/cms/posts/{id}Consultar rascunhoPATCH /api/cms/posts/{id}Editar traduçãoDELETE /api/cms/posts/{id}Excluir rascunhoCompatibilidade: POST /api/cms/drafts continua disponível como alias legado para criação. Novas integrações devem usar /api/cms/posts.
/api/cms/postsCriar rascunho
Scopedraft:createCria um post em estado draft e adiciona sua primeira tradução.
Corpo da requisição
| Campo | Tipo | Obrigatório | Padrão | Descrição |
|---|---|---|---|---|
locale | string | Não | pt | Idioma da tradução: pt, en ou es. |
title | string | Sim | — | Título entre 3 e 180 caracteres. |
slug | string | Não | Gerado | Identificador na URL, único por idioma. Máximo de 110 caracteres. |
excerpt | string | Não | "" | Resumo do post. Máximo de 360 caracteres. |
content_format | string | Não | html | Formato de content: html ou markdown. |
content | string | Sim | — | Corpo do post com pelo menos 20 caracteres. |
seo_title | string | Não | null | Título para buscadores. Máximo de 180 caracteres. |
seo_description | string | Não | null | Descrição para buscadores. Máximo de 360 caracteres. |
cover_image_url | string | Não | null | URL HTTP ou HTTPS da imagem de capa. |
curl -X POST https://optioai.net/api/cms/posts \
-H "Authorization: Bearer SUA_CHAVE" \
-H "Content-Type: application/json" \
-d '{
"locale": "pt",
"title": "Como agentes locais protegem seus dados",
"slug": "agentes-locais-e-privacidade",
"excerpt": "Entenda por que executar agentes localmente reduz riscos.",
"content_format": "html",
"content": "<h2>Seus dados ficam com você</h2><p>O processamento local reduz a exposição de informações sensíveis.</p>",
"seo_title": "Agentes locais e privacidade",
"seo_description": "Como agentes locais ajudam a manter seus dados sob controle."
}'{
"id": "8f352848-3ef5-4f07-9608-d4f45687fd48",
"status": "draft",
"locale": "pt",
"title": "Como agentes locais protegem seus dados",
"slug": "agentes-locais-e-privacidade",
"excerpt": "Entenda por que executar agentes localmente reduz riscos.",
"content": "<h2>Seus dados ficam com você</h2><p>O processamento local reduz a exposição de informações sensíveis.</p>",
"content_format": "html",
"seo_title": "Agentes locais e privacidade",
"seo_description": "Como agentes locais ajudam a manter seus dados sob controle.",
"cover_image_url": null,
"available_locales": ["pt"],
"created_at": "2026-09-11T14:30:00.000Z",
"updated_at": "2026-09-11T14:30:00.000Z"
}/api/cms/postsListar rascunhos
Scopedraft:readRetorna somente os rascunhos criados pela chave atual, do mais recente para o mais antigo.
limitQuantidade de itens por página.offsetQuantidade de itens a ignorar.localeFiltra por pt, en ou es.curl "https://optioai.net/api/cms/posts?limit=20&offset=0&locale=pt" \
-H "Authorization: Bearer SUA_CHAVE"{
"data": [
{
"id": "8f352848-3ef5-4f07-9608-d4f45687fd48",
"status": "draft",
"locale": "pt",
"title": "Como agentes locais protegem seus dados",
"slug": "agentes-locais-e-privacidade",
"excerpt": "Entenda por que executar agentes localmente reduz riscos.",
"content": "<h2>Seus dados ficam com você</h2><p>O processamento local reduz a exposição de informações sensíveis.</p>",
"content_format": "html",
"seo_title": "Agentes locais e privacidade",
"seo_description": "Como agentes locais ajudam a manter seus dados sob controle.",
"cover_image_url": null,
"available_locales": ["pt"],
"created_at": "2026-09-11T14:30:00.000Z",
"updated_at": "2026-09-11T14:30:00.000Z"
}
],
"pagination": { "limit": 20, "offset": 0, "total": 1 }
}/api/cms/posts/{id}Consultar rascunho
Scopedraft:readRetorna um rascunho específico pertencente à integração. Use ?locale=pt para selecionar a tradução; sem o parâmetro, a API prioriza português.
curl "https://optioai.net/api/cms/posts/8f352848-3ef5-4f07-9608-d4f45687fd48?locale=pt" \
-H "Authorization: Bearer SUA_CHAVE"/api/cms/posts/{id}Editar rascunho
Scopedraft:updateAtualiza a tradução indicada por locale. Envie apenas os campos que deseja alterar; a operação nunca muda o status para publicado.
curl -X PATCH "https://optioai.net/api/cms/posts/8f352848-3ef5-4f07-9608-d4f45687fd48?locale=pt" \
-H "Authorization: Bearer SUA_CHAVE" \
-H "Content-Type: application/json" \
-d '{
"locale": "pt",
"title": "Novo título do post",
"content_format": "html",
"content": "<h2>Conteúdo revisado</h2><p>Nova versão do rascunho.</p>",
"expected_updated_at": "2026-09-11T14:30:00.000Z"
}'/api/cms/posts/{id}Excluir rascunho
Scopedraft:deleteExclui permanentemente o rascunho e suas traduções. A operação não aceita posts já publicados.
curl -X DELETE https://optioai.net/api/cms/posts/8f352848-3ef5-4f07-9608-d4f45687fd48 \
-H "Authorization: Bearer SUA_CHAVE"{
"id": "8f352848-3ef5-4f07-9608-d4f45687fd48",
"deleted": true
}HTML ou Markdown
HTML é o formato padrão e recomendado. Ele oferece controle previsível sobre títulos, parágrafos, listas, links e destaques.
HTML
Use content_format: "html" ou omita o campo.
<h2>Título</h2><p>Texto...</p>Markdown
Use content_format: "markdown". A API converte o conteúdo para HTML antes de salvar.
## Título
Texto com **destaque**{
"locale": "pt",
"title": "Título do post",
"content_format": "markdown",
"content": "## Primeira seção\n\nTexto com **destaque** e uma lista:\n\n- Item um\n- Item dois"
}Erros
Erros usam códigos HTTP convencionais e retornam uma mensagem legível no campo error.
JSON malformado, campo inválido ou conteúdo fora dos limites.
Bearer ausente, chave inválida, revogada ou expirada.
A chave não possui o scope exigido pela operação.
Rascunho inexistente, já publicado ou pertencente a outra chave.
Slug duplicado ou rascunho alterado depois da última leitura.
Não foi possível concluir a operação.
{
"error": {
"code": "insufficient_scope",
"message": "A chave não possui o escopo draft:update.",
"details": { "required_scope": "draft:update" }
}
}Publicação só pelo painel
A API não publica, despublica nem altera posts publicados. Revise a prévia, conteúdo, imagem e SEO no painel administrativo antes de publicar.