Scroll
EvoraDocs
Get started
C++ SDK
REST API
Manage
Endpoint reference
All endpoints
GETPlan quota and current usage
GETList applicationsPOSTCreate an applicationGETGet an applicationPUTUpdate an applicationDELETEDelete an application
GETApplication statisticsGETExtended overviewGETLogin activity by dayGETUser growth over timeGETLicense status breakdownGETSession trends
GETList licensesPOSTGenerate licensesGETGet a licensePUTUpdate a licenseDELETEDelete a licensePOSTBan a licensePOSTUnban a licensePOSTReset a license HWIDPOSTFreeze a licensePOSTResume a frozen licensePOSTAdjust license expiry by a signed deltaPOSTBulk license actions
GETLook up a customer by usernameGETList customersPOSTCreate a customerGETGet a customerPUTUpdate a customerDELETEDelete a customerPOSTMint a password-reset tokenPOSTConsume a reset token and set the new passwordPOSTBan a customerPOSTUnban a customerPOSTReset a customer's HWIDGETRead a customer's two-factor stateDELETEReset a customer's two-factor authenticationPOSTReset a customer's device bindingPOSTMint a one-time SDK login token (panel SSO)POSTRedeem a license key on a customer's behalfPOSTBulk customer actions
POSTAuthenticate a customer by license keyPOSTAuthenticate a customer by username and password
GETList a customer's subscriptionsPOSTGrant a subscription directlyDELETERemove a subscriptionPOSTFreeze a subscriptionPOSTResume a frozen subscriptionPOSTExtend a subscription by days
GETList tiersPOSTCreate a tierPUTUpdate a tierDELETEDelete a tier
GETList app variablesPOSTCreate or update a variableDELETEDelete all app variablesGETGet a variablePUTUpdate a variableDELETEDelete a variableGETList every user variable in the applicationGETList one customer's variablesPOSTSet a customer variableDELETEDelete all of a customer's variablesDELETEDelete a customer variable
GETList webhooksPOSTCreate a webhookGETGet a webhookPUTUpdate a webhookDELETEDelete a webhookPOSTFire a test deliveryGETRead the event stream (catch-up)
GETList blacklist entriesPOSTAdd a blacklist entryDELETERemove a blacklist entryGETList whitelist entriesPOSTAdd a whitelist entryDELETERemove a whitelist entry
GETList live sessionsDELETEKill a sessionPOSTKill every live session
GETList logsGETLog statistics
GETList sellersPOSTCreate a sellerGETGet a sellerPUTUpdate a sellerDELETEDelete a sellerPOSTAdd seller balance
GETList clientsPOSTCreate a clientPUTUpdate a clientDELETEDelete a clientGETList a client's application accessPOSTGrant application accessDELETERevoke application access
GETList entitlementsPOSTCreate an entitlementPUTUpdate an entitlementDELETEDelete an entitlementGETList entitlements attached to a tierPOSTAttach an entitlement to a tierGETResolve a customer's entitlements
GETList geo rulesPOSTAdd a geo ruleDELETERemove a geo rulePUTEnable or disable geo restrictions
GETList active leasesDELETERevoke a leaseGETSeat usage for a customer
Docs/API reference/Licenses

Adjust license expiry by a signed delta

POSThttps://api.evora.lol/api/developer-api/apps/{appId}/licenses/{licenseId}/expiry
Requires scopelicenses:write

Moves one license's expiry by deltaSeconds — positive to grant time, negative to take it back. {licenseId} accepts the printable license key as well as the UUID, so a settlement loop never has to resolve one first.

Written for time-wager features ("key gambling"), where a customer stakes minutes against your own game logic and your server settles the result. Prefer this over reading expires_at and writing it back with PUT /licenses/{licenseId}: the delta is applied inside a single statement, so two settlements landing at the same instant compose instead of one silently overwriting the other.

Behaviour worth knowing:

- Expiry floors at now — a loss bigger than the time remaining expires the key; it never rewinds into the past. - duration_seconds and banked remaining_seconds floor at 0. - A paused license keeps its expiry, and the delta is applied to its banked seconds instead. - A lifetime key (expires_at: null) is left untouched and returns lifetime: true — there is no expiry to move. - The redeemer's subscription moves in the same statement, so the SDK and your panel never disagree about when access ends.

Path parameters
appIdrequired
string (uuid)
Application UUID. App-scoped keys may only use their own application.
licenseIdrequired
string
License UUID. Ban, unban, pause, unpause, reset-hwid and expiry also accept the raw license key here.
Body
deltaSecondsrequired
integer
Seconds to add (positive) or take back (negative). Non-zero, within +/-315360000 (10 years).
Request
{
  "deltaSeconds": -1800
}
Responses
200Applied. Returns the license's settled state.
json
{
  "success": true,
  "license": {
    "id": "9c1f2e7a-5b30-4a11-9d64-0f2b8c7a5e10",
    "key": "HA7N-9CGB-RFV2-MPAN",
    "status": "active",
    "expiresAt": "2026-09-01T12:00:00.000Z",
    "remainingSeconds": null
  },
  "applied_seconds": -1800,
  "lifetime": false,
  "subscriptions_updated": 1
}
400deltaSeconds absent, zero, or out of range (INVALID_DELTA).
403You do not own this application.
404No license with that key or id in this application.

More in Licenses

  • getList licenses
  • postGenerate licenses
  • getGet a license
  • putUpdate a license
  • deleteDelete a license
  • postBan a license
  • postUnban a license
  • postReset a license HWID
  • postFreeze a license
  • postResume a frozen license
  • postBulk license actions

Base URL https://api.evora.lol/api/developer-api · full spec at developer-api.yaml · back to the docs