メインコンテンツまでスキップ

複数PDF同期生成(ZIP)

POST /file/sync/multiple エンドポイントは、指定されたテンプレートと複数のパラメータから複数のPDFファイルを同期的に生成し、ZIPファイルで返します。

エンドポイント情報​

  • URL: https://api.re-port-flow.com/v1/file/sync/multiple
  • メソッド: POST
  • 認証: appkey ヘッダーが必要
  • タイムアウト: 60秒
  • リクエストサイズ上限: 50MB(Base64エンコード後、実質約37MB相当)

使用例​

cURL​

curl -X POST https://api.re-port-flow.com/v1/file/sync/multiple \
-H "appkey: your-application-key" \
-H "Content-Type: application/json" \
-d '{
"designId": "0eUDdgAjNXrrItA2",
"version": 1,
"contents": [
{
"fileName": "invoice_001.pdf",
"shareType": "01",
"passcodeEnabled": false,
"params": { "customerName": "山田太郎", "invoiceNumber": "INV-001" }
},
{
"fileName": "invoice_002.pdf",
"shareType": "02",
"passcodeEnabled": false,
"params": { "customerName": "佐藤花子", "invoiceNumber": "INV-002" }
}
]
}' \
--output invoices.zip

JavaScript​

import axios from 'axios';
import fs from 'fs';

async function generateMultiplePDFs(designId, contents) {
const response = await axios.post(
'https://api.re-port-flow.com/v1/file/sync/multiple',
{ designId, version: 1, contents },
{
headers: { 'appkey': process.env.APP_KEY },
responseType: 'arraybuffer'
}
);

const requestId = response.headers['request-id'];
const fileUrl = response.headers['file-url'];
// X-File-Mapping は URL エンコード済みの JSON 配列。decodeURIComponent → JSON.parse の順で復号する。
const fileMapping = JSON.parse(decodeURIComponent(response.headers['x-file-mapping']));

console.log('生成されたファイル:', fileMapping.map(f => ({ fileId: f.fileId, fileName: f.fileName, share: f.share })));

return { data: response.data, requestId, fileUrl, fileMapping };
}

// 使用例
const contents = [
{ fileName: 'invoice_001.pdf', shareType: '01', passcodeEnabled: false, params: { customerName: '山田太郎', invoiceNumber: 'INV-001' } },
{ fileName: 'invoice_002.pdf', shareType: '02', passcodeEnabled: false, params: { customerName: '佐藤花子', invoiceNumber: 'INV-002' } }
];

const result = await generateMultiplePDFs('0eUDdgAjNXrrItA2', contents);
fs.writeFileSync('invoices.zip', result.data);

リクエストパラメータ​

フィールド型必須説明
designIdstring✓テンプレート ID(16文字の英数字。例: 0eUDdgAjNXrrItA2)
versioninteger✓バージョン番号
webhookUrlstring-このリクエストの Webhook 通知先(https、2048文字以内)。ワークスペースに登録済みで有効な Webhook エンドポイントの URL と一致する必要があり、一致しなければ 400 WEBHOOK_URL_NOT_ALLOWED。指定すると、その宛先だけがこのリクエストのイベントを受け取る(詳細)
contentsarray✓ContentDtoの配列(1〜100件)
contents[].fileNamestring✓ファイル名(/ \\ : * ? " < > | および制御文字以外は使用可能。配列内で一意であること(大文字・小文字は区別しない))
contents[].shareTypestring-共有タイプ(リクエストは数値コード)。"01"=ワークスペース内共有(デフォルト) / "02"=招待者共有 / "03"=公開URL共有。レスポンスの share.shareType は workspace / invited / public の人間可読な名前で返ります
contents[].passcodeEnabledboolean-パスコード保護(デフォルト: false)
contents[].passthroughobject-レスポンスの X-File-Mapping に透過する任意のメタデータ(例: { "pageId": "abc123" })。トップレベルの文字列・数値は帳票検索メタデータとしても保存されます
contents[].paramsobject✓パラメータ(テンプレートのパラメータ取得APIで構造を確認可能)

レスポンス​

成功時 (200 OK)​

レスポンスボディ: ZIPファイル(バイナリ)

レスポンスヘッダー:

ヘッダー説明例
Content-Typeコンテンツタイプapplication/zip
Content-Lengthファイルサイズ(バイト)307200
Content-Dispositionファイル名。<テンプレート名>_<requestId>.zip を URL エンコードした値attachment; filename="%E8%AB%8B%E6%B1%82%E6%9B%B8_kZ3mP9qL2xV7nR4t.zip"(テンプレート名が「請求書」の場合)
File-URL生成結果を確認できるアプリ画面(出力履歴)のURL。ファイルの直接ダウンロードURLではないhttps://re-port-flow.com/{workspaceId}/templates/{designId}/outputs?requestId={requestId}
Request-IdリクエストIDkZ3mP9qL2xV7nR4t
X-File-Mappingファイル情報と共有設定(JSON 配列)。URL エンコード済みで返るため、クライアントは decodeURIComponent してから JSON.parse すること下記参照
File-URL はダウンロードURLではありません

File-URL は生成結果を確認できるアプリ画面(出力履歴)へのリンクで、開くにはRe:port Flowへのログインが必要です。プログラムからファイルを取得する場合はPDF のダウンロードのエンドポイントを使ってください(requestId でZIP一括、requestId + fileId で個別PDF)。

以前このヘッダーは「ZIPダウンロードURL」と記載していましたが、実装が返す値と食い違っていたため、実装に合わせて訂正しました。レスポンス自体の挙動は変わっていません。

X-File-Mapping の構造:

[
{
"fileId": "a8Fh2LkQ9zT4wE6y",
"fileName": "invoice_001.pdf",
"passthrough": { "pageId": "abc123" },
"share": {
"shareType": "workspace",
"url": "https://re-port-flow.com/file/{requestId}/a8Fh2LkQ9zT4wE6y",
"passcodeEnabled": false
}
},
{
"fileId": "b3Gk7MnP1qR5sT9v",
"fileName": "invoice_002.pdf",
"share": {
"shareType": "invited",
"url": "https://re-port-flow.com/file/{requestId}/b3Gk7MnP1qR5sT9v",
"passcodeEnabled": false
}
}
]

passthrough フィールドは contents[].passthrough を指定したエントリのみに含まれます。

passthrough の使い所

ReportFlow はセキュリティとペイロードサイズの観点から、レスポンスや Webhook 通知に params(生成データ)を返しません。

受信側で「どの業務レコードに対する PDF か」を識別したい場合は、 リクエスト時に passthrough に自社DBのIDなどを入れてください。 レスポンスや Webhook でそのまま返却されます。

{
"fileName": "invoice.pdf",
"passthrough": { "invoiceId": "INV-001", "tenantId": "acme" },
"params": { "customerName": "山田太郎", "amount": 10000 }
}

Webhook 受信時に passthrough の値がそのまま返るため、invoiceId から DB を引いて該当レコードを更新する、といった処理が組めます。 params(顧客名や金額)は外部に送信されません。

さらに passthrough のトップレベルにある文字列・数値は、帳票検索用のメタデータ としても保存されます(生成PDF内の XMP メタデータと、Re:port Flow アプリの帳票検索 インデックス)。対象になる値の条件・上限と、個人情報を入れてはいけない理由は passthrough と帳票検索メタデータを参照してください。

識別子を JSON で受け取る(?response=json)​

URL に ?response=json を付けると、ZIPの本体の代わりに識別子を JSON で返します。レスポンスヘッダー(Request-Id / File-URL / X-File-Mapping)を読めないツール(Coze など)向けです。

curl -X POST "https://api.re-port-flow.com/v1/file/sync/multiple?response=json" \
-H "appkey: YOUR_APP_KEY" \
-H "Content-Type: application/json" \
-d @request.json
{
"requestId": "Xk3pQ9vB2mN7aR1t",
"fileUrl": "https://re-port-flow.com/{workspaceId}/templates/{designId}/outputs?requestId=Xk3pQ9vB2mN7aR1t",
"files": [
{
"fileId": "a8Fh2LkQ9zT4wE6y",
"fileName": "invoice-001",
"pageCount": 1,
"downloadPath": "/v1/file/download/Xk3pQ9vB2mN7aR1t/a8Fh2LkQ9zT4wE6y",
"share": { "shareType": "workspace" }
}
]
}
  • 切り替わるのはクエリ ?response=json を付けたときだけです。Accept: application/json ヘッダーでは切り替わりません(既存の連携が意図せず JSON を受け取らないようにするため)。
  • fileUrl は出力履歴画面の URL で、ファイル本体の URL ではありません。PDF は、ホスト(https://api.re-port-flow.com)に downloadPath を連結した URL に appkey(または Bearer)を付けて GET すると取得できます(PDF ダウンロード)。
  • 生成とページ数の消費は、PDF 本体を返す場合と同じです。

エラー時​

単一PDF同期生成と同様のエラーレスポンスに加え、以下のエラーが返される場合があります。

400 Bad Request(fileName 重複)​

{
"statusCode": 400,
"code": "FILE_NAME_DUPLICATED",
"message": [
"fileName values in contents must be unique (case-insensitive). Give each file a unique name."
],
"error": "Bad Request",
"details": [
{
"field": "contents",
"code": "FILE_NAME_DUPLICATED",
"message": "fileName values in contents must be unique (case-insensitive). Give each file a unique name."
}
],
"docsUrl": "https://doc.re-port-flow.com/en/docs/guides/error-codes#file_name_duplicated"
}

原因: contents 配列内に同じ fileName(大文字・小文字の違いのみを含む)が複数存在する

ユースケース​

月次請求書の一括生成​

async function generateMonthlyInvoices(month) {
const invoices = await getInvoicesByMonth(month);

const contents = invoices.map(invoice => ({
fileName: `invoice_${invoice.number}.pdf`,
shareType: '01',
passcodeEnabled: false,
params: invoice
}));

const result = await generateMultiplePDFs('invoice-template-id', contents);
fs.writeFileSync(`invoices_${month}.zip`, result.data);
}

よくある質問​

1回のリクエストで何件のPDFを生成できますか​

1 リクエストあたり最大 100 件です(超えると 400 TOO_MANY_CONTENTS)。加えて、リクエストサイズ上限(Base64エンコード後50MB)とレート制限(同期エンドポイントは30 requests/分)の範囲に収める必要があります。大量生成の場合は複数PDF非同期生成の利用を検討してください。

同期生成と非同期生成はどちらを使うべきですか​

即座にZIPを受け取りたい場合は同期エンドポイントを使います。生成件数が多く時間がかかりうる場合(60 秒を超えうる場合。制限事項)は複数PDF非同期生成を使ってください。

次のステップ​