---
title: "Update Blog Post"
method: PATCH
path: "/blogs/posts/{id}"
tags: ["Blogs::Post"]
---

# Update Blog Post

`PATCH /blogs/posts/{id}`

Update a blog post.

Pass `markup` to update the post's visual content via PML. Invalid markup returns 400 and neither the post metadata nor the markup is saved. Pass `expand[]=markup` to have the markup returned in the response.

## Path parameters

- `id` string, required

## Query parameters

- `expand[]` string[]

## Request body

- object
  - `blogs_post` BlogsPostParameters — Blog Posts
    - `title` string — Title of the post
    - `visibility` 'draft' | 'public' | 'members_only' | 'scheduled' — Visibility status. One of `draft`, `public`, `members_only`, or `scheduled`.
    - `published_at` string, date-time, nullable — Date and time to publish the post. Required when visibility is `scheduled`.
    - `excerpt_content` string, nullable — Short summary of the blog post
    - `seo_title` string, nullable — SEO page title
    - `seo_description` string, nullable — SEO page description
    - `image_id` integer, nullable — Featured image ID
    - `markup` string, nullable — PML (Page Markup Language) that builds the post's content tree (its page_content) — this IS the post body that renders. Replaces the existing tree. Validated before any DB write; invalid markup returns 400 and the post is not created or updated.
    - `author_ids` integer[] — IDs of authors to associate with the post
    - `tag_ids` integer[] — IDs of tags to associate with the post
    - `category_ids` integer[] — IDs of categories to associate with the post

## Response `200`

OK

- BlogsPostAttributes — Blog Posts
  - `id` integer — Post ID
  - `public_id` string — The public identifier of the post
  - `blog_id` integer — Blog ID that the post belongs to
  - `title` string — Title of the post
  - `published_at` string, date-time, nullable — Date and time the post was published
  - `current_path` string — The URL path for the post
  - `url` string — The full public URL of the post
  - `visibility` 'draft' | 'public' | 'members_only' | 'scheduled' — Visibility status of the post. One of `draft`, `public`, `members_only`, or `scheduled`.
  - `excerpt_content` string, nullable — Short summary of the blog post
  - `seo_title` string, nullable — SEO page title
  - `seo_description` string, nullable — SEO page description
  - `image_id` integer, nullable — Featured image ID
  - `image_url` string, nullable — URL of the featured image
  - `categories` object[] — Categories associated with the post
    - `name` string — Category name
  - `tags` object[] — Tags associated with the post
    - `name` string — Tag name
  - `authors` object[] — Authors associated with the post
    - `first_name` string — Author's first name
    - `last_name` string — Author's last name
    - `email_address` string — Author's email address
  - `markup` string — **Expandable** The PML (Page Markup Language) representation of the post's visual content. Only returned when expand[]=markup is provided. Empty string when the post has no visual content yet. See the [Page Markup Skill](https://accounts.myclickfunnels.com/.well-known/page-markup/skill.md) for the full DSL reference.
  - `created_at` string, date-time — Created at
  - `updated_at` string, date-time — Updated at

## Other responses

- `400` — Bad Request
- `401` — Unauthorized
- `403` — Forbidden
- `404` — Not Found
- `422` — Unprocessable Entity

---

[API](https://skmtc.net/myclickfunnels/apis/clickfunnels-api.md) · [All operations](https://skmtc.net/myclickfunnels/apis/clickfunnels-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/myclickfunnels/clickfunnels-api/revisions/ae6313eaa176/schema)
