認証

API自身の説明を返すインデックス以外のすべてのリクエストに、ヘッダーを1つ付けます。

Authorization: Bearer <your api key>

トークンはアカウントページで発行します。1アカウントにつき最大10個まで発行でき、個別に無効化できるため、漏洩したトークンだけを他に影響を与えずに削除できます。有料プランが必要です。有料プランがない場合、/と/v1/account以外のすべてのエンドポイントは403 plan_requiredを返します。

OAuth 2.1を使って、アプリケーションにトークンを取得させることもできます。ログインし、アプリケーションが求める権限を確認して「許可」を押すだけです。そのトークンも同じヘッダーで送信し、同じように機能します。

?key=を使わない理由

クエリ文字列に含めたキーは、意図しない場所に残ります。ウェブサーバーのアクセスログ、ブラウザの履歴、プロキシのログ、そしてレスポンスからリンクされた先に送られるRefererヘッダーなどです。そのためAPIはクエリ文字列のキーを受け付けず、その旨を401 missing_keyで返します。

ただし、メインサイトの旧?export=URLでは、引き続き?key=を受け付けます。何年も前に書かれたスクリプトがこれに依存しており、廃止すると動かなくなるためです。使えるのはこの1か所だけです。詳しくは旧エクスポートURLをご覧ください。

キーが有効か確認する

/v1/accountは最も負担の少ない呼び出しです。利用枠を消費せず、プランのないアカウントでも動作するため、「このキーは有効か」と「どこまで利用できるか」の両方を確認できます。

curl -H "Authorization: Bearer $KEY" https://api.publicwww.com/v1/account
{
  "plan": "enterprise",
  "plan_until": 1819461840,
  "full_access": true,
  "quota": {
    "searches": { "limit": 300, "used": 12, "resets_at": 1787961600 },
    "snippets": { "limit": 100, "used": 3,  "resets_at": 1787961600 }
  },
  "limits": {
    "disclosed_positions": 4294967295,
    "max_per_page": 1000000,
    "max_per_page_snippets": 10000
  }
}

起こりうるエラー

ステータスコード意味
401missing_keyAuthorization: Bearerヘッダーがありません。クエリ文字列のキーは認められません。
401invalid_keyキーに対応するアカウントがありません。余分な改行や引用符が含まれていないか確認してください。
403plan_requiredキーは有効ですが、アカウントに有料プランがありません。

401にはWWW-Authenticate: Bearerヘッダーも付くため、認証を汎用的に処理するHTTPクライアントも適切に動作します。

アプリケーション向けOAuth 2.1

アシスタント、連携ツール、ホスティング型サービスなど、他のユーザーの代わりに動作するアプリケーションは、ユーザー一人ひとりにトークンをコピーさせるべきではありません。代わりにユーザーをPublicWWWに案内します。ユーザーがログインしてアプリケーションを承認すると、アプリケーションは専用のトークンを受け取ります。このトークンは他のトークンと同様にAuthorization: Bearerとして送信し、そのアカウントのプラン、利用枠、レート制限の範囲内で、API全体とhttps://api.publicwww.com/mcpのMCPサーバーを利用できます。

項目URL
認可サーバーのメタデータ(RFC 8414)https://publicwww.com/.well-known/oauth-authorization-server
保護リソースのメタデータ(RFC 9728)https://api.publicwww.com/.well-known/oauth-protected-resource
認可エンドポイントhttps://publicwww.com/oauth/authorize
トークンエンドポイントhttps://publicwww.com/oauth/token
取り消しエンドポイント(RFC 7009)https://publicwww.com/oauth/revoke

アプリケーションの識別

クライアント登録はありません。client_idは、アプリケーションが公開する小さなJSONドキュメント(クライアントメタデータドキュメント)のhttps URLです。PublicWWWは誰かが連携するたびにこのドキュメントを読み込むため、名前やリダイレクト先は常に最新の状態に保たれ、承認するユーザーはどのホストがそれを公開しているかを確認できます。

{
  "client_id": "https://app.example.com/oauth/client.json",
  "client_name": "Example App",
  "redirect_uris": ["https://app.example.com/oauth/callback"],
  "grant_types": ["authorization_code"],
  "response_types": ["code"],
  "token_endpoint_auth_method": "none"
}
  • ドキュメント内のclient_idは、そのドキュメントを配信しているURLと完全に一致する必要があります。ドキュメントはパスを含むURLからhttpsで、リダイレクトをたどらずに取得されます。5秒以内に応答し、64 KB未満である必要があります。
  • redirect_urisはhttpsのアドレスである必要があります。ユーザー自身のコンピューターで動作するアプリケーションの場合は、127.0.0.1、localhost、[::1]上のhttpも使えます。この場合、ポートは任意です。myapp://のようなカスタムスキームは受け付けません。
  • すべてのアプリケーションはパブリッククライアントとして扱われます。ドキュメントでtoken_endpoint_auth_methodに何を指定していても、トークンリクエストにシークレットは含めません。代わりに、認可コードはPKCEで保護されます。

フロー

PKCE付きの認可コードフローを使います。メソッドはS256のみです。ユーザーを認可エンドポイントに案内します。

https://publicwww.com/oauth/authorize
    ?response_type=code
    &client_id=https%3A%2F%2Fapp.example.com%2Foauth%2Fclient.json
    &redirect_uri=https%3A%2F%2Fapp.example.com%2Foauth%2Fcallback
    &code_challenge=<BASE64URL(SHA-256(code_verifier))>
    &code_challenge_method=S256
    &state=<random>

ユーザーは、まだログインしていなければメールで届くワンタイムコードでログインし、アプリケーションの名前、ドキュメントのホスト、戻り先を確認して、「許可」または「キャンセル」を押します。redirect_uriには、code、アプリケーションが送ったstate、iss=https://publicwww.com(RFC 9207)が返されます。認可コードの有効期間は10分で、使えるのは1回だけです。これをトークンと交換します。

curl https://publicwww.com/oauth/token \
     -d grant_type=authorization_code \
     -d code="$CODE" \
     -d code_verifier="$VERIFIER" \
     -d client_id=https://app.example.com/oauth/client.json \
     -d redirect_uri=https://app.example.com/oauth/callback
{ "access_token": "<token>", "token_type": "Bearer", "scope": "mcp" }

scopeは省略できます。スコープはmcpの1つだけで、API全体をカバーします。resource(RFC 8707)も省略できます。指定する場合はhttps://api.publicwww.com/mcpまたはhttps://api.publicwww.comです。

トークンの有効期間

取り消されるまで有効です。有効期限もリフレッシュトークンもありません。今日動いている連携は、誰も手を加えなくても明日も動き続けます。トークンが取り消されるのは、意図的な操作があった場合だけです。ユーザーがアカウントページでアプリケーションの連携を解除した場合、アプリケーション自身が取り消した場合、またはアカウントが削除された場合です。

curl https://publicwww.com/oauth/revoke \
     -d token="$TOKEN" \
     -d client_id=https://app.example.com/oauth/client.json

取り消しエンドポイントは、トークンが存在したかどうかにかかわらず、常に200を返します。

OAuthのエラー

発生箇所コード意味
認可エラーページclient_idのドキュメントを読み込めないか、redirect_uriがドキュメントに記載されていません。ユーザーはリダイレクトされません。検証されていないアドレスにリダイレクトすることはありません。
認可invalid_requestcode_challengeがないか、S256以外のメソッドが指定されています。
認可unsupported_response_typeresponse_type=code以外が指定されています。
認可、トークンinvalid_targetAPI以外のresourceが指定されています。
認可access_deniedユーザーが「キャンセル」を押しました。
トークンinvalid_grant認可コードが不明、使用済み、期限切れ、または別のclient_idに発行されたものです。あるいはcode_verifierまたはredirect_uriが一致しません。
トークンunsupported_grant_typeauthorization_code以外が指定されています。

エラーページ以外の認可エラーは、error、error_description、state、issとしてredirect_uriに返されます。トークンのエラーは400で、同じ2つのフィールドをJSONで返します。

次へ リクエストの送信