Anwendung erstellen
POST /v1/applications · Berechtigung applications:write
Erstellt eine Anwendung (einen OAuth/OIDC-Client) in der Umgebung des aufrufenden Schlüssels. key, name, app_type und party sind erforderlich; jedes andere Feld erhält einen sicheren Standardwert, der vom Anwendungstyp abgeleitet wird. Die Antwort enthält einen ETag, den Sie beim Aktualisieren oder Löschen als If-Match senden. Dieser Vorgang erstellt kein Client-Secret; Secrets und Schlüssel werden über die Endpunkte für Anwendungsanmeldedaten verwaltet.
Anfrage
Body (application/json). Unbekannte Felder werden abgelehnt. Nur key, name, app_type und party sind erforderlich.
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
key |
string | ja | Stabiler Konfigurationsschlüssel, ^[a-z0-9_-]{1,64}$, pro Umgebung eindeutig. Beim Erstellen erforderlich; danach nicht änderbar. |
name |
string | ja | Anzeigename, 1–100 Zeichen. |
app_type |
string | ja | web, spa, native, m2m, device oder management. Beim Erstellen erforderlich; danach nicht änderbar. |
party |
string | ja | first_party oder third_party. Beim Erstellen erforderlich; kann nur von first_party zu third_party geändert werden. |
owner_org_id |
string or null | nein | org_…-ID der besitzenden Organisation; nur für m2m-Anwendungen; nicht änderbar. |
status |
string | nein | active oder suspended. Eine gesperrte Anwendung kann keine neuen Tokens erhalten. |
allowed_web_origins |
string[] | nein | Erlaubte CORS-Ursprünge (https://host[:port]), höchstens 20, keine Wildcards. |
organization_usage |
string | nein | deny, allow oder require. Steuert den Autorisierungsparameter organization (eine org_…-ID oder der Slug der Organisation): deny lehnt ihn ab, allow macht ihn optional, require macht ihn verpflichtend. Das Token enthält org_id erst, nachdem die Mitgliedschaft des Benutzers geprüft wurde. |
org_access_mode |
string | nein | Zugriffsmodus für die Anmeldung über Organisationen: all_organizations (Standard; jedes Mitglied jeder Organisation), enabled_organizations (nur Organisationen, in denen die Anwendung aktiviert ist) oder assigned_only (zusätzlich nur zugewiesene Mitgliedschaften oder Verzeichnisgruppen). Siehe Organisationsanwendungen. |
registration_mode |
string or null | nein | open, invite_only oder closed; leer übernimmt die Einstellung der Umgebung. |
registration_source |
string | nein | dashboard oder management_api beim Erstellen (Standard management_api); nicht änderbar. Antworten können auch dcr oder cimd anzeigen. |
verification_status |
string | nein | verified oder unverified. |
security_profile |
string | nein | baseline (derzeit das einzige beschreibbare Profil). |
token_endpoint_auth_method |
string | nein | private_key_jwt, client_secret_basic, client_secret_post oder none; muss für den app_type erlaubt sein. |
grant_types |
string[] | nein | Erlaubte Grant-Typen; eine Teilmenge dessen, was der app_type zulässt. |
default_api_id |
string or null | nein | api_…-ID der API, die verwendet wird, wenn eine Anfrage kein resource enthält. |
require_par |
boolean | nein | Verlangt Pushed Authorization Requests. |
require_state |
boolean | nein | Verlangt state. |
require_nonce |
boolean | nein | Verlangt nonce. |
pkce_required |
boolean | nein | Verlangt PKCE; kann nur für eine vertrauliche Webanwendung deaktiviert werden. Ohne PKCE ist nonce die einzige Verteidigung gegen Authorization-Code-Injection, daher muss require_nonce außerhalb von Entwicklungsumgebungen aktiviert bleiben (andernfalls validation_failed auf /require_nonce). |
skip_consent |
boolean | nein | Überspringt den Zustimmungsbildschirm; nur für Erstanbieter-Anwendungen. |
token_binding_policy |
string | nein | none oder dpop_required. |
login_host |
string or null | nein | Einer der Login-Hosts der Umgebung (DNS-Name in Kleinbuchstaben). |
default_max_age_s |
integer or null | nein | Standardwert für max_age in Sekunden. |
min_acr |
string or null | nein | Mindestens erforderliche Authentifizierungssicherheit: urn:idp:acr:1fa, urn:idp:acr:mfa oder urn:idp:acr:phr. |
access_token_lifetime_s |
integer or null | nein | Gültigkeitsdauer des Access-Tokens, 60–86400 Sekunden. |
refresh_idle_s |
integer or null | nein | Inaktivitätsdauer des Refresh-Tokens in Sekunden; nicht größer als refresh_absolute_s. |
refresh_absolute_s |
integer or null | nein | Absolute Gültigkeitsdauer des Refresh-Tokens in Sekunden. |
refresh_reuse_interval_s |
integer | nein | Wiederverwendungsfenster für Refresh-Tokens, 0–30 Sekunden (Standard 5). |
backchannel_logout_uri |
string or null | nein | URI für den Backchannel-Logout (https). |
frontchannel_logout_uri |
string or null | nein | URI für den Frontchannel-Logout (https). |
frontchannel_logout_session_required |
boolean | nein | Fügt iss und sid zur URI für den Frontchannel-Logout hinzu. Wird true gesetzt, während die Frontchannel-Logout-Einstellung der Umgebung deaktiviert ist, wird 422 zurückgegeben. Standard false. |
initiate_login_uri |
string | nein | URI für die OIDC-Login-Initiierung (OpenID Connect Core 1.0 §4): Nach einer vom Identitätsanbieter initiierten SAML-Anmeldung wird der Browser an diese URI mit iss weitergeleitet, und die Anwendung startet ihren eigenen Authorization-Code-Flow mit state und PKCE. Absolute https-URL mit einem DNS-Host in Kleinbuchstaben, ohne Fragment oder Benutzerinformationen, höchstens 2048 Byte; nicht erlaubt für m2m- und management-Anwendungen. Nur eine Anwendung mit dieser URI kann Ziel einer vom Identitätsanbieter initiierten Anmeldung sein. |
id_token_org_claims |
boolean | nein | Bei true (Standard) enthält das ID-Token einer Organisationsanmeldung org_id, org_slug und org_roles; bei false enthält das ID-Token keine Organisations-Claims. Access-Tokens sind nicht betroffen, und ID-Tokens enthalten niemals Berechtigungen. |
policy_uri |
string or null | nein | URI der Datenschutzrichtlinie (https), die auf dem Zustimmungsbildschirm angezeigt wird. |
tos_uri |
string or null | nein | URI der Nutzungsbedingungen (https). |
client_uri |
string or null | nein | URI der Startseite der Anwendung (https). |
jwks |
object or null | nein | Eingebettetes JWK-Set ({"keys":[…]}): 1–5 öffentliche Schlüssel, höchstens 16 KiB; Member privater Schlüssel werden abgelehnt. Schließt jwks_uri gegenseitig aus. |
jwks_uri |
string or null | nein | URI eines entfernten JWK-Sets (https); schließt jwks gegenseitig aus. |
software_id |
string or null | nein | Nur für DCR-Anwendungen. |
software_version |
string or null | nein | Nur für DCR-Anwendungen. |
m2m_token_lifetime_s |
integer or null | nein | Gültigkeitsdauer des Tokens für m2m-Anwendungen, 60–86400 Sekunden. |
redirect_uris |
string[] | nein | Erlaubte Redirect-URIs, höchstens 50; muss für m2m und management leer sein. |
post_logout_redirect_uris |
string[] | nein | Erlaubte Redirect-URIs nach dem Abmelden, höchstens 50. |
connection_ids |
string[] | nein | Auf der Anwendung aktivierte Verbindungen (conn_…), geordnet; die Reihenfolge bestimmt die Reihenfolge der Schaltflächen. Höchstens 100. |
allowed_first_factors |
string[] | nein | Auf der Anwendung erlaubte Erstfaktoren: Werte aus password, passkey, email_otp, magic_link, sms_otp, social, enterprise, ohne Duplikate; werden in dieser Reihenfolge zurückgegeben. Eine leere Liste (Standard) bedeutet, dass die Anwendung keine Einschränkung hinzufügt. Die Menge wird mit den allowed_first_factors der Umgebung geschnitten; bleibt keine Methode übrig, 422 policy_conflict. |
allowed_response_modes |
string[] | nein | Die response_mode-Werte, die die Anwendung in Autorisierungs- und Pushed-Authorization-Anfragen verwenden darf: query, form_post (eines oder beide, ohne Duplikate); werden in dieser Reihenfolge zurückgegeben. Standard ["query"]: Eine Anwendung, die die Autorisierungsantwort per Form-Post erhält, fügt form_post explizit hinzu. Eine Autorisierungsanfrage, deren response_mode nicht in der Liste steht, wird abgelehnt; eine Anfrage ohne response_mode verwendet query. Eine leere Liste ergibt 422. JARM-Modi (jwt, query.jwt, fragment.jwt, form_post.jwt) werden noch nicht unterstützt. Anwendungen, die über dynamische Client-Registrierung oder ein Client-ID-Metadatendokument registriert wurden, erhalten ["query"]. |
Antwort
201 Created mit der Anwendung und einem ETag-Header.
{
"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"
}
Fehler
| HTTP | code |
Wann |
|---|---|---|
| 401 | unauthenticated |
Der Schlüssel fehlt, ist ungültig oder wurde widerrufen. |
| 403 | insufficient_permissions |
Dem Schlüssel fehlt die erforderliche Berechtigung. |
| 409 | conflict |
Eine Anwendung mit diesem key existiert bereits. |
| 422 | validation_failed |
Ein Feld ist ungültig; errors[].pointer benennt es (zum Beispiel /redirect_uris/0). |
| 422 | policy_conflict |
allowed_first_factors hat keine Methode gemeinsam mit den Erstfaktoren der Umgebung. |
| 400 | unknown_field |
Der Body enthält ein Feld, das nicht Teil des Schemas ist. |
| 403 | quota_exceeded |
Das Tariflimit für Anwendungen ist erreicht. |
Beispiel
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"]}'
Antwortfelder
id und client_id sind die Anwendungs-ID (app_…); version wird auch als ETag zurückgegeben; created_at, updated_at, last_token_issued_at und last_token_asn sind schreibgeschützt. Jedes beschreibbare Feld oben wird zurückgegeben. Client-Secrets sind niemals Teil dieser Ressource.