Applies the uploaded transactions, extends the session lease, and returns a signed receipt carrying a refreshed license.
const url = 'https://example.com/api/v1/provision/admin/usage/offline/ingest';const options = { method: 'POST', headers: {'Content-Type': 'application/json'}, body: '{"meta":{"schemaVersion":1,"nonce":"example","requestedAt":"2026-04-15T12:00:00Z","sdkVersion":"example"},"body":{"currentLicense":{"licenseToken":"example","version":1,"legalNotice":"example","copyright":"example","providerUrl":"example","providerEmail":"example","description":"example","licensedProducts":["2489E9AD-2EE2-8E00-8EC9-32D5F69181C0"],"activatedFeatures":[{"id":"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0","featureCode":"example","productId":"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0","moduleName":"example","featurePath":"example","name":"example","description":"example","value":"example","version":"example","isEnabled":true,"isAvailableDuringTrialPeriod":true,"isAvailableDuringGracePeriod":true,"featureExpiration":"2026-04-15T12:00:00Z"}]},"transactions":[{"transactionId":1,"sessionId":"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0","apiVersion":1,"creationDateTime":"2026-04-15T12:00:00Z","eventName":"example","eventData":"example"}]}}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://example.com/api/v1/provision/admin/usage/offline/ingest \ --header 'Content-Type: application/json' \ --data '{ "meta": { "schemaVersion": 1, "nonce": "example", "requestedAt": "2026-04-15T12:00:00Z", "sdkVersion": "example" }, "body": { "currentLicense": { "licenseToken": "example", "version": 1, "legalNotice": "example", "copyright": "example", "providerUrl": "example", "providerEmail": "example", "description": "example", "licensedProducts": [ "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0" ], "activatedFeatures": [ { "id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "featureCode": "example", "productId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "moduleName": "example", "featurePath": "example", "name": "example", "description": "example", "value": "example", "version": "example", "isEnabled": true, "isAvailableDuringTrialPeriod": true, "isAvailableDuringGracePeriod": true, "featureExpiration": "2026-04-15T12:00:00Z" } ] }, "transactions": [ { "transactionId": 1, "sessionId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "apiVersion": 1, "creationDateTime": "2026-04-15T12:00:00Z", "eventName": "example", "eventData": "example" } ] } }'Request Body required
Section titled “Request Body required ”Request artifact for the offline transaction-ingest flow. Carries the SDK’s accumulated usage transactions plus the EndUserLicenseDto the SDK is currently operating under — the embedded license JWT provides server-side provenance that the request actually came from a licensed SDK for the claimed session.
object
Request-instance metadata. Same shape as the activation flow’s OfflineActivationRequestMeta — the schema is intentionally shared.
object
Wire-format major version. Currently always 1. The server refuses unknown versions to fail
fast rather than silently mis-parse.
Client-generated request correlation id, populated by the SDK builder as 32 random bytes encoded as
base64url without padding. Echoed by the server in the matching response for audit / correlation;
has no security property in v1 — the SDK does not currently track outstanding
nonces. The real defences are the JWT exp/aud claims and the response signature.
UTC timestamp at which the SDK produced the request. Used by the server as part of the idempotency cache key.
Version of the SDK assembly that produced the request. Diagnostic only; never load-bearing.
Payload — current license + accumulated transactions.
object
The license the SDK is currently operating under. The server validates the JWT’s signature using
its own public key, extracts the jti (session id) and aud (fingerprint) claims, and
uses them to bind the request to a specific session. Required; the JWT must verify.
object
object
Accumulated usage transactions awaiting server processing. Every record’s Guid ClientTransactionRecord.SessionId must match the session id in EndUserLicenseDto OfflineTransactionRequestBody.CurrentLicense; mismatched records cause the entire batch to be refused. May be empty — treated as a ping-to-renew-lease, in which case the receipt still carries a refreshed license.
object
Example generated
{ "meta": { "schemaVersion": 1, "nonce": "example", "requestedAt": "2026-04-15T12:00:00Z", "sdkVersion": "example" }, "body": { "currentLicense": { "licenseToken": "example", "version": 1, "legalNotice": "example", "copyright": "example", "providerUrl": "example", "providerEmail": "example", "description": "example", "licensedProducts": [ "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0" ], "activatedFeatures": [ { "id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "featureCode": "example", "productId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "moduleName": "example", "featurePath": "example", "name": "example", "description": "example", "value": "example", "version": "example", "isEnabled": true, "isAvailableDuringTrialPeriod": true, "isAvailableDuringGracePeriod": true, "featureExpiration": "2026-04-15T12:00:00Z" } ] }, "transactions": [ { "transactionId": 1, "sessionId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "apiVersion": 1, "creationDateTime": "2026-04-15T12:00:00Z", "eventName": "example", "eventData": "example" } ] }}Request artifact for the offline transaction-ingest flow. Carries the SDK’s accumulated usage transactions plus the EndUserLicenseDto the SDK is currently operating under — the embedded license JWT provides server-side provenance that the request actually came from a licensed SDK for the claimed session.
object
Request-instance metadata. Same shape as the activation flow’s OfflineActivationRequestMeta — the schema is intentionally shared.
object
Wire-format major version. Currently always 1. The server refuses unknown versions to fail
fast rather than silently mis-parse.
Client-generated request correlation id, populated by the SDK builder as 32 random bytes encoded as
base64url without padding. Echoed by the server in the matching response for audit / correlation;
has no security property in v1 — the SDK does not currently track outstanding
nonces. The real defences are the JWT exp/aud claims and the response signature.
UTC timestamp at which the SDK produced the request. Used by the server as part of the idempotency cache key.
Version of the SDK assembly that produced the request. Diagnostic only; never load-bearing.
Payload — current license + accumulated transactions.
object
The license the SDK is currently operating under. The server validates the JWT’s signature using
its own public key, extracts the jti (session id) and aud (fingerprint) claims, and
uses them to bind the request to a specific session. Required; the JWT must verify.
object
object
Accumulated usage transactions awaiting server processing. Every record’s Guid ClientTransactionRecord.SessionId must match the session id in EndUserLicenseDto OfflineTransactionRequestBody.CurrentLicense; mismatched records cause the entire batch to be refused. May be empty — treated as a ping-to-renew-lease, in which case the receipt still carries a refreshed license.
object
Example generated
{ "meta": { "schemaVersion": 1, "nonce": "example", "requestedAt": "2026-04-15T12:00:00Z", "sdkVersion": "example" }, "body": { "currentLicense": { "licenseToken": "example", "version": 1, "legalNotice": "example", "copyright": "example", "providerUrl": "example", "providerEmail": "example", "description": "example", "licensedProducts": [ "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0" ], "activatedFeatures": [ { "id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "featureCode": "example", "productId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "moduleName": "example", "featurePath": "example", "name": "example", "description": "example", "value": "example", "version": "example", "isEnabled": true, "isAvailableDuringTrialPeriod": true, "isAvailableDuringGracePeriod": true, "featureExpiration": "2026-04-15T12:00:00Z" } ] }, "transactions": [ { "transactionId": 1, "sessionId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "apiVersion": 1, "creationDateTime": "2026-04-15T12:00:00Z", "eventName": "example", "eventData": "example" } ] }}Request artifact for the offline transaction-ingest flow. Carries the SDK’s accumulated usage transactions plus the EndUserLicenseDto the SDK is currently operating under — the embedded license JWT provides server-side provenance that the request actually came from a licensed SDK for the claimed session.
object
Request-instance metadata. Same shape as the activation flow’s OfflineActivationRequestMeta — the schema is intentionally shared.
object
Wire-format major version. Currently always 1. The server refuses unknown versions to fail
fast rather than silently mis-parse.
Client-generated request correlation id, populated by the SDK builder as 32 random bytes encoded as
base64url without padding. Echoed by the server in the matching response for audit / correlation;
has no security property in v1 — the SDK does not currently track outstanding
nonces. The real defences are the JWT exp/aud claims and the response signature.
UTC timestamp at which the SDK produced the request. Used by the server as part of the idempotency cache key.
Version of the SDK assembly that produced the request. Diagnostic only; never load-bearing.
Payload — current license + accumulated transactions.
object
The license the SDK is currently operating under. The server validates the JWT’s signature using
its own public key, extracts the jti (session id) and aud (fingerprint) claims, and
uses them to bind the request to a specific session. Required; the JWT must verify.
object
object
Accumulated usage transactions awaiting server processing. Every record’s Guid ClientTransactionRecord.SessionId must match the session id in EndUserLicenseDto OfflineTransactionRequestBody.CurrentLicense; mismatched records cause the entire batch to be refused. May be empty — treated as a ping-to-renew-lease, in which case the receipt still carries a refreshed license.
object
Example generated
{ "meta": { "schemaVersion": 1, "nonce": "example", "requestedAt": "2026-04-15T12:00:00Z", "sdkVersion": "example" }, "body": { "currentLicense": { "licenseToken": "example", "version": 1, "legalNotice": "example", "copyright": "example", "providerUrl": "example", "providerEmail": "example", "description": "example", "licensedProducts": [ "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0" ], "activatedFeatures": [ { "id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "featureCode": "example", "productId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "moduleName": "example", "featurePath": "example", "name": "example", "description": "example", "value": "example", "version": "example", "isEnabled": true, "isAvailableDuringTrialPeriod": true, "isAvailableDuringGracePeriod": true, "featureExpiration": "2026-04-15T12:00:00Z" } ] }, "transactions": [ { "transactionId": 1, "sessionId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "apiVersion": 1, "creationDateTime": "2026-04-15T12:00:00Z", "eventName": "example", "eventData": "example" } ] }}Responses
Section titled “ Responses ”Receipt issued successfully.
Server-issued signed receipt for the offline transaction-ingest flow. Wire format is structurally
identical to OfflineActivationResponse (same JWS-flattened-JSON detached-payload envelope,
same RSA-SHA256 PKCS#1 v1.5 signature). The inner signed payload identifies itself via
protected.artifactType = "offline-transaction-receipt-v1" so SDK importers fail fast if an
activation response is mis-fed here or vice versa.
object
Base64url-encoded UTF-8 JSON bytes of an OfflineTransactionReceiptSignedPayload. The importer treats this string as opaque — it is base64url-decoded and verified, never re-serialized.
Base64-encoded RSA-SHA256 (PKCS#1 v1.5) signature over the raw bytes inside string OfflineTransactionReceipt.SignedPayload.
Example generated
{ "signedPayload": "example", "signature": "example"}Invalid request (schema mismatch, JWT validation failure, session mismatch).
object
Example generated
{ "type": "example", "title": "example", "status": 1, "detail": "example", "instance": "example"}Caller is not an admin.
object
Example generated
{ "type": "example", "title": "example", "status": 1, "detail": "example", "instance": "example"}Session not found.
object
Example generated
{ "type": "example", "title": "example", "status": 1, "detail": "example", "instance": "example"}