# microCMSをエクスポートする方法：CSV出力・API全件取得・画像の移行

公開日: 2026-10-23 | 更新日: 2026-10-23 | URL: https://blog.genko.me/microcms-export-csv

> microCMSのエクスポートを、管理画面のCSV出力とAPI全件取得に分けて解説します。対応プラン、limitとoffset、SDKのTypeScript実装、画像の保存、genko.meへの移行時に必要な変換まで確認できます。

microCMSのエクスポートは、Team以上なら管理画面のCSV出力、APIならSDKの`getAllContents`を使います。HobbyでもGET APIのJSONをCSVに変換できます。画像本体とスキーマは別に保存します。

本記事はgenko.meの運営側が執筆しています。2026年10月23日に公式資料を確認しました。移行だけでなく、バックアップや棚卸しにも使える手順です。

## microCMSのCSVエクスポートは管理画面からできる？

公式CSVエクスポート手順では、Team・Business・Enterpriseが対象です。

1. 対象APIのコンテンツ一覧を開きます。
2. 全件なら「全てのコンテンツ」を選び、フィルターや検索条件も解除します。
3. 「CSVエクスポート」を押し、名前と対象条件を確認して開始します。
4. 完了メールのリンクからダウンロードします。リンクは実行者本人だけが使用でき、有効期限は24時間です。

「公開中かつ下書き中」は同じIDが2行になるため、行数と記事数は異なります。参照先のコンテンツ・メディア・メンバーを読む権限がない値は`NO_READ_PERMISSION`になります。書き出し中は編集を止めます。

## microCMSで全件取得するには？limit・offset・totalCount

一覧APIは`GET https://{service}.microcms.io/api/v1/{endpoint}`です。`limit`の既定値は10、最大100です。`limit=1000`では全件取得できません。

`limit=100`で`offset=0`、`100`、`200`と進めて`contents`を連結し、次の開始位置が`totalCount`以上なら終了します。全件保存では`filters`・`q`・`fields`を指定しません。

### TypeScriptで全件取得してJSONを保存する

SDKの`getAllContents({ endpoint, queries?, customRequestInit? })`は配列を返し、`queries`に`limit`・`offset`・`ids`は指定できません。オブジェクト形式は`getObject`を使います。

Node.js 22以降で実行します。

```bash
npm install microcms-js-sdk
npm install --save-dev tsx
```

`export.ts`として保存します。環境変数は実行環境に設定し、キーをGitに入れません。

```typescript
import { writeFile } from "node:fs/promises";
import { createClient } from "microcms-js-sdk";

async function main() {
  const serviceDomain = process.env.MICROCMS_SERVICE_DOMAIN;
  const apiKey = process.env.MICROCMS_API_KEY;
  const endpoint = process.env.MICROCMS_ENDPOINT;
  if (!serviceDomain || !apiKey || !endpoint) {
    throw new Error("Missing microCMS environment variables");
  }
  const client = createClient({ serviceDomain, apiKey, retry: true });
  const contents = await client.getAllContents<Record<string, unknown>>({
    endpoint,
    queries: { depth: 0 },
  });
  await writeFile("export.json", JSON.stringify({ contents }, null, 2) + "\n");
  console.log(`Exported ${contents.length} items`);
}
main().catch((error) => {
  console.error("Export failed:", error instanceof Error ? error.message : error);
  process.exitCode = 1;
});
```

```bash
npx tsx export.ts
```

サービス名と`blog`などのエンドポイントを指定します。`depth: 0`は参照をIDだけにし、参照先APIも別に保存します。

APIキーの権限は対象APIのGETだけに絞ります。下書き・公開終了には各全取得権限も必要です。APIキーと書き出したファイルは、公開されない場所に保管します。

編集を止め、件数とID重複を確認します。制限事項では最大応答サイズは約5MBです。サイズ超過時は`getList`で`limit`を減らし、`offset`・`totalCount`で逐次取得します。GETのレート制限はサービス単位で毎秒60回のオリジンアクセスです。エッジキャッシュから返った分は数えられませんが、サイト本番の取得も合算されます。429などでは待って再試行します。

## microCMSのJSONをCSVに変換する方法

`to-csv.ts`に保存して`npx tsx to-csv.ts`で実行します。キーを列にし、配列・オブジェクトはJSON文字列にします。確認用で、移行先への直接投入用ではありません。

```typescript
import { readFile, writeFile } from "node:fs/promises";

async function main() {
  const { contents } = JSON.parse(await readFile("export.json", "utf8")) as {
    contents: Record<string, unknown>[];
  };
  const columns = [...new Set(contents.flatMap((row) => Object.keys(row)))];
  const cell = (value: unknown): string => {
    let text = value == null ? "" : typeof value === "object"
      ? JSON.stringify(value) : String(value);
    if (/^[\s]*[=+\-@]/.test(text)) text = "'" + text;
    return `"${text.replace(/"/g, '""')}"`;
  };
  const rows = [columns.map(cell).join(","), ...contents.map((row) =>
    columns.map((key) => cell(row[key])).join(","))];
  await writeFile("export.csv", "﻿" + rows.join("\r\n") + "\r\n", "utf8");
}
main().catch((error) => {
  console.error("CSV conversion failed:", error instanceof Error ? error.message : error);
  process.exitCode = 1;
});
```

BOMとCSVのエスケープを付け、式と解釈されやすいセルに`'`を加えます。この処理で`-1`のような負の数にも`'`が付くため、移行の原本にはJSONを使います。

| フィールド | CSVだけで移すときの問題 | 整理方法 |
| --- | --- | --- |
| リッチテキスト | HTMLや埋め込み画像が1セルに入ります | HTMLを保持し、画像URLを別に収集します |
| 繰り返し・カスタム | 入れ子と項目順を表で表しにくいです | JSONを保存し、移行先に合わせて再設計します |
| 参照・複数参照 | IDだけでは参照先本文を復元できません | 参照先APIとID対応表を保存します |
| 画像・複数画像 | URLはファイル本体ではありません | 本体の保存とURL対応表を別に用意します |

## microCMSの画像・メディアもエクスポートするには？

画像の`url`、複数画像、本文の`src`を集めます。未使用画像も必要なら、公式のメディア書き出し案内に従い、マネジメントAPIの`GET /api/v2/media`で一覧を取得します。「メディアの取得」権限が必要です。

メディア一覧APIの`limit`は最大100で、続きは`offset`ではなく`token`を使います。有効期限は15秒なので、一覧収集後にダウンロードします。初回は末尾でもトークンが返るため、終了は件数と`totalCount`で判定します。

マネジメントAPIの制限はIP単位で10秒に10回です。URL対応表を残し、PDFや本文も確認します。

## microCMSのエクスポートをgenko.meへ移行する手順

[genko.me](https://genko.me/)では、microCMSの`apiFields`を持つスキーマJSONを読み込めます。コンテンツと画像の無変換一括移行ではありません。[インポートとエクスポート](https://docs.genko.me/studio/import-export)の形式に合わせます。

1. microCMSの「API設定」→「APIスキーマ」からJSONを保存し、genko.meのスキーマ画面で読み込みます。未対応の種類は設計し直します。
2. 項目IDと型を合わせ、`revisedAt`など不要なキーを除いたJSONを作ります。
3. 画像をgenko.meに登録し、メディアIDを含む値に置き換えます。参照先も登録してIDを合わせます。
4. 対象APIの「インポート」でJSONを選び、まず下書きとして取り込みます。
5. 件数・ID・本文・画像・リンクを確認してから公開します。

`title`・`body`だけなら次の形です。

```json
{
  "contents": [
    { "id": "first-post", "title": "最初の記事", "body": "<p>本文です。</p>" }
  ]
}
```

2026年10月時点で1ファイル10MB、1回1,000件までです。両方の上限内に分割します。IDは条件内なら維持できますが、重複で停止し、保存済みの分は残ります。公開状態・作成日時・公開予約は復元されません。元の公開日は専用の日時項目へ移します。配信値と保存値の違いは[レスポンスの値](https://docs.genko.me/api-reference/values)も確認してください。

[比較記事](https://blog.genko.me/compare-microcms)、Hobbyの見直しは[無料プランの上限](https://blog.genko.me/microcms-free-plan-limits)で整理しています。microCMSの継続利用も選べます。

## よくある質問

### microCMSを無料でエクスポートできますか？

HobbyでもGET APIで取得してJSON保存やCSV変換を行えます。管理画面のCSV出力はTeam以上が対象です。

### microCMSで100件を超えて全件取得できますか？

`getAllContents`を使うか、`getList`の`limit`と`offset`でページを進めます。全件はキーと取得条件で読める件数です。

### 下書きと公開終了の記事もエクスポートできますか？

APIではGETに加え、それぞれの全取得権限が必要です。公開中の未公開変更は、CSVの版別行と実際の返却値で保存範囲を確認します。

### CSVを保存すれば画像もバックアップできますか？

URLだけでは本体は保存されません。ファイルをダウンロードし、本文内画像も確認します。

## 出典

- [microCMS：CSVエクスポート](https://document.microcms.io/manual/csv-export)
- [microCMS：一覧API](https://document.microcms.io/content-api/get-list-contents)
- [microCMS：公式SDK](https://github.com/microcmsio/microcms-js-sdk)
- [microCMS：APIキー](https://document.microcms.io/content-api/x-microcms-api-key)
- [microCMS：メディアの書き出し](https://help.microcms.io/ja/knowledge/media-export-and-import)
- [microCMS：メディア一覧](https://document.microcms.io/management-api/get-media-v2)
- [microCMS：制限事項](https://document.microcms.io/manual/limitations)
- [microCMS：スキーマJSON](https://document.microcms.io/manual/export-and-import-api-schema)
- [genko.me：インポート](https://docs.genko.me/studio/import-export)
- [genko.me：プランと上限](https://docs.genko.me/studio/plans)
