Create a new blog post via the Write API with support for draft status, author assignment, category tagging, and media integration.
title (post title) and slug (URL-friendly identifier). The slug must be unique across all posts in your organization and will become part of the post’s permanent URL.
Author Management: The author must already exist in your ButterCMS account before creating posts. You can specify the author by email address or slug. If no author is specified, the post will be automatically assigned to your organization owner, ensuring every post has proper attribution.
Dynamic Categorization: Categories and tags can be provided as string arrays in your request. If you specify categories or tags that don’t exist yet, they will be automatically created in your account, making it easy to expand your content taxonomy organically.
Media Integration: Featured images are always uploaded to your ButterCMS media library for reliable hosting. For images within the post body content, set upload_images_to_media_library=true to automatically download and host external images through ButterCMS’s CDN infrastructure.
Publication & Scheduling: Blog posts default to draft unless status=published is provided. Scheduling future publication is not supported via the Write API; scheduling-related fields will result in validation errors.
Asynchronous Processing: This endpoint returns 202 Accepted immediately to ensure fast response times for your application. The actual post creation, including media processing, category creation, and webhook notifications, happens in the background processing queue.Write-enabled API token required for creating content.
The API token you use for reading from the ButterCMS API will not allow you to create content in the API. For this you will need to use a different write-enabled token. Chat or email support@buttercms.com to get yours.
Set the Authorization header to Token your_write_api_token.
Example: Authorization: Token abc123def456
Your write-enabled token should never be used anywhere it would be exposed, e.g. in client-side JavaScript.
Request schema for creating a new blog post
The title of the blog post
200"This is a blog post"
The slug of the blog post (must be unique).
Auto-Generation: If not provided, the slug will be automatically generated from the title using unicode slugification. You can provide a custom slug or let the API generate one for you.
100"this-is-a-blog-post"
The status of the post. Defaults to 'draft'. Cannot be 'scheduled'.
draft, published "published"
Author reference for blog posts. Author must exist in your account prior to POST.
You can specify the author either by email or by slug. If no author is specified, defaults to the organization owner.
Array of category names. Categories will be created if they don't exist.
["Recipes", "Meals"]Array of tag names. Tags will be created if they don't exist.
["Butter", "Sushi", "Really Good Recipes"]Can be a remote URL to an image.
The image will always be uploaded to the media library (the value of upload_images_to_media_library is ignored for featured images).
"https://farm1.staticflickr.com/836/42903355654_8faa21171a_m_d.jpg"
Alt text for the featured image
250"Featured image alt text example."
Should be a string of escaped HTML.
In case it contains any remote URLs to images, the upload_images_to_media_library flag controls the behavior.
"<h1>Butter</h1><p>I am so hungry!</p>"
Plain-text summary of the blog post
2000"This is a blog post summary."
SEO title for HTML title tag
100"This is a blog post"
Meta description for SEO and social sharing
"This is a blog post to test the API."
Defaults to false.
If set to true, any image URLs in the body property will be uploaded to the Butter Media Library and the original URL will be replaced with the media library URL.
Note: Featured images are always uploaded regardless of this setting.
false
Accepted - Post Creation Initiated
A validated POST request will return a response with HTTP status code 202. Full post creation occurs asynchronously, meaning a successfully created post may not show immediately.
Posts are validated prior to returning the API response but it is also possible that post creation may fail after returning a 202 response. If this happens please contact support.
Success response for blog post creation (202 Accepted)
Indicates that the blog post creation is being processed asynchronously
pending "pending"