送信データ
Webhook で送る JSON の形です。
外枠
どのイベントも、次の外枠で送ります。
{
"id": "<uuid>", // 送信ごとに一意
"version": 1, // 送信データの形の版
"event": "project.updated", // イベント
"occurredAt": "2026-10-04T01:23:45.678Z", // 操作を保存した時刻
"tenant": { "id": "<uuid>", "name": "株式会社〇〇" },
"actor": { "userId": "<uuid>", "name": "山田 太郎" },
"changes": ["period", "staff"], // *.updated だけ
"filter": null, // document.sent だけ
"data": {} // 案件か予定の data
}idは送信1回ごとに異なります。同じ送信を重ねて受け取ったかの判定に使えます。occurredAtは UTC の ISO 8601 です。tenantはワークスペースを指します。actorは操作した人です。氏名を引けないときはnameがnullです。changesは*.updatedで変わった範囲を示します。ほかのイベントでは空の配列です。filterはdocument.sentで{ "sectionIds": ["<uuid>", ...] }を送ります。絞り込みのないときはsectionIdsが空の配列です。ほかのイベントではnullです。dataは、案件のイベントとdocument.sentでは案件の data、予定のイベントでは予定の data です。- 項目を足すときは
versionを変えません。項目を削除するときや意味を変えるときだけversionを上げます。
案件の data
project.* と document.sent で送ります。中身は書類作成の画面の機材リストと同じです。
"data": {
"documentType": "equipment_checklist",
"generatedAt": "2026-10-04T01:23:45.678Z",
"company": { "name": "..." },
"project": {
"id": "<uuid>", "name": "...", "periodStart": "...", "periodEnd": "...",
"location": "...", "status": "...", "isCancelled": false
},
"assignedStaff": [
{ "id": "<assignment_uuid>", // アサインの行の ID
"staffId": "<staff_uuid>", // 氏名だけの「その他スタッフ」は null
"name": "...", "nameKana": "...",
"email": "taro@example.com", // 氏名だけの「その他スタッフ」は null
"staffType": "internal|external",
"isManager": true, // 案件の責任者の行。責任者は必ず 1 行含まれます
"themeColor": "#...", "section": "撮影", // セクション名。未設定の共通は null
"roles": ["..."], "roleFreeText": null,
"shiftStart": "2026-09-01T00:00:00.000Z", // シフトの期間。案件の期間を引き継ぐ行は案件の期間と同じ
"shiftEnd": "2026-09-02T09:00:00.000Z",
"isPeriodCustom": false } // true は案件の期間から独立したシフトの期間
],
"equipmentSets": [
{ "id": "<parent_reservation_uuid>", "equipmentId": "<equipment_uuid>",
"category": "中継機材", "name": "中継セットA", "quantity": 1,
"notes": null, // 機材の備考。予約ごとの備考はありません
"section": "撮影", "sectionId": "<section_uuid>",
"isPartial": true, "isSlide": false, "isSlideReceiver": false,
"reservationStart": "2026-09-01T00:00:00.000Z",
"reservationEnd": "2026-09-02T09:00:00.000Z",
"categoryId": "<uuid>", "subCategoryId": null, "sortOrder": 1,
"includedItems": [
{ "equipmentId": "<uuid>", "name": "カメラ本体",
"managementType": "individual|quantity", "quantity": 1, "orderIndex": 0 }
],
"excludedItems": [
{ "equipmentId": "<uuid>", "name": "予備カメラ",
"managementType": "individual|quantity", "quantity": 1, "orderIndex": 1 }
] }
],
"equipmentIndividual": [
{ "id": "<reservation_uuid>", "equipmentId": "<equipment_uuid>",
"category": "カメラ", "name": "SONY HDC3200 No3", "quantity": 1, "notes": null,
"section": "撮影", "sectionId": "<section_uuid>",
"modelNumber": "HDC3200", "serialNumber": "SN-0001",
"reservationStart": "2026-09-01T00:00:00.000Z",
"reservationEnd": "2026-09-02T09:00:00.000Z",
"status": "available", "stockQuantity": null,
"categoryId": "<uuid>", "subCategoryId": "<uuid>", "sortOrder": 2,
"isSlide": true, "isSlideReceiver": false }
],
"equipmentQuantity": [
{ "id": "<reservation_uuid>", "equipmentId": "<equipment_uuid>",
"category": "収録メディア", "name": "SDカード 128GB", "quantity": 10, "notes": null,
"section": null, "sectionId": null, "modelNumber": null, "serialNumber": null,
"reservationStart": "2026-09-01T00:00:00.000Z",
"reservationEnd": "2026-09-02T09:00:00.000Z",
"status": "available", "stockQuantity": 50,
"categoryId": "<uuid>", "subCategoryId": null, "sortOrder": 0,
"isSlide": false, "isSlideReceiver": true }
],
"manualItems": [ { "id": "...", "category": "特機", "categoryId": "<uuid>",
"name": "...", "quantity": 1, "notes": null } ],
"summary": { "totalLineItems": 4, "setCount": 1, "individualCount": 1,
"quantityCount": 1, "manualCount": 1 }
}- 絞り込み:
project.*は絞り込まずに全体を送ります。document.sentは画面で選んだセクションと共通の予約だけを送り、条件をfilter.sectionIdsに示します。手入力の機材はセクションを持たないため、常に送ります。 - キャンセル:
project.cancelledでは予約がすべてキャンセル済みのため、機材の3つの配列は空になります。 - 機材の行:
equipmentIndividualとequipmentQuantityは、キャンセルしていない予約1件が1行です。idは予約の ID、quantityは予約の数、reservationStartとreservationEndは予約の期間です。それ以外は機材の登録内容で、型番、シリアル番号、在庫数も送ります。 - セット: セットの予約とその構成品の予約は
equipmentSetsの1つの要素にまとめ、個別の配列には重ねません。includedItemsは実際に予約した構成品、excludedItemsは登録したセットの構成との差で、quantityは足りない数です。外した理由は送りません。構成品だけを単独で予約したときは、個別の行として送ります。セットの予約が見つからない構成品の予約も、個別の行として送ります。セクションの絞り込みは、セットの予約のセクションで判定します。 - 並び順: 構成品は機材一覧と同じ順に並べます。大カテゴリ、小カテゴリ、機材の順です。
orderIndexは、含むものと除くものを通した番号です。 - スライド:
isSlideは、その予約をスライドに指定して次の予約へ渡すことを示します。isSlideReceiverは、同じ機材の直前の予約がスライドの指定で、終わりの時刻が一致する、受け取る側の予約であることを示します。セットはセットの予約で判定します。 - カテゴリ:
categoryは大カテゴリの名前です。未分類はnullです。 - シフトの期間: アサインしたスタッフごとのシフトの期間を送ります。案件に属さない休みなどの予定は、予定のイベントで送ります。
予定の data
schedule_entry.* で送ります。
"data": {
"scheduleEntry": {
"id": "<uuid>",
"title": "有給休暇",
"start": "2026-09-01T00:00:00.000Z",
"end": "2026-09-02T00:00:00.000Z",
"isAllDay": true,
"category": "working|off|paid_leave", // 勤務、休み、有給
"color": "#...", // null は色の指定なし(CrewGear の画面ではグレーで表示)
"location": null,
"memo": null,
"staff": { "id": "<staff_uuid>", "name": "...", "nameKana": "...",
"email": "taro@example.com", "themeColor": "#..." }
}
}schedule_entry.deleted は、削除する直前の内容を送ります。
changes の値
| event | 値 |
|---|---|
project.updated | name 案件名、period 期間、location 場所、manager 責任者、staff アサインの追加と解除や役職とシフトの期間、equipment 機材の予約と手入力の機材 |
schedule_entry.updated | title タイトル、period 期間、isAllDay 終日かどうか、category 勤務と休みと有給の区分、color 色、location 場所、memo メモ、staff 予定の持ち主のスタッフの付け替え |
- 値は上の表の順に並べ、重ねません。その保存で実際に値が変わったものだけを入れます。
- 責任者の変更は
managerだけを入れます。責任者は常にアサインしたスタッフの一員のため、責任者の行の付け外しも責任者の変更として扱い、staffは足しません。 - 期間の変更は、案件の期間が変われば
period、予約の期間を変えたときや予約を解除したときはequipment、案件の期間から独立したシフトの期間を変えたときはstaffを入れます。案件の期間を引き継ぐシフトの期間は常に案件の期間と同じため、その変化はperiodで示します。 - 予定のスタッフを付け替えたときは
staffを入れ、data.scheduleEntry.staffには付け替えた後のスタッフを載せます。