Record an equipment lifecycle event for a unit
const url = 'https://quikstik-core.fly.dev/resources/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/equipment-events';const options = { method: 'POST', headers: { 'x-tenant-id': '2489E9AD-2EE2-8E00-8EC9-32D5F69181C0', 'Idempotency-Key': 'example', Authorization: 'Bearer <token>', 'Content-Type': 'application/json' }, body: '{"resource_id":"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0","event":{"event":"acquired"}}'};
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://quikstik-core.fly.dev/resources/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/equipment-events \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --header 'Idempotency-Key: example' \ --header 'x-tenant-id: 2489E9AD-2EE2-8E00-8EC9-32D5F69181C0' \ --data '{ "resource_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "event": { "event": "acquired" } }'Appends one event (acquire / capitalize / record-usage / open- or close-maintenance /
post-depreciation / transfer-to-sale / sell / dispose) to the unit’s append-only equipment
stream. The server loads the unit’s financial fold, runs the lifecycle gate
(illegal transitions return 422), and persists the event with its paired status
transition atomically. Distinct from setResourceStatus: status is an operational signal,
this is the unit’s financial/physical history.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”Header Parameters
Section titled “Header Parameters”Tenant identifier (UUID).
Authn/authz semantics are intentionally TBD for this contract slice; this header exists to keep the contract explicitly multi-tenant from day 0.
Idempotency key for the command envelope. A retry with the same key is a no-op.
Request Bodyrequired
Section titled “Request Bodyrequired”object
A tagged equipment event. The event discriminator selects the variant
(acquired, capitalized, usage_recorded, maintenance_opened,
maintenance_closed, depreciation_posted, transferred_to_sale, sold,
disposed); remaining fields are the variant’s payload. The server-side domain type is
authoritative for payload shape and money/currency fields.
object
Responses
Section titled “Responses”Event recorded; the assigned stream sequence is returned
object
The append-only sequence assigned to this event in the unit’s stream.
Example generated
{ "resource_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "seq": 1}Malformed body
object
Example generated
{ "reason": "example"}Missing or invalid session bearer token
object
Stable, machine-readable reason code (e.g. “sold_out”, “processor_not_configured”, “rail_refused”).
Example
{ "reason": "sold_out"}The session’s effect authority does not cover this operation
object
Stable, machine-readable reason code (e.g. “sold_out”, “processor_not_configured”, “rail_refused”).
Example
{ "reason": "sold_out"}Expired, consumed, unknown, or unresolvable — indistinguishable by design
object
Example generated
{ "reason": "example"}The command is rejected by a domain lifecycle gate (illegal state transition)
object
Stable machine-readable error code
Human-readable explanation (never leaks SQL, URLs, or secrets)
Example generated
{ "code": "example", "message": "example"}No durable backend is wired for this operation (fail-closed)
object
Stable, machine-readable reason code (e.g. “sold_out”, “processor_not_configured”, “rail_refused”).
Example
{ "reason": "sold_out"}