Overview
Core extensions follow a Kubernetes-inspired design pattern with:- Group-Version-Kind (GVK) based routing
- Standard CRUD operations (Create, Read, Update, Delete, List)
- Metadata management including labels, annotations, and versioning
- Optimistic locking through version numbers
- Soft deletion with finalizers support
API Endpoints
All extension APIs follow a consistent URL pattern:Authentication
All Extension APIs require authentication using one of the following methods:- Basic Auth: Username and password credentials
- Bearer Token: JWT token obtained from login
Core Extension Types
Content Extensions
Content extensions are in thecontent.halo.run group.
Post
GVK:content.halo.run/v1alpha1/Post
Represents a blog post with full content management capabilities.
Post title
URL-friendly identifier
Username of the post owner
Whether the post is in recycle bin
Whether to publish the post
ISO 8601 timestamp for scheduled publishing
Pin post to top of list
Allow comments on this post
Visibility level:
PUBLIC, INTERNAL, or PRIVATEArray of category names
Array of tag names
Current phase:
DRAFT, PENDING_APPROVAL, PUBLISHED, or FAILEDPublic URL of the published post
Auto-generated or custom excerpt
SinglePage
GVK:content.halo.run/v1alpha1/SinglePage
Represents a standalone page (not part of the blog stream).
Page title
URL-friendly identifier
Whether the page is in recycle bin
Whether to publish the page
Visibility level:
PUBLIC, INTERNAL, or PRIVATECategory
GVK:content.halo.run/v1alpha1/Category
Represents a post category with hierarchical support.
Display name of the category
URL-friendly identifier
Category description
Sort priority (higher values first)
Array of child category names for hierarchical structure
Total number of posts including subcategories
Number of published and public posts
Tag
GVK:content.halo.run/v1alpha1/Tag
Represents a post tag.
Display name of the tag
URL-friendly identifier
Color code for the tag (e.g.,
#FF5733)Comment
GVK:content.halo.run/v1alpha1/Comment
Represents a comment on a post or page.
Raw comment content (Markdown)
Rendered HTML content
Comment owner information with
kind, name, and displayNameWhether the comment is approved
Whether the comment is hidden
Reference to the subject (Post/SinglePage) with
group, version, kind, and nameCore Extensions (v1alpha1)
These extensions use the default API group (empty string).User
GVK:v1alpha1/User
Represents a user account.
User’s display name
User’s email address
Avatar image URL
User biography
Whether the account is disabled
Role
GVK:v1alpha1/Role
Defines permissions and access control.
Array of policy rules defining permissions
RoleBinding
GVK:v1alpha1/RoleBinding
Binds roles to users or groups.
Array of subjects (users/groups) to bind
Reference to the role being bound
Setting
GVK:v1alpha1/Setting
Stores system or plugin configuration settings.
Form configuration for setting UI
ConfigMap
GVK:v1alpha1/ConfigMap
Stores configuration data as key-value pairs.
Key-value pairs of configuration data
Secret
GVK:v1alpha1/Secret
Stores sensitive data like passwords and tokens.
Key-value pairs of secret data (write-only)
Base64-encoded secret data (read-only)
Menu
GVK:v1alpha1/Menu
Defines a navigation menu.
Menu display name
MenuItem
GVK:v1alpha1/MenuItem
Represents an item in a menu.
Display text for the menu item
Link URL
Array of child menu item names
Plugin Extensions
Plugin
GVK:plugin.halo.run/v1alpha1/Plugin
Represents an installed plugin.
Plugin display name
Plugin version (semantic versioning)
Whether the plugin is enabled
Plugin author information with
name and websitePlugin homepage URL
Plugin phase:
PENDING, STARTING, STARTED, STOPPED, FAILED, etc.File system path where the plugin is loaded from
Theme Extensions
Theme
GVK:theme.halo.run/v1alpha1/Theme
Represents an installed theme.
Theme display name
Theme version
Theme author with
name and optional websiteCustom template definitions for posts, pages, and categories
Theme phase:
READY, FAILED, or UNKNOWNCommon Operations
List Extensions
List all resources of a given type with pagination, filtering, and sorting.Page number (0-based)
Page size (0 means no pagination)
Filter by labels (e.g.,
hidden!=true)Filter by fields (e.g.,
metadata.name==my-post)Sort criteria (e.g.,
metadata.creationTimestamp,desc)Get Extension
Retrieve a single resource by name.Create Extension
Create a new resource.apiVersion, kind, metadata, and spec.
Update Extension
Update an existing resource (full replacement).Patch Extension
Partially update a resource using JSON Patch (RFC 6902).Delete Extension
Delete a resource.Resources with finalizers are soft-deleted (marked with
deletionTimestamp) until all finalizers are removed.Response Format
All responses follow a consistent structure:Single Resource Response
List Response
Error Handling
API errors return appropriate HTTP status codes with error details:- 400 Bad Request: Invalid request body or parameters
- 401 Unauthorized: Missing or invalid authentication
- 403 Forbidden: Insufficient permissions
- 404 Not Found: Resource not found
- 409 Conflict: Version conflict (optimistic locking failure)
- 422 Unprocessable Entity: Validation error
- 500 Internal Server Error: Server error
Next Steps
- Custom Extensions - Learn how to create and manage custom extension types
- Authentication - Authentication and authorization details
- Extension System Overview - Deep dive into the extension system architecture