-
Marketing + dev alignment. Marketers and developers agree—they love Butter
-
Easy to use. You don't need to be technical to launch amazing content experiences
-
Perfect ecommerce match. Enhance product detail pages, launch promotions, and more
Content management at any scale
-
Multi-channel & multi-site
Enterprises and Agencies portfolio management. Brands and client sites all in one place.
-
Marketing site
Marketing website for your SaaS, Ecommerce, Marketplace. Built in any tech stack.
-
Blog engine
Say goodbye to WordPress. Branded /blog with built-in SEO. Plugs into your existing website.

Your team will love Butter.
Less Code. Any Stack.
-
Any tech stack. Global Content API that integrates into any tech stack
-
Zero maintenance.We handle scaling, security and maintenance
-
Save time. Instant CMS backend. Get back to more important problems
val client = ButterCMS("YOUR_BUTTER_TOKEN");
# Get all blog posts
queryParameters = HashMap<String, String>()
queryParameters["page"] = "1"
client.data.getPosts(
queryParameters,
callback = object : Callback {
override fun success(response: Posts) {}
override fun failure(error: RestCallError) {}
})
import Butter from 'buttercms';
const butter = Butter("YOUR_BUTTER_TOKEN");
# Get blog posts, case study pages, and main menu
butter.post.list();
butter.page.list('case_studies');
butter.content.retrieve(['main_menu']);
from butter_cms import ButterCMS
client = ButterCMS('YOUR_BUTTER_TOKEN')
# Get blog posts, case study pages, and main menu
client.posts.all()
client.pages.all('case_studies')
client.content_fields.get(['main_menu'])
Butter butter = Butter('YOUR_BUTTER_TOKEN');
# Get blog posts, case study pages, and main menu
butter.post.list();
butter.page.list('case_studies');
butter.content.retrieve(['main_menu']);
import Butter from 'buttercms';
const butter = Butter("YOUR_BUTTER_TOKEN");
# Get blog posts, case study pages, and main menu
butter.post.list();
butter.page.list('case_studies');
butter.content.retrieve(['main_menu']);
ButterCMS.SetAuthToken("YOUR_BUTTER_TOKEN")
# Get all blog posts, case study pages, and main menu
params := map[string]string{
"page": "1",
"page_size": "10",
}
ButterCMS.GetPosts(params)
ButterCMS.GetPages([]string{"case_studies"})
ButterCMS.GetContentFields([]string{"main_menu"})
import Butter from 'buttercms';
const butter = Butter("YOUR_BUTTER_TOKEN");
# Get blog posts, case study pages, and main menu
butter.post.list();
butter.page.list('case_studies');
butter.content.retrieve(['main_menu']);
ButterCMS.SetAuthToken("YOUR_BUTTER_TOKEN")
# Get all blog posts, case study pages, and main menu
params := map[string]string{
"page": "1",
"page_size": "10",
}
ButterCMS.GetPosts(params)
ButterCMS.GetPages([]string{"case_studies"})
ButterCMS.GetContentFields([]string{"main_menu"})
import Butter from 'buttercms';
const butter = Butter("YOUR_BUTTER_TOKEN");
# Get blog posts, case study pages, and main menu
butter.post.list();
butter.page.list('case_studies');
butter.content.retrieve(['main_menu']);
var butter = ButterCMSClient(apiKey: "YOUR_BUTTER_TOKEN")
# Get all blog posts
butter.getPosts(parameters: [
.preview,
.excludeBody,
.page(value: 1),
.pageSize(value: 10)
]) { result in
switch result {
case .success(let posts):
print(Count: \(posts.meta.count)")
posts.data.compactMap() { print("Post: \($0.title)") }
case .failure(let error):
print("getPost failed with Error: \(error)")
}
}
import com.buttercms.IButterCMSClient;
import com.buttercms.ButterCMSClient;
import java.util.Collections;
IButterCMSClient client =
new ButterCMSClient("YOUR_BUTTER_TOKEN");
# Get blog posts, case study pages, and main menu
PostsResponse response = client.getPosts(
Collections.emptyMap());
PagesResponse response = client.getPages(
"case_studies", Collections.emptyMap(),
CaseStudyPage.class);
CollectionResponse response = client.getCollection(
"main_menu", Collections.emptyMap(),
MainMenu.class);
val client = ButterCMS("YOUR_BUTTER_TOKEN");
# Get all blog posts
queryParameters = HashMap<String, String>()
queryParameters["page"] = "1"
client.data.getPosts(
queryParameters,
callback = object : Callback {
override fun success(response: Posts) {}
override fun failure(error: RestCallError) {}
})
use ButterCMS\ButterCMS;
$butter = new ButterCMS('YOUR_BUTTER_TOKEN');
# Get blog posts, case study pages, and main menu
$butter->fetchPosts();
$butter->fetchPages('case_studies');
$butter->fetchContentFields(['main_menu'])
using ButterCMS;
var client =
new ButterCMSClient("YOUR_BUTTER_TOKEN");
# Get blog posts, case study pages, and main menu
client.ListPosts();
client.ListPages<CaseStudiesPage>
('case_studies')
client.RetrieveContentFields<NewsPage>
('main_menu')
import Butter from 'buttercms';
const butter = Butter("YOUR_BUTTER_TOKEN");
# Get blog posts, case study pages, and main menu
butter.post.list();
butter.page.list('case_studies');
butter.content.retrieve(['main_menu']);
var butter = require('buttercms')('YOUR_BUTTER_TOKEN');
# Get blog posts, case study pages, and main menu
butter.post.list();
butter.page.list('case_studies');
butter.content.retrieve(['main_menu']);
import Butter from 'buttercms';
const butter = Butter("YOUR_BUTTER_TOKEN");
# Get blog posts, case study pages, and main menu
butter.post.list();
butter.page.list('case_studies');
butter.content.retrieve(['main_menu']);
use ButterCMS\ButterCMS;
$butter = new ButterCMS('YOUR_BUTTER_TOKEN');
# Get blog posts, case study pages, and main menu
$butter->fetchPosts();
$butter->fetchPages('case_studies');
$butter->fetchContentFields(['main_menu'])
from butter_cms import ButterCMS
client = ButterCMS('YOUR_BUTTER_TOKEN')
# Get blog posts, case study pages, and main menu
client.posts.all()
client.pages.all('case_studies')
client.content_fields.get(['main_menu'])
require 'buttercms-ruby'
ButterCMS::api_token = "YOUR_BUTTER_TOKEN"
# Get blog posts, case study pages, and main menu
ButterCMS::Post.list()
ButterCMS::Page.list('case_studies')
ButterCMS::Content.list(['main_menu'])
import Butter from 'buttercms';
const butter = Butter("YOUR_BUTTER_TOKEN");
# Get blog posts, case study pages, and main menu
butter.post.list();
butter.page.list('case_studies');
butter.content.retrieve(['main_menu']);
require 'buttercms-ruby'
ButterCMS::api_token = "YOUR_BUTTER_TOKEN"
# Get blog posts, case study pages, and main menu
ButterCMS::Post.list()
ButterCMS::Page.list('case_studies')
ButterCMS::Content.list(['main_menu'])
var butter = ButterCMSClient(apiKey: "YOUR_BUTTER_TOKEN")
# Get all blog posts
butter.getPosts(parameters: [
.preview,
.excludeBody,
.page(value: 1),
.pageSize(value: 10)
]) { result in
switch result {
case .success(let posts):
print(Count: \(posts.meta.count)")
posts.data.compactMap() { print("Post: \($0.title)") }
case .failure(let error):
print("getPost failed with Error: \(error)")
}
}
import Butter from 'buttercms';
const butter = Butter("YOUR_BUTTER_TOKEN");
# Get blog posts, case study pages, and main menu
butter.post.list();
butter.page.list('case_studies');
butter.content.retrieve(['main_menu']);
Freedom and Flexibility.
-
Free Yourself. Stop fighting for IT resources. Get content live instantly
-
Centralized. Centralized dashboard to manage all of your content
-
Flexibility. Launch multi-channel content experiences faster
Support at every step.
-
Professional Support. Here to help answer your questions and get you launched quickly.
-
Secure. We're SaaS. Say goodbye to stressing over security patches
-
Scalable. Global CDNs provide maximum performance and availability
The highest-rated headless CMS on G2.
Find out why we take top marks across the board, every quarter.