Créer une application
POST /v1/applications · autorisation applications:write
Crée une application (un client OAuth/OIDC) dans l'environnement de la clé appelante. key, name, app_type et party sont obligatoires ; chaque autre champ reçoit une valeur par défaut sûre dérivée du type d'application. La réponse contient un en-tête ETag que vous envoyez comme If-Match lors de la mise à jour ou de la suppression. Cette opération ne crée pas de secret client ; les secrets et les clés sont gérés via les points de terminaison d'identifiants de l'application.
Requête
Corps (application/json). Les champs inconnus sont rejetés. Seuls key, name, app_type et party sont obligatoires.
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
key |
string | oui | Clé de configuration stable, ^[a-z0-9_-]{1,64}$, unique par environnement. Obligatoire à la création ; ne peut pas être modifiée ensuite. |
name |
string | oui | Nom d'affichage, 1 à 100 caractères. |
app_type |
string | oui | web, spa, native, m2m, device ou management. Obligatoire à la création ; ne peut pas être modifié ensuite. |
party |
string | oui | first_party ou third_party. Obligatoire à la création ; ne peut passer que de first_party à third_party. |
owner_org_id |
string or null | non | Identifiant org_… de l'organisation propriétaire ; uniquement pour les applications m2m ; ne peut pas être modifié. |
status |
string | non | active ou suspended. Une application suspendue ne peut pas obtenir de nouveaux jetons. |
allowed_web_origins |
string[] | non | Origines CORS autorisées (https://host[:port]), 20 au maximum, sans caractères génériques. |
organization_usage |
string | non | deny, allow ou require. Régit le paramètre d'autorisation organization (un identifiant org_… ou le slug de l'organisation) : deny le refuse, allow le rend facultatif, require le rend obligatoire. Le jeton ne contient org_id qu'après vérification de l'appartenance de l'utilisateur. |
org_access_mode |
string | non | Accès à la connexion par organisation : all_organizations (par défaut ; chaque membre de chaque organisation), enabled_organizations (uniquement les organisations où l'application est activée) ou assigned_only (en plus, uniquement les appartenances attribuées ou les groupes d'annuaire). Voir applications d'organisation. |
registration_mode |
string or null | non | open, invite_only ou closed ; vide, hérite du paramètre de l'environnement. |
registration_source |
string | non | dashboard ou management_api à la création (par défaut management_api) ; ne peut pas être modifié. Les réponses peuvent aussi afficher dcr ou cimd. |
verification_status |
string | non | verified ou unverified. |
security_profile |
string | non | baseline (le seul profil modifiable actuellement). |
token_endpoint_auth_method |
string | non | private_key_jwt, client_secret_basic, client_secret_post ou none ; doit être autorisé pour le app_type. |
grant_types |
string[] | non | Types de octroi autorisés ; sous-ensemble de ce que le app_type permet. |
default_api_id |
string or null | non | Identifiant api_… de l'API utilisée lorsqu'une requête n'a pas de resource. |
require_par |
boolean | non | Exige des requêtes d'autorisation poussées (PAR). |
require_state |
boolean | non | Exige state. |
require_nonce |
boolean | non | Exige nonce. |
pkce_required |
boolean | non | Exige PKCE ; ne peut être désactivé que pour une application web confidentielle. Sans PKCE, nonce est la seule défense contre l'injection de code d'autorisation, donc require_nonce doit rester activé hors environnements de développement (sinon validation_failed sur /require_nonce). |
skip_consent |
boolean | non | Ignore l'écran de consentement ; applications de première partie uniquement. |
token_binding_policy |
string | non | none ou dpop_required. |
login_host |
string or null | non | L'un des hôtes de connexion de l'environnement (nom DNS en minuscules). |
default_max_age_s |
integer or null | non | max_age par défaut, en secondes. |
min_acr |
string or null | non | Niveau minimal d'assurance d'authentification : urn:idp:acr:1fa, urn:idp:acr:mfa ou urn:idp:acr:phr. |
access_token_lifetime_s |
integer or null | non | Durée de vie du jeton d'accès, 60 à 86400 secondes. |
refresh_idle_s |
integer or null | non | Durée d'inactivité du jeton de rafraîchissement, en secondes ; ne doit pas dépasser refresh_absolute_s. |
refresh_absolute_s |
integer or null | non | Durée de vie absolue du jeton de rafraîchissement, en secondes. |
refresh_reuse_interval_s |
integer | non | Fenêtre de réutilisation du jeton de rafraîchissement, 0 à 30 secondes (par défaut 5). |
backchannel_logout_uri |
string or null | non | URI de déconnexion back-channel (https). |
frontchannel_logout_uri |
string or null | non | URI de déconnexion front-channel (https). |
frontchannel_logout_session_required |
boolean | non | Ajoute iss et sid à l'URI de déconnexion front-channel. Le définir à true alors que le paramètre de déconnexion front-channel de l'environnement est désactivé renvoie 422. Par défaut false. |
initiate_login_uri |
string | non | URI d'initiation de connexion OIDC (OpenID Connect Core 1.0 §4) : après une connexion SAML initiée par le IdP, le navigateur y est redirigé avec iss, et l'application démarre son propre flux de code d'autorisation avec state et PKCE. URL https absolue avec un hôte DNS en minuscules, sans fragment ni informations utilisateur, 2048 octets au maximum ; non autorisée pour les applications m2m et management. Seule une application avec cet URI peut être une cible initiée par le IdP. |
id_token_org_claims |
boolean | non | Lorsqu'elle vaut true (par défaut), le jeton ID d'une connexion par organisation contient org_id, org_slug et org_roles ; lorsqu'elle vaut false, le jeton ID ne contient aucune revendication d'organisation. Les jetons d'accès ne sont pas affectés, et les jetons ID ne contiennent jamais d'autorisations. |
policy_uri |
string or null | non | URI de la politique de confidentialité (https), affichée sur l'écran de consentement. |
tos_uri |
string or null | non | URI des conditions d'utilisation (https). |
client_uri |
string or null | non | URI de la page d'accueil de l'application (https). |
jwks |
object or null | non | Ensemble de JWK intégré ({"keys":[…]}) : 1 à 5 clés publiques, 16 Kio au maximum ; les membres de clé privée sont rejetés. Mutuellement exclusif avec jwks_uri. |
jwks_uri |
string or null | non | URI d'un ensemble de JWK distant (https) ; mutuellement exclusif avec jwks. |
software_id |
string or null | non | Applications DCR uniquement. |
software_version |
string or null | non | Applications DCR uniquement. |
m2m_token_lifetime_s |
integer or null | non | Durée de vie des jetons pour les applications m2m, 60 à 86400 secondes. |
redirect_uris |
string[] | non | URI de redirection autorisées, 50 au maximum ; doit être vide pour m2m et management. |
post_logout_redirect_uris |
string[] | non | URI de redirection après déconnexion autorisées, 50 au maximum. |
connection_ids |
string[] | non | Connexions activées sur l'application (conn_…), ordonnées ; l'ordre correspond à l'ordre des boutons. 100 au maximum. |
allowed_first_factors |
string[] | non | Premiers facteurs autorisés sur l'application : valeurs parmi password, passkey, email_otp, magic_link, sms_otp, social, enterprise, sans doublons ; renvoyés dans cet ordre. Une liste vide (par défaut) signifie que l'application n'ajoute aucune restriction. L'ensemble est intersecté avec les allowed_first_factors de l'environnement ; si aucune méthode ne subsiste, 422 policy_conflict. |
allowed_response_modes |
string[] | non | Valeurs de response_mode que l'application peut utiliser dans les requêtes d'autorisation et les requêtes d'autorisation poussées : query, form_post (un ou les deux, sans doublons) ; renvoyées dans cet ordre. Par défaut ["query"] : une application qui reçoit la réponse d'autorisation par form post ajoute explicitement form_post. Une requête d'autorisation dont le response_mode ne figure pas dans la liste est rejetée ; une requête sans response_mode utilise query. Une liste vide renvoie 422. Les modes JARM (jwt, query.jwt, fragment.jwt, form_post.jwt) ne sont pas encore pris en charge. Les applications enregistrées par inscription dynamique de client ou par un document de métadonnées d'identifiant client reçoivent ["query"]. |
Réponse
201 Created avec l'application et un en-tête ETag.
{
"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"
}
Erreurs
| HTTP | code |
Quand |
|---|---|---|
| 401 | unauthenticated |
La clé est absente, invalide ou révoquée. |
| 403 | insufficient_permissions |
La clé ne dispose pas de l'autorisation requise. |
| 409 | conflict |
Une application avec cette key existe déjà. |
| 422 | validation_failed |
Un champ est invalide ; errors[].pointer le désigne (par exemple /redirect_uris/0). |
| 422 | policy_conflict |
allowed_first_factors ne contient aucune méthode en commun avec l'ensemble des premiers facteurs de l'environnement. |
| 400 | unknown_field |
Le corps contient un champ qui ne fait pas partie du schéma. |
| 403 | quota_exceeded |
La limite du forfait pour les applications est atteinte. |
Exemple
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"]}'
Champs de la réponse
id et client_id correspondent à l'identifiant de l'application (app_…) ; version est également renvoyé comme ETag ; created_at, updated_at, last_token_issued_at et last_token_asn sont en lecture seule. Chaque champ modifiable ci-dessus est renvoyé. Les secrets client ne font jamais partie de cette ressource.