Agility CMS documentationAgility CMS documentation
OverviewEditorsDevelopersOwners & AdminsTraining GuideApps
Sign inLet's Chat
JavaScript
Content Fetch JS SDKContent Sync JS SDKManagement SDK - InstanceManagement SDK - AssetsManagement SDK - ModelsManagement SDK - ContainersManagement SDK - ContentManagement SDK - Pages

SDKs

Management SDK - Models

Learn how to update Agility Models programmatically using JavaScript.

!

This page has moved โ€” the Management SDK is now documented elsewhere. The JavaScript and .NET guides have been merged into a single set with per-language code tabs. Read the current guide.

This guide covers content model operations using the Agility Management SDK, including creating, updating, and managing content models.

๐Ÿ“‹ Model Types

Content Models vs Component Models

// Content Models - for content items
const contentModels = await apiClient.modelMethods.getContentModules(true, guid, false);

// Page Models - for page components/modules
const pageModels = await apiClient.modelMethods.getPageModules(true, guid);

๐Ÿ” Retrieving Models

Get All Models (Summary)

// Get content model summaries
const contentModels = await apiClient.modelMethods.getContentModules(
  true,  // includeShared
  guid,  // instance GUID
  false  // includeDeleted
);

// Get page model summaries
const pageModels = await apiClient.modelMethods.getPageModules(
  true,  // includeShared
  guid   // instance GUID
);

Get Model Details

// Get full model with field definitions
const modelDetails = await apiClient.modelMethods.getContentModel(modelId, guid);

console.log('Model fields:', modelDetails.fields);
console.log('Model settings:', modelDetails.settings);

Get Model by Reference Name

// Primary method for finding existing models
const model = await apiClient.modelMethods.getModelByReferenceName('blog-posts', guid);

if (model) {
  console.log('Found model:', model.displayName);
} else {
  console.log('Model not found');
}

๐Ÿ”ง Creating Models

Basic Content Model

const blogPostModel = {
  id: -1, // -1 for new models
  displayName: 'Blog Post',
  referenceName: 'blog-posts',
  description: 'Blog post content model',
  fields: [
    {
      name: 'Title',
      referenceName: 'title',
      type: 'text',
      required: true,
      settings: {
        maxLength: 200
      }
    },
    {
      name: 'Content',
      referenceName: 'content',
      type: 'html',
      required: true,
      settings: {
        toolbar: 'full'
      }
    },
    {
      name: 'Featured Image',
      referenceName: 'featuredImage',
      type: 'image',
      required: false
    },
    {
      name: 'Publish Date',
      referenceName: 'publishDate',
      type: 'date',
      required: true
    }
  ]
};

const savedModel = await apiClient.modelMethods.saveModel(blogPostModel, guid);
console.log('Created model with ID:', savedModel.id);

Advanced Field Types

const advancedModel = {
  id: -1,
  displayName: 'Advanced Content',
  referenceName: 'advanced-content',
  fields: [
    // Rich text with custom toolbar
    {
      name: 'Rich Content',
      referenceName: 'richContent',
      type: 'html',
      settings: {
        toolbar: 'basic',
        allowedTags: ['p', 'strong', 'em', 'ul', 'ol', 'li']
      }
    },
    
    // Number field with validation
    {
      name: 'Price',
      referenceName: 'price',
      type: 'number',
      settings: {
        min: 0,
        max: 10000,
        decimalPlaces: 2
      }
    },
    
    // Choice field (dropdown)
    {
      name: 'Category',
      referenceName: 'category',
      type: 'choice',
      required: true,
      settings: {
        choices: [
          { value: 'technology', label: 'Technology' },
          { value: 'business', label: 'Business' },
          { value: 'lifestyle', label: 'Lifestyle' }
        ]
      }
    },
    
    // Boolean field
    {
      name: 'Featured',
      referenceName: 'featured',
      type: 'boolean',
      defaultValue: false
    },
    
    // Content reference
    {
      name: 'Related Posts',
      referenceName: 'relatedPosts',
      type: 'contentreference',
      settings: {
        contentDefinitionReferenceName: 'blog-posts',
        multiple: true,
        maxItems: 5
      }
    }
  ]
};

โœ๏ธ Updating Models

Update Existing Model

// Get existing model
const existingModel = await apiClient.modelMethods.getModelByReferenceName('blog-posts', guid);

if (existingModel) {
  // Add new field
  existingModel.fields.push({
    name: 'Tags',
    referenceName: 'tags',
    type: 'text',
    settings: {
      maxLength: 500
    }
  });
  
  // Update the model
  const updatedModel = await apiClient.modelMethods.saveModel(existingModel, guid);
  console.log('Updated model:', updatedModel.displayName);
}

Field Modification Patterns

// Find and update specific field
const model = await apiClient.modelMethods.getContentModel(modelId, guid);

const titleField = model.fields.find(f => f.referenceName === 'title');
if (titleField) {
  titleField.settings.maxLength = 300;
  titleField.required = true;
}

// Save updated model
await apiClient.modelMethods.saveModel(model, guid);

๐Ÿ—‘๏ธ Deleting Models

Delete Model

// Delete by model ID
await apiClient.modelMethods.deleteModel(modelId, guid);
console.log('Model deleted successfully');

Safe Delete with Validation

async function safeDeleteModel(modelId: number, guid: string) {
  try {
    // Check if model exists
    const model = await apiClient.modelMethods.getContentModel(modelId, guid);
    if (!model) {
      console.log('Model not found');
      return;
    }
    
    // Check for dependent containers
    const containers = await apiClient.containerMethods.getContainerList(guid);
    const dependentContainers = containers.filter(c => c.contentDefinitionID === modelId);
    
    if (dependentContainers.length > 0) {
      console.warn('Cannot delete model - containers depend on it:', 
        dependentContainers.map(c => c.referenceName));
      return;
    }
    
    // Safe to delete
    await apiClient.modelMethods.deleteModel(modelId, guid);
    console.log('Model deleted successfully');
  } catch (error) {
    console.error('Error deleting model:', error);
  }
}

๐Ÿ”ง Field Type Reference

Common Field Types

// Text field
{
  name: 'Title',
  referenceName: 'title',
  type: 'text',
  settings: {
    maxLength: 200,
    placeholder: 'Enter title...'
  }
}

// HTML/Rich text
{
  name: 'Content',
  referenceName: 'content',
  type: 'html',
  settings: {
    toolbar: 'full' | 'basic' | 'minimal'
  }
}

// Image field
{
  name: 'Image',
  referenceName: 'image',
  type: 'image',
  settings: {
    maxWidth: 1920,
    maxHeight: 1080,
    allowedTypes: ['jpg', 'png', 'webp']
  }
}

// Date field
{
  name: 'Date',
  referenceName: 'date',
  type: 'date',
  settings: {
    includeTime: true,
    format: 'MM/DD/YYYY'
  }
}

// Number field
{
  name: 'Price',
  referenceName: 'price',
  type: 'number',
  settings: {
    min: 0,
    max: 99999,
    decimalPlaces: 2
  }
}

๐ŸŽฏ Best Practices

Model Design Principles

// โœ… Good: Clear, descriptive names
const goodModel = {
  displayName: 'Blog Post',
  referenceName: 'blog-posts', // kebab-case
  fields: [
    {
      name: 'Title',
      referenceName: 'title', // camelCase for fields
      type: 'text'
    }
  ]
};

// โŒ Avoid: Unclear or inconsistent naming
const badModel = {
  displayName: 'BP',
  referenceName: 'BlogPost', // Inconsistent casing
  fields: [
    {
      name: 'T',
      referenceName: 'Title', // Inconsistent casing
      type: 'text'
    }
  ]
};

Field Validation

// Validate model before saving
function validateModel(model: any): string[] {
  const errors: string[] = [];
  
  if (!model.displayName) {
    errors.push('Display name is required');
  }
  
  if (!model.referenceName) {
    errors.push('Reference name is required');
  }
  
  if (!model.fields || model.fields.length === 0) {
    errors.push('At least one field is required');
  }
  
  model.fields?.forEach((field: any, index: number) => {
    if (!field.name) {
      errors.push(`Field ${index + 1}: Name is required`);
    }
    if (!field.referenceName) {
      errors.push(`Field ${index + 1}: Reference name is required`);
    }
    if (!field.type) {
      errors.push(`Field ${index + 1}: Type is required`);
    }
  });
  
  return errors;
}
โ† Previous
Management SDK - Assets
Next โ†’
Management SDK - Containers
On this page
๐Ÿ“‹ Model Types๐Ÿ” Retrieving Models๐Ÿ”ง Creating Modelsโœ๏ธ Updating Models๐Ÿ—‘๏ธ Deleting Models๐Ÿ”ง Field Type Reference๐ŸŽฏ Best Practices
Agility CMS documentationAgility CMS documentation

Documentation for the CMS built for editors, developers, and AI agents.

Docs
  • Overview
  • Editors
  • Developers
  • Owners & Admins
  • Training Guide
  • Changelog
Resources
  • Get Support
  • MCP Server
  • System Status
  • llms.txt
Agility
  • agilitycms.com
  • Start Free Trial
  • Sign in
  • Blog
ยฉ 2026 Agility Inc. All rights reserved.
Privacy PolicyTerms of Service