Stayfilm
Stayfilmは、大規模な自動パーソナライズビデオ制作のためのREST APIです。このプラットフォームは、データ、画像、テキスト、サウンドトラック、ナレーション、ビジュアルエフェクトを統合し、eコマース、マーケットプレイス、CRMワークフロー、マーケティングキャンペーン向けにカスタマイズされたビデオコンテンツを生成します。
この統合では、BrazeからStayfilm APIにレンダリングジョブを送信し、ビデオの準備が完了するとコールバックを受信し、キャンペーンやキャンバスで使用するためにビデオURLとステータスをユーザープロファイルに保存します。
この統合はStayfilmによって管理されています。
ユースケース
Stayfilmは、以下を含むカスタマーライフサイクル全体にわたるパーソナライズされたビデオ配信をサポートしています。
- オンボーディングとウェルカムジャーニー: プロファイルやサインアップのコンテキストに合わせてパーソナライズされたビデオで新規ユーザーを歓迎します
- 商品およびマーケットプレイスコンテンツ: カタログやユーザー提供のメディアから商品に焦点を当てたビデオを生成します
- コンバージョンとアクティベーション: 文脈に応じたビデオメッセージングで重要なアクションを強化します
- ロイヤルティとアップセル: パーソナライズされたオファーや利用マイルストーンをビデオ形式でハイライトします
- 奪還と離脱防止: カスタマイズされたビデオコンテンツで非アクティブなユーザーを再エンゲージします
前提条件
開始する前に、以下を確認してください。
| 要件 | 説明 |
|---|---|
| Stayfilm APIアクセス | Stayfilmに連絡して、idproject、Subscription-Key、OAuthクライアント認証情報、Stayfilm APIベースURLを含むプロジェクト認証情報を取得してください。認証とエンドポイントの詳細については、Stayfilm APIドキュメントを参照してください。 |
| Brazeデータ変換 | Brazeデータ変換を使用して、Stayfilmのコールバックを受信し、/users/trackエンドポイントを通じてBrazeユーザープロファイルにマッピングします。 |
| Brazeユーザー識別子 | このウォークスルーでは、external_idを使用してStayfilmジョブをBrazeユーザープロファイルと関連付けます。CallbackRelayDataで渡す値は、Brazeのユーザーのexternal_idと一致する必要があります。 |
| Brazeサンドボックス(推奨) | 本番環境にデプロイする前に、Brazeサンドボックスワークスペースで統合をテストしてください。 |
統合の仕組み
この統合は双方向のWebhookフローを使用します。
- アウトバウンド: BrazeのWebhookキャンペーンがStayfilmの
POST /Jobエンドポイントにレンダリングジョブを送信します。リクエストには、ユーザーメディア、テンプレート設定、およびBrazeユーザーのexternal_idに設定されたCallbackRelayDataが含まれます。 - インバウンド: Stayfilmがレンダリングを完了すると、Brazeデータ変換のWebhook URLにコールバックを送信します。変換により、レスポンスが一致するユーザープロファイルのカスタム属性とカスタムイベントにマッピングされます。
- 配信: 保存された
stayfilm_video_url属性を、カスタムHTMLを使用したアプリ内メッセージなどのメッセージングチャネルで使用します。
このウォークスルーのデータ変換は、以下のカスタム属性を書き込みます。
| 属性 | 説明 |
|---|---|
stayfilm_video_status |
レンダリングが成功した場合はready、Stayfilmがエラーを報告した場合はfailed |
stayfilm_video_url |
レンダリングされたMP4ビデオのURL |
stayfilm_job_id |
Stayfilmジョブ識別子 |
stayfilm_render_error |
レンダリング失敗時のエラーメッセージ |
stayfilm_callback_received_at |
コールバックのISOタイムスタンプ |
変換では、stayfilm_video_readyまたはstayfilm_video_failedという名前のカスタムイベントも記録されます。
統合
以下のステップでは、概念実証について説明します。フローを検証した後、ジョブペイロード、属性、メッセージングをユースケースに合わせて調整してください。
ステップ1:テストユーザーを作成する
統合の構築と検証に使用するテストユーザープロファイルを作成します。詳細については、ユーザーのインポートを参照してください。
- オーディエンス > ユーザーのインポートに移動します。
- クイックユーザー追加を選択します。
external_idとその他の必須フィールドを入力し、新規ユーザーを作成を選択します。

メール、電話番号、氏名、政府発行ID、住所、注文の詳細などの個人データをexternal_idとして使用しないでください。この統合全体を通じて、external_idは大文字と小文字を区別するものとして扱ってください。
このウォークスルーでは、stayfilm-poc-001をサンプルのexternal_idとして使用します。後のステップで使用するため、選択した値をメモしておいてください。
ステップ2:データ変換を作成する
Stayfilmのコールバックを受信し、ユーザープロファイルを更新するためのデータ変換を作成します。
- データ設定 > データ変換に移動します。
- 変換を作成を選択します。
Stayfilm Callback Data Transformationなどの名前を入力します。- 編集エクスペリエンスで、ゼロから始めるを選択します。
- 送信先を選択 > 送信先で、POST: Track usersを選択します。
- 変換を作成を選択します。
- デフォルトの変換コードを以下に置き換えます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
const brazeExternalId = payload.RelayedData;
if (!brazeExternalId) {
throw new Error("Missing RelayedData. Expected Stayfilm callback to relay the Braze external_id from CallbackRelayData.");
}
const idJob = payload.IdJob || null;
const producedFiles = payload.ProducedFiles || {};
const videoUrl = producedFiles?.Videos?.VideoMP4?.Url || null;
const errorMessage = payload.ErrorMessage || null;
const hasError = payload.HasError === true || Boolean(errorMessage);
const isReady = !hasError && Boolean(videoUrl);
const now = new Date().toISOString();
let brazecall = {
attributes: [
{
external_id: brazeExternalId,
_update_existing_only: true,
stayfilm_video_status: isReady ? "ready" : "failed",
stayfilm_video_url: videoUrl || null,
stayfilm_job_id: idJob,
stayfilm_render_error: errorMessage,
stayfilm_callback_received_at: now
}
],
events: [
{
external_id: brazeExternalId,
_update_existing_only: true,
name: isReady ? "stayfilm_video_ready" : "stayfilm_video_failed",
time: now,
properties: {
stayfilm_job_id: idJob,
stayfilm_video_url: videoUrl || null,
stayfilm_render_error: errorMessage,
stayfilm_status: payload.Status || payload.status || null
}
}
]
};
return brazecall;
- 保存を選択し、生成されたWebhook URLをコピーします。
- 以下のサンプルStayfilmコールバックJSONを使用して、Webhook URLにテスト
POSTリクエストを送信します。RelayedDataをステップ1で作成したテストユーザーのexternal_idに設定します。
1
2
3
4
5
6
7
8
9
10
11
12
13
{
"IdJob": "debug-job-001",
"HasError": false,
"Status": "DRAFT_DONE",
"ProducedFiles": {
"Videos": {
"VideoMP4": {
"Url": "https://example.com/stayfilm-poc-video.mp4"
}
}
},
"RelayedData": "stayfilm-poc-001"
}
cURL、Postman、または同様のツールでリクエストを送信します。成功したレスポンスは、HTTPステータス201と{"message": "success"}を返します。
- データ設定 > データ変換に移動し、変換がリストに表示されない場合はページをリロードします。
- 変換を開き、検証を選択します。出力で検証が成功したことを確認します。
- 有効化を選択します。
- コピーしたWebhook URLをコールバックURLとしてStayfilmに提供します。

Brazeのexternal_id以外のデータをCallbackRelayDataに保存する場合は、RelayedDataを適切に解析するように変換コードを更新してください。
ステップ3:Stayfilmにジョブを送信するWebhookキャンペーンを作成する
Stayfilmにレンダリングジョブを送信するWebhookキャンペーンを作成します。

キャンペーンをテストする前に、Stayfilmがステップ2のデータ変換コールバックURLでプロジェクトを設定していることを確認してください。
- メッセージング > キャンペーンに移動します。
- キャンペーンを作成 > Webhookを選択します。
Stayfilm Webhook Integrationなどのキャンペーン名を入力します。- Webhookを作成 > ゼロから始めるを選択します。
- Webhookを作成 > Webhook URLで、Stayfilmが提供する
POST /JobエンドポイントURLを入力します。以下の例の{BASE_URL}を置き換えてください:https://{BASE_URL}/stg/v3/job - HTTPメソッドをPOSTに設定します。
- リクエストボディでRaw Textを選択し、Stayfilmが提供するジョブペイロードを貼り付けます。Connected Contentを使用してボディをダイナミックにすることができます。
CallbackRelayDataをBrazeユーザーのexternal_idに設定してください。Stayfilmはこの値をコールバックでRelayedDataとして返します。
1
2
3
4
5
6
7
8
9
10
11
{
"SmartTags": ["Setup-Template"],
"Medias": [
{
"Group": "userMedia",
"URL": "https://{BASE_URL}/some_media.png"
}
],
"Videos": [{}],
"CallbackRelayData": "stayfilm-poc-001"
}
以下のリクエストヘッダーを追加します。
| キー | 値 |
|---|---|
idproject |
Stayfilmが提供するidprojectの値 |
Subscription-Key |
Stayfilmが提供するSubscription-Key |
Content-Type |
application/json |
Authorization |
Connected Contentを通じて取得したOAuthベアラートークン(以下の例を参照) |
以下のConnected Contentブロックで、{TENANT_ID}、{CLIENT_ID}、{CLIENT_SECRET_URL_ENCODED}、{SCOPE_URL_ENCODED}をStayfilmが提供する値に置き換えます。{CLIENT_SECRET_URL_ENCODED}と{SCOPE_URL_ENCODED}はブロックに貼り付ける前にURLエンコードしてください。OAuthの要件については、Stayfilm APIドキュメントを参照してください。
1
2
3
4
5
6
7
{% connected_content https://login.microsoftonline.com/{TENANT_ID}/oauth2/v2.0/token
:method post
:body grant_type=client_credentials&client_id={CLIENT_ID}&client_secret={CLIENT_SECRET_URL_ENCODED}&scope={SCOPE_URL_ENCODED}
:content_type application/x-www-form-urlencoded
:cache_max_age 3000
:save stayfilm_auth
%}Bearer {{stayfilm_auth.access_token}}
- 下書きを保存を選択します。

キャンペーンページを離れて戻った場合、ステータスをすべてに設定すると、まだ下書きのキャンペーンを見つけることができます。
ステップ4:Webhookキャンペーンをテストする
- Webhookコンポーザーから、テストタブを選択します。
- ユーザーとしてメッセージをプレビューで、既存のユーザーを選択を選択し、テストユーザー(例:
stayfilm-poc-001)を検索します。 - テストを送信を選択します。
成功したレスポンスは、HTTPステータス201と以下のようなJSONボディを返します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{
"IdJob": "4557a77e-f56c-48be-81f7-2d8c5e558cb1",
"Videos": [
{
"IdVideo": "87287b25-7814-4fa1-ad1a-f2ea89822d0f",
"IdGenre": "f07a1334-5904-420a-9f31-92644f245c5a",
"IdVideoTemplate": "7b77c3df-12a1-4636-a9b4-bc227f4c233f",
"IdProject": "73ea3e73-b41e-4676-b674-51731d3bf49c",
"Status": "DRAFT_RENDERING_PENDING",
"DurationInSeconds": null,
"URL": null,
"ErrorMessage": null,
"CreatedAt": "2026-06-16T00:35:28.7736263Z",
"UpdatedAt": "2026-06-16T00:35:28.7736264Z",
"IdVideoFather": null,
"IdVideoSon": null,
"ProducingStatus": "PENDING"
}
],
"Images": []
}
ステップ5:Stayfilmのコールバックを確認する
Stayfilmはビデオを非同期でレンダリングし、処理が完了するとデータ変換にコールバックを送信します。Stayfilm APIドキュメントに記載されているStayfilm APIエンドポイントを通じてジョブステータスを監視してください。
- データ設定 > データ変換に移動します。
- 変換のログタブを選択します。
- 成功ステータスのコールバックが表示されていることを確認します。
ステップ6:アプリ内メッセージでビデオを表示する
ユーザープロファイルにstayfilm_video_urlが設定された後、レンダリングされたビデオをキャンペーンまたはキャンバスで表示します。
- メッセージング > キャンペーンに移動します。
- キャンペーンを作成 > アプリ内メッセージを選択します。
Stayfilm Video Showなどのキャンペーン名を入力します。- メッセージ作成画面で、トラディショナルエディターを選択します。
- 送信先で、Webブラウザーを選択します。
- メッセージタイプをカスタムコードに設定します。
- 以下のHTMLをHTMLフィールドに貼り付けます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<div id="stayfilm-video-url" style="display: none;">{{custom_attribute.${stayfilm_video_url}}}</div>
<video id="stayfilm-video" controls preload="metadata" playsinline style="width: 100%; max-width: 420px; border-radius: 12px; background: #000;">
Your browser does not support HTML5 video.
</video>
<script>
(function () {
var urlElement = document.getElementById("stayfilm-video-url");
var video = document.getElementById("stayfilm-video");
var videoUrl = urlElement ? urlElement.textContent.trim() : "";
if (!videoUrl || videoUrl.indexOf("http") !== 0) {
return;
}
var source = document.createElement("source");
source.src = videoUrl;
source.type = "video/mp4";
video.appendChild(source);
video.load();
})();
</script>
</body>
</html>
- 下書きを保存を選択します。
- テストタブを選択します。
- ユーザーとしてメッセージをプレビューで、既存のユーザーを選択を選択し、テストユーザーの
external_idを検索します。
プロファイルにstayfilm_video_urlが設定されている場合、レンダリングされたビデオがプレビューに表示され、再生されます。
統合の拡張
このウォークスルーでは、Stayfilm APIの一部をカバーしています。ジョブテンプレート、メディア入力、またはダウンストリームメッセージングを調整するには、Stayfilm APIドキュメントを参照し、Webhookペイロード、データ変換マッピング、キャンペーンロジックを適宜更新してください。
考慮事項
- 非同期レンダリング: ビデオ生成は即時ではありません。Webhookと同じフローでアプリ内メッセージを送信するのではなく、
stayfilm_video_readyカスタムイベントまたはstayfilm_video_statusのセグメントからフォローアップメッセージングをトリガーしてください。 - 識別子の一貫性:
CallbackRelayDataの値は、Brazeユーザーのexternal_idと正確に一致する必要があります。 - OAuthトークンのキャッシュ: Connected Contentの例では、OAuthトークンを3000秒間キャッシュします。Stayfilmがトークンの有効期間要件を変更した場合は、
cache_max_ageを調整してください。 - サンドボックステスト: 本番環境にリリースする前に、Brazeサンドボックスで完全なコールバックループを検証してください。
- カスタム属性の容量: この統合で作成されるStayfilmのカスタム属性とイベントに対して、ワークスペースに十分な容量があることを確認してください。
トラブルシューティング
Stayfilm統合で問題が発生した場合は、以下の表を参照してください。
| 問題 | 解決方法 |
|---|---|
| データ変換の検証が失敗する | テストペイロードのRelayedDataが有効なBrazeのexternal_idと一致していることを確認し、検証を選択する前にデータ変換ページをリロードしてください。 |
| Webhookテストが201以外のレスポンスを返す | リクエストヘッダーのStayfilm認証情報を確認し、OAuth Connected ContentブロックがURLエンコードされた値を使用していることを確認し、POST /Job URLが正しいことを確認してください。 |
| 変換ログにコールバックが表示されない | Stayfilmがアクティブなデータ変換のWebhook URLを持っていることを確認し、ビデオレンダリングが完了するまで待ってください。 |
| アプリ内プレビューにビデオが表示されない | テストユーザープロファイルにstayfilm_video_urlが設定されていること、およびアプリ内メッセージがカスタムコードでWebブラウザーをターゲットにしていることを確認してください。 |