SDK Reference
Complete reference for the FeedGen CMS SDK available to plugins and themes.
Content API
Access posts, categories, authors, and tags.
sdk.content.getPosts(options)
Get paginated posts.
const result = await sdk.content.getPosts({
filter: { category: 'news' },
page: 1,
limit: 10,
sort: 'createdAt',
order: 'desc'
});
// Returns:
{
items: [...], // Array of posts
total: 100, // Total count
page: 1, // Current page
pages: 10 // Total pages
}sdk.content.getPost(idOrSlug)
Get a single post by ID or slug.
const post = await sdk.content.getPost('my-post-slug');
const post = await sdk.content.getPost('507f1f77bcf86cd799439011');sdk.content.getLatestPosts(limit)
Get latest posts.
const latest = await sdk.content.getLatestPosts(10);sdk.content.getFeaturedPosts(limit)
Get featured posts.
const featured = await sdk.content.getFeaturedPosts(6);sdk.content.searchPosts(query, options)
Search posts.
const results = await sdk.content.searchPosts('search term', {
limit: 20
});sdk.content.getCategories()
Get all categories.
const categories = await sdk.content.getCategories();sdk.content.getCategory(idOrSlug)
Get a single category.
const category = await sdk.content.getCategory('news');sdk.content.getAuthors()
Get all authors.
const authors = await sdk.content.getAuthors();sdk.content.getAuthor(idOrSlug)
Get a single author.
const author = await sdk.content.getAuthor('john-doe');sdk.content.getTags(options)
Get tags.
const tags = await sdk.content.getTags({ limit: 50 });Media API
Handle images and media files.
sdk.media.getImageUrl(imageData, size)
Get image URL for a specific size.
const url = sdk.media.getImageUrl(post.featuredImageData, 'md');
// Sizes: 'xs', 'sm', 'md', 'lg', 'xl'sdk.media.getSrcSet(imageData, sizes)
Generate srcset for responsive images.
const srcset = sdk.media.getSrcSet(imageData, ['sm', 'md', 'lg']);
// Returns: "image-sm.jpg 640w, image-md.jpg 1024w, image-lg.jpg 1920w"sdk.media.getPictureElement(imageData, options)
Generate a picture element HTML.
const html = sdk.media.getPictureElement(imageData, {
sizes: '(max-width: 640px) 100vw, 50vw',
alt: 'Image description',
className: 'my-image',
loading: 'lazy'
});sdk.media.hasImage(imageData)
Check if image exists.
if (sdk.media.hasImage(post.featuredImageData)) {
// Has image
}Hooks API
Register actions and filters.
sdk.hooks.addAction(name, callback, priority)
Register an action hook.
sdk.hooks.addAction('post.viewed', async (post) => {
console.log('Post viewed:', post.title);
}, 10); // priority (lower = earlier)sdk.hooks.addFilter(name, callback, priority)
Register a filter hook.
sdk.hooks.addFilter('post.title', (title) => {
return title.toUpperCase();
}, 10);sdk.hooks.removeAction(name, callback)
Remove an action.
sdk.hooks.removeAction('post.viewed', myCallback);sdk.hooks.removeFilter(name, callback)
Remove a filter.
sdk.hooks.removeFilter('post.title', myCallback);Available Hooks
Actions:
init- CMS initializedpost.viewed- Post was viewedpost.saved- Post was savedplugin.activated- Plugin activatedplugin.deactivated- Plugin deactivated
Filters:
post.content- Filter post contentpost.title- Filter post titlepost.data- Filter entire post objectpage.title- Filter page title
Shortcodes API
Register content shortcodes.
sdk.shortcodes.register(name, callback)
Register a shortcode.
// Simple shortcode: [greeting name="John"]
sdk.shortcodes.register('greeting', (attrs, content) => {
return `<div>Hello, ${attrs.name}!</div>`;
});
// With content: [box type="info"]Content here[/box]
sdk.shortcodes.register('box', (attrs, content) => {
return `<div class="box box-${attrs.type}">${content}</div>`;
});sdk.shortcodes.exists(name)
Check if shortcode exists.
if (sdk.shortcodes.exists('greeting')) {
// Shortcode is registered
}sdk.shortcodes.getAll()
Get all registered shortcodes.
const all = sdk.shortcodes.getAll();Widgets API
Create sidebar and footer widgets.
sdk.widgets.registerWidget(id, config)
Register a widget type.
sdk.widgets.registerWidget('my-widget', {
name: 'My Widget',
description: 'Widget description',
icon: '🎯',
settings: [
{ key: 'title', type: 'text', label: 'Title', default: 'My Widget' },
{ key: 'count', type: 'number', label: 'Count', default: 5 },
{ key: 'showImages', type: 'boolean', label: 'Show Images', default: true },
{
key: 'style',
type: 'select',
label: 'Style',
options: [
{ value: 'default', label: 'Default' },
{ value: 'compact', label: 'Compact' }
],
default: 'default'
}
],
render: async (settings, sdk) => {
return `
<div class="my-widget">
<h3>${settings.title}</h3>
<!-- Widget content -->
</div>
`;
}
});sdk.widgets.registerArea(id, config)
Register a widget area (in themes).
sdk.widgets.registerArea('sidebar', {
name: 'Sidebar',
description: 'Main sidebar widgets',
beforeWidget: '<div class="widget">',
afterWidget: '</div>',
beforeTitle: '<h3 class="widget-title">',
afterTitle: '</h3>'
});sdk.widgets.renderArea(areaId)
Render all widgets in an area.
const html = await sdk.widgets.renderArea('sidebar');sdk.widgets.isAreaActive(areaId)
Check if area has widgets.
if (sdk.widgets.isAreaActive('sidebar')) {
// Has widgets
}Admin API
Extend the admin panel.
sdk.admin.addMenuItem(config)
Add admin menu item.
sdk.admin.addMenuItem({
id: 'my-plugin',
title: 'My Plugin',
icon: '<svg>...</svg>',
position: 50,
capability: 'admin',
render: async (req, res) => {
return '<div>My admin page</div>';
}
});sdk.admin.addSubMenuItem(parentId, config)
Add submenu item.
sdk.admin.addSubMenuItem('my-plugin', {
id: 'settings',
title: 'Settings',
render: async (req, res) => {
return '<div>Settings page</div>';
}
});sdk.admin.addDashboardWidget(config)
Add dashboard widget.
sdk.admin.addDashboardWidget({
id: 'my-stats',
title: 'My Statistics',
position: 'side', // 'normal' or 'side'
render: async () => '<div>Stats content</div>'
});sdk.admin.registerSettingsSection(config)
Add settings section.
sdk.admin.registerSettingsSection({
id: 'my-settings',
title: 'My Plugin Settings',
tab: 'plugins',
fields: [
{ key: 'apiKey', type: 'text', label: 'API Key' },
{ key: 'enabled', type: 'toggle', label: 'Enable', default: false }
]
});REST API
Create custom REST endpoints.
sdk.rest.registerRoute(namespace, path, config)
Register a REST route.
// GET endpoint
sdk.rest.registerRoute('my-plugin/v1', '/items', {
methods: ['GET'],
permission: 'public', // 'public', 'authenticated', 'admin'
args: {
page: { type: 'integer', default: 1 },
limit: { type: 'integer', default: 10 }
},
callback: async (req) => {
return { items: [], total: 0 };
}
});
// POST endpoint
sdk.rest.registerRoute('my-plugin/v1', '/items', {
methods: ['POST'],
permission: 'authenticated',
callback: async (req) => {
const { title } = req.body;
// Create item...
return { success: true, id: '123' };
}
});Storage API
Isolated key-value storage for plugins.
sdk.storage.set(key, value)
Store data.
await sdk.storage.set('myData', { count: 42, items: [] });sdk.storage.get(key)
Retrieve data.
const data = await sdk.storage.get('myData');sdk.storage.delete(key)
Delete data.
await sdk.storage.delete('myData');Utilities
Helper functions.
sdk.utils.formatDate(date, format)
Format a date.
sdk.utils.formatDate(new Date(), 'default'); // "January 12, 2026"
sdk.utils.formatDate(new Date(), 'short'); // "Jan 12, 2026"
sdk.utils.formatDate(new Date(), 'iso'); // "2026-01-12T..."sdk.utils.slugify(text)
Generate URL slug.
sdk.utils.slugify('Hello World!'); // "hello-world"sdk.utils.truncate(text, length)
Truncate text.
sdk.utils.truncate('Long text here...', 100); // "Long text..."sdk.utils.stripHtml(html)
Remove HTML tags.
sdk.utils.stripHtml('<p>Hello</p>'); // "Hello"sdk.utils.escapeHtml(text)
Escape HTML entities.
sdk.utils.escapeHtml('<script>'); // "<script>"sdk.utils.randomId(length)
Generate random ID.
sdk.utils.randomId(); // "x7k2m9p4"
sdk.utils.randomId(16); // Longer IDUI Components
Pre-built UI helpers.
sdk.ui.pagination(options)
Generate pagination HTML.
const html = sdk.ui.pagination({
currentPage: 1,
totalPages: 10,
baseUrl: '/posts',
maxVisible: 5
});sdk.ui.breadcrumb(items)
Generate breadcrumb HTML.
const html = sdk.ui.breadcrumb([
{ label: 'Home', url: '/' },
{ label: 'Posts', url: '/posts' },
{ label: 'Current Post' }
]);sdk.ui.menu(menuId)
Render a navigation menu.
const html = sdk.ui.menu('primary');sdk.ui.shareButtons(options)
Generate share buttons.
const html = sdk.ui.shareButtons({
url: 'https://example.com/post',
title: 'Post Title',
platforms: ['facebook', 'twitter', 'pinterest', 'email']
});