概要
Figma REST APIを使って画像アセットを自動的に書き出す方法を紹介します。デザイナーがFigmaで設定したExport設定を開発者が自動的に取得し、一括書き出しできる仕組みを構築します。
npm scriptを使用してNode.jsで実装しますが、他の言語や環境でも同様の手法が応用可能です。
Figma REST APIの認証とセットアップで紹介した認証設定とセットアップが完了していることを前提としています。
準備
FigmaファイルとExport設定の確認
書き出し対象のFigmaファイルを準備し、Figmaで書き出したい要素にExport設定(フォーマット・スケール・サフィックス)を追加します。ファイルの準備ができたらShareメニューからファイルのリンクを取得しておきます。リンクの中に含まれるファイルキー(fileKey)が必要になります。
例: https://www.figma.com/file/ABCDEFG1234567/Your-Design-File → ファイルキーはABCDEFG1234567
npm script 実行環境の準備
Node.js環境とプロジェクトのpackage.jsonが必要です。アセットの出力先ディレクトリ(例: figma/export)も必要に応じて事前に作成します。
Node.js環境の準備がまだの場合は、公式サイトからインストールが必要です。
Files endpointとレスポンス構造
Figma REST APIのFiles endpointを使用して、Figmaファイルの階層構造とExport設定を取得します。
このendpointは、ノードの階層構造・Export設定・スタイル・コンポーネント情報など、ファイルに含まれるすべての情報を返します。
レスポンス構造の全体像
curlコマンドでFiles endpointを呼び出します。環境変数FIGMA_ACCESS_TOKENにアクセストークンを設定し、YOUR_FILE_KEYを実際のファイルキーに置き換えます。
curl -H "X-Figma-Token: $FIGMA_ACCESS_TOKEN" \
"https://api.figma.com/v1/files/YOUR_FILE_KEY"
レスポンスは以下のようなJSON形式になります(一部抜粋)。
レスポンスは階層構造になっており、documentから各ページ(CANVAS)、フレーム(FRAME)、コンポーネント(COMPONENT)とネストされています。Export設定があるノードを見つけるには、この階層を再帰的に探索する必要があります。
{
"name": "utsusie Design System",
"lastModified": "2026-01-25T01:28:27Z",
"thumbnailUrl": "https://...",
"version": "1234567890",
"role": "owner",
"document": {
"id": "0:0",
"name": "Document",
"type": "DOCUMENT",
"children": [
{
"id": "45:2",
"name": "Components",
"type": "CANVAS",
"children": [
{
"id": "45:3",
"name": "Toolbar",
"type": "FRAME",
"children": [
{
"id": "46:8",
"name": "Toolbar / Item",
"type": "INSTANCE",
"exportSettings": [
{
"suffix": "",
"format": "PNG",
"constraint": {
"type": "SCALE",
"value": 1.0
}
}
],
"children": [...]
}
]
}
]
},
{
"id": "12:2",
"name": "Background",
"type": "CANVAS",
"children": [
{
"id": "13:6",
"name": "Texture / Light",
"type": "COMPONENT",
"exportSettings": [
{
"suffix": "",
"format": "JPG",
"constraint": {
"type": "SCALE",
"value": 1.0
}
}
]
}
]
}
]
},
"components": {...},
"componentSets": {...},
"schemaVersion": 0,
"styles": {...}
}
JavaScriptを使用したFigmaファイル情報の取得
JavaScriptで情報を取得するため、scripts/get-figma-file.jsを作成し、以下のコードを記述します。
scripts/get-figma-file.jsJavaScript
const fileKey = "FIGMA_FILE_KEY"; // ここにFigmaファイルキーを設定
const token = process.env.FIGMA_ACCESS_TOKEN;
fetch(`https://api.figma.com/v1/files/${fileKey}`, {
headers: {
'X-Figma-Token': token,
},
})
.then(res => res.json())
.then(data => {
console.log(JSON.stringify(data, null, 2));
})
.catch(err => {
console.error('Error:', err.message);
process.exit(1);
});
npm scriptとして実行できるように、package.jsonにスクリプトを追加します。
{
"scripts": {
"figma:file": "node scripts/get-figma-file.js"
}
}
以下のコマンドで実行できます。
ログにFigmaファイルのJSON情報が出力されていれば成功です。
Figma Export設定の探索
FigmaファイルのレイヤーにExport設定を追加すると、書き出しフォーマット・スケール・サフィックスを指定できます。
それらの情報はファイル情報にも記録されるため、レスポンスのJSONを探索することで、Export設定があるノードを見つけられます。
Export設定の構造
各ノードのexportSettingsプロパティにExport設定が含まれています。
{
"id": "46:8", // ← Images endpointで使用
"name": "Toolbar / Item",
"type": "INSTANCE",
"exportSettings": [
{
"suffix": "@2x",
"format": "PNG", // ← Images endpointのformatパラメータに使用
"constraint": {
"type": "SCALE",
"value": 2 // ← Images endpointのscaleパラメータに使用
}
}
]
}
Export設定から必要な情報を取得する
書き出しを自動化するため、Export設定があるノードから以下の情報を取得する必要があります。
| プロパティ | 説明 | 使用箇所 |
|---|
id | ノードID | Images endpointのidsパラメータ |
exportSettings[].format | 書き出しフォーマット | Images endpointのformatパラメータ(PNG、JPG、SVG、PDF) |
exportSettings[].constraint.value | スケール値 | Images endpointのscaleパラメータ(1.0、2.0、4.0など) |
name | ノード名 | ファイル名生成 |
exportSettings[].suffix | サフィックス | ファイル名の末尾に追加 |
これらの情報を使って、Images endpointから画像URLを取得し、ダウンロードします。
Images endpointを使った画像URLの取得
Images endpointは、指定したノードの画像URLを取得するためのAPIです。
Images endpointを使用して、Export設定があるノードの画像URLを取得できます。Export設定から取得した値をパラメータとして使用します。
Images endpointの呼び出し例
JavaScriptでImages endpointを呼び出した場合は以下のようになります。
// Export設定から取得した情報
const nodeId = '46:8'; // Export設定があるノードのID
const format = 'png'; // exportSettings[0].format(小文字に変換)
const scale = 2; // exportSettings[0].constraint.value
// Images endpointを呼び出し
const response = await fetch(
`https://api.figma.com/v1/images/${fileKey}?ids=${nodeId}&format=${format}&scale=${scale}`,
{
headers: {
'X-Figma-Token': process.env.FIGMA_ACCESS_TOKEN!,
},
}
);
const { images } = await response.json();
// images: { "46:8": "https://s3-alpha.figma.com/img/...", ... }
複数ノードの画像URLを一括取得
Images endpointは複数のノードIDをカンマ区切りで指定できます。
const nodeIds = ['46:8', '13:6'].join(',');
const response = await fetch(
`https://api.figma.com/v1/images/${fileKey}?ids=${nodeIds}&format=png&scale=1`,
// ...
);
npm scriptsによる自動化
最後に、これまでの内容を組み合わせて、FigmaファイルからExport設定を探索し、Images endpointで画像URLを取得してダウンロードするnpm scriptを作成します。
ポイントをおさらいします。
- Export設定の収集:
collectExportableNodesで階層構造を再帰的に探索
- 画像URL取得: Export設定の
formatとscaleをImages endpointに渡す
- ダウンロード: 取得したURLから画像をダウンロードしてファイル保存
- レート制限対応: 各リクエスト間に300ms待機(必要に応じて調整します)
スクリプトの作成
プロジェクトに scripts/export-figma-assets-simple.js を作成します。
scripts/export-figma-assets-simple.jsJavaScript
const fs = require('fs').promises;
const path = require('path');
// 環境変数
const FIGMA_ACCESS_TOKEN = process.env.FIGMA_ACCESS_TOKEN;
const FIGMA_FILE_KEY = process.env.FIGMA_FILE_KEY;
const OUTPUT_DIR = process.env.OUTPUT_DIR || 'figma/export';
/**
* Figmaファイル情報を取得
*/
async function getFigmaFile(fileKey) {
const response = await fetch(`https://api.figma.com/v1/files/${fileKey}`, {
headers: { 'X-Figma-Token': FIGMA_ACCESS_TOKEN },
});
if (!response.ok) {
throw new Error(`Figma API Error: ${response.status}`);
}
return await response.json();
}
/**
* Export設定があるノードを再帰的に収集
*/
function collectExportableNodes(node, nodes = []) {
if (node.exportSettings && node.exportSettings.length > 0) {
nodes.push({
id: node.id,
name: node.name,
exportSettings: node.exportSettings,
});
}
if (node.children) {
node.children.forEach((child) => collectExportableNodes(child, nodes));
}
return nodes;
}
/**
* 画像URLを取得
*/
async function getImageUrl(fileKey, nodeId, format, scale) {
const params = new URLSearchParams({
ids: nodeId,
format: format.toLowerCase(),
});
if (format.toLowerCase() !== 'svg') {
params.append('scale', scale);
}
const response = await fetch(
`https://api.figma.com/v1/images/${fileKey}?${params}`,
{ headers: { 'X-Figma-Token': FIGMA_ACCESS_TOKEN } }
);
if (!response.ok) {
throw new Error(`Figma API Error: ${response.status}`);
}
const data = await response.json();
return data.images[nodeId];
}
/**
* 画像をダウンロードして保存
*/
async function downloadImage(url, outputPath) {
const response = await fetch(url);
if (!response.ok) {
throw new Error(`Download failed: ${response.status}`);
}
const buffer = await response.arrayBuffer();
await fs.writeFile(outputPath, Buffer.from(buffer));
}
/**
* ファイル名をサニタイズ
*/
function sanitizeFileName(name) {
return name.replace(/[<>:"/\\|?*]/g, '-').replace(/\s+/g, '-').toLowerCase();
}
/**
* メイン処理
*/
async function main() {
if (!FIGMA_ACCESS_TOKEN || !FIGMA_FILE_KEY) {
console.error('Error: FIGMA_ACCESS_TOKEN and FIGMA_FILE_KEY are required');
process.exit(1);
}
console.log('Starting Figma asset export...\n');
// 出力ディレクトリ作成
await fs.mkdir(OUTPUT_DIR, { recursive: true });
// Figmaファイル取得
console.log('Fetching Figma file...');
const fileData = await getFigmaFile(FIGMA_FILE_KEY);
console.log(`File: ${fileData.name}\n`);
// Export設定があるノードを収集
const nodes = collectExportableNodes(fileData.document);
console.log(`Found ${nodes.length} nodes with export settings\n`);
if (nodes.length === 0) {
console.log('No export settings found');
return;
}
// 各ノードを処理
let successCount = 0;
for (const node of nodes) {
for (const setting of node.exportSettings) {
const format = setting.format.toLowerCase();
const scale = setting.constraint?.value || 1;
const suffix = setting.suffix || '';
// ファイル名生成
const fileName = `${sanitizeFileName(node.name)}${suffix}.${format}`;
const outputPath = path.join(OUTPUT_DIR, fileName);
console.log(`Processing: ${node.name} (${format.toUpperCase()} @${scale}x)`);
try {
// 画像URL取得
const imageUrl = await getImageUrl(FIGMA_FILE_KEY, node.id, format, scale);
if (!imageUrl) {
throw new Error('Failed to get image URL');
}
// ダウンロード
await downloadImage(imageUrl, outputPath);
console.log(` ✓ Saved: ${fileName}\n`);
successCount++;
// レート制限対策(300ms待機)
await new Promise((resolve) => setTimeout(resolve, 300));
} catch (error) {
console.error(` ✗ Error: ${error.message}\n`);
}
}
}
console.log(`\nCompleted: ${successCount} files exported to ${OUTPUT_DIR}`);
}
main().catch((error) => {
console.error('Fatal error:', error.message);
process.exit(1);
});
package.jsonへの追加
スクリプトができたら、package.jsonに以下のようにnpm scriptを追加します。
{
"scripts": {
"figma:export": "node scripts/export-figma-assets-simple.js"
}
}
実行方法
以下のコマンドで実行できます。
環境変数FIGMA_ACCESS_TOKENとFIGMA_FILE_KEYが設定されていることを確認する必要があります。
環境変数を直接渡す方法
環境変数を事前に設定していない場合は、コマンド実行時に直接渡すこともできます。
FIGMA_ACCESS_TOKEN=your_access_token FIGMA_FILE_KEY=your_file_key npm run figma:export
出力先ディレクトリも指定する場合は以下のようにします。
FIGMA_ACCESS_TOKEN=your_access_token \
FIGMA_FILE_KEY=your_file_key \
OUTPUT_DIR=public/images \
npm run figma:export
実行結果の例
実行結果として、対象のファイルからExport設定があるノードが探索され、画像アセットが指定のディレクトリに保存されました。
Starting Figma asset export...
Fetching Figma file...
File: utsusie Design System
Found 3 nodes with export settings
Processing: Toolbar / Item (PNG @1x)
✓ Saved: toolbar---item.png
Processing: Texture / Light (JPG @1x)
✓ Saved: texture---light.jpg
Processing: Texture / Dark (JPG @1x)
✓ Saved: texture---dark.jpg
Completed: 3 files exported to figma/export
まとめ
Figma REST APIのFiles endpointとImages endpointを組み合わせることで、デザインファイルから画像アセットを自動的に書き出せます。
応用すれば様々なことを自動化でき、Figma MCP ServerとAgent Skillsを組み合わせた高度なワークフローも構築できそうです。