Pular para o conteúdo

PATCH /v1/posts/:id

Aplique um patch parcial em um post que já existe. Só os campos que você envia mudam — tudo o que você omite fica exatamente como está.

  • URL: https://api.canverly.com/v1/posts/{id}
  • Método: PATCH
  • Auth: chave de API Bearer — escopo posts:write
  • Content-Type: application/json
  • Limite de requisição: 60 req/min por chave

Uma chave só edita posts do próprio site: um id que pertence a outro site retorna 404, nunca 403.

Campo Tipo Observações
title string Ignorado quando vazio ou só com espaços em branco.
blocks_json object Um documento de blocos completo. Ele substitui o corpo e passa pela mesma etapa de normalização + sanitização por allowlist da criação.
excerpt string Também gravado na description de SEO do post.
category_slugs string[] Substitui a lista de categorias.
tag_slugs string[] Substitui a lista de tags.
published_at string RFC-3339. Move ou retroage a data de publicação de um post no ar e dispara de novo o ping do IndexNow no upstream.

Um corpo sem nenhum desses campos — ou cujo único campo era um title vazio — é um 400 no updatable fields provided, não uma ida e volta silenciosa sem efeito.

Escopo: posts:write. Tira do ar um post publicado: ele passa para archived, o evento de despublicação é emitido e a página em cache é purgada — então o artigo deixa de poder ser lido na hora, não quando um TTL expira.

reference é o id do post ou o slug dele; adicione ?language= quando o mesmo slug existir em mais de um idioma.

Janela do terminal
curl -X POST https://api.canverly.com/v1/posts/como-fazer-x/unpublish -H "Authorization: Bearer ck_live_xxx"
{ "id": "01J8ZQ7X4K2N5M9P0R3T6V8W1Y", "slug": "como-fazer-x", "status": "archived" }

Um post que não está publicado retorna 409 — um conflito de estado, não uma falha do servidor. Essa distinção não é cosmética: antes a resposta era 500 internal error, e a plataforma oculta o corpo das respostas 5xx, então a única frase que dizia o que fazer de diferente era apagada no caminho.

Corrigir um erro de digitação no título e atualizar o resumo:

Janela do terminal
curl -X PATCH https://api.canverly.com/v1/posts/01J8ZQ7X4K2N5M9P0R3T6V8W1Y \
-H "Authorization: Bearer ck_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"title": "How to do X, properly",
"excerpt": "A corrected one-sentence summary."
}'

Substituir o corpo:

Janela do terminal
curl -X PATCH https://api.canverly.com/v1/posts/01J8ZQ7X4K2N5M9P0R3T6V8W1Y \
-H "Authorization: Bearer ck_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"blocks_json": {
"v": 1,
"blocks": [
{ "id": "h1", "type": "heading", "attrs": { "level": 2 }, "text": "Rewritten" },
{ "id": "p1", "type": "paragraph", "text": "New body text." }
]
}
}'

Retroagir a data de um post — o caso de campanha para o qual esta rota existe:

Janela do terminal
curl -X PATCH https://api.canverly.com/v1/posts/01J8ZQ7X4K2N5M9P0R3T6V8W1Y \
-H "Authorization: Bearer ck_live_xxx" \
-H "Content-Type: application/json" \
-d '{ "published_at": "2026-05-14T09:00:00Z" }'

Trocar tags e categorias:

Janela do terminal
curl -X PATCH https://api.canverly.com/v1/posts/01J8ZQ7X4K2N5M9P0R3T6V8W1Y \
-H "Authorization: Bearer ck_live_xxx" \
-H "Content-Type: application/json" \
-d '{ "category_slugs": ["news", "opinion"], "tag_slugs": ["api"] }'

O registro do post atualizado, como o serviço de conteúdo o armazena. Esta é a representação interna, não o formato público enxuto retornado por GET /v1/posts/{reference}:

{
"id": "01J8ZQ7X4K2N5M9P0R3T6V8W1Y",
"site_id": "01KVPWYKT6AJDGG2EJN7DW4VT5",
"org_id": "01KVPWYKT6AJDGG2EJN7DW4VT4",
"type": "post",
"post_type_slug": "post",
"status": "published",
"slug": "how-to-do-x",
"title": "How to do X, properly",
"excerpt": "A corrected one-sentence summary.",
"blocks_json": { "v": 1, "blocks": [] },
"seo_json": { "description": "A corrected one-sentence summary." },
"fields": {},
"author_id": "01KVPWYKT6AJDGG2EJN7DW4VT3",
"persona_id": null,
"featured_image_id": null,
"published_at": "2026-05-14T09:00:00Z",
"canonical_url": "",
"access": "public",
"language": "pt-BR",
"is_primary_translation": true,
"created_at": "2026-05-14T09:00:00Z",
"updated_at": "2026-08-26T11:04:00Z"
}

Leia id, slug, status, published_at e updated_at dele; trate o resto como informativo. Campos novos podem aparecer aqui sem aviso.

Envelope: { "error": { "code", "message" } }. Tabela completa em Erros e limites de requisição.

Status error.code Quando
400 bad_request Patch vazio (no updatable fields provided) ou JSON malformado.
401 unauthorized Chave ausente/inválida/revogada.
403 forbidden A chave não tem posts:write.
404 not_found Não existe esse post neste site.
429 rate_limited Acima de 60 req/min — respeite o Retry-After.
502 upstream Transitório; tente de novo com backoff.