Aurea License Portal
Aurea License Integration
A public contract describing how Aurea on-premise environments obtain and verify signed license files for active Community and paid organizations.
Overview
What this integration does
Aurea License Portal provides a signed license file for an active Community or paid Aurea organization. An on-premise Aurea environment uses this file to determine which edition, primary limit and validity period apply to the organization.
The license file can be obtained in two equivalent ways: Aurea may download it through a read-only API by using a license download token, or an administrator may download the same file from the portal and upload or paste it into Aurea.
The license file is verified locally by Aurea. A temporary network issue does not invalidate an already downloaded and still valid license file.
Transparency
What data is exchanged
The license download API is intentionally narrow. It is used to retrieve the current signed license file for one organization.
| Direction | Data | Purpose |
|---|---|---|
| Aurea → License Portal | organizationId in the URL |
Identifies the licensed Aurea organization. |
| Aurea → License Portal | Authorization: Bearer ldt_... |
Authenticates license download for that organization only. |
| License Portal → Aurea | Signed JSON license file | Provides edition, validity, environment type and entitlements (Community: users.active=5). |
Diagnostic and telemetry data
The license download endpoint described here returns a license file. Aurea may also exchange limited diagnostic data required to confirm license compliance, such as environment type, active user count or usage counters relevant to licensed limits.
Broader product telemetry is optional and intended to be based on customer consent. It should be limited to technical or statistical information and should not include business documents, form contents, process payloads or other customer business data.
The license format, API description and JSON Schema are public by design. Security depends on the license download token and on the private signing key, not on hiding the file format.
Concepts
Core license model
- Account
- Customer account in Aurea License Portal. It groups subscriptions, licensed organizations and portal users.
- Organization
-
Licensed tenant in Aurea, identified by
organizationId. The license is assigned to an organization, not to a VM, installation or workspace. - License
- Commercial and technical grant for one organization. It defines the edition, validity period and entitlements.
- License file
- Signed JSON document issued by Aurea License Portal and verified locally by Aurea.
- License download token
-
Secret token used only to download the license file for one organization. It starts
with
ldt_, is shown only once, and is stored by the portal only as a hash and fingerprint. - Environment type
-
One of
production,staging,testordevelopment. Aurea verifies that the license matches the current organization environment.
API contract
License retrieval endpoint
This endpoint returns the current signed license file for one active Community or paid organization. It does not grant access to account management, billing, users, subscriptions or other portal APIs.
Request
GET /api/v1/organizations/{organizationId}/license
Authorization: Bearer <license-download-token>
Accept: application/json
Example
curl -fsS \
-H "Authorization: Bearer ldt_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Accept: application/json" \
"https://license.aurea.software/api/v1/organizations/org_01k2n7pmv9y4z6c5r8f2wq3hda/license" \
-o aurea-license.json
| Status | Meaning | Recommended Aurea behavior |
|---|---|---|
200 |
Signed license file returned. | Verify the file locally and store it as the latest valid license. |
401 |
Missing, malformed or invalid license download token. | Report configuration/token error to the administrator. |
404 |
Organization not found or token does not belong to this organization. | Check the configured organizationId and token pairing. |
409 |
The organization is inactive or its paid grant is not currently issuable. Active Community returns 200. | Keep using the last valid local license if it is still within validity or grace period. |
License file
Signed JSON format
The top-level document contains payload and signature.
The payload contains license data. The signature proves that the payload was issued
by Aurea License Portal.
{
"payload": {
"schemaVersion": 1,
"licenseRevision": 1,
"licenseId": "lic_550e8400e29b41d4a716446655440000",
"licenseType": "subscription",
"edition": "standard",
"account": {
"accountId": "acct_550e8400e29b41d4a716446655440001",
"name": "Tecna Sp. z o.o."
},
"organization": {
"organizationId": "org_01k2n7pmv9y4z6c5r8f2wq3hda",
"name": "Tecna",
"environmentType": "production"
},
"validity": {
"issuedAt": "2026-06-15T12:00:00Z",
"validFrom": "2026-06-15T12:00:00Z",
"validUntil": "2026-07-17T12:00:00Z",
"graceUntil": "2026-07-31T12:00:00Z"
},
"entitlements": [
{
"code": "users.active",
"value": 50
}
]
},
"signature": {
"algorithm": "Ed25519",
"canonicalization": "jcs-rfc8785",
"keyId": "aurea-license-signing-2026-01",
"value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
}
}
Important payload fields
licenseIdislic_plus 32 lowercase hexadecimal UUID characters.licenseRevisionstarts at 1 and increases per organization whenever the effective license data changes. It is part of the signed payload.licenseTypeissubscription,perpetual, orcommunity.editiondescribes functional scope:coreorstandard.account.accountIdisacct_plus 32 lowercase hexadecimal UUID characters.organization.organizationIdbinds the license to one Aurea organization.- Organization is always required; its ID is
org_plus a lowercase Crockford ULID. organization.environmentTypebinds the license to one environment type.entitlementscontains exactly one primary limit. Community requiresusers.active=5.- Active Community organizations receive a signed Community License File:
licenseType=community,edition=standard. Community is a license type, not an edition or perpetual license: Standard edition, up to 5 active users, no expiration. - Community validity contains only
issuedAtandvalidFrom=issuedAt:NOT_YET_VALIDwhennow < validFrom, andVALIDwhennow >= validFrom. No expiry or grace applies.
The Community License File confirms/registers Community in License Portal. The future consumer will also use Community as a fallback without a registered License File; a missing downloaded file does not mean Community is unavailable. This fallback is the consumer's responsibility, not implemented in Portal.
Signature fields
algorithm:Ed25519.canonicalization:jcs-rfc8785.keyId: identifier of the signing key.value: Ed25519 signature over canonical payload bytes.
Verification
How Aurea verifies the license
Aurea verifies the license file before trusting any payload field.
Verification rules
- Parse the JSON document.
- Read
payloadandsignature. - Verify supported
schemaVersion. - Verify
signature.algorithmandsignature.canonicalization. - Canonicalize
payloadusing JCS / RFC 8785. - Verify the Ed25519 signature over canonical payload bytes.
- Verify
organizationIdandenvironmentType. - Verify validity period and apply entitlements.
Pseudo-code
document = parseJson(licenseFile)
payload = document.payload
signature = document.signature
require(payload.schemaVersion == 1)
require(payload.licenseRevision >= 1)
require(signature.algorithm == "Ed25519")
require(signature.canonicalization == "jcs-rfc8785")
canonicalPayload = canonicalizeJcs(payload)
require(verifyEd25519(
publicKey(signature.keyId),
canonicalPayload,
base64urlDecode(signature.value)
))
require(payload.organization.organizationId == currentOrganizationId)
require(payload.organization.environmentType == currentEnvironmentType)
require(now >= payload.validity.validFrom)
if (payload.licenseType == "subscription") {
require(now < payload.validity.graceUntil)
}
applyEntitlements(payload.entitlements)
The signature covers only the payload object. It does not cover the top-level
wrapper or the signature object itself.
Repeated successful downloads of unchanged license data return the exact same signed file, including its revision, license ID and issue time. A change issues a new revision; returning to earlier license data still creates a higher revision.
Canonical JSON
Signature input
Before signing and verifying, the payload object is canonicalized using
JCS / RFC 8785. This makes the signature independent of whitespace, pretty-printing
and JSON object field order.
For schema version 1, the payload uses only JSON types safe for canonicalization: object, array, string and integer values. Floating point numbers are not used in the license payload.
Validity
Validity and offline behavior
| Field | Meaning |
|---|---|
issuedAt |
Timestamp when the license file was issued by License Portal. |
validFrom |
Timestamp from which the license file is valid. |
validUntil |
End of the normal subscription validity period. Omitted for perpetual and Community licenses. |
graceUntil |
End of the subscription grace period. Omitted for perpetual and Community licenses. |
Subscription validity contains all four fields above. Perpetual and Community validity contain only
issuedAt and validFrom.
Subscription: before validFrom is NOT_YET_VALID; from validFrom
(inclusive) to validUntil (exclusive) is VALID; from validUntil
(inclusive) to graceUntil (exclusive) is GRACE; at or after
graceUntil is EXPIRED. Perpetual and Community: before validFrom is
NOT_YET_VALID, and at or after validFrom is VALID.
Aurea should keep the last successfully verified license file locally. A temporary API error should not remove or invalidate a local license file that is still within its validity or grace period.
Entitlements
Primary limits
For paid licenses, the entitlements array contains exactly one object with only a code and
positive integer value. Aurea evaluates it locally after signature and validity checks pass.
| Edition | License type | Primary entitlement |
|---|---|---|
core |
subscription |
users.active |
standard |
subscription or perpetual |
users.active, business_processes.active, or compute.cores |
standard |
community |
Exactly users.active = 5 |
{
"code": "compute.cores",
"value": 16
}
compute.cores is the maximum CPU or vCPU allocated to the entire running Aurea
environment. If multiple valid Processor files are loaded in one environment, the effective
limit is the maximum compute.cores value, not their sum. Values 32, 32, and 32
produce an effective limit of 32; values 16 and 32 also produce 32. Each file remains
organization-scoped.
Resources
Machine-readable contract
These files are provided for implementation, integration testing and security review.