アットウィキ(@WIKI)ご利用ガイド
APIリファレンス
最終更新:
guide
-
view
共通のきまりについて
このAPIのすべてのエンドポイントに共通する決まりごととなっております。
個別のエンドポイントの説明で迷ったら、ここに戻り内容を確認してください。
- ベースURLは `https://w.atwiki.jp/_api/v1/wikis/{wikiid}` 。`{wikiid}` は自分のwikiのID
- 認証は `Authorization: Bearer <アクセストークン>` だけで行う。クエリパラメータやリクエストボディにトークンを入れると、400 `invalid_request` になる
- やり取りはJSON・UTF-8。書き込み(POST・PUT)は `Content-Type: application/json` が必須で、これ以外だと415になる
- 応答には毎回 `Cache-Control: no-store` が付く。クライアント側で応答をキャッシュしない前提で作ること
- 登録したアプリは、登録時に紐付けた1つのwikiでしか使えない。URLの `{wikiid}` に別のwikiのIDを入れると401になる
- スクリプトを書くときは、既定のUser-Agent(curlのものなど)のままにせず、自分のアプリを表す独自のUser-Agentを設定する
よく使うヘッダをまとめると次のとおり。
| ヘッダ | 使う場面 | 値の例 |
| Authorization | すべてのリクエスト(必須) | `Bearer <アクセストークン>` |
| Content-Type | POST・PUTのリクエスト(必須) | `application/json` |
| If-Match | DELETEのリクエスト(必須。無いと428)/PUTのリクエスト(省略可。ただし他人の更新を黙って上書きしないため付けることを強く推奨) | GET /pages/{pageid}で控えたetagの値 |
| Idempotency-Key | POST・PUT・DELETEのリクエスト(省略可) | 自分で決める一意な文字列 |
なお、このページの応答例に出てくる値(pageid・日時・トークンの値など)はすべてイメージ用のダミー値。実際にAPIを呼んだときの値ではない。
エンドポイント一覧
| メソッド | パス | 必要な scope | 成功時 |
| GET | /whoami | user:read | 200 |
| GET | /me | user:read | 200 |
| GET | /pages | wiki:read | 200 |
| GET | /pages/{pageid} | wiki:read | 200 |
| POST | /pages | wiki:write | 201 |
| PUT | /pages/{pageid} | wiki:write | 200 |
| DELETE | /pages/{pageid} | wiki:delete | 200 |
| GET | /search | wiki:search | 200 |
アカウント情報
GET /whoami
トークンがどのwiki宛で、どんなscopeを持っているかを確認する、疎通確認用のエンドポイント。新しいアプリやトークンを試すときは、まずここを叩く。
`ACCESS` は保有しているアクセストークン、`WIKIID` は自分のwikiのIDに置き換える。
curl -s -H "Authorization: Bearer ${ACCESS}" \
--max-time 15 \
"https://w.atwiki.jp/_api/v1/wikis/${WIKIID}/whoami"
返ってくるJSONの例(以下はイメージ):
{
"subject": "yourwiki:1001",
"client_id": "3f29a1c2-4b5d-4e6f-8a9b-0c1d2e3f4a5b",
"wikiid": "yourwiki",
"scopes": ["user:read"],
"grant_generation": 1
}
注意:
- トークンに `user:read` scopeが無いと403 `insufficient_scope` になる
GET /me
トークンの持ち主が、対象wikiでどんなロールを持っているかを取得する。
`ACCESS` `WIKIID` はGET /whoamiと同じ(保有しているアクセストークン・自分のwikiのID)。
curl -s -H "Authorization: Bearer ${ACCESS}" \
--max-time 15 \
"https://w.atwiki.jp/_api/v1/wikis/${WIKIID}/me"
返ってくるJSONの例(以下はイメージ):
{
"subject": "yourwiki:1001",
"wikiid": "yourwiki",
"user_id": "1001",
"username": "yourname",
"role": {
"is_admin": true,
"is_sub_admin": false,
"is_member": true
},
"scopes": ["user:read"]
}
注意:
- `role` は現在のロールを表す。`is_admin`(管理者かどうか)・`is_sub_admin`(副管理者かどうか)・`is_member`(有効なメンバー登録があるかどうか)はそれぞれ独立した値。管理者だからといって `is_member` が必ずtrueになるとは限らない
ページの読み取り
GET /pages
wiki内のページを一覧で取得する。1回の呼び出しで返るのは既定20件・最大100件で、続きがあれば `next_cursor` を使って次のページを取る。
`ACCESS` `WIKIID` はGET /whoamiと同じ。
curl -s -H "Authorization: Bearer ${ACCESS}" \
--max-time 15 \
"https://w.atwiki.jp/_api/v1/wikis/${WIKIID}/pages?limit=20"
続きを取るときは、`CURSOR` に直前の応答の `next_cursor` の値を入れて、`cursor` クエリに渡す。
curl -s -H "Authorization: Bearer ${ACCESS}" \
--max-time 15 \
"https://w.atwiki.jp/_api/v1/wikis/${WIKIID}/pages?limit=20&cursor=${CURSOR}"
返ってくるJSONの例(以下はイメージ):
{
"items": [
{ "pageid": 1042, "pagename": "サンプルページ", "updated_at": "2026-07-20T03:15:00Z", "permission_read": 0 },
{ "pageid": 1041, "pagename": "サンプルページ(旧)", "updated_at": "2026-07-19T10:02:31Z", "permission_read": 0 }
],
"next_cursor": "MTc4NDQ1NTM1MToxMDQx"
}
注意:
- `limit` は既定20・最大100。それより大きい値を指定しても100に切り詰められる
- `next_cursor` を次の呼び出しの `cursor` に渡すと続きが取れる。中身を解釈しようとせず、そのまま渡すこと
- `next_cursor` が `null` なら、それが最後のページ。`next_cursor` のキー自体は最後のページでも必ず入っている(値が `null` になる)ので、キーの有無ではなく値が `null` かどうかで判定する。`null` をそのまま `cursor` に渡すと先頭ページに戻り、繰り返しが終わらなくなる
GET /pages/{pageid}
1件のページを取得する。`{pageid}` はページのID(数字)。
`ACCESS` `WIKIID` はGET /whoamiと同じ。`PAGEID` は取得したいページのID。
curl -s -H "Authorization: Bearer ${ACCESS}" \
--max-time 15 \
"https://w.atwiki.jp/_api/v1/wikis/${WIKIID}/pages/${PAGEID}"
返ってくるJSONの例(以下はイメージ):
{
"pageid": 1042,
"pagename": "サンプルページ",
"source": "*見出し\n\n本文の内容がここに入る。",
"updated_at": "2026-07-20T03:15:00Z",
"permission_read": 0,
"tags": "サンプル,メモ",
"description": "",
"etag": "\"1042-1784517300\""
}
注意:
- 本文は `source` フィールドに入っている(書き込み時のフィールド名 `body` とは違う。詳しくは「読み取りと書き込みでフィールド名が違う」を参照)
- `etag` の値は、そのまま更新(PUT)・削除(DELETE)の `If-Match` に使う。引用符(`"`)も含めて丸ごと控えておく
- `pageid` に数字以外を入れると404になる
ページの書き込み
POST /pages
新しいページを作成する。成功すると201が返る。
応答は `data`(作成されたページの内容)と `meta`(`wikiid` と `request_id`)に分かれる。この形はPUT・DELETEの応答でも同じ。一方、読み取り(GET)の応答は `data`/`meta` に包まれず、内容がそのまま返る。
`ACCESS` `WIKIID` はGET /whoamiと同じ。`IDEMPOTENCY_KEY` は自分で決める、この1回のリクエストを表す一意な文字列(UUIDなど)。
curl -s -X POST \
-H "Authorization: Bearer ${ACCESS}" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: ${IDEMPOTENCY_KEY}" \
--max-time 15 \
-d '{
"pagename": "新しいページ",
"body": "*見出し\n\n本文の内容"
}' \
"https://w.atwiki.jp/_api/v1/wikis/${WIKIID}/pages"
返ってくるJSONの例(以下はイメージ):
{
"data": {
"pageid": 1050,
"pagename": "新しいページ",
"source": "*見出し\n\n本文の内容",
"updated_at": "2026-07-31T01:00:00Z",
"etag": "\"1050-1785459600\""
},
"meta": {
"wikiid": "yourwiki",
"request_id": "A1B2C3D4E5F6A7B8C9D0E1F2A3"
}
}
注意:
- リクエストのボディは `{"pagename": "...", "body": "..."}` の形(応答側の `source` とは名前が違う点に注意)
- 同名のページがすでにあると409 `conflict` になる
- `Idempotency-Key` ヘッダを付けると、同じキーで再送しても二重にページが作られない(ネットワーク断などでの再送に安全)。ただし同じキーで前回と違うボディを送ると422になる。この仕組みはPOSTだけでなくPUT・DELETEでも同様に使える
- 同じキーで再送したときの応答は、`pageid` と `etag`(DELETEでは `deleted`)だけの簡略形になり、`meta` も本文(`pagename`・`source`)も含まれない。再送を前提にするスクリプトでは、`data.pagename` や `meta.request_id` が無い場合を想定して書くこと
PUT /pages/{pageid}
既存のページの本文を更新する。`{pageid}` はページのID。
`body` に送った内容が、そのページの本文の全文になる。部分更新や末尾への追記はできない。既存の内容を残したいときは、まずGET /pages/{pageid}で `source` を取得し、それを編集した全文を `body` に入れて送る。既存本文を読まずにPUTすると、元の本文は失われる。
`ACCESS` `WIKIID` はGET /whoamiと同じ。`PAGEID` は更新したいページのID。`ETAG` は直前にGET /pages/{pageid}で控えた `etag` の値(引用符込みでそのまま)。
curl -s -X PUT \
-H "Authorization: Bearer ${ACCESS}" \
-H "Content-Type: application/json" \
-H "If-Match: ${ETAG}" \
--max-time 15 \
-d '{
"body": "*見出し(更新後)\n\n更新した本文"
}' \
"https://w.atwiki.jp/_api/v1/wikis/${WIKIID}/pages/${PAGEID}"
返ってくるJSONの例(以下はイメージ):
{
"data": {
"pageid": 1050,
"pagename": "新しいページ",
"source": "*見出し(更新後)\n\n更新した本文",
"updated_at": "2026-07-31T02:00:00Z",
"etag": "\"1050-1785463200\""
},
"meta": {
"wikiid": "yourwiki",
"request_id": "B2C3D4E5F6A7B8C9D0E1F2A3B4"
}
}
注意:
- `body` は本文の全文。送った内容で既存の本文をまるごと置き換える(追記にはならない)
- タグと概要(`tags`・`description`)はPUTでは変更されず、そのまま保持される
- `If-Match` に、更新前に控えたetagを入れる。合わないと409 `conflict` になる(自分が読んだ後に、他の誰かが先に更新したということ)
- `If-Match` はPUTでは省略できる(DELETEとは違い必須ではない)。ただし省略すると、他の誰かが先に更新していても検証されずにそのまま上書きしてしまう。基本的には毎回付けること
- `pagename` の変更は422になる(v1はページ名の変更に対応していない)。リクエストの `body` は必須
- 更新に成功すると `etag` の値も変わる。次に更新するときは、この新しい `etag` を使う
- `Idempotency-Key` ヘッダを付けると再送保護が効く(POSTの節を参照)
DELETE /pages/{pageid}
ページを削除する。`{pageid}` はページのID。
`ACCESS` `WIKIID` はGET /whoamiと同じ。`PAGEID` は削除したいページのID。`ETAG` はGET /pages/{pageid}で控えた `etag` の値。
curl -s -X DELETE \
-H "Authorization: Bearer ${ACCESS}" \
-H "If-Match: ${ETAG}" \
--max-time 15 \
"https://w.atwiki.jp/_api/v1/wikis/${WIKIID}/pages/${PAGEID}"
返ってくるJSONの例(以下はイメージ):
{
"data": {
"pageid": 1050,
"deleted": true
},
"meta": {
"wikiid": "yourwiki",
"request_id": "C3D4E5F6A7B8C9D0E1F2A3B4C5"
}
}
注意:
- `If-Match` は必須。付けずに呼ぶと428 `precondition_required` になる
- 削除は元に戻せない。実行前に本当に消してよいか確認すること
- トップページとメニューページは削除できない(422)
- `Idempotency-Key` ヘッダを付けると再送保護が効く(POSTの節を参照)
ページの検索
GET /search
wiki内のページをキーワードで全文検索する。ページングには対応していない。
`ACCESS` `WIKIID` はGET /whoamiと同じ。検索語はシェルの引用符トラブルを避けるため `--data-urlencode` で渡す。
curl -s -G \
-H "Authorization: Bearer ${ACCESS}" \
--max-time 15 \
--data-urlencode "q=検索したい語句" \
"https://w.atwiki.jp/_api/v1/wikis/${WIKIID}/search"
返ってくるJSONの例(以下はイメージ):
{
"results": [
{ "pageid": 1042, "pagename": "サンプルページ" },
{ "pageid": 1038, "pagename": "サンプルページ(旧)" }
],
"query": "検索したい語句"
}
注意:
- 受け付けるクエリは `q` だけ。`q` は必須で、付け忘れたり空文字を渡すと422になる
- `cursor` は使えない。付けると422になる
- 返る件数は最大20件で、それ以上は絞り込みが必要
読み取りと書き込みでフィールド名が違う
ページの本文を表すフィールド名は、読み取りと書き込みで違う。書き込みのリクエストで `source` を使うと、`body` が無いとみなされて422になる。
| 操作 | 本文のフィールド名 |
| 読み取りの応答(GET /pages/{pageid}) | source |
| 書き込みのリクエスト(POST・PUT) | body |
補足として、POST・PUTの応答(`data`の中)も本文は `source` で返ってくる。つまり本文フィールド名が `body` になるのは「書き込みのリクエストを送るとき」だけで、それ以外(読み取りの応答・書き込みの応答のどちらも)は常に `source` 。