Sorry, no results found for "".

Import and Export > Enterprise Project Exports

Enterprise Project Exports

The Project Export feature allows Enterprise customers to export all content and assets from their DatoCMS project to their own AWS S3 bucket. This export provides a structured snapshot of your data in JSON format, along with all uploaded assets.

Security and integrity of your data is our top priority!

Our ISO 27001 certification ensures that our architecture incorporates internal backups, delivering a dependable safeguard against data loss. In other words, you can be confident that we adhere to best practices for keeping your data secure.

This Enterprise functionality serves as an additional layer of protection to ensure your safety and should be utilized as a last resort.

Key Points to Consider

  • Enterprise Only: This feature is available exclusively to Enterprise customers.

  • Not a Backup Solution: The export does not offer a one-click restoration process.

  • Primary Environment Only: Only the primary project environment is included in the export.

  • Automated and Scheduled: Exports occur on a predefined schedule, with a minimum frequency of once per month and a maximum of once per day.

  • AWS S3 Storage Required: Customers must configure their own S3 bucket to receive the exported data.

What is Included in the Export?

The exported data includes:

  • Schema Models: Fields and fieldsets.

  • Schema Blocks: Block definitions and fields.

  • Records: Current and published versions, including block records.

  • Uploads: Metadata and references for uploaded assets.

  • Project Settings: Locales, SEO settings, workflows, and installed plugins.

  • Asset Files: All uploaded files from the media area.

JSON Snapshots vs. Asset Syncing

While JSON snapshots are periodic and remain unchanged once created, assets are simply synced to their latest versions in the same directory every time. This is why bucket versioning is recommended—if an asset is removed from the project, it will also be deleted from the bucket. However, with versioning enabled, you can still retrieve previous versions of deleted assets.

What is NOT Included?

The export does not include:

  • Record revision history

  • API tokens, webhooks, and build triggers

  • Collaborators, roles, and permissions

  • Audit logs and usage statistics

  • SSO settings and user accounts

  • Any additional metadata not explicitly listed

How to enable Project Export

This feature cannot be enabled by customers directly. To set up an export, you must contact DatoCMS support and provide the following AWS S3 details:

  • S3 Bucket Name

  • AWS Region

  • S3 Access Key ID

  • S3 Secret Access Key

Additionally, you must configure your AWS S3 bucket with:

  • Public access blocked (mandatory for security)

  • Bucket versioning enabled (recommended for data recovery)

  • Lifecycle rules (optional, for automatic cleanup of old snapshots)

Our support team will give you detailed instructions on how to setup everything correctly.

Export structure

Once configured, each export generates a timestamped snapshot in your S3 bucket. The structure is as follows:

assets/
project_<ID>/
file1.png
file2.mp4
content/
project_<ID>/
snapshot_<TIMESTAMP>/
models/
records/
uploads/
workflows/
site.json

The presence of a canary.txt file in a snapshot directory confirms that the export was completed successfully.

JSON files format

JSON files in the snapshots are similar to the JSON content you can fetch from our Content Management API, with some changes to reduce scattering across multiple files.

Schema

For each schema model/block model, a file following this path is present in the bucket:

content/project_<ID>/snapshot_<TIMESTAMP>/models/<api_key>.json

For instance:

content/project_999/snapshot_1721033044/models/article.json

The data key contains the item_type resource. Fields and fieldsets are referenced by their IDs, and their full payload is present in the included key.

{
"data": {
"id": "UVP2y5QPToWPXqJbMszyFg",
"type": "item_type",
"attributes": {
"api_key": "article",
"name": "Article",
// ... the rest of item_type attributes
},
"relationships": {
"fields": {
"data": [
{ "id": "InMbgf7BSo2TDG4HYGb2Ug", "type": "field" }
]
},
"fieldsets": {
"data": [
{ "id": "bwk17lanRYCOvXKztPp5PA", "type": "fieldset" }
]
},
"workflow": {
"data": { "id": "MQLtfJv4Q22nKUoHEQ3b9A", "type": "workflow" }
}
},
"meta": { "has_singleton_item": false }
},
"included": [
{
"id": "InMbgf7BSo2TDG4HYGb2Ug",
"type": "field",
"attributes": {
"label": "Content",
// ... the rest of field attributes
},
"relationships": {
"item_type": {
"data": { "id": "UVP2y5QPToWPXqJbMszyFg", "type": "item_type" }
},
"fieldset": {
"data": { "id": "bwk17lanRYCOvXKztPp5PA", "type": "fieldset" }
}
}
},
{
"id": "bwk17lanRYCOvXKztPp5PA",
"type": "fieldset",
"attributes": {
"title": "Group 1",
// ... the rest of fieldset attributes
},
"relationships": {
"item_type": {
"data": { "id": "UVP2y5QPToWPXqJbMszyFg", "type": "item_type" }
}
}
}
]
}

Records

For each schema model, multiple files following this template are present in the bucket:

content/project_<ID>/snapshot_<TIMESTAMP>/records/<schema_model_api_key>/current/batch_<batch_increment_number>.json
content/project_<ID>/snapshot_<TIMESTAMP>/records/<schema_model_api_key>/published/batch_<batch_increment_number>.json

For instance:

content/project_999/snapshot_1721033044/records/article/current/batch_000.json
content/project_999/snapshot_1721033044/records/article/current/batch_001.json
content/project_999/snapshot_1721033044/records/article/published/batch_000.json
content/project_999/snapshot_1721033044/records/article/published/batch_001.json

The current prefix contains the records' current versions (the latest version available, as seen in the admin interface). The published prefix contains records' published versions.

The same record ID can be present in both trees (current and published) if it has both a current and a published version. The same version can be present in both trees if it's at the same time the current and published version of the record.

Versions include their block records, similar to using the nested=true query parameter in our Content Management API.

Each batch_XXX.json contains several versions under the data key and their order is not predictable.

{
"data": [
{
"id": "ZrKQnn5AQBiZ4CTX8eyu8Q",
"type": "item",
"attributes": {
"title": "A trip to Florence!",
"content": {
"en": [
{
"type": "item",
"attributes": {
"text": "Beautiful!"
// ... the rest of block record attributes
},
"relationships": {
"item_type": {
"data": {
"id": "JfkKRx-FRJONbco_hHOS5Q",
"type": "item_type"
}
}
},
"id": "afzDcUT0RHOduJbr8L_ZmA"
}
]
}
// ... the rest of record attributes
},
"relationships": {
"item_type": {
"data": { "id": "UVP2y5QPToWPXqJbMszyFg", "type": "item_type" }
},
"creator": { "data": { "id": "24527", "type": "account" } }
},
"meta": {
// ...
}
},
{
// .. other current versions
}
]
}