Transfers between organizations
A box moves to another organization only with the Axowl operator's approval. The current Owner seals the request; the operator approves or rejects it. On approval the box leaves the pair-less, case-free state it was in, becomes Enrolling in the new organization and starts the enrollment ceremony again. Role assignments, quorum policies, alert recipients and alert states that pointed at the box in the old organization are removed; the box timeline and the audit chain stay.
| Method · Route | Who | Effect · audit event |
|---|---|---|
POST /api/org/{slug}/roost/devices/{serial}/transfer | Owner seal (roost.transfer, RoostTransferSubject(slug, serial, toOrgSlug)) | { toOrgSlug, reason, stepUpAssertion } → Requested. The box must be bound (Active / Degraded / Zeroized / Retired), not in a pair, with no open maintenance case and no pending request: 409 NOT_TRANSFERABLE | IN_PAIR | CASE_OPEN | TRANSFER_PENDING, 404 ORG_NOT_FOUND, 400 SAME_ORG. roost.transfer.requested |
GET /api/org/{slug}/roost/transfers | Owner / Roost Admin | Requests this organization sent (direction: "out") or is receiving ("in"), with state Requested | Approved | Rejected, decision time and note |
Approval writes roost.device.transferred (from / to organization) and roost.device.lifecycle_changed (→ Enrolling, reason transfer) under the new organization; a rejection writes roost.transfer.rejected with the operator's note under the requesting organization.