REST API リファレンス
Page Lemon の REST API は https://api.pagelemon.com/v1 にあります。シェルを使えるコードエージェントは、1 つのコマンドでフォルダを公開できます。AI エージェントは、まずAI 向け公開ガイド(Markdown)から読み始めてください。
最終更新 · Markdown で見る
クイックスタート
アカウントなしでフォルダを公開します(保存しない限り、72 時間オンラインのままです):
tar -czf - -C dist . | curl -sS --data-binary @- https://api.pagelemon.com/v1/deployAPI トークンがあれば、サイトはそのままアカウントに入ります:
tar -czf - -C dist . | curl -sS -H "Authorization: Bearer $PAGELEMON_TOKEN" --data-binary @- https://api.pagelemon.com/v1/deployホスト
| ホスト | 配信内容 |
|---|---|
https://pagelemon.com | このサイト、/agents、/llms.txt、/docs/* |
https://api.pagelemon.com | /v1 以下の REST API |
https://mcp.pagelemon.com | /(別名 /mcp)のリモート MCP サーバー(streamable HTTP) |
https://app.pagelemon.com | アカウント:サイト、メンバー、トークン、請求 |
https://<name>.pagelemon.dev | サイト |
認証
認証情報は Authorization: Bearer <token> として送信します。
| 認証情報 | 形式 | 取得元 | できること |
|---|---|---|---|
| サイトトークン | st_… | 匿名デプロイで一度だけ返される | アカウントに保存するまで、そのサイトの更新、読み戻し、ロールバック、閲覧が可能。保存後は、保存したことの報告のみ(GET /v1/sites/:name) |
| 保存用リンク | https://app.pagelemon.com/claim/ct_… | 匿名デプロイで一度だけ返される | ログインした人がサイトをアカウントに保存する |
| API トークン | pl_… | app.pagelemon.com/account/tokens(アカウント設定 → API トークン。API トークンを参照) | アカウントでできることすべてを、REST と MCP で |
| OAuth アクセストークン | pla_… | ログインして承認した後、MCP アプリ(Claude.ai、ChatGPT、Claude Code など)に発行される | API トークンと同じだが MCP 専用(REST は 401 を返す)。有効期間 1 時間で自動更新 |
トークンはハッシュのみを保存しているため、紛失したトークンを再表示することはできません。新しく作成してください。
エラー
{ "error": { "code": "conflict", "message": "…" }, "agent_message": "…" }agent_message は、AI からユーザーに伝えることがあるときに付いています。ユーザーの言語で伝え、リンク、コード、数字、日付、ドメインは正確なまま使ってください。時刻は UTC で、*_at のフィールドには ISO 形式で入っています。
| コード | ステータス | 意味 |
|---|---|---|
bad_request | 400 | アーカイブ、ボディ、パラメーターが不正 |
unauthorized | 401 | トークンがない、または無効 |
forbidden | 403 | そのトークンまたはロールでは実行できない |
not_found | 404 | サイトまたはファイルが存在しない |
conflict | 409 | X-Base-Revision / base_revision が古い |
gone | 410 | サイトの期限が切れた |
too_large | 413 | サイズ上限を超えている |
blocked_secret | 422 | リーク防止機能が秘密鍵を検出した |
limit | 429 | プランまたはレートの上限 |
デプロイ
POST /v1/deploy:アーカイブ 1 つ
リクエストボディがアーカイブそのものです:.tar.gz、.tgz、.tar、.zip。サーバーはバイト列から形式を判別するため、Content-Type は省略可能です。
tar -czf - -C <dir> . | curl -sS --data-binary @- https://api.pagelemon.com/v1/deploy| リクエスト | 結果 |
|---|---|
?site なし、トークンなし | 匿名作成。brave-otter-4821 のようなランダムな名前。保存されない場合は 72 時間後に期限切れ |
?site なし、API トークン | アカウント内に作成。期限なし |
?site=<name> + X-Base-Revision: <revision id> + サイトトークンまたは API トークン | 更新。公開中のリビジョンが X-Base-Revision でない場合、409 conflict が返され、何も公開されない |
デプロイのたびにサイト全体が置き換わります。含めなかったファイルは公開中のサイトから削除されます。すべてのファイルが 1 つの最上位フォルダ(dist/index.html など)の下にある場合、そのフォルダは取り除かれます。
レスポンス 201:
{
"site": { "name": "brave-otter-4821", "url": "https://brave-otter-4821.pagelemon.dev", "claimed": false, "expires_at": "2026-10-14T14:40:00Z" },
"revision": { "id": "rev_…", "number": 1, "files": 12, "bytes": 48213 },
"site_token": "st_…",
"claim_url": "https://app.pagelemon.com/claim/ct_…",
"skipped": [".env", "node_modules/…"],
"agent_message": "Your site is live at …"
}site_token と claim_url は匿名作成時のみ含まれます。
JSON による POST /v1/deploy:インラインファイル
MCP クライアントや小さなサイト向け:同じエンドポイントに Content-Type: application/json を送信します。
{ "site": "brave-otter-4821", "base_revision": "rev_…", "files": [ { "path": "index.html", "content": "<h1>Hi</h1>", "encoding": "utf8" } ] }encoding は utf8 または base64 です。新しいサイトを作成するには site と base_revision を省略します。レスポンスは上記と同じです。
パッチ:"patch": true を追加すると、base_revision に対して変更された files と "deleted": ["old.html"] だけを送信でき、それ以外はそのまま保持されます。上限とチェックは同じで、base_revision が古い場合は 409 conflict になります。
アップロードのルール
| ファイル数 | ファイルごと | サイトごと | 有効期限 | |
|---|---|---|---|---|
| アカウントなし | 100 | 1 MB | 1 MB | 保存しない場合 72 時間 |
| 無料 | 500 | 5 MB | 5 MB | なし |
| Prompter | 1,000 | 50 MB | 5 GB(その全ストレージ) | なし |
| Builder | 2,000 | 50 MB | 25 GB(その全ストレージ) | なし |
| Team | 3,000 | 50 MB | 50 GB(その全ストレージ) | なし |
| Company | 5,000 | 50 MB | 150 GB(その全ストレージ) | なし |
サイトごとの上限は、デプロイ後に公開されるサイト全体に対する値です。パッチでも、反映後のサイト全体で数えます。有料プランでは 1 つのサイトでプランのストレージをすべて使えますが、1 回のリクエストで送れるのは最大 90 MB(MCP 経由では 40 MB)です。それより大きいサイトは、最初のデプロイで送り、残りをパッチのデプロイで送ってください。上限を超えると、413 too_large と、表示用の agent_message が返ります。
- 拒否:シンボリックリンク、ハードリンク、デバイス、絶対パス、
..、大文字・小文字だけが異なる重複パス。 - スキップされ
skippedに記載:.git/、node_modules/、.env*、*.map、*.pem、*.key、.well-known/以外のドットファイル、.DS_Store、Thumbs.db。 - リーク防止:テキストファイルは、よく知られた種類の秘密鍵やプライベートキーが含まれていないかスキャンされます。検出されると
{file, line, kind}付きの422 blocked_secretが返されます。キー自体が返されることはありません。 - 必須:ルートに
index.html。 - 匿名のみ:実行ファイルとインストーラーはブロックされ、各ネットワークで作成できる匿名サイトとデプロイの数は少なく制限されます。それ以上はアカウントに保存するかログインしてください。
サイト
| メソッド | パス | 認証 | 備考 |
|---|---|---|---|
| GET | /v1/sites | API トークン | メンバーになっているサイト |
| GET | /v1/sites/:name | サイトトークン、メンバー | {name, url, claimed, expires_at, plan, role, live_revision: {id, number, created_at, created_by}, badge}。サイトトークンを使い、ユーザーが保存用リンクを開いた後にポーリングします:{claimed: false, …} または {claimed: true, account_token?}。サイトが保存された後もサイトトークンで実行できる唯一の呼び出しです |
| GET | /v1/sites/:name/files | サイトトークン、メンバー | 公開中のバージョンは {revision, files: [{path, size, sha256}]} |
| GET | /v1/sites/:name/files/<path> | サイトトークン、メンバー | ファイルの生の内容(読み戻し)、X-Revision ヘッダー付き |
| GET | /v1/sites/:name/revisions | サイトトークン、メンバー | 新しい順。匿名: 現在のバージョンのみ。Free: 7 日。Prompter: 90 日。Builder と Team: 1 年。Company: 2 年 |
| POST | /v1/sites/:name/rollback | サイトトークン、編集者または所有者 | {revision} はそのバージョンを新しいバージョン番号として再公開します |
| POST | /v1/sites/:name/rename | 編集者または所有者(アカウントのみ) | {name}:a-z、0-9、- からなる 4〜63 文字。ランダムな名前(word-word-1234)に見えるもの、予約済みのもの、過去に使用されたものは不可 |
| DELETE | /v1/sites/:name | 所有者 | 完全削除です。API トークンを使うと 202 と approve_url が返ります。これは、サイトのアドレスを入力して「完全に削除」をクリックするページです。削除されたかどうかは GET /v1/approvals/<token> でわかります。 |
| GET | /v1/sites/:name/members | メンバー | {members: [{email, role}], invites: [{email, role}]} |
| POST | /v1/sites/:name/members | 所有者 | {email, role: "editor" or "viewer"} は招待メールを送信します |
| DELETE | /v1/sites/:name/members/:email | 所有者 | 2 ステップ式です。1 回目の呼び出しで {confirm_token} が返ります。5 分以内に ?confirm=<token> を付けてもう一度呼び出してください。 |
ロール:閲覧者はサイトとその履歴を読むことができます。編集者はさらにデプロイとロールバックができます。所有者はさらに招待、名前の変更、削除ができます。
アカウント
| メソッド | パス | 認証 | 備考 |
|---|---|---|---|
| GET | /v1/me | API トークン | {email, plan, sites_used, sites_limit} |
サイトの保存、招待の承認、トークン、請求は app.pagelemon.com で行います。
pagelemon.dev での配信
/はindex.htmlを配信します。/aboutはabout.htmlまたはabout/index.htmlを配信します。- 存在しないファイルには、サイトの
404.htmlがあればそれを、なければ当社のものを返します。 - シングルページアプリのフォールバック:サイトに
404.htmlがなく、パスにファイル拡張子がない場合、index.htmlが配信されます。 - ヘッダー:
X-Content-Type-Options: nosniff、Referrer-Policy: strict-origin-when-cross-origin、HTML にはCache-Control: public, max-age=60、その他のファイルにはmax-age=300。Content-Type は許可リストに基づき、不明な形式はapplication/octet-streamとして配信されます。 - 匿名のサイトと無料プランのサイトには、
</body>の前に小さな「Page Lemon で公開中」バッジが付きます。スクリプトを使わない素の HTML と CSS で、サイトを報告するリンクも含まれます。 - 期限切れまたは削除されたサイトは
410を返します。不正利用により停止されたサイトは451を返します。
.pagelemon.json
デプロイ後、エージェントはこのファイルをプロジェクトフォルダに書き込み、.gitignore に追加します。これにより、次のセッションで同じサイトを更新できます:
{ "site": "brave-otter-4821", "url": "https://brave-otter-4821.pagelemon.dev", "revision": "rev_…", "site_token": "st_…" }