Skip to content
Oclavex is in private preview, available to selected users. Public signup is blocked. Request access at [email protected].

Submits a batch of usage transactions captured against a license session.

POST
/api/v1/provision/usage/sessions/{sessionId}/transactions
curl --request POST \
--url https://example.com/api/v1/provision/usage/sessions/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/transactions \
--header 'Content-Type: application/json' \
--data '[ { "transactionId": 1, "sessionId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "apiVersion": 1, "creationDateTime": "2026-04-15T12:00:00Z", "eventName": "example", "eventData": "example" } ]'

Requires the license token issued for this session — not a user or service bearer. The token is bound to the session it was issued for, so a bearer that authenticates successfully but was issued for a different session, or for a user, is refused with 403. Send no bearer and the request is 401.

SDK callers get this automatically: the client captures the license token during activation through its authentication provider, so the first upload already carries it.

The response states what the server did with the batch: the highest transaction id it now holds for the session (records up to it may be purged client-side), how many records were newly acknowledged, and whether the session’s entitlement resolved at all — when it did not, nothing was recorded and the client must keep the batch.

sessionId
required
string format: uuid

Active license session. Must be the session the bearer token was issued for.

Batch of client-side usage records.

Array<object>

One usage event in the SDK’s client-side transaction log, uploaded (online or via the offline transaction-ingest flow) for server-side processing.

object
transactionId

Monotonically increasing id assigned by the local transaction store; the server acknowledges the highest processed id.

integer | string format: int64
/^-?(?:0|[1-9]\d*)$/
sessionId
string format: uuid
apiVersion
integer | string format: int32
/^-?(?:0|[1-9]\d*)$/
creationDateTime
string format: date-time
eventName

Type name of the event object serialized into string ClientTransactionRecord.EventData.

string
eventData

The event payload as JSON.

string
Examplegenerated
[
{
"transactionId": 1,
"sessionId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"apiVersion": 1,
"creationDateTime": "2026-04-15T12:00:00Z",
"eventName": "example",
"eventData": "example"
}
]

OK

What a session usage upload actually did with the batch. A bare 200 cannot distinguish “every record was ingested” from “every record was skipped as already ingested” from “the session’s entitlement no longer resolves, nothing was recorded”; the client purges its local copy on the first and must retain it on the last, so the server states which it was.

object
lastAcceptedTransactionId

The highest transaction id the server has recorded for the session after this upload; records up to and including it may be purged locally.

integer | string format: int64
/^-?(?:0|[1-9]\d*)$/
transactionsAccepted

How many records of this batch were newly recorded (the rest were already ingested).

integer | string format: int32
/^-?(?:0|[1-9]\d*)$/
entitlementResolved

False when the session’s entitlement could not be resolved and nothing was recorded; the client must retain the batch. Null when the server did not state the outcome, which the client reads as accepted, like a bodyless answer.

null | boolean

Unauthorized

object
type
null | string
title
null | string
status
null | integer | string format: int32
/^-?(?:0|[1-9]\d*)$/
detail
null | string
instance
null | string

Forbidden

object
type
null | string
title
null | string
status
null | integer | string format: int32
/^-?(?:0|[1-9]\d*)$/
detail
null | string
instance
null | string