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

複数PDF非同期生成

POST /file/async/multiple エンドポイントは、指定されたテンプレートと複数のパラメータから複数のPDFファイルを非同期的に生成します。リクエストを受け付けた時点で requestId を返すためタイムアウトがなく、大量生成に向きます。完了は 生成状態の取得(GET /v1/file/status/{requestId})で確認するか、Webhook で受け取ります。

エンドポイント情報​

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

使用例​

cURL​

curl -X POST https://api.re-port-flow.com/v1/file/async/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": "01",
"passcodeEnabled": false,
"params": { "customerName": "佐藤花子", "invoiceNumber": "INV-002" }
}
]
}'

リクエストパラメータ​

フィールド型必須説明
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-レスポンスの files[].passthrough に透過する任意のメタデータ(例: { "pageId": "abc123" })。トップレベルの文字列・数値は帳票検索メタデータとしても保存されます
contents[].paramsobject✓パラメータ(テンプレートのパラメータ取得APIで構造を確認可能)

レスポンス​

成功時 (202 Accepted)​

{
"requestId": "kZ3mP9qL2xV7nR4t",
"url": "https://re-port-flow.com/{workspaceId}/templates/{designId}/outputs?requestId={requestId}",
"files": [
{
"fileName": "invoice_001.pdf",
"fileId": "a8Fh2LkQ9zT4wE6y",
"passthrough": { "pageId": "abc123" },
"share": {
"shareType": "workspace",
"url": "https://re-port-flow.com/file/{requestId}/a8Fh2LkQ9zT4wE6y",
"passcodeEnabled": false
}
},
{
"fileName": "invoice_002.pdf",
"fileId": "b3Gk7MnP1qR5sT9v",
"share": {
"shareType": "workspace",
"url": "https://re-port-flow.com/file/{requestId}/b3Gk7MnP1qR5sT9v",
"passcodeEnabled": false
}
}
]
}
フィールド型説明
requestIdstringリクエストID(16文字の英数字。ZIPダウンロードエンドポイントで使用)
urlstring (URI)生成結果を確認できるアプリ画面(出力履歴)のURL。ファイルの直接ダウンロードURLではない — 取得はPDF のダウンロードを使う
filesarray各PDFファイルの情報
files[].fileNamestringPDFファイル名
files[].fileIdstring個別ファイルID(個別ダウンロードエンドポイントで使用)
files[].passthroughobjectリクエスト時に指定した contents[].passthrough の値(指定時のみ)
files[].share.shareTypestring共有タイプ(workspace / invited / public)
files[].share.urlstringファイル表示URL
files[].share.passcodeEnabledbooleanパスコード有効フラグ
files[].share.passcodestringサーバー生成パスコード(passcodeEnabled=true かつ生成直後のみ)
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 と帳票検索メタデータを参照してください。

エラー時​

単一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"
}

Accept-Language: ja を付けると message は contents 内の fileName が重複しています(大文字・小文字は区別されません)。各ファイルには一意の名前を指定してください。 になります。

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

一部のファイルだけ失敗した場合​

受付(202)後に一部のファイルだけ生成に失敗した場合、生成状態の取得は status: "completed" のまま失敗分を failedFiles に入れて返します。Webhook では成功分が file.completed で届きます。失敗分の file.failed(error.code: "PARTIAL_FAILURE")は、生成リクエストで webhookUrl を指定した場合だけ、その宛先に届きます。すべて失敗した場合は status: "failed"(error.code: "FILE_GENERATION_FAILED")で、ファイルごとの理由は failedFiles に入ります。詳細は Webhook 通知 を参照してください。

ユースケース​

大量請求書の一括生成​

async function generateBulkInvoices(invoices) {
const batchSize = 100;
const batches = chunkArray(invoices, batchSize);
const results = [];

for (const [index, batch] of batches.entries()) {
console.log(`バッチ ${index + 1}/${batches.length} 処理中...`);

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

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

results.push(response.data);

if (index < batches.length - 1) {
await new Promise(resolve => setTimeout(resolve, 1000));
}
}

return results;
}

よくある質問​

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

1 リクエストあたり最大 100 件です(超えると 400 TOO_MANY_CONTENTS)。加えて、リクエストサイズ上限(Base64エンコード後50MB)とレート制限(非同期エンドポイントは100 requests/分)の範囲に収める必要があります。大量生成では複数リクエストに分割し、レート制限内でバッチ処理することを推奨します。

生成完了はどうやって確認すればよいですか​

Webhook通知を設定するとポーリング不要でリアルタイムに完了を受け取れます(詳細はWebhook通知ガイド)。Webhookを使わない場合は、レスポンスの requestId を使って生成状態の取得(GET /v1/file/status/{requestId})をポーリングし、status が completed / failed になるのを待ちます。生成中は Retry-After ヘッダーが付くので、その秒数を間隔にしてください。手順は非同期ワークフローを参照してください。

次のステップ​