microCMSのエクスポートは、Team以上なら管理画面のCSV出力、APIならSDKのgetAllContentsを使います。HobbyでもGET APIのJSONをCSVに変換できます。画像本体とスキーマは別に保存します。
本記事はgenko.meの運営側が執筆しています。2026年10月23日に公式資料を確認しました。移行だけでなく、バックアップや棚卸しにも使える手順です。
microCMSのCSVエクスポートは管理画面からできる?
公式CSVエクスポート手順では、Team・Business・Enterpriseが対象です。
対象APIのコンテンツ一覧を開きます。
全件なら「全てのコンテンツ」を選び、フィルターや検索条件も解除します。
「CSVエクスポート」を押し、名前と対象条件を確認して開始します。
完了メールのリンクからダウンロードします。リンクは実行者本人だけが使用でき、有効期限は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以降で実行します。
npm install microcms-js-sdknpm install --save-dev tsxexport.tsとして保存します。環境変数は実行環境に設定し、キーをGitに入れません。
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;});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文字列にします。確認用で、移行先への直接投入用ではありません。
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では、microCMSのapiFieldsを持つスキーマJSONを読み込めます。コンテンツと画像の無変換一括移行ではありません。インポートとエクスポートの形式に合わせます。
microCMSの「API設定」→「APIスキーマ」からJSONを保存し、genko.meのスキーマ画面で読み込みます。未対応の種類は設計し直します。
項目IDと型を合わせ、
revisedAtなど不要なキーを除いたJSONを作ります。画像をgenko.meに登録し、メディアIDを含む値に置き換えます。参照先も登録してIDを合わせます。
対象APIの「インポート」でJSONを選び、まず下書きとして取り込みます。
件数・ID・本文・画像・リンクを確認してから公開します。
title・bodyだけなら次の形です。
{ "contents": [ { "id": "first-post", "title": "最初の記事", "body": "<p>本文です。</p>" } ]}2026年10月時点で1ファイル10MB、1回1,000件までです。両方の上限内に分割します。IDは条件内なら維持できますが、重複で停止し、保存済みの分は残ります。公開状態・作成日時・公開予約は復元されません。元の公開日は専用の日時項目へ移します。配信値と保存値の違いはレスポンスの値も確認してください。
比較記事、Hobbyの見直しは無料プランの上限で整理しています。microCMSの継続利用も選べます。
よくある質問
microCMSを無料でエクスポートできますか?
HobbyでもGET APIで取得してJSON保存やCSV変換を行えます。管理画面のCSV出力はTeam以上が対象です。
microCMSで100件を超えて全件取得できますか?
getAllContentsを使うか、getListのlimitとoffsetでページを進めます。全件はキーと取得条件で読める件数です。
下書きと公開終了の記事もエクスポートできますか?
APIではGETに加え、それぞれの全取得権限が必要です。公開中の未公開変更は、CSVの版別行と実際の返却値で保存範囲を確認します。
CSVを保存すれば画像もバックアップできますか?
URLだけでは本体は保存されません。ファイルをダウンロードし、本文内画像も確認します。
