An app can issue tokens without a plan, but the token will not include the
limits claim. If the app is assigned a retired plan, token issuance is
blocked. All limits are expressed in Document Units.What An App Represents
Each app is an isolated machine identity under a tenant.- it has its own
client_idandclient_secret - it is tied to one license region at creation time
- it stores the region-backed
DbCodeused during token issuance - it can be enabled or disabled independently
- it can optionally have a plan assigned later
Creation Workflow
When you create an app in the dashboard, the backend creates a confidential OpenIddict client for the current tenant.Choose A Region
Select a valid license region. The backend validates that the region exists,
is active, and has an active region database available.
Add Optional URLs
Redirect and post-logout URLs are optional. If supplied, they must be valid
absolute URIs.
What Gets Stored On The App
In addition to the OpenIddict client record, the app stores tenant-specific metadata used later during token issuance.client_idclient_secretLicenseRegionIdDbCodeAllowedDomain1,AllowedDomain2,AllowedDomain3- enabled or disabled state
- optional
PlanId
Allowed Domain Rules
Allowed domains are normalized and validated before they are saved.http://andhttps://are stripped- trailing
/is removed - wildcards are rejected
localhostis allowed, includinglocalhost:<port>- duplicate domains are rejected
- ports must be in the valid range
https://app.example.com/becomesapp.example.comhttp://localhost:3000/becomeslocalhost:3000
Accessing Credentials Later
The dashboard continues to expose app metadata after creation.client_idremains available- plaintext
client_secretis shown once at creation time - if you regenerate the secret, the new plaintext secret is shown once for that regeneration event
Regenerating The Secret
If a secret is lost or exposed, regenerate it from the dashboard.- a new plaintext
client_secretis generated - the old secret stops working immediately
- every service using the old secret must be updated

