- About the Management API SDK
- Getting Started
- Authentication & Setup
- API Method Classes
- Examples
- TypeScript Interfaces
- Available Enums
- Provides a facility to developers to use the new Agility Management API more effectively.
- Provides methods to perform operations on Assets, Batches, Containers, Content, Models, Pages, and Users.
- Content and Page Creation - Create individual or multiple content items and pages (which automatically get added to batches).
- Essential batch workflow operations - Perform publish, unpublish, approve, decline, and request approval operations on existing batches.
- Ability to generate Content in bulk for a Website.
- Strongly typed TypeScript interfaces for all batch operations with comprehensive error handling.
- Clone the repository agility-cms-management-sdk-typescript.
- Import the index file to make use of the Options class.
- You will need valid Agility CMS credentials to authenticate and obtain an access token.
For detailed authentication instructions, including OAuth 2.0 setup, token management, and security best practices, see the Authentication & Setup Guide.
- First, initiate the authorization flow by making a GET request to the authorization endpoint:
const authUrl = 'https://mgmt.aglty.io/oauth/authorize';
//if you wish to implement offline access using refresh tokens, use this URL (enables refresh tokens)
//const authUrl = 'https://mgmt.aglty.io/oauth/authorize?scope=offline-access ';
const params = new URLSearchParams({
response_type: 'code',
redirect_uri: 'YOUR_REDIRECT_URI',
state: 'YOUR_STATE',
scope: 'openid profile email offline_access'
});
// Redirect the user to the authorization URL
window.location.href = `${authUrl}?${params.toString()}`;- After successful authentication, you'll receive an authorization code at your redirect URI. Use this code to obtain an access token:
const response = await fetch('https://mgmt.aglty.io/oauth/token', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
body: new URLSearchParams({
code: 'YOUR_AUTHORIZATION_CODE'
})
});
const { access_token, refresh_token, expires_in } = await response.json();- Use the obtained token to initialize the SDK:
import * as mgmtApi from "@agility/management-sdk";
// Initialize the Options Class with your authentication token
let options = new mgmtApi.Options();
options.token = access_token; // Use the token obtained from authentication
// Initialize the APIClient Class
let apiClient = new mgmtApi.ApiClient(options);
let guid = "<<Provide the Guid of the Website>>";
let locale = "<<Provide the locale of the Website>>"; // Example: en-us
// Now you can make authenticated requests
var contentItem = await apiClient.contentMethods.getContentItem(22, guid, locale);
console.log(JSON.stringify(contentItem));- When the access token expires, use the refresh token to obtain a new access token:
const response = await fetch('https://mgmt.aglty.io/oauth/refresh', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
refresh_token: 'YOUR_REFRESH_TOKEN'
})
});
const { access_token, refresh_token, expires_in } = await response.json();import * as mgmtApi from "@agility/management-sdk";
// Token-based approach for CI/CD and automated environments
const options = new mgmtApi.Options();
options.token = process.env.AGILITY_API_TOKEN;
const apiClient = new mgmtApi.ApiClient(options);
const guid = process.env.AGILITY_GUID;
const locale = "en-us";
const contentItem = await apiClient.contentMethods.getContentItem(22, guid, locale);
console.log('Content retrieved:', contentItem.fields.title);đź’ˇ Note: The new OAuth authentication requires
keytarfor secure token storage. See the Authentication & Setup Guide for OAuth setup or CI/CD & Automated Environments for token-based authentication.
- AssetMethods - File and media management operations (15 functions)
- BatchMethods - Batch workflow operations (7 functions)
-
ContainerMethods - Container management operations (8 functions)
-
ContentMethods - Content item operations (13 functions)
-
ModelMethods - Content model operations (6 functions)
- PageMethods - Page management operations (17 functions)
- getPage, getPageByPath, getPageHistory, getPageComments, getPageList, getPageListByPageTemplateID, getPageListByPage, getPageListByPageAndPageTemplateID, getPageTree, getPageTemplateList, getPageSecurity, getPageItemTemplateList, getPageContentZones, savePage, savePageSecurity, movePageItem, deletePage
-
InstanceMethods - Instance-level operations (1 function)
-
InstanceUserMethods - Instance user management (3 functions)
-
ServerUserMethods - Server user operations (2 functions)
- WebhookMethods - Webhook management (4 functions)
- Multi-Instance Operations - Advanced workflows for managing content across multiple instances and locales
- Configuration-driven content creation across multiple environments
- Parallel processing and batch operations
- Performance optimization and error handling
- Cross-instance synchronization and reporting
- CI/CD & Automated Environments - Token-based authentication for automated environments
- CI/CD pipeline examples (GitHub Actions, GitLab CI, Jenkins)
- Serverless functions (AWS Lambda, Vercel)
- Environment configuration and security best practices
- Token management and rotation
Agility CMS uses a simple approach for working with content and batches:
- contentMethods.saveContentItem() - Creates a single new content item and adds it to a batch
- contentMethods.saveContentItems() - Creates multiple new content items and adds them to a batch
- pageMethods.savePage() - Creates a new page and adds it to a batch
- These methods create the content AND automatically handle batch creation/management
- batchMethods.publishBatch() - Publishes all items in an existing batch
- batchMethods.unpublishBatch() - Unpublishes all items in an existing batch
- batchMethods.approveBatch() - Approves all items in an existing batch
- batchMethods.declineBatch() - Declines all items in an existing batch
- batchMethods.requestApprovalBatch() - Requests approval for all items in an existing batch
- batchMethods.getBatch() - Retrieves details of an existing batch
- batchMethods.getBatchTypes() - Retrieves all batch-related enum types for developer discovery
import * as mgmtApi from '@agility/management-sdk';
// Authenticate with simple OAuth flow
const client = new mgmtApi.ApiClient();
await client.auth();
const guid = 'your-instance-guid';
const locale = 'en-us';
// Get batch types for dynamic UI and validation
const batchTypes = await client.batchMethods.getBatchTypes(guid);
console.log('Available batch types loaded:', batchTypes);
// Create NEW content items (handled by content controller)
// This automatically creates and manages batches
const newContentBatchID = await client.contentMethods.saveContentItem(locale, {
properties: {
referenceName: 'blog-post',
definitionName: 'BlogPost',
state: 2
},
fields: {
title: 'My New Blog Post',
content: 'This is the blog post content...'
}
});
// Create NEW page (handled by page controller)
// This automatically creates and manages batches
const newPageBatchID = await client.pageMethods.savePage(locale, {
name: 'new-product-page',
title: 'New Product Page',
menuText: 'New Product',
pageType: 'static',
templateName: 'Product Template',
parentPageID: -1
});
// Retrieve details of an existing batch
const batchDetails = await client.batchMethods.getBatch(newContentBatchID, guid);
console.log('Batch details:', batchDetails);
// Perform workflow operations on existing batches
await client.batchMethods.publishBatch(newContentBatchID, guid);
await client.batchMethods.approveBatch(newPageBatchID, guid);
// Or use immediate return for custom polling
const batchId = await client.batchMethods.publishBatch(newContentBatchID, guid, true);
console.log('Batch submitted for publishing:', batchId);
console.log('All operations completed successfully!');interface BatchTypesResponse {
itemTypes: EnumInfo[]; // Page, ContentItem, ContentList, Tag, ModuleDef
operationTypes: EnumInfo[]; // All operation types
workflowOperations: EnumInfo[]; // Publish, Unpublish, Approve, Decline, RequestApproval
states: EnumInfo[]; // None, Pending, InProcess, Processed, Deleted
}
interface EnumInfo {
value: number; // Numeric enum value
name: string; // String name (e.g., "Publish")
description: string; // Human-readable description
}Note: In the API documentation (Swagger UI), these operations appear as descriptive dropdown options (Publish, Unpublish, Approve, Decline, RequestApproval) instead of numbers.
Publish = 1Unpublish = 2Approve = 3Decline = 4RequestApproval = 5
Note: In the API documentation (Swagger UI), these appear as descriptive dropdown options (Page, ContentItem, ContentList, Tag, ModuleDef) instead of numbers.
Page = 1ContentItem = 2ContentList = 3Tag = 4ModuleDef = 5
Note: In the API documentation (Swagger UI), these appear as descriptive names (None, Pending, InProcess, Processed, Deleted) instead of numbers.
None = 0- Batch created but not submitted for processingPending = 1- Batch is pending processingInProcess = 2- Batch is currently being processedProcessed = 3- Batch has been processed successfullyDeleted = 4- Batch has been deleted
All methods throw exceptions on failure:
try {
const batch = await client.batchMethods.getBatch(123, 'instance-guid');
} catch (error) {
console.error('Failed to get batch:', error.message);
}MIT
If you have feedback or questions about this starter, please use the Github Issues on this repo, join our Community Slack Channel or create a post on the Agility Developer Community.