Superseded terms, newest first
const url = 'https://app.dycrypt.com/o/acme/api/licenses/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/versions';const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url https://app.dycrypt.com/o/acme/api/licenses/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/versions \ --header 'Authorization: Bearer <token>'The current term is excluded. A superseded term stays a live artifact until its own expiry, which is why it is kept and can still be downloaded.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”The licence id — a UUID, and the lid claim in the signed payload. It survives renewal.
Responses
Section titled “Responses”Past terms.
A superseded term. Still a live artifact until its own expiry, which is why it is kept.
object
Examplegenerated
[ { "versionNo": 1, "issuedAt": "2026-04-15T12:00:00Z", "startsAt": "2026-04-15T12:00:00Z", "expiresAt": "2026-04-15T12:00:00Z", "graceDays": 1, "issuedBy": "example", "revokedReason": "example" }]No credential, or one that no longer resolves — revoked, expired, deleted. Replace it.
Every failure in this API has this shape and no other.
object
Example
{ "error": "this token does not have licenses:write"}Authenticated, but not allowed: a missing scope, a read-only role, a plan limit reached, or a credential used under another organisation’s slug. The right credential doing something it may not do.
Every failure in this API has this shape and no other.
object
Example
{ "error": "this token does not have licenses:write"}No such record, or no such endpoint.
Every failure in this API has this shape and no other.
object
Example
{ "error": "this token does not have licenses:write"}