APIを作成する
POST /v1/apis · 権限 apis:write
環境内にAPIを作成します。key、identifier、nameは必須です。省略したオプションフィールドはデフォルト値を取ります。識別子は環境内で一意です(削除されたAPIはその識別子を90日間予約します)。レスポンスは現在のバージョンを含むETagを含みます。再試行を安全にするにはIdempotency-Keyヘッダーを送信してください。
リクエスト
ボディ application/json。不明なフィールドは拒否されます。
| フィールド | タイプ | 必須 | 説明 |
|---|---|---|---|
key |
string | はい | 安定した設定キー、^[a-z0-9_-]{1,64}$。変更不可。 |
identifier |
string | はい | トークンオーディエンス: httpsURL(クエリまたはフラグメントなし)またはurn:<nid>:<nss>。正規形式で保存されます。変更不可。urn:idp:ネームスペースは予約されています。 |
name |
string | はい | 1~128文字。 |
access_token_lifetime_s |
integer | いいえ | 60~86400。デフォルト3600(mcp_profileを使用する場合は600)。 |
token_format |
string | いいえ | jwt(デフォルト)またはopaque。 |
rbac_mode |
string | いいえ | ロールと権限がトークンに反映される方法: claims(デフォルト)はpermissionsとorg_permissionsを追加します。offはどちらも追加しません(org_rolesは引き続き追加されます)。enforceはそれらを追加し、さらに付与されるスコープをユーザーの有効な権限に制限します。 |
allow_offline_access |
boolean | いいえ | デフォルトtrue。 |
require_resource_indicator |
boolean | いいえ | デフォルトfalse(mcp_profileを使用する場合はtrue)。 |
dpop_required |
boolean | いいえ | デフォルトfalse。 |
mcp_profile |
boolean | いいえ | httpsのidentifierとrequire_resource_indicator: trueが必要です。 |
first_party_access |
string | いいえ | all(デフォルト)またはgranted_only。 |
introspection_applications |
array | いいえ | このAPIのトークンをイントロスペクトできるアプリケーション(app_…)、最大50個、重複なし。同じ環境のwebおよびm2mアプリケーションのみ。デフォルトは空です。 |
イントロスペクトアプリケーション
イントロスペクトエンドポイント(POST <issuer>/oauth2/introspect、RFC 7662)は、アクセストークンに対して、トークンが発行されたアプリケーション、またはトークンのaudで指定されたAPIのintrospection_applicationsリストにあるアプリケーションの2つの呼び出し元にのみactive: trueで応答します。他のすべての呼び出し元はactive: falseを取得するため、APIは互いのトークンを読むことができません。同じ環境の機密アプリケーション(web、m2m)のみをリストできます。リストはセットとして保存され、ID順で返されます。一時停止されたアプリケーションはリストに残りますが、イントロスペクトはできません。システムAPIのリストは書き込みできません。
レスポンス
201 CreatedとETagヘッダー、およびAPI:
{
"id": "api_01h455vb4pex5vsknk084sn02q",
"key": "orders",
"identifier": "https://api.example.com/orders",
"name": "Orders API",
"is_system": false,
"access_token_lifetime_s": 3600,
"token_format": "jwt",
"rbac_mode": "claims",
"allow_offline_access": true,
"require_resource_indicator": false,
"dpop_required": false,
"mcp_profile": false,
"first_party_access": "all",
"introspection_applications": ["app_01h455vb4pex5vsknk084sn02r"],
"created_at": "2026-10-05T12:00:00Z",
"updated_at": "2026-10-05T12:00:00Z"
}
エラー
| HTTP | code | 情況 |
|---|---|---|
| 400 | unknown_field |
ボディに上記にリストされていないフィールド(例:idまたはis_system)が含まれています。 |
| 409 | conflict |
同じkeyまたはidentifierを持つAPIが既に存在します。 |
| 415 | unsupported_media_type |
コンテンツタイプがapplication/jsonではありません。 |
| 422 | validation_failed |
フィールドが欠落しているか無効です(errors[].pointer、例:/identifier)。 |
| 422 | validation_failed |
introspection_applicationsアイテムがこの環境に存在しない(unknown_application)、機密ではない(not_confidential)、重複している(duplicate)、またはapp_… IDではありません(invalid_value)。ポインタはリクエスト内のインデックスを名付けます。 |
| 403 | quota_exceeded |
環境がその技術的API制限に達しました。 |
| 403 | insufficient_permissions |
認証情報にapis:writeがありません。 |
例
curl -X POST https://api.eu.keenauth.com/v1/apis \
-H "Authorization: Bearer $KEENAUTH_SECRET_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"key":"orders","identifier":"https://api.example.com/orders","name":"Orders API"}'