#author("2026-01-24T04:26:05+09:00","default:kanateko","kanateko")
#author("2026-01-24T04:29:10+09:00","default:kanateko","kanateko")
&tag(API);

HTTPプロトコルを利用して、Webブラウザを介さずにPukiWikiのページや添付ファイルを操作できる機能。
HTTPプロトコルを利用して、Webブラウザを介さずにWikiのページや添付ファイルを操作できる機能。

#contentsx

* 認証 [#auth]

すべてのリクエスト(auth エンドポイント以外)には、 Authorization ヘッダーに Bearerトークンを含める必要がある。

 Authorization: Bearer [TOKEN]

''トークン''
- 管理者トークン:管理者用。全権限付与
- 一時トークン:auth エンドポイントで発行される。有効期限あり

** トークン取得 [#token]

 POST /api/v1/auth

管理者パスワードを使用して一時トークンを取得する。

''リクエストボディ (JSON):''
#prism(json){{
{
  "password": "管理者パスワード"
}
}}

''レスポンス:'' 200 OK

''レスポンス例:''
#prism(json){{
{
  "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...",
  "expires_at": "2026-01-23T12:00:00+00:00",
  "expires_in": 900
}
}}

* エンドポイント [#ic5eef3e]

** ページ一覧取得 [#pages]

 GET /api/v1/pages

既存のすべてのページの一覧を取得する。
一時トークンの場合は閲覧権限のあるページのみ。

''レスポンス:'' 200 OK

''レスポンス例:''
#prism(json){{
{
  "count": 10,
  "pages": ["FrontPage", "MenuBar", ...]
}
}}

** ページ内容取得 [#page]

 GET /api/v1/pages/[ページ名]

指定したページの内容と更新タイムスタンプを取得する。

''レスポンス:'' 200 OK

''レスポンス例:''
#prism(json){{
{
  "page": "FrontPage",
  "content": "# FrontPage\n\nWelcome to PukiWiki!",
  "timestamp": 1705891200
}
}}

** 最近更新されたページ一覧取得 [#recent]

 GET /api/v1/recentpages/[件数]

最近更新されたページの名前とタイムスタンプを取得する。
件数を指定しない場合は10件。

''レスポンス:'' 200 OK

''レスポンス例:''
#prism(json){{
{
  "count": 10,
  "recent": [
    {
      "page": "FrontPage",
      "timestamp": 1705891200
    },
    ...
  ]
}
}}

** 添付ファイル一覧取得 [#attachments]

 GET /api/v1/attachments?page=[ページ名]

指定したページの添付ファイルの一覧を取得する。

''レスポンス:'' 200 OK

''レスポンス例:''
#prism(json){{
{
  "page": "FrontPage",
  "count": 2,
  "files": [
    {
      "name": "image.jpg",
      "size": 12345,
      "mtime": 1705891200
    },
    ...
  ]
}
}}

** ページ作成 [#create]

 POST /api/v1/pages

新しいページを作成する。

''リクエストボディ (JSON):''
#prism(json){{
{
  "page": "NewPage",
  "content": "ページの内容"
}
}}

''レスポンス:'' 201 Created

''レスポンス例:''
#prism(json){{
{
  "page": "NewPage"
}
}}

** ページ更新 [#update]

 PUT /api/v1/pages/[ページ名]

既存のページを更新する。

''リクエストボディ (JSON):''
#prism(json){{
{
  "content": "更新された内容",
  "touch": true
}
}}

- touch: true の場合、タイムスタンプを更新する (デフォルト: true)

''レスポンス:'' 200 OK

''レスポンス例:''
#prism(json){{
{
  "page": "ExistingPage",
  "touch": true
}
}}

** ページ削除 [#delete]

 DELETE /api/v1/pages/[ページ名]

ページを削除する。

''レスポンス:'' 200 OK

''レスポンス例:''
#prism(json){{
{
  "page": "PageToDelete"
}
}}

* エラーレスポンス [#error]

エラーが発生した場合、エラーメッセージが返される。

''例:''
#prism(json){{
HTTP 401 Unauthorized
{
  "error": "Unauthorized: Invalid token"
}
}}

''主なエラーコード:''
- 400: Bad Request(必須パラメータ不足、無効なページ名など)
- 401: Unauthorized(認証失敗)
- 403: Forbidden(権限不足)
- 404: Not Found(ページが存在しない)
- 409: Conflict(ページが既に存在する)
- 500: Internal Server Error(サーバーエラー)

* 注意事項 [#a0949fc8]

- ページ名は PukiWiki の命名規則に従う必要がある。
- 作成時は page と content が必須。
- 更新時は content が必須。
- 一時トークンは15分で有効期限切れ。

*コメント [#comment]
#mcomment