Try API Reference
カスタマージャーニー可視化システム「Try」の REST API。
基本情報
- Base URL:
https://try.stagbeetle.group/api/v1 - Format: JSON (UTF-8必須、Shift_JISは400で拒否)
- レスポンス形式:
{"data": ...}(204は空) - エラー形式:
{"error": "message"} - 認証: なし(IPアロー方式、現在は全許可)
- 姉妹システム: Fudo (
box.stagbeetle.group) / Love (love.stagbeetle.group)
概念
Journey (1プロジェクト = 1カスタマージャーニー)
└─ ExperienceNode (体験ノード) ──┬── ExperienceEdge (ノード間接続)
└── NodeImage (ノードに紐づく画像)
各 Journey が独立した体験マップを持ち、ノードとエッジ、画像を管理。
Journeys
| Method | Path | Description | Body |
|---|---|---|---|
| GET | /journeys |
ジャーニー一覧 | — |
| POST | /journeys |
ジャーニー作成 | {slug, name, description?, default_view?, phases?} |
| GET | /journeys/{slug} |
ジャーニー取得 | — |
| PUT | /journeys/{slug} |
ジャーニー更新 | {name, description, default_view, phases} |
| DELETE | /journeys/{slug} |
ジャーニー削除(カスケード) | — |
Journey オブジェクト
{
"id": 1,
"slug": "sample",
"name": "サンプルジャーニー",
"description": "ECサイト購入体験",
"default_view": "canvas",
"phases": "[\"認知\",\"興味\",\"検討\",\"購入\",\"使用\",\"リピート\"]",
"sort_order": 0,
"created_at": "2026-04-09 02:57:40",
"updated_at": "2026-04-09 02:57:40"
}
default_view:"canvas"または"timeline"phases: JSON配列文字列(パースして使用)
Experience Nodes (体験ノード)
| Method | Path | Description | Body |
|---|---|---|---|
| GET | /journeys/{slug}/nodes |
ノード一覧 | — |
| POST | /journeys/{slug}/nodes |
ノード作成 | ExperienceNode フィールド (title 必須) |
| PUT | /journeys/{slug}/nodes/{nodeId} |
ノード更新 | 全フィールド |
| PATCH | /journeys/{slug}/nodes/{nodeId}/position |
座標のみ更新(軽量、ドラッグ用) | {x, y} |
| DELETE | /journeys/{slug}/nodes/{nodeId} |
ノード削除(エッジ・画像もカスケード) | — |
ExperienceNode オブジェクト
{
"id": 1,
"journey_id": 1,
"title": "SNS広告",
"description": "通勤中にスマホで発見",
"phase": "認知",
"emoji": "😐",
"emotion": 0,
"x": 50,
"y": 100,
"sort_order": 1,
"created_at": "...",
"updated_at": "..."
}
emotion: -2 〜 +2 の整数x,y: Canvas ビュー用座標phase: Timeline ビューでの列分け用文字列(journey.phases と一致させる)
Experience Edges (接続)
ノード間の有向接続。分岐・合流対応。
| Method | Path | Description | Body |
|---|---|---|---|
| GET | /journeys/{slug}/edges |
エッジ一覧 | — |
| POST | /journeys/{slug}/edges |
エッジ作成 | {from_node_id, to_node_id, label?} |
| PUT | /journeys/{slug}/edges/{edgeId} |
エッジ更新(label) | {label} |
| DELETE | /journeys/{slug}/edges/{edgeId} |
エッジ削除 | — |
ExperienceEdge オブジェクト
{
"id": 1,
"journey_id": 1,
"from_node_id": 1,
"to_node_id": 2,
"label": "次に",
"created_at": "..."
}
Node Images (画像)
ノードに紐づく画像。複数枚 OK。
| Method | Path | Description | Body |
|---|---|---|---|
| GET | /journeys/{slug}/images |
ジャーニー全画像 | — |
| GET | /journeys/{slug}/nodes/{nodeId}/images |
ノード画像一覧 | — |
| POST | /journeys/{slug}/nodes/{nodeId}/images |
画像アップロード(複数可) | multipart/form-data (file 複数) |
| PUT | /journeys/{slug}/images/{imageId} |
キャプション更新 | {caption} |
| DELETE | /journeys/{slug}/images/{imageId} |
画像削除(ファイルも削除) | — |
NodeImage オブジェクト
{
"id": 1,
"node_id": 1,
"url": "/uploads/nodes/abc123.png",
"caption": "",
"sort_order": 1,
"created_at": "..."
}
アップロード仕様
- 対応形式: jpg, jpeg, png, gif, webp
- 上限: 100MB(複数ファイル合計)
- 保存先:
/opt/try/uploads/nodes/<random>.ext - 公開URL:
https://try.stagbeetle.group/uploads/nodes/... - multipart フィールド:
file(複数指定可、filesも受け付け) - 戻り値: 作成された画像オブジェクトの配列
エラーレスポンス
{"error": "journey not found"}
| Code | 意味 |
|---|---|
| 200 | 取得/更新成功 |
| 201 | 作成成功 |
| 204 | 更新/削除成功(ボディ無し) |
| 400 | リクエスト不正 |
| 404 | リソース未発見 |
| 500 | サーバーエラー |
使用例
ジャーニー作成 → ノード追加 → 接続
# 1. ジャーニー作成
curl -X POST https://try.stagbeetle.group/api/v1/journeys \
-H 'Content-Type: application/json' \
-d '{"slug":"my-journey","name":"My Journey","description":"テスト"}'
# 2. ノード3つ作成
curl -X POST https://try.stagbeetle.group/api/v1/journeys/my-journey/nodes \
-H 'Content-Type: application/json' \
-d '{"title":"認知","phase":"認知","emoji":"😐","x":50,"y":100}'
curl -X POST https://try.stagbeetle.group/api/v1/journeys/my-journey/nodes \
-H 'Content-Type: application/json' \
-d '{"title":"検討","phase":"検討","emoji":"🙂","x":280,"y":100}'
curl -X POST https://try.stagbeetle.group/api/v1/journeys/my-journey/nodes \
-H 'Content-Type: application/json' \
-d '{"title":"購入","phase":"購入","emoji":"😄","x":510,"y":100}'
# 3. エッジで接続
curl -X POST https://try.stagbeetle.group/api/v1/journeys/my-journey/edges \
-H 'Content-Type: application/json' \
-d '{"from_node_id":1,"to_node_id":2}'
curl -X POST https://try.stagbeetle.group/api/v1/journeys/my-journey/edges \
-H 'Content-Type: application/json' \
-d '{"from_node_id":2,"to_node_id":3,"label":"購入完了"}'
ノードに複数画像をアップロード
curl -X POST https://try.stagbeetle.group/api/v1/journeys/my-journey/nodes/1/images \
-F "file=@photo1.jpg" \
-F "file=@photo2.jpg" \
-F "file=@photo3.jpg"
ノード位置更新(ドラッグ後)
curl -X PATCH https://try.stagbeetle.group/api/v1/journeys/my-journey/nodes/1/position \
-H 'Content-Type: application/json' \
-d '{"x":150,"y":250}'
注意事項
UTF-8必須
リクエストボディは厳密にUTF-8でないと拒否される(400エラー)。Windows等のシェルから日本語を送る場合は文字コードに注意。
文字列フィールドの空値
PUT 時、未指定フィールドは空文字で上書きされる。部分更新は未対応(PATCH /position を除く)。
slug の制約
URL-safe な英数字とハイフンを推奨。重複はジャーニーレベルでは UNIQUE。
ノード位置 (x, y)
- ピクセル単位
- Canvas は 0,0 が左上
- ドラッグ時は PATCH /position を呼ぶと軽量
ファイルパス
- アップロードされた画像は
/opt/try/uploads/nodes/に保存 - DB には相対URL
/uploads/nodes/{filename}で記録 - 公開URLは
https://try.stagbeetle.group/uploads/nodes/... - ジャーニー削除時、関連画像ファイルは自動削除されない(手動削除が必要)
未実装機能
- バッチ API(Phase 5 で予定)
- インポート/エクスポート(Phase 5 で予定)
- ペルソナ管理(Phase 4 で予定)
詳細は README / TODO 参照。