
# アプリケーションを作成

`POST /v1/applications` · 権限 `applications:write`

呼び出し元のキーの環境に、アプリケーション（OAuth/OIDC クライアント）を作成します。`key`、`name`、`app_type`、`party` は必須です。その他のフィールドには、アプリケーションの種類から導かれる安全なデフォルト値が設定されます。レスポンスには `ETag` が含まれます。更新または削除の際は、これを `If-Match` として送信してください。この操作ではクライアントシークレットは作成されません。シークレットとキーは、アプリケーション認証情報のエンドポイントで管理します。

## リクエスト

**本文**（`application/json`）。定義されていないフィールドは拒否されます。必須なのは `key`、`name`、`app_type`、`party` のみです。

| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
| `key` | string | はい | 安定した設定キー。`^[a-z0-9_-]{1,64}$` に一致し、環境ごとに一意です。作成時に必須で、その後は変更できません。 |
| `name` | string | はい | 表示名。1〜100 文字です。 |
| `app_type` | string | はい | `web`、`spa`、`native`、`m2m`、`device`、`management` のいずれかです。作成時に必須で、その後は変更できません。 |
| `party` | string | はい | `first_party` または `third_party` です。作成時に必須です。変更できるのは `first_party` から `third_party` への一方向のみです。 |
| `owner_org_id` | string or null | いいえ | 所有組織の `org_…` ID です。`m2m` アプリケーションのみに使用できます。変更できません。 |
| `status` | string | いいえ | `active` または `suspended` です。停止中のアプリケーションは新しいトークンを取得できません。 |
| `allowed_web_origins` | string[] | いいえ | 許可する CORS オリジン（`https://host[:port]`）です。最大 20 件で、ワイルドカードは使用できません。 |
| `organization_usage` | string | いいえ | `deny`、`allow`、`require` のいずれかです。`organization` 認可パラメータ（`org_…` ID または組織のスラッグ）を制御します。`deny` は拒否し、`allow` は任意、`require` は必須にします。トークンに `org_id` が含まれるのは、ユーザーのメンバーシップが検証された後のみです。 |
| `org_access_mode` | string | いいえ | 組織サインインのアクセスモードです。`all_organizations`（デフォルト。すべての組織のすべてのメンバー）、`enabled_organizations`（アプリケーションが有効な組織のみ）、`assigned_only`（さらに割り当て済みのメンバーシップまたはディレクトリグループのみ）から選択します。詳しくは [組織アプリケーション](../organization-applications/get.md) を参照してください。 |
| `registration_mode` | string or null | いいえ | `open`、`invite_only`、`closed` のいずれかです。空の場合は環境の設定を継承します。 |
| `registration_source` | string | いいえ | 作成時は `dashboard` または `management_api` です（デフォルトは `management_api`）。変更できません。レスポンスには `dcr` または `cimd` も表示される場合があります。 |
| `verification_status` | string | いいえ | `verified` または `unverified` です。 |
| `security_profile` | string | いいえ | `baseline`（現時点で設定可能な唯一のプロファイル）です。 |
| `token_endpoint_auth_method` | string | いいえ | `private_key_jwt`、`client_secret_basic`、`client_secret_post`、`none` のいずれかです。`app_type` で許可されている必要があります。 |
| `grant_types` | string[] | いいえ | 許可するグラントタイプです。`app_type` が許可する範囲の部分集合である必要があります。 |
| `default_api_id` | string or null | いいえ | リクエストに `resource` がない場合に使用する API の `api_…` ID です。 |
| `require_par` | boolean | いいえ | プッシュ型認可リクエストを必須にします。 |
| `require_state` | boolean | いいえ | `state` を必須にします。 |
| `require_nonce` | boolean | いいえ | `nonce` を必須にします。 |
| `pkce_required` | boolean | いいえ | PKCE を必須にします。無効にできるのは、機密クライアントの Web アプリケーションのみです。PKCE がない場合、認可コードインジェクションに対する防御は `nonce` だけになるため、開発環境以外では `require_nonce` を有効のままにしてください（無効にすると `/require_nonce` で `validation_failed` になります）。 |
| `skip_consent` | boolean | いいえ | 同意画面をスキップします。ファーストパーティのアプリケーションのみ対象です。 |
| `token_binding_policy` | string | いいえ | `none` または `dpop_required` です。 |
| `login_host` | string or null | いいえ | 環境のログインホストのいずれか（小文字の DNS 名）です。 |
| `default_max_age_s` | integer or null | いいえ | デフォルトの `max_age`（秒）です。 |
| `min_acr` | string or null | いいえ | 最小認証保証レベルです。`urn:idp:acr:1fa`、`urn:idp:acr:mfa`、`urn:idp:acr:phr` のいずれかです。 |
| `access_token_lifetime_s` | integer or null | いいえ | アクセストークンの有効期間です。60〜86400 秒です。 |
| `refresh_idle_s` | integer or null | いいえ | リフレッシュトークンのアイドル有効期間（秒）です。`refresh_absolute_s` を超えることはできません。 |
| `refresh_absolute_s` | integer or null | いいえ | リフレッシュトークンの絶対有効期間（秒）です。 |
| `refresh_reuse_interval_s` | integer | いいえ | リフレッシュトークンの再利用可能期間です。0〜30 秒です（デフォルトは 5）。 |
| `backchannel_logout_uri` | string or null | いいえ | バックチャネルログアウトの URI です（`https`）。 |
| `frontchannel_logout_uri` | string or null | いいえ | フロントチャネルログアウトの URI です（`https`）。 |
| `frontchannel_logout_session_required` | boolean | いいえ | フロントチャネルログアウトの URI に `iss` と `sid` を追加します。環境のフロントチャネルログアウト設定が無効なときに `true` にすると 422 が返されます。デフォルトは `false` です。 |
| `initiate_login_uri` | string | いいえ | OIDC ログイン開始 URI（OpenID Connect Core 1.0 §4）です。IdP 起点の SAML サインイン後、ブラウザは `iss` を付けてこの URI に送られ、アプリケーションは `state` と PKCE を使って独自の認可コードフローを開始します。小文字の DNS ホストを持つ絶対 `https` URL で、フラグメントやユーザー情報を含めることはできず、2048 バイト以内である必要があります。`m2m` および `management` アプリケーションでは使用できません。この URI を持つアプリケーションのみ、IdP 起点の対象になれます。 |
| `id_token_org_claims` | boolean | いいえ | `true`（デフォルト）の場合、組織サインインの ID トークンに `org_id`、`org_slug`、`org_roles` が含まれます。`false` の場合、ID トークンに組織のクレームは含まれません。アクセストークンには影響せず、ID トークンに権限が含まれることはありません。 |
| `policy_uri` | string or null | いいえ | プライバシーポリシーの URI です（`https`）。同意画面に表示されます。 |
| `tos_uri` | string or null | いいえ |利用規約の URI です（`https`）。 |
| `client_uri` | string or null | いいえ | アプリケーションのホームページの URI です（`https`）。 |
| `jwks` | object or null | いいえ | インラインの JWK Set（`{"keys":[…]}`）です。公開鍵は 1〜5 件、最大 16 KiB です。秘密鍵のメンバーは拒否されます。`jwks_uri` と同時に指定できません。 |
| `jwks_uri` | string or null | いいえ | リモートの JWK Set の URI です（`https`）。`jwks` と同時に指定できません。 |
| `software_id` | string or null | いいえ | DCR アプリケーションのみ対象です。 |
| `software_version` | string or null | いいえ | DCR アプリケーションのみ対象です。 |
| `m2m_token_lifetime_s` | integer or null | いいえ | `m2m` アプリケーションのトークンの有効期間です。60〜86400 秒です。 |
| `redirect_uris` | string[] | いいえ | 許可するリダイレクト URI です。最大 50 件で、`m2m` および `management` では空である必要があります。 |
| `post_logout_redirect_uris` | string[] | いいえ | 許可するログアウト後リダイレクト URI です。最大 50 件です。 |
| `connection_ids` | string[] | いいえ | アプリケーションで有効な接続（`conn_…`）です。順序付きで、この順序がボタンの表示順になります。最大 100 件です。 |
| `allowed_first_factors` | string[] | いいえ | アプリケーションで許可する第 1 要素です。`password`、`passkey`、`email_otp`、`magic_link`、`sms_otp`、`social`、`enterprise` から選択し、重複は不可です。この順序で返されます。空リスト（デフォルト）の場合、アプリケーションによる制限はありません。この集合は環境の `allowed_first_factors` と共通部分を取ります。残る方式がない場合は `422 policy_conflict` になります。 |
| `allowed_response_modes` | string[] | いいえ | 認可リクエストおよびプッシュ型認可リクエストで使用できる `response_mode` の値です。`query`、`form_post` のいずれか一方または両方を指定し、重複は不可です。この順序で返されます。デフォルトは `["query"]` です。フォームポストで認可レスポンスを受け取るアプリケーションは、`form_post` を明示的に追加してください。リストにない `response_mode` の認可リクエストは拒否されます。`response_mode` を省略したリクエストは `query` を使用します。空のリストを指定すると 422 が返されます。JARM モード（`jwt`、`query.jwt`、`fragment.jwt`、`form_post.jwt`）は未対応です。動的クライアント登録またはクライアント ID メタデータドキュメントで登録されたアプリケーションは `["query"]` になります。 |

## レスポンス

アプリケーションと `ETag` ヘッダーを含む `201 Created` を返します。

```json
{
  "id": "app_6f8d0cjgbmf0gtn2rg6pscp3cg",
  "client_id": "app_6f8d0cjgbmf0gtn2rg6pscp3cg",
  "version": 1,
  "created_at": "2026-10-05T10:00:01Z",
  "updated_at": "2026-10-05T10:00:01Z",
  "key": "portal",
  "name": "Portal",
  "app_type": "web",
  "party": "first_party",
  "status": "active",
  "redirect_uris": ["https://portal.example.com/cb"],
  "...": "all other fields from the field reference"
}
```

## エラー

| HTTP | `code` | 発生条件 |
|---|---|---|
| 401 | `unauthenticated` | キーがない、無効、または取り消されています。 |
| 403 | `insufficient_permissions` | キーに必要な権限がありません。 |
| 409 | `conflict` | この `key` のアプリケーションはすでに存在します。 |
| 422 | `validation_failed` | フィールドが無効です。`errors[].pointer` が該当箇所を示します（例: `/redirect_uris/0`）。 |
| 422 | `policy_conflict` | `allowed_first_factors` に、環境の第 1 要素の集合と共通する方式がありません。 |
| 400 | `unknown_field` | 本文にスキーマに含まれないフィールドがあります。 |
| 403 | `quota_exceeded` | アプリケーションのプラン上限に達しています。 |

## 例

```bash
curl -X POST https://api.eu.keenauth.com/v1/applications \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY" \
  -H "Content-Type: application/json" \
  -d '{"key":"portal","name":"Portal","app_type":"web","party":"first_party","redirect_uris":["https://portal.example.com/cb"]}'
```

## レスポンスフィールド

`id` と `client_id` はアプリケーション ID（`app_…`）です。`version` は `ETag` としても返されます。`created_at`、`updated_at`、`last_token_issued_at`、`last_token_asn` は読み取り専用です。上記の書き込み可能なフィールドはすべて返されます。クライアントシークレットはこのリソースに含まれません。
