Contentstack CLI Configuration Reference
This reference outlines all configuration options available in Contentstack CLI plugins for export, import, audit, and content migrations tasks. It helps developers and administrators configure and manage CLI-based workflows across stacks.
Prerequisites
Before you begin, ensure that:
- The CLI is installed and authenticated
- You have stack access with the necessary permissions
- You understand how configuration values are loaded (via config files, environment variables, or CLI flags)
What You’ll Learn
After reading this reference, you can:
- Choose the correct CLI command and configuration for your task
- Understand how configuration values are resolved across environment variables, root settings, module overrides, and defaults
- Configure required and optional settings, including module-specific options
- Optimize performance and avoid common configuration errors
Quick Reference
- Export a stack or content:
csdx cm:stacks:export
- Import content into a stack:
csdx cm:stacks:import
- Export specific content only:
csdx cm:stacks:export-query
- Audit schema and entries:
csdx cm:stacks:audit
- Set up mapping and dependencies before import:
csdx cm:stacks:import-setup
- Run custom content transformations:
csdx cm:stacks:migration
Environment Variables
The CLI supports environment variables that override config files and defaults. This is especially useful for CI/CD pipelines, local overrides, and handling sensitive settings such as encryption keys.
Note Environment variables have the highest priority in the configuration resolution order. Refer to the Configuration Precedence section for the complete hierarchy.
Supported CLI Configuration Environment Variables
| Variable | Type | Default | Description |
| CS_CLI_CONFIG_PATH | string | - | Custom path to the CLI configuration directory |
| CS_CLI_LOG_PATH | string | process.cwd() | Custom path for CLI log files |
| CONFIG_NAME | string | contentstack_cli | Base name of the configuration file (without extension) |
| ENC_CONFIG_NAME | string | contentstack_cli_obfuscate | Name of the encrypted configuration file |
| ENC_KEY | string | encryptionKey | Encryption key used for configuration files |
| ENCRYPT_CONF | boolean | true | Enable/disable configuration encryption |
Usage Examples
The following examples focus on environment variables that significantly impact CLI behavior or are commonly used in real-world workflows.
Change the default location for CLI log files
export CS_CLI_LOG_PATH="/path/to/logs" csdx cm:stacks:export
Disable configuration file encryption
export ENCRYPT_CONF=false csdx cm:stacks:import
NoteDisabling encryption is useful in CI environments where secrets are managed externally.
Use a custom directory for CLI configuration files
export CS_CLI_CONFIG_PATH="/path/to/config" csdx cm:stacks:export
Configuration Precedence
Refer to this section when your CLI config includes both root and module-level values, and you need to understand which setting takes precedence.
Precedence Order
- Module-specific configuration (highest priority)
- Root-level configuration
- Default values (lowest priority)
How It Works
The CLI uses a recursive merge strategy (merge.recursive()) when loading configuration files. This means:
- Module config overrides root config: If a key exists at both <module>.<key> and root-level <key>, the module-specific value is used.
- Root config acts as a fallback: If a key is not defined at the module level, the CLI uses the root-level value.
- Defaults are a last resort: If neither module nor root includes the key, the CLI falls back to default values.
Examples
Import Configuration Precedence
Example 1: importConcurrency for Entries Module
{
"importConcurrency": 5,
"modules": {
"entries": {
"importConcurrency": 10
}
}
}Result: Entries module uses importConcurrency: 10 (module config), while other modules use importConcurrency: 5 (root config).
Code Reference: Refer to the entries.ts in the CLI repository.
Example 2: writeConcurrency for Content Types Module
{
"writeConcurrency": 5,
"modules": {
"content-types": {
"writeConcurrency": 8
}
}
}Result: Content Types module uses writeConcurrency: 8 (module config), while other modules use writeConcurrency: 5 (root config).
Code Reference: See content-types.ts in the CLI repository.
Export Configuration Precedence
Example 3: chunkFileSize for Entries Module
{
"modules": {
"entries": {
"chunkFileSize": 20
}
}
}Result: Entries module uses chunkFileSize: 20 (module config). If not specified, it defaults to 10 (FsUtility default).
Example 4: fetchConcurrency for Assets Module
{
"fetchConcurrency": 5,
"modules": {
"assets": {
"fetchConcurrency": 10
}
}
}Result: Assets module uses fetchConcurrency: 10 (module config), while other modules use fetchConcurrency: 5 (root config).
Common Keys with Precedence
The following table lists configuration keys that can be defined at both the root level and module level, along with their corresponding module override paths.
| Root-Level Key | Module Override Path | Applicable Commands |
| importConcurrency | modules.entries.importConcurrency | Import |
| fetchConcurrency | modules.<module>.fetchConcurrency | Import, Export |
| writeConcurrency | modules.<module>.writeConcurrency | Import, Export |
| chunkFileSize | modules.<module>.chunkFileSize | Import, Export |
| limit | modules.<module>.limit | Export |
| batchLimit | modules.<module>.batchLimit | Export |
Best Practices
- Define shared configuration values at the root level to apply them consistently across all modules.
- Use module-specific configuration only when a module requires behavior that differs from the global defaults.
- Avoid repeating the same configuration value at both root and module levels unless different behavior is intentionally required.
- When validating or troubleshooting CLI behavior, review module-level configuration first.
- Be aware that environment variables override configuration file values and can affect CLI behavior across commands.
Example – Recommended Pattern:
The following example demonstrates a recommended configuration pattern that balances shared defaults with targeted module overrides.
{
"fetchConcurrency": 5,
"writeConcurrency": 5,
"modules": {
"entries": {
"importConcurrency": 10,
"chunkFileSize": 20
},
"assets": {
"fetchConcurrency": 10
}
}
}In this example:
- Most modules use fetchConcurrency: 5 and writeConcurrency: 5 from the root
- The Entries module uses importConcurrency: 10 and chunkFileSize: 20 (module-specific overrides)
- The Assets module overrides the root value with fetchConcurrency: 10
Export Configuration
Use this configuration to export stack content and metadata for backups, migrations, or moving content between stacks.
Command:
csdx cm:stacks:export
Default Configuration: See the default export configuration file in the CLI repository.
Basic Settings
| Option | Type | Default | Required | Description |
| contentVersion | number | 2 | No | Version of the export format |
| versioning | boolean | false | No | Export versioned entries |
| host | string | "https://api.contentstack.io/v3" | No | Base URL for Content Management API |
| preserveStackVersion | boolean | false | No | Preserve stack version information |
| source_stack | string | - | Yes | API key of the source stack |
| data | string | - | Yes | Path to export directory |
| exportDir | string | - | No | Alias for data (export directory path) |
Note The source_stack and data fields are required unless they are provided through CLI flags or an alias.
Path & Directory Settings
| Option | Type | Default | Required | Description |
| cliLogsPath | string | - | No | Custom path for CLI logs |
| branchName | string | - | No | Branch name to export from |
| branchAlias | string | - | No | Branch alias to export from |
Content Filtering
| Option | Type | Default | Required | Description |
| moduleName | string | - | No | Specific module to export |
| contentTypes | string[] | - | No | Array of content type UIDs |
| filteredModules | string[] | - | No | An array of module names to filter |
| query | object|string | - | No | Query object or file path for filtering |
Performance Settings
| Option | Type | Default | Required | Description |
| fetchConcurrency | number | 5 | No | Number of parallel fetch operations |
| writeConcurrency | number | 5 | No | Number of parallel write operations |
| delayMs | number | - | No | Delay in milliseconds between API requests |
| maxContentLength | number | 100000000 | No | Max content length in bytes (100 MB) |
| maxBodyLength | number | 100000000 | No | Max body length in bytes (100 MB) |
Feature Flags
| Option | Type | Default | Required | Description |
| securedAssets | boolean | false | No | Export secured assets |
| personalizationEnabled | boolean | false | No | Enable personalization features |
| skipStackSettings | boolean | false | No | Skip exporting stack settings (not in default config, but supported) |
| skipDependencies | boolean | false | No | Skip dependency resolution (not in default config, but supported) |
Authentication
| Option | Type | Default | Required | Description |
| string | - | No | Email for basic authentication | |
| password | string | - | No | Password for basic authentication |
| management_token | string | - | No | Management token (use --alias flag instead) |
Advanced Settings
| Option | Type | Default | Required | Description |
| master_locale | object | - | No | Master locale configuration |
| developerHubBaseUrl | string | - | No | Base URL for Developer Hub API |
| marketplaceAppEncryptionKey | string | "nF2ejRQcTv" | No | Encryption key for Marketplace apps |
Note If a configuration value is defined at both the root level and a module level, the module-level value takes precedence for that module. See Configuration Precedence for more information.
Module-Specific Configuration
Assets Module
| Option | Type | Default | Description |
| modules.assets.batchLimit | number | 20 | Asset objects fetched per API call |
| modules.assets.chunkFileSize | number | 1 | Size in MB for chunking large metadata JSON files (assets.json) |
| modules.assets.downloadLimit | number | 5 | Parallel asset file downloads |
| modules.assets.fetchConcurrency | number | 5 | Parallel fetch operations for asset metadata |
| modules.assets.includeVersionedAssets | boolean | false | Include versioned assets |
| modules.assets.securedAssets | boolean | false | Export secured assets (adds auth token to asset URLs) |
| modules.assets.displayExecutionTime | boolean | false | Display execution time for batch operations |
| modules.assets.enableDownloadStatus | boolean | false | Enable download progress display for asset files |
| modules.assets.assetsMetaKeys | string[] | [uid, url, filename, parent_uid] | Additional metadata keys to include |
| modules.assets.host | string | https://images.contentstack.io | CDN host for asset URLs |
Entries Module
| Option | Type | Default | Description |
| modules.entries.limit | number | 100 | Entries fetched per API call per content type/locale |
| modules.entries.batchLimit | number | 20 | Parallel entry version fetches when exportVersions is set to true (only used for version export) |
| modules.entries.exportVersions | boolean | false | Export all versions of each entry |
| modules.entries.chunkFileSize | number | 10 | Size in MB for chunking large entry JSON files (defaults to FsUtility default of 10 if not specified) |
| modules.entries.invalidKeys | string[] | See the default below the table | Keys to exclude from exported entries |
| modules.entries.dependencies | string[] | ['locales', 'content-types'] | Required modules that must be exported first |
Default invalidKeys for Entry Module:
- stackHeaders
- content_type_uid
- urlPath
- created_at
- updated_at
- created_by
- updated_by
- _metadata
- published
Note The downloadLimit is not used for entries export. It applies only to the assets module.
Precedence: Module-specific chunkFileSize, limit, and batchLimit are module-specific only and don't have root-level equivalents.
Content Types Module
| Option | Type | Default | Description |
| modules.content-types.limit | number | 100 | Content types fetched per API call |
| modules.content-types.validKeys | string[] | See the default below the table | Valid keys to export |
| modules.content-types.writeConcurrency | number | 5 | Parallel file write operations (overrides root writeConcurrency if set) |
Default validKeys for Content Type Module:
- title
- uid
- field_rules
- schema
- options
- singleton
- description
Precedence: modules.content-types.writeConcurrency takes precedence over root-level writeConcurrency. If not set, falls back to the root writeConcurrency (default: 5).
Global Fields Module
| Option | Type | Default | Description |
| modules.global-fields.limit | number | 100 | Global fields fetched per API call |
| modules.global-fields.validKeys | string[] | See the default below the table | Valid keys to export |
Default validKeys for Global Field Module:
- title
- uid
- schema
- options
- singleton
- description
Taxonomies Module
| Option | Type | Default | Description |
| modules.taxonomies.limit | number | 100 | Taxonomies fetched per API call |
| modules.taxonomies.invalidKeys | string[] | See the default below the table | Keys to exclude from exported taxonomies |
Default invalidKeys for Taxonomies Module:
- updated_at
- created_by
- updated_by
- stackHeaders
- urlPath
- created_at
Personalize Module
| Option | Type | Default | Description |
| modules.personalize.baseURL | object | Region-specific | Base URLs for Personalize API by region |
| modules.personalize.exportOrder | string[] | ['attributes', 'audiences', 'events', 'experiences'] | Export order |
Base URLs by Region:
- AWS-NA: https://personalize-api.contentstack.com
- AWS-EU: https://eu-personalize-api.contentstack.com
- AWS-AU: https://au-personalize-api.contentstack.com
- AZURE-NA: https://azure-na-personalize-api.contentstack.com
- AZURE-EU: https://azure-eu-personalize-api.contentstack.com
- GCP-NA: https://gcp-na-personalize-api.contentstack.com
- GCP-EU: https://gcp-eu-personalize-api.contentstack.com
Locales Module
| Option | Type | Default | Description |
| modules.locales.limit | number | 100 | Locales fetched per API call |
| modules.locales.requiredKeys | string[] | See the default below the table | Required keys to export for locales |
Default requiredKeys for Locales module:
- code
- uid
- name
- fallback_locale
Environments Module
| Option | Type | Default | Description |
| modules.environments.limit | number | 100 | Environments fetched per API call |
Extensions Module
| Option | Type | Default | Description |
| modules.extensions.limit | number | 100 | Extensions fetched per API call |
Stack Module
| Option | Type | Default | Description |
| modules.stack.limit | number | 100 | Stack data fetched per API call |
Webhooks Module
| Option | Type | Default | Description |
| modules.webhooks.limit | number | 100 | Webhooks fetched per API call |
Workflows Module
| Option | Type | Default | Description |
| modules.workflows.limit | number | 100 | Workflows fetched per API call |
| modules.workflows.invalidKeys | string[] | See the default below the table | Keys to exclude from exported workflows |
Default invalidKeys for Workflows module:
- stackHeaders
- urlPath
- created_at
- updated_at
- created_by
- updated_by
Labels Module
| Option | Type | Default | Description |
| modules.labels.limit | number | 100 | Labels fetched per API call |
| modules.labels.invalidKeys | string[] | See the default below the table | Keys to exclude from exported labels |
Default invalidKeys for Labels module:
- stackHeaders
- urlPath
- created_at
- updated_at
- created_by
- updated_by
Complete Export Configuration Example
The following example shows a complete export configuration, including commonly used options and module-level overrides.
{
"contentVersion": 2,
"versioning": false,
"host": "https://api.contentstack.io/v3",
"preserveStackVersion": false,
"master_locale": {
"name": "English - United States",
"code": "en-us"
},
"source_stack": "bltXXXXXXXXXX",
"data": "./export-data",
"branchName": "main",
"moduleName": null,
"contentTypes": [],
"securedAssets": false,
"fetchConcurrency": 5,
"writeConcurrency": 5,
"delayMs": 1000,
"maxContentLength": 100000000,
"maxBodyLength": 100000000,
"personalizationEnabled": false,
"skipStackSettings": false,
"skipDependencies": false,
"developerHubBaseUrl": "",
"marketplaceAppEncryptionKey": "nF2ejRQcTv",
"modules": {
"assets": {
"batchLimit": 20,
"chunkFileSize": 1,
"downloadLimit": 5,
"fetchConcurrency": 5,
"includeVersionedAssets": false,
"securedAssets": false,
"displayExecutionTime": false,
"enableDownloadStatus": false,
"assetsMetaKeys": ["uid", "url", "filename", "parent_uid"],
"host": "https://images.contentstack.io"
},
"entries": {
"limit": 100,
"batchLimit": 20,
"exportVersions": false,
"chunkFileSize": 10
},
"content-types": {
"limit": 100,
"validKeys": ["title", "uid", "field_rules", "schema", "options", "singleton", "description"]
},
"global-fields": {
"validKeys": ["title", "uid", "schema", "options", "singleton", "description"]
},
"taxonomies": {
"limit": 100
},
"personalize": {
"baseURL": {
"AWS-NA": "https://personalize-api.contentstack.com",
"AWS-EU": "https://eu-personalize-api.contentstack.com",
"AWS-AU": "https://au-personalize-api.contentstack.com",
"AZURE-NA": "https://azure-na-personalize-api.contentstack.com",
"AZURE-EU": "https://azure-eu-personalize-api.contentstack.com",
"GCP-NA": "https://gcp-na-personalize-api.contentstack.com",
"GCP-EU": "https://gcp-eu-personalize-api.contentstack.com"
},
"exportOrder": ["attributes", "audiences", "events", "experiences"]
}
}
}Import Configuration
Use this configuration to import content and stack metadata into a target stack, typically after an export or as part of a migration workflow. This section describes the root-level and module-specific options that control how content is imported and published.
Command: csdx cm:stacks:import
Default Configuration: Refer to the default import configuration file in the CLI repository.
Basic Settings
| Option | Type | Default | Required | Description |
|---|---|---|---|---|
| versioning | boolean | false | No | Import versioned entries |
| host | string | "https://api.contentstack.io/v3" | No | Base URL for Content Management API |
| extensionHost | string | "https://app.contentstack.com" | No | Base URL for Contentstack application |
| contentVersion | number | - | No | Version of the import format |
| preserveStackVersion | boolean | false | No | Preserve stack version information |
| target_stack | string | - | Yes* | API key of target stack |
| data | string | - | Yes* | Path to import directory |
| contentDir | string | - | No | Alias for data |
Note The target_stack and data fields are required unless they are provided through CLI flags or a management token alias.
Path & Directory Settings
| Option | Type | Default | Required | Description |
|---|---|---|---|---|
| cliLogsPath | string | - | No | Custom path for CLI logs |
| backupDir | string | - | No | Path to backup directory |
| branchName | string | "main" | No | Branch name to import into |
| branchAlias | string | - | No | Branch alias to import into |
Content Filtering
| Option | Type | Default | Required | Description |
|---|---|---|---|---|
| moduleName | string | - | No | Specific module to import |
| contentTypes | string[] | - | No | Array of content type UIDs |
| modules | string[] | - | No | Array of module names to import |
Performance Settings
| Option | Type | Default | Required | Description |
|---|---|---|---|---|
| concurrency | number | 1 | No | General concurrency level |
| importConcurrency | number | 5 | No | Number of parallel import operations |
| fetchConcurrency | number | 5 | No | Number of parallel fetch operations |
| writeConcurrency | number | 5 | No | Number of parallel write operations |
| delayMs | number | - | No | Delay in milliseconds between requests |
| maxContentLength | number | 100000000 | No | Max content length in bytes (100 MB) |
| maxBodyLength | number | 100000000 | No | Max body length in bytes (100 MB) |
Recommended starting point: Start by tuning importConcurrency, which controls overall import parallelism. Use module-level overrides for targeted optimization, and treat fetchConcurrency and writeConcurrency as advanced tuning options.
Publish Settings
| Option | Type | Default | Required | Description |
|---|---|---|---|---|
| skipAssetsPublish | boolean | - | No | Skip asset publishing |
| skipEntriesPublish | boolean | - | No | Skip entry publishing |
| entriesPublish | boolean | true | No | Publish entries after import |
Feature Flags
| Option | Type | Default | Required | Description |
|---|---|---|---|---|
| skipAudit | boolean | - | No | Skip audit fix during import |
| skipExisting | boolean | - | No | Skip "module exists" warnings |
| replaceExisting | boolean | - | No | Replace existing modules |
| exclude-global-modules | boolean | false | No | Exclude branch-independent modules (global modules are shared across all branches in a stack; see Contentstack documentation) |
| skipPrivateAppRecreationIfExist | boolean | - | No | Skip recreation of existing private apps |
Advanced Settings
| Option | Type | Default | Required | Description |
|---|---|---|---|---|
| importWebhookStatus | string | "disable" | No | Webhook state: "disable" or "current" |
| personalizeProjectName | string | - | No | Unique name for the Personalize project |
| developerHubBaseUrl | string | - | No | Base URL for Developer Hub API |
| marketplaceAppEncryptionKey | string | "nF2ejRQcTv" | No | Encryption key for Marketplace apps |
| getEncryptionKeyMaxRetry | number | 3 | No | Max retry attempts for encryption key |
| auditConfig | object | - | No | Configuration for audit process |
| master_locale | object | - | No | Master locale configuration |
Authentication
| Option | Type | Default | Required | Description |
|---|---|---|---|---|
| string | - | No | Email for basic authentication | |
| password | string | - | No | Password for basic authentication |
| management_token | string | - | No | Management token (use --alias flag instead) |
Configuration Precedence
Note When the same configuration key exists at both the root level and module level, module-specific configuration takes precedence.
For example, if you set importConcurrency: 5 at root and modules.entries.importConcurrency: 10, the entries module uses 10.
Additional Resource Refer to the Configuration Precedence section for a detailed explanation and examples.
Module-Specific Configuration
Assets Module
| Option | Type | Default | Description |
|---|---|---|---|
| modules.assets.assetBatchLimit | number | 1 | Assets processed per batch |
| modules.assets.uploadAssetsConcurrency | number | 2 | Assets uploaded in parallel |
| modules.assets.importFoldersConcurrency | number | 1 | Folders processed in parallel |
| modules.assets.importSameStructure | boolean | true | Maintain folder structure |
| modules.assets.includeVersionedAssets | boolean | false | Include versioned assets |
| modules.assets.displayExecutionTime | boolean | false | Display execution time |
| modules.assets.host | string | "https://api.contentstack.io" | API host for asset operations |
| modules.assets.validKeys | string[] | See default | Valid keys to import for assets |
| modules.assets.folderValidKeys | string[] | See default | Valid keys to import for folders |
Default validKeys: ["title", "parent_uid", "description", "tags"]
Default folderValidKeys: ["name", "parent_uid"]
Note Folder hierarchy during import follows folders.json, not modules.assets.importSameStructure. The importSameStructure setting (default: true) only controls asset replace or skip behavior.
Entries Module
| Option | Type | Default | Description |
|---|---|---|---|
| modules.entries.importConcurrency | number | 5 | Parallel entry import operations (overrides root importConcurrency if set) |
| modules.entries.chunkFileSize | number | 10 | Size in MB for chunking large entry mapper JSON files (defaults to FsUtility default of 10 if not specified) |
| modules.entries.invalidKeys | string[] | See default | Keys to exclude from entry mapper files |
Default invalidKeys: ['created_at', 'updated_at', 'created_by', 'updated_by', '_metadata', 'published']
Note limit and assetBatchLimit are defined in config but not actively used in the entries import code.
Precedence: modules.entries.importConcurrency takes precedence over root-level importConcurrency. If not set, falls back to root importConcurrency (default: 5).
Content Types Module
| Option | Type | Default | Description |
|---|---|---|---|
| modules.content-types.limit | number | 100 | Content types processed per batch |
| modules.content-types.validKeys | string[] | See default | Valid keys to import |
| modules.content-types.writeConcurrency | number | 5 | Parallel content type operations (overrides root writeConcurrency if set) |
Default validKeys: ["title", "uid", "schema", "options", "singleton", "description"]
Precedence: modules.content-types.writeConcurrency takes precedence over root-level writeConcurrency. If not set, falls back to root writeConcurrency (default: 5).
Global Fields Module
| Option | Type | Default | Description |
|---|---|---|---|
| modules.global-fields.limit | number | 100 | Global fields processed per batch |
| modules.global-fields.validKeys | string[] | See default | Valid keys to import |
| modules.global-fields.writeConcurrency | number | 5 | Parallel global field operations (overrides root writeConcurrency if set) |
Default validKeys: ["title", "uid", "schema", "options", "singleton", "description"]
Precedence: modules.global-fields.writeConcurrency takes precedence over root-level writeConcurrency. If not set, falls back to root writeConcurrency (default: 5).
Locales Module
| Option | Type | Default | Description |
|---|---|---|---|
| modules.locales.writeConcurrency | number | 5 | Parallel locale operations (overrides root writeConcurrency if set) |
| modules.locales.requiredKeys | string[] | See default | Required keys to import for locales |
Default requiredKeys: ['code', 'uid', 'name', 'fallback_locale']
Precedence: modules.locales.writeConcurrency takes precedence over root-level writeConcurrency. If not set, falls back to root writeConcurrency (default: 5).
Environments Module
| Option | Type | Default | Description |
|---|---|---|---|
| modules.environments.fetchConcurrency | number | 2 | Parallel environment operations (overrides root fetchConcurrency if set) |
Precedence: modules.environments.fetchConcurrency takes precedence over root-level fetchConcurrency. If not set, falls back to root fetchConcurrency (default: 5), but the module default is 2.
Extensions Module
| Option | Type | Default | Description |
|---|---|---|---|
| modules.extensions.concurrency | number | 1 | Parallel extension operations (falls back to fetchConcurrency if not set) |
| modules.extensions.validKeys | string[] | See default | Valid keys to import for extensions |
Default validKeys: ['data_type', 'srcdoc', 'title', 'type', 'multiple', 'config']
Taxonomies Module
| Option | Type | Default | Description |
|---|---|---|---|
| modules.taxonomies.dirName | string | "taxonomies" | Directory name for taxonomies |
| modules.taxonomies.fileName | string | "taxonomies.json" | File name for taxonomies data |
Personalize Module
| Option | Type | Default | Description |
|---|---|---|---|
| modules.personalize.baseURL | object | Region-specific | Base URLs for Personalize API by region |
| modules.personalize.importData | boolean | true | Enable/disable Personalize data import |
| modules.personalize.importOrder | string[] | ['attributes', 'audiences', 'events', 'experiences'] | Import order |
| modules.personalize.project_id | string | "" | Personalize project ID (auto-populated) |
| modules.personalize.experiences.thresholdTimer | number | 60000 | Timer threshold in milliseconds |
| modules.personalize.experiences.checkIntervalDuration | number | 10000 | Check interval duration in milliseconds |
Base URLs: Same as Export configuration (see Export section above).
Variant Entry Module
| Option | Type | Default | Description |
|---|---|---|---|
| modules.variantEntry.apiConcurrency | number | 5 | Parallel API calls |
| modules.variantEntry.query.locale | string | "en-us" | Locale for variant entry queries |
General Module Settings
| Option | Type | Default | Description |
|---|---|---|---|
| modules.apiConcurrency | number | 5 | General API concurrency for modules |
Complete Import Configuration Example
{
"versioning": false,
"host": "https://api.contentstack.io/v3",
"extensionHost": "https://app.contentstack.com",
"contentVersion": 2,
"preserveStackVersion": false,
"master_locale": {
"name": "English - United States",
"code": "en-us"
},
"target_stack": "bltXXXXXXXXXX",
"data": "./import-data",
"branchName": "main",
"moduleName": null,
"contentTypes": [],
"skipAssetsPublish": false,
"skipEntriesPublish": false,
"entriesPublish": true,
"concurrency": 1,
"importConcurrency": 5,
"fetchConcurrency": 5,
"writeConcurrency": 5,
"delayMs": 1000,
"maxContentLength": 100000000,
"maxBodyLength": 100000000,
"skipAudit": false,
"skipExisting": false,
"replaceExisting": false,
"importWebhookStatus": "disable",
"personalizeProjectName": null,
"exclude-global-modules": false,
"skipPrivateAppRecreationIfExist": false,
"backupDir": "./backup",
"createBackupDir": "./temp",
"cliLogsPath": "./logs",
"developerHubBaseUrl": "",
"marketplaceAppEncryptionKey": "nF2ejRQcTv",
"getEncryptionKeyMaxRetry": 3,
"auditConfig": {
"noLog": false,
"skipConfirm": true,
"returnResponse": true,
"noTerminalOutput": false,
"config": {
"basePath": ""
}
},
"modules": {
"apiConcurrency": 5,
"assets": {
"assetBatchLimit": 1,
"uploadAssetsConcurrency": 2,
"importFoldersConcurrency": 1,
"importSameStructure": true,
"includeVersionedAssets": false,
"displayExecutionTime": false,
"host": "https://api.contentstack.io",
"validKeys": ["title", "parent_uid", "description", "tags"],
"folderValidKeys": ["name", "parent_uid"]
},
"entries": {
"limit": 50,
"assetBatchLimit": 5
},
"content-types": {
"limit": 100,
"validKeys": ["title", "uid", "schema", "options", "singleton", "description"]
},
"global-fields": {
"limit": 100,
"validKeys": ["title", "uid", "schema", "options", "singleton", "description"]
},
"taxonomies": {
"dirName": "taxonomies",
"fileName": "taxonomies.json"
},
"personalize": {
"baseURL": {
"AWS-NA": "https://personalize-api.contentstack.com",
"AWS-EU": "https://eu-personalize-api.contentstack.com",
"AWS-AU": "https://au-personalize-api.contentstack.com",
"AZURE-NA": "https://azure-na-personalize-api.contentstack.com",
"AZURE-EU": "https://azure-eu-personalize-api.contentstack.com",
"GCP-NA": "https://gcp-na-personalize-api.contentstack.com",
"GCP-EU": "https://gcp-eu-personalize-api.contentstack.com"
},
"importData": true,
"importOrder": ["attributes", "audiences", "events", "experiences"],
"project_id": "",
"experiences": {
"thresholdTimer": 60000,
"checkIntervalDuration": 10000
}
},
"variantEntry": {
"apiConcurrency": 5,
"query": {
"locale": "en-us"
}
}
}
}Best Practices for CLI Import and Backup
Follow these best practices for Contentstack CLI imports:
- Set branchName or branchAlias for non-default branch imports. Verify the branch exists (or the alias resolves). The CLI does not create branches, so the import fails if the branch is missing.
- Backup your export data using one of these methods:
- Create a new backup: Set createBackupDir to a dedicated path in the config. If that path already exists, the CLI removes it before creating the backup directory and copying your export data.
- Reuse an existing backup: Pass the --backup-dir flag or set useBackedupDir in the config.
Note After each run, the CLI logs the actual backupDir used. Setting backupDir in the config alone does not control the backup location. Use createBackupDir or useBackedupDir (or --backup-dir) to define it.
- Verify content publishing behavior before import using entriesPublish, skipEntriesPublish, and skipAssetsPublish.
Warning skipExisting and replaceExisting are high-impact flags that control whether content is skipped or overwritten.
Audit Configuration
Use the Audit configuration to analyze stack schemas and entries for structural or data-related issues. Audit identifies inconsistencies and provides a summary of potential problems across supported modules.
Workflow
Follow this workflow to ensure a safe and predictable migration:
- Export: Export stack content with the CLI into the expected folder layout.
- Audit: Run csdx cm:stacks:audit against that folder (read-only; reports under audit-report).
- Fix (optional): Run csdx cm:stacks:audit:fix only when you want to modify files; use --copy-dir or --copy-path to keep a safe copy.
- Import / migrate: Import or migrate using the cleaned export in a separate step.
Note Audit does not export or import data. Always point --data-dir or basePath to the root of your export.
Command: csdx cm:stacks:audit
Default Configuration: Refer to the default audit configuration file in the CLI repository to understand included modules, supported fixes, and reporting behavior.
Basic Settings
| Option | Type | Default | Required | Description |
|---|---|---|---|---|
| showTerminalOutput | boolean | true | No | Display output on the terminal |
| skipRefs | string[] | ['sys_assets'] | No | Skip specified references during audit |
| skipFieldTypes | string[] | ['taxonomy', 'group'] | No | Skip specified field types during audit |
| fixSelectField | boolean | false | No | Fix select field issues |
Module Configuration
Limit audit modules to shorten runs on large exports, skip unnecessary areas, or narrow testing. The modules array defines these audit pipelines.
Supported modules:
- content-types
- entries
- assets
| Option | Type | Default | Required | Description |
|---|---|---|---|---|
| modules | string[] | See default | No | Specify modules to include in the audit |
Default modules: ['content-types', 'global-fields', 'entries', 'extensions', 'workflows', 'custom-roles', 'assets', 'field-rules']
Field Configuration
| Option | Type | Default | Required | Description |
|---|---|---|---|---|
| fix-fields | string[] | See default | No | Field types that can be fixed |
| schema-fields-data-type | string[] | See default | No | Schema field data types to check |
Default fix-fields: ['reference', 'global_field', 'json:rte', 'json:extension', 'blocks', 'group', 'content_types']
Default schema-fields-data-type: ['blocks', 'group', 'global_field']
Entry System Keys
| Option | Type | Default | Required | Description |
|---|---|---|---|---|
| entries.systemKeys | string[] | See default | No | Define system keys to include when auditing entries |
Default systemKeys: ['uid', 'ACL', 'tags', 'locale', '_version', '_metadata', 'published', 'created_at', 'updated_at', 'created_by', 'updated_by', '_in_progress', '_restore_status', 'publish_details']
External Configuration
When using the --config flag with audit commands, you can pass external configuration options.
| Option | Type | Default | Required | Description |
|---|---|---|---|---|
| noLog | boolean | false | No | Skip printing logs on the terminal |
| skipConfirm | boolean | true | No | Skip confirmation before writing fixes (cm:stacks:audit:fix); when false, user may be prompted unless --yes / copy-dir applies |
| returnResponse | boolean | true | No | Return the resolved runtime configuration and fix status when using cm:stacks:audit:fix |
| noTerminalOutput | boolean | false | No | Skip the final audit table output on the terminal |
| basePath | string | "" | No | Directory containing export data to audit (overrides default; equivalent to --data-dir for scope) |
- noLog, noTerminalOutput, and returnResponse control logging, terminal UX, and command returns. They do not change the executed audit rules.
- skipConfirmApplies fixes without interactive confirmation prompts. Use this with the cm:stacks:audit:fix command.
Example external config file:
{
"noLog": false,
"skipConfirm": true,
"returnResponse": true,
"noTerminalOutput": false,
"basePath": "./export-data"
}Best Practices for Audit
Follow these practices when using the Audit plugin:
- Use CLI export data in the expected layout. Review the default audit configuration for details. Older or non-CLI exports might lack matching module paths and filenames.
- Set --data-dir or basePath to the root of the exported data. For branch-enabled stacks, point directly to the branch folder inside the export and not to a parent directory.
- Use --copy-dir with cm:stacks:audit:fix to back up the export before writing fixes. Use --copy-path to specify a custom backup location. Avoid applying fixes directly to your main copy.
- Split large audits using --modules or the modules config to reduce memory usage and isolate issues. The entries module is typically the most resource-intensive.
- Increase Node.js memory (for example, NODE_OPTIONS=--max-old-space-size=4096) if audit runs fail on very large datasets.
- Use --fix-only for targeted fixes instead of applying all supported fix types.
- Use skipConfirm: true in non-interactive environments to apply fixes without prompts. Always maintain a backup or version-controlled copy before running fixes.
Query-Export Configuration
Use this configuration when you need to export a subset of stack content that matches a specific query, rather than exporting the entire stack. A successful run creates an export directory containing the matched content and a query metadata file describing the export.
A successful query export creates the specified exportDir containing the exported modules and a _query-meta.json file that describes the export.
Command: csdx cm:stacks:export-query
Basic Settings
| Option | Type | Default | Required | Description |
|---|---|---|---|---|
| contentVersion | number | 2 | No | Version of the export format |
| host | string | "https://api.contentstack.io/v3" | No | Base URL for Content Management API |
| exportDir | string | - | Yes | Path to export directory |
| stackApiKey | string | - | Yes | API key of source stack |
| branchName | string | - | No | Branch name to export from |
| branchAlias | string | - | No | Branch alias to export from |
Note The exportDir and stackApiKey fields are required unless they are provided through CLI flags or a management token alias.
Query Settings
| Option | Type | Default | Required | Description |
|---|---|---|---|---|
| query | object|string | - | Yes* | Query object or file path for filtering. See Query field format below. |
| skipReferences | boolean | false | No | Export only the matched entries or assets, without including the referenced content chain. |
| skipDependencies | boolean | false | No | Exclude dependent modules such as Apps, Taxonomies, and other related components. |
| skipStackSettings | boolean | false | No | Export content only, and omit all stack-level settings. |
| maxCTReferenceDepth | number | 20 | No | Max depth for content type references |
Query field format (object | string)
The query field supports two formats based on where it is defined: CLI input (string) and config file (object).
CLI (--query as a string)
Pass the query as either a file path or inline JSON:
- If the value contains .json, /, or \, the CLI treats it as a file path and loads the JSON.
- Otherwise, it parses the value using JSON.parse, so it must be valid JSON.
Config file (as an object)
Define module-specific filters under query.modules.<moduleName>:
- Do not use a flat query object for filtering.
- Each module filter is merged into the corresponding module API request.
For entries:
- The filter is applied inside the nested query object used by the Content Management API.
- Supports Mongo-style operators such as $regex.
Example:
{
"query": {
"modules": {
"entries": {
"title": { "$regex": "blog" }
}
}
}
}Performance Settings
| Option | Type | Default | Required | Description |
|---|---|---|---|---|
| fetchConcurrency | number | 5 | No | Number of parallel fetch operations |
| writeConcurrency | number | 5 | No | Number of parallel write operations |
| batchSize | number | 100 | No | Number of items per batch |
Feature Flags
| Option | Type | Default | Required | Description |
|---|---|---|---|---|
| securedAssets | boolean | false | No | Export secured assets |
| personalizationEnabled | boolean | false | No | Enable personalization features |
Query Configuration
| Option | Type | Default | Description |
|---|---|---|---|
| queryConfig.maxRecursionDepth | number | 10 | Maximum depth for recursive query processing |
| queryConfig.batchSize | number | 100 | Number of items per batch |
| queryConfig.metadataFileName | string | "_query-meta.json" | Name of the metadata file |
| queryConfig.validation.maxQueryDepth | number | 5 | Maximum depth of nested queries |
| queryConfig.validation.maxArraySize | number | 1000 | Maximum size of arrays in queries |
| queryConfig.validation.allowedDateFormats | string[] | ['ISO8601', 'YYYY-MM-DD', 'MM/DD/YYYY'] | Allowed date formats |
Module Configuration
You can set these modules.* keys in any order in your JSON file. The modules.exportOrder key controls the runtime sequence of the export. Keep the default setting unless you understand module dependencies, such as exporting stacks and locales before content types and entries.
Warning Arbitrary reordering can break or omit data.
| Option | Type | Default | Description |
|---|---|---|---|
| modules.general | string[] | ['stack', 'locales', 'environments'] | Always exported modules |
| modules.queryable | string[] | ['content-types'] | Modules that can be queried |
| modules.dependent | string[] | ['global-fields', 'extensions', 'marketplace-apps', 'taxonomies', 'personalize'] | Dependent modules |
| modules.content | string[] | ['entries', 'assets'] | Content modules |
| modules.exportOrder | string[] | See default | Export order based on dependencies |
Default exportOrder: ['stack', 'locales', 'environments', 'content-types', 'global-fields', 'extensions', 'taxonomies', 'entries', 'assets']
Note The modules.dependent array includes marketplace-apps and personalize in addition to the listed modules.
Authentication
| Option | Type | Default | Required | Description |
|---|---|---|---|---|
| managementToken | string | - | No | Management token. (Use --alias flag instead) |
Complete Query-Export Configuration Example
{
"contentVersion": 2,
"host": "https://api.contentstack.io/v3",
"exportDir": "./query-export-data",
"stackApiKey": "bltXXXXXXXXXX",
"branchName": "main",
"query": {
"title": {
"$regex": "blog"
}
},
"skipReferences": false,
"skipDependencies": false,
"skipStackSettings": false,
"securedAssets": false,
"fetchConcurrency": 5,
"writeConcurrency": 5,
"batchSize": 100,
"personalizationEnabled": false,
"maxCTReferenceDepth": 20,
"queryConfig": {
"maxRecursionDepth": 10,
"batchSize": 100,
"metadataFileName": "_query-meta.json",
"validation": {
"maxQueryDepth": 5,
"maxArraySize": 1000,
"allowedDateFormats": ["ISO8601", "YYYY-MM-DD", "MM/DD/YYYY"]
}
},
"modules": {
"general": ["stack", "locales", "environments"],
"queryable": ["content-types"],
"dependent": ["global-fields", "extensions", "marketplace-apps", "taxonomies", "personalize"],
"content": ["entries", "assets"],
"exportOrder": [
"stack",
"locales",
"environments",
"content-types",
"global-fields",
"extensions",
"taxonomies",
"entries",
"assets"
]
}
}Import-Setup Configuration
Use this configuration to prepare module dependencies and mappings required for a successful import. Import-Setup is typically run before the Import command to ensure dependent modules are created in the correct order.
Command: csdx cm:stacks:import-setup
Basic Settings
| Option | Type | Default | Required | Description |
|---|---|---|---|---|
| host | string | "https://api.contentstack.io/v3" | No | Specify the base URL for Content Management API |
| developerHubBaseUrl | string | "" | No | Specify the base URL for the Developer Hub API |
| fetchConcurrency | number | 5 | No | Control the number of parallel fetch operations |
Module Configuration
Each module can specify dependencies that must be imported first.
Dependencies define the order in which modules are imported. The CLI uses them to automatically import required modules first, avoiding reference or schema errors.
| Module | Option | Type | Default | Required | Description |
|---|---|---|---|---|---|
| custom-roles | modules.custom-roles.dependencies | string[] | ['environments', 'entries'] | No | Define required module dependencies |
| locales | modules.locales.dependencies | string[] | [] | No | Define required module dependencies |
| environments | modules.environments.dependencies | string[] | - | No | Define required module dependencies |
| extensions | modules.extensions.dependencies | string[] | - | No | Define required module dependencies |
| assets | modules.assets.fetchConcurrency | number | 5 | No | Fetch concurrency for assets |
| content-types | modules.content-types.dependencies | string[] | ['extensions', 'marketplace-apps', 'taxonomies'] | No | Define required module dependencies |
| entries | modules.entries.dependencies | string[] | ['assets', 'extensions', 'marketplace-apps', 'taxonomies'] | No | Define required module dependencies |
| global-fields | modules.global-fields.dependencies | string[] | ['extensions', 'marketplace-apps'] | No | Define required module dependencies |
| marketplace-apps | modules.marketplace-apps.dependencies | string[] | - | No | Define required module dependencies |
| taxonomies | modules.taxonomies.invalidKeys | string[] | See default | No | Keys to exclude during import |
Default taxonomies invalidKeys: ['updated_at', 'created_by', 'updated_by', 'stackHeaders', 'urlPath', 'created_at', 'ancestors', 'update', 'delete', 'fetch', 'descendants', 'move', 'search']
Migration Configuration
Use Migration Configuration to run user-defined scripts during CLI execution for advanced schema or content changes beyond export and import.
Running a migration executes the specified script against the target stack.
Key Considerations for Running Migrations
- Script controls all changes: The script fully determines all content and schema changes. The CLI does not validate, restrict, or preview the resulting operations.
- Permissions define impact: Migrations run with the configured management token or session, so the scope of changes depends entirely on that credential’s permissions. The CLI does not add restrictions. Use least-privilege tokens to limit risk.
- No built-in safety checks: The CLI does not prompt before destructive or bulk actions (for example, deleting a content type). Add safeguards in your script, such as prompts, environment checks, or conditional logic.
Note Migration behavior depends on the logic defined in the migration script. Test migrations in non-production environments before applying them to production stacks.
Command: csdx cm:stacks:migration
Configuration Options
Migration uses either an inline configuration or external JSON files.
Inline Configuration
Use the --config flag with key-value pairs:
csdx cm:migration --config <key1:value1> <key2:value2> --file-path <migration/script/file/path>
Replace the placeholders with keys expected by your script.
External Configuration File
Use the --config-file flag with a JSON file:
{
"apiKey": "your-api-key",
"managementToken": "your-management-token",
"branch": "main",
"customKey": "customValue"
}Note Migration configuration is script-specific and varies based on your unique migration requirements.