MQS™
Contentful

How to Export Content Metadata from Contentful

Contentful stores structured content with rich metadata. Here's how to extract your entries and assets into a spreadsheet for quality assessment.

Built-in Export
JSON only
Admin Required
Space access
Best Output
JSON → CSV
Time to First Export
10-30 min
i
The short answer

Contentful does not export directly to CSV or Excel. The platform's native export format is JSON. However, getting to CSV is straightforward: use the built-in Web App export or CLI to get JSON, then convert to CSV with a short script. For targeted exports, the Content Management API gives you full control over which content types and fields to include.

1

Contentful Web App Export

EasyBest for: Content editors, project managers, non-technical usersOutput: JSON → CSV~10-15 minutes

Contentful's Web App includes a built-in export feature that downloads all content entries and assets from a space as a JSON file. You can then convert it to CSV.

1
Log in to the Contentful Web App. Navigate to Settings → Export in the space whose metadata you need.
2
Click Export content. Contentful will generate a JSON file containing all entries, assets, and content types in the space.
3
Download the JSON export. Use the Python conversion script below to transform it into a CSV file.
python
import json, csv

with open("contentful-export.json") as f:
    data = json.load(f)

# Export entries (content items)
with open("contentful_entries.csv", "w", newline="") as f:
    writer = csv.writer(f)
    writer.writerow([
        "ID", "Content Type", "Created", "Updated",
        "Published Version", "Locale", "Fields Summary"
    ])
    for entry in data.get("entries", []):
        sys = entry.get("sys", {})
        fields = entry.get("fields", {})
        field_summary = "; ".join(
            f"{k}: {str(v.get('en-US', v))[:80]}"
            for k, v in fields.items()
        )
        writer.writerow([
            sys.get("id", ""),
            sys.get("contentType", {}).get("sys", {}).get("id", ""),
            sys.get("createdAt", ""),
            sys.get("updatedAt", ""),
            sys.get("publishedVersion", ""),
            "en-US",
            field_summary,
        ])

# Export assets (media files)
with open("contentful_assets.csv", "w", newline="") as f:
    writer = csv.writer(f)
    writer.writerow([
        "ID", "Title", "Description", "File Name",
        "Content Type", "Size", "URL", "Created", "Updated"
    ])
    for asset in data.get("assets", []):
        sys = asset.get("sys", {})
        fields = asset.get("fields", {})
        file_info = fields.get("file", {}).get("en-US", {})
        writer.writerow([
            sys.get("id", ""),
            fields.get("title", {}).get("en-US", ""),
            fields.get("description", {}).get("en-US", ""),
            file_info.get("fileName", ""),
            file_info.get("contentType", ""),
            file_info.get("details", {}).get("size", ""),
            file_info.get("url", ""),
            sys.get("createdAt", ""),
            sys.get("updatedAt", ""),
        ])

print("Exported entries and assets to CSV")
2

Contentful CLI

ModerateBest for: Developers, DevOps, automated backupsOutput: JSON → CSV~15-20 minutes

The Contentful CLI provides a powerful space export command that exports all content from a space to a JSON file. It handles pagination, rate limiting, and large spaces automatically.

1
Install the CLI: npm install -g contentful-cli
2
Log in: contentful login. This opens a browser for authentication.
3
Run the export command with your space ID:
bash
# Export entire space (entries, assets, content types)
contentful space export \
  --space-id YOUR_SPACE_ID \
  --environment-id master \
  --content-file contentful-export.json

# Export only specific content type
contentful space export \
  --space-id YOUR_SPACE_ID \
  --content-type blogPost \
  --content-file blog_posts.json

# The exported JSON can be converted to CSV using the
# Python script from Method 1 above.
Filtering exports
You can filter the export by content type using --content-type. For very large spaces, you can also use --skip-content-model to exclude the content type definitions, or --skip-roles to skip user roles.
3

Content Management API (CMA)

TechnicalBest for: Developers, data engineers, custom integrationsOutput: JSON → CSV~20-30 minutes

The Contentful CMA gives you the most granular control. Query specific content types, filter by field values, select specific fields, and handle pagination. This is the best approach when you need a targeted export of specific content.

1
Get your CMA token from Settings → API Keys in the Contentful Web App. Create a Content Management API token with read access.
2
Install the Contentful SDK: pip install contentful-management
3
Run the script below. Adjust the content type and fields as needed.
python
import contentful_management
import csv

client = contentful_management.Client("YOUR_CMA_TOKEN")
space = client.spaces().find("YOUR_SPACE_ID")
environment = space.environments().find("master")

# List all entries of a specific content type
entries = []
skip = 0
limit = 100
while True:
    batch = environment.entries().all({
        "content_type": "blogPost",  # Change to your content type
        "limit": limit,
        "skip": skip,
    })
    entries.extend(batch)
    if len(batch) < limit:
        break
    skip += limit

with open("contentful_metadata.csv", "w", newline="") as f:
    writer = csv.writer(f)
    writer.writerow([
        "ID", "Title", "Slug", "Status",
        "Created", "Updated", "Published At"
    ])
    for entry in entries:
        writer.writerow([
            entry.id,
            entry.fields().get("title", ""),
            entry.fields().get("slug", ""),
            "published" if entry.is_published else "draft",
            entry.sys.get("created_at", ""),
            entry.sys.get("updated_at", ""),
            entry.sys.get("published_at", ""),
        ])

# List all assets
assets = []
skip = 0
while True:
    batch = environment.assets().all({"limit": limit, "skip": skip})
    assets.extend(batch)
    if len(batch) < limit:
        break
    skip += limit

with open("contentful_assets.csv", "w", newline="") as f:
    writer = csv.writer(f)
    writer.writerow([
        "ID", "Title", "Description", "File Name",
        "Content Type", "Size", "Created", "Updated"
    ])
    for asset in assets:
        file_info = asset.fields().get("file", {})
        writer.writerow([
            asset.id,
            asset.fields().get("title", ""),
            asset.fields().get("description", ""),
            file_info.get("fileName", "") if file_info else "",
            file_info.get("contentType", "") if file_info else "",
            file_info.get("details", {}).get("size", "") if file_info else "",
            asset.sys.get("created_at", ""),
            asset.sys.get("updated_at", ""),
        ])

print(f"Exported {len(entries)} entries and {len(assets)} assets")

What metadata fields can you export?

FieldWeb App ExportCLI ExportCMA API
Entry ID
Content type
All custom fields
Created date
Updated date
Published version
Publication status
Locale / translations
Asset title
Asset file name
Asset MIME type
Asset file size
Asset dimensions
Asset URL
Tags
Content type schemaSeparate call
!
Known limitations
  • JSON-first platform: Contentful exports are JSON, not CSV. You will always need a conversion step. The scripts above handle this for common use cases.
  • Linked entries: Contentful content models use references (links) between entries. The export includes reference IDs but not the resolved content. To include linked content, you need to resolve references in your conversion script.
  • Locales: Multi-locale spaces include field values for each locale. The JSON structure nests field values under locale keys (e.g., en-US). Decide whether your CSV should include all locales or just the default.

You have your metadata export.
Now score it.

Upload your CSV or Excel file to MQS and get a structural metadata health score out of 100 with dimension breakdowns and actionable diagnostics.

Get Your Free ReportSee How It Works

Exporting from another platform?

Google Drive
How to Export File Metadata from Google Drive
Dropbox
How to Export File Metadata from Dropbox
Box
How to Export File Metadata from Box
SharePoint
How to Export Document Metadata from SharePoint
Local Server
How to Export File Metadata from a Local Server
Amazon S3
How to Export Object Metadata from AWS S3
Adobe AEM
How to Export Asset Metadata from AEM
Salsify
How to Export Product Metadata from Salsify
Bynder
How to Export Asset Metadata from Bynder
Airtable
How to Export Metadata from Airtable
Canto
How to Export Asset Metadata from Canto
Acquia DAM
How to Export Asset Metadata from Acquia DAM
Orange Logic
How to Export Asset Metadata from Orange Logic
PhotoShelter for Brands
How to Export Asset Metadata from PhotoShelter for Brands
PhotoShelter for Photographers
How to Export Image Metadata from PhotoShelter for Photographers