仕様・API

サービス概要(プレゼン用)

価値・柱・スタックの圧縮サマリー。

Swipe LP — プレゼン用サマリー

用途: 社内外の説明・デモ・投資家向けのたたき台。仕様の正本は docs/spec/ の各ファイル。数値・HTTP・キー形式の最終確認は必ず spec


1. 一言で

スワイプ操作で読み進める、スマートフォン向けLPを管理画面で作り、埋め込みJS・ホスト型URL(/p/{id})・ZIPで配信し、ステップ単位で分析するシステム(作成するLPがSP前提。管理画面そのものの端末とは切り離す)。

マーケサイト / には 組み込みデモLP(灯り珈琲・5ステップ)があり、API不要でスワイプ体験できる。


2. 価値・狙い

観点内容
優先順位まず社内での制作・配信・分析。外販に耐えるマルチテナントと課金の置き場は最初から持つ。
制作物作成するLPはスマートフォン向け(レイアウト・操作はSP前提。PCで見ることはあっても主設計はSP)。
体験縦/横・通常/全画面などスワイプとビューポートswipe オブジェクトで表現し、ランタイムで統一。
配信の自由度自サイト埋め込みホスト型 /p/{id}任意静的ホスティングへのZIP(相対パス完結)。file:// 直開きは推奨しない。
AI制作LPナレッジから 文案提案(同期)・画像ジョブ(非同期)・参考URL解析。ストーリーボード一括。
計測ファネルに効く lp_view / step_view / 滞在 / CTA・ホットスポット・動画・スワイプ をイベント化。LP別ダッシュボード+効果測定ハブ。期間フィルタ(7/30/90日)。
単一ソース編集・プレビュー・埋め込み・ZIPは同じLP定義JSONを消費し、二重実装を避ける。

3. 誰が・どう使うか(ストーリー)

役割行うこと
制作者Workspace 上でLPを作成し、ステップ(画像/動画)・CTA・ホットスポットをJSONとして編集。公開すると公開ID(lpId)で取得可能に。
サイト運用者埋め込み: runtime.js を読み、コンテナに data-swipe-lp-id / data-swipe-lp-api-base 等を指定。ZIP: index.html + lp.json + assets/ をホスティングに配置。
分析担当計測キーを付与した公開ビューから POST /v1/analytics/events でイベントが届く想定で、ダッシュボード(MVP指標は後述)を見る。

4. LP定義JSONの骨子(v0.1)

単一JSONが正本。schemaVersion(現状 "0.1")で互換管理。

ルート役割
id公開LP ID(埋め込み・計測・GET /v1/public/lp/{lpId})。ULID推奨。
revision更新の識別。サーバ返却の revision と原則同一。
metatitle 必須、locale(省略時 ja-JP)、description 任意。
swipedirection: vertical | horizontal · viewport: default | fullscreen
steps[]1件以上。配列順が表示順。

各ステップ: id公開後も不変。並べ替えしてもID維持・削除IDは再利用しない)、type: image | videomediasrc は相対パスが正)、cta(ステップごと。非表示は null)、hotspots[](正規化矩形 rect 0〜1)。

ホットスポット: 画像上のタップ領域。CTAボタンとは別系統で、分析でも cta_clickhotspot_click を分離。

メディア: ZIPでは assets/... 相対。将来、CDN絶対URLはオプション拡張の余地あり(v0.1では相対が主)。

詳細・例は spec/lp-definition-v0.1.md


5. 配信の3経路

5.1 埋め込みJS

  • スクリプト例: https://{配信元}/swipe-lp/v0/runtime.jsdefer 推奨)。メジャー互換破壊時のみパスを上げる想定。
  • マウント先は1つのルート要素。data-swipe-lp-iddata-swipe-lp-api-base が必須。data-swipe-lp-public-key計測する場合に使用。省略時は計測なし。
  • ランタイムは GET {apiBase}/v1/public/lp/{lpId} で定義を取得し、分析は POST {apiBase}/v1/analytics/events(後述)。
  • 代替として window.SwipeLP.mount(selector, { lpId, apiBase, publicKey?, surface? }) でも初期化可能。

5.2 ホスト型公開URL

  • GET https://{site-origin}/p/{publicId} — SSR・OGメタ付き。
  • 公開時に live 計測キーがあれば 当ページからも計測GET /v1/public/lp/{id}publicKey)。
  • 非公開は 410。詳細は embed-and-zip-v0.1.md §4。

5.3 ZIP配布

解凍ルートに置く固定名(マニフェスト別名は使わない):

ファイル役割
index.htmlエントリ。ランタイムと lp.json を読み込み。
lp.jsonLP定義(スキーマ v0.1)。
swipe-lp.runtime.v0.jsビューア(ファイル名固定)。埋め込みと同一バンドル可。
assets/メディア。lp.jsonmedia.src と整合。
swipe-lp.config.json任意。surface: zipapiBasepublicKeyanalytics.enabled 等。

完全オフライン閲覧は、apiBase なし/analytics.enabled: false でイベント送信なしにできる。相対パス完結のため、顧客の静的サーバやS3等にそのまま配置しやすい。


6. 公開HTTP API(ランタイムが触る部分)

ベースURLは末尾スラッシュなし。パスは /v1/...。JSON、Content-Type: application/json

エンドポイント認証役割
GET /v1/public/lp/{lpId}不要公開中のLP定義を返す。404 不存在、410 非公開。
POST /v1/analytics/eventsX-SwipeLP-Key 必須イベントバッチ。204/202 受理。

CORS: 公開LPの GET は任意オリジン可。計測POSTは X-SwipeLP-Key を許可ヘッダに含めてプリフライト対応。

エラー形式(推奨): { "error": { "code", "message" } }。例: invalid_requestinvalid_keykey_lp_mismatchnot_foundgonerate_limited 等。詳細は spec/api-v0.1.md

計測POSTの制約: events1〜100件/リクエスト。超過は 400。サーバは キーに紐づく lpId と各イベントの lpId が一致することを検証(不一致は 403)。eventId 重複は冪等に捨ててよい(推奨)。


7. 分析イベント(設計の要点)

7.1 共通エンベロープ

各イベントに eventId(UUID)nameoccurredAt(ISO8601 UTC)sessionId(匿名・端末単位)、surfaceembed | zip | preview)、lpIdrevision。任意で contextuserAgentviewport 等)。

7.2 主要イベント(抜粋)

名前意味の概要
lp_viewその sessionId で初めてLPを表示。
step_viewステップが十分見えた(閾値: 表示率 ≥ 0.5 が 連続100ms)。
step_dwell閾値以上で見えていた時間を、ステップ離脱時に送信。
cta_click / hotspot_clickステップID・インデックス。ホットスポットは hotspotId 追加。
swipe_next / swipe_prev遷移元・先のステップとインデックス。
video_play / video_progress / video_complete動画ステップ用(video_progress は 25/50/75% 等、spec準拠)。

ペイロードは payload にネスト推奨(実装はフラットでも可)。全文は spec/analytics-events-v0.1.md

7.3 MVPダッシュボードで見せる指標(確定)

  • LPあたり: ユニーク sessionIdlp_view ベース)
  • ステップあたり: step_viewstep_dwell 平均・合計
  • コンバージョン寄り: cta_click + hotspot_click

8. 計測キー(publicKey)の考え方

  • 目的: 匿名の計測POSTを許可しつつ、どのLP向けのトラフィックかを識別し、漏洩時に失効できるようにする。
  • 形式(確定): pk_{live|test}_{opaque}。クライアントに平文で置くため、サーバは ハッシュのみ保存(例: HMAC-SHA256(secret_pepper, 全文))。
  • 検証: 形式・DB照合・ボディ内の lpId とキーの紐づき(MVPは LP単位発行を推奨して影響範囲を限定)。
  • 管理画面では平文は一度だけ表示などの運用前提。詳細は spec/api-v0.1.md

9. 管理API(v0.1 実装・バックオフィス)

日常操作: ログインユーザーの JWT(httpOnly)+ワークスペース ACL(owner / editor / viewer)。

ブートストラップ: 環境変数 ADMIN_TOKENAuthorization: Bearer … または X-Admin-Token で送る(CI・緊急用)。

メソッドパス内容
POST/v1/manage/workspacesWorkspace 作成 { name, slug }
GET/v1/manage/workspaces一覧
POST/v1/manage/workspaces/{id}/landing-pagesLP 作成(public_id は ULID 自動)
GET/v1/manage/workspaces/{id}/landing-pagesLP 一覧
PATCH/v1/manage/workspaces/{ws}/landing-pages/{lp}definition 更新(definition.id は変更不可)
POST/v1/manage/workspaces/{ws}/landing-pages/{lp}/publish公開
POST/v1/manage/workspaces/{ws}/landing-pages/{lp}/keys計測キー発行(平文はレスで一度だけ
POST/v1/manage/workspaces/{ws}/landing-pages/{lp}/ai/writing-suggestionsAI文案提案(同期)
POST/v1/manage/workspaces/{ws}/landing-pages/{lp}/ai/image-jobsAI画像ジョブ
GET/v1/manage/workspaces/{ws}/landing-pages/{lp}/analytics/summary?days=LP集計(期間フィルタ可)

開発シードのデモキー例(demo LP 用): pk_live_swipelp_seed_demo_0001 — 実装は spec/stack.md を参照。

管理コンソール(競合型UIに寄せた導線): 左ナビで サイト制作(ワークスペース・LP)と 効果測定(LP横断の集計一覧)に分離。画面要素と未実装の対応は spec/product-ui-parity.md


10. 技術スタックと通信

領域内容
構成npm workspaces モノレポ
管理UIapps/web — Next.js 14 App Router、Tailwind
APIapps/api — Python 3.12、FastAPI、SQLAlchemy 2
閲覧packages/viewer — 埋め込み/ZIP向けランタイム(TypeScript)
DBPostgreSQL 16
オブジェクトS3互換(開発: MinIO。本番は R2/S3 + CDN 前提)
プロキシ既存 nginx-proxy + acme-companion 等で HTTPS(sslip.io 等での検証ドキュメントあり)

ブラウザ → サーバ: ユーザー操作は主に Next と同一オリジン/api/* は Next の rewrite で内部 apiAPI_INTERNAL_URL)へ。公開LPの /v1/public/* や計測は FastAPI 側の契約どおり。

本番に近い動作確認: docker composedeploy/nginx-proxy-sslip.md


11. 認証・マルチテナント・課金

  • 認証: 「誰が」「どの Workspace に属するか」をドメインで表現。ログイン手段はアダプタで差し替え。MVPはメール+パスワードやマジックリンク等から。SSO/OIDC は同じ境界に後から載せる。
  • Workspace: メンバー・権限(Owner / Admin / Editor / Viewer 等)は実装時に確定。LP・資産・集計キーは Workspace に紐づく。
  • 課金: MVPでは Stripe 等は実装しない。Workspace に planbilling_statustrial_ends_at 等の nullable フィールドを持ち、社内運用では手動でも可。

12. AI機能

  • 文案提案(実装済): CTA・メタ・ナレッジ・ステップ補足・ストーリーボード。同期 API。→ ai-writing-v0.1.md
  • 画像生成(実装済): 非同期ジョブ、一括・RAG・参考URL。→ ai-lp-image-jobs-v0.1.md
  • 動画生成: 未実装。方針は ai-features.md
  • 原則: APIキーはサーバのみ。画像はジョブ+ストレージ。文案は現状同期。

13. MVPの境界(話の整理用)

  • やる: スワイプLPの制作・公開、埋め込み/ホストURL/ZIP配信、ステップ分析、Workspace、計測キー、AI文案・画像、管理API。
  • まだやらない: 本番課金フロー(フィールドのみ)。動画AI・ヒートマップ可視化。

14. デモ・質疑で使えるフレーズ

  • 「LPは1つのJSON定義で、埋め込みもZIPも同じランタイム。」
  • 「ZIPは相対パスだけなので、顧客の静的ホスティングにそのまま載せられる。」
  • step.id は公開後も変えないので、長期の分析比較がしやすい。」
  • 「ホットスポットとCTAはイベントが分かれるので、バナー型とボタン型の効果を分けられる。」
  • step_view は『半分以上が100ms見えた』など、仕様で閾値が決まっている。」
  • 「計測キーはクライアントに出るので、LP単位発行や失効でリスクを抑える設計。」
  • 「TOPのデモは組み込みLPで、picsum や API に依存しない。」
  • 「AI文案はストーリーボードまで一括。演出指示として画像生成に渡せる。」

15. 正本ドキュメント(詳細はこちら)

内容パス
MVP全体像spec/mvp.md
LP定義スキーマ v0.1spec/lp-definition-v0.1.md
分析イベント v0.1spec/analytics-events-v0.1.md
埋め込み・ZIP v0.1spec/embed-and-zip-v0.1.md
公開API・計測キー v0.1spec/api-v0.1.md
技術スタック・管理APIspec/stack.md
AI文案 v0.1spec/ai-writing-v0.1.md
AI画像 v0.1spec/ai-lp-image-jobs-v0.1.md
製品ガイドproduct/getting-started.md
Docker・プロキシdeploy/nginx-proxy-sslip.md
意思決定ログdecisions/log.md

本ファイルはプレゼン向け要約である。契約・HTTP・キー形式の最終確認は必ず上記 spec を参照すること。

ソース: docs/presentation/overview.md