---
title: "動画の尺に合わせて BGM をループ結合する（240秒ごとに2クレジット）"
method: POST
path: "/api/v1/projects/{projectId}/bgm/pipeline"
tags: ["projects"]
---

# 動画の尺に合わせて BGM をループ結合する（240秒ごとに2クレジット）

`POST /api/v1/projects/{projectId}/bgm/pipeline`

## Request

- Base URL: `https://app.yukkurigen.com`
- URL: `https://app.yukkurigen.com/api/v1/projects/{projectId}/bgm/pipeline`
- Auth: one of:
  - HTTP bearer
  - HTTP bearer

## Path parameters

- `projectId` string, required

## Headers

- `Prefer` 'respond-async'

## Request body

- object
  - `tags` string, required
  - `targetDurationSec` integer, required
  - `videoUrl` string, uri, required: S3 上の動画URL

## Response `200`

結合成功（同期パス。Prefer なしの呼び出しをサーバが待つ設定で、待つ間にジョブが終わったときも同じ形）

- object
  - `success` boolean
  - `mergedUrl` string
  - `totalDurationSec` number
  - `clipCount` integer
  - `playbackUrl` string: 再生用の署名付き URL（1時間で失効）。保存はしないこと。保存するのは bgm_path の方

## Other responses

- `202`: 非同期ジョブを受け付けた（Prefer: respond-async を付け、サーバの設定でジョブが使えるとき。Prefer なしでサーバが待つ設定のとき、待つ間に終わらなければ Preference-Applied なしで返る）。result.s3AudioUrl は private URL なので playbackUrl は GET /api/v1/projects/{projectId}/bgm から取得すること。
- `400`: リクエスト不正（code: validation_error）
- `401`: 未認証（code: unauthenticated）
- `402`: クレジット不足（code: insufficient_credits）
- `403`: 権限不足（audio:generate / code: insufficient_scope）
- `404`: プロジェクトが見つからない（code: not_found）

---

[API](https://skmtc.dev/yukkurigen/apis/yukkurigen-ai-operated-api.md) · [All operations](https://skmtc.dev/yukkurigen/apis/yukkurigen-ai-operated-api/llms.txt) · [OpenAPI document](https://skmtc.dev/yukkurigen/apis/yukkurigen-ai-operated-api/revisions/ba5f36b016da?raw)
