Skip to content

Accept ownership

Platform module

POST/ownership-transfers/{id}/acceptownershipTransfers.accept

The member the org was offered to accepts with step-up, so a second factor (app.accept_ownership_transfer): they become an Owner, then the old Owner becomes an Admin (or leaves) and loses the Owner role, so the org keeps an Owner at every step (invariant 4). An answered, withdrawn or lapsed offer answers 422. Requires `Idempotency-Key`; a replay returns the original response. A rule that refuses the request returns 422 with `refusal` and `reason`.

  • Requires the capability org.members.read.
  • OAuth scopes: org.
  • Send an Idempotency-Key header. A replay with the same key returns the original response.
  • Error statuses: 400, 401, 404, 409, 422, 429. Errors are RFC 9457 problem details.

Path and query parameters

ownershipTransfers.accept: Path and query parameters
FieldTypeRequiredDescription
idstring (uuid)YesIdentifier of the ownership transfer.

Response 200: OwnershipTransfer

ownershipTransfers.accept: OwnershipTransfer
FieldTypeRequiredDescription
idstring (uuid)YesIdentifier of the ownership transfer.
org_idstring (uuid)YesIdentifier of the owning organization, derived from the parent row and never accepted from the caller.
created_atstring (date-time)YesWhen the row was created.
created_bystring (uuid) | nullYesIdentifier of the person who created the row.
updated_atstring (date-time)YesWhen the row was last updated.
updated_bystring (uuid) | nullYesIdentifier of the person who last updated the row.
from_person_idstring (uuid)YesIdentifier of the Owner who offered the org.
to_person_idstring (uuid)YesIdentifier of the member the org is offered to.
previous_owner_outcome"admin" | "leave"YesWhat happens to the Owner who offered on acceptance.
offered_atstring (date-time)YesWhen the offer was made.
expires_atstring (date-time)YesWhen an unanswered offer lapses, 7 days after it was made.
accepted_atstring (date-time) | nullYesWhen the member accepted and became an Owner.
declined_atstring (date-time) | nullYesWhen the member declined.
canceled_atstring (date-time) | nullYesWhen an Owner withdrew the offer.
canceled_bystring (uuid) | nullYesIdentifier of the Owner who withdrew it.
expired_atstring (date-time) | nullYesWhen the lifecycle job lapsed the unanswered offer.
{
  "id": "0192f1e2-7c3a-7b4d-9e8f-1a2b3c4d5e6f",
  "org_id": "0192f1e2-7c3a-7b4d-9e8f-1a2b3c4d5e6f",
  "created_at": "2026-10-08T14:30:00Z",
  "created_by": "0192f1e2-7c3a-7b4d-9e8f-1a2b3c4d5e6f",
  "updated_at": "2026-10-08T14:30:00Z",
  "updated_by": "0192f1e2-7c3a-7b4d-9e8f-1a2b3c4d5e6f",
  "from_person_id": "0192f1e2-7c3a-7b4d-9e8f-1a2b3c4d5e6f",
  "to_person_id": "0192f1e2-7c3a-7b4d-9e8f-1a2b3c4d5e6f",
  "previous_owner_outcome": "admin",
  "offered_at": "2026-10-08T14:30:00Z",
  "expires_at": "2026-10-08T14:30:00Z",
  "accepted_at": "2026-10-08T14:30:00Z",
  "declined_at": "2026-10-08T14:30:00Z",
  "canceled_at": "2026-10-08T14:30:00Z",
  "canceled_by": "0192f1e2-7c3a-7b4d-9e8f-1a2b3c4d5e6f",
  "expired_at": "2026-10-08T14:30:00Z"
}

Code samples

curl -X POST "$XOS_BASE_URL/ownership-transfers/0192f1e2-7c3a-7b4d-9e8f-1a2b3c4d5e6f/accept" \
  -H "Authorization: Bearer $XOS_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)"
const { data } = await xos.ownershipTransfers.accept("0192f1e2-7c3a-7b4d-9e8f-1a2b3c4d5e6f");
response = xos.ownership_transfers.accept("0192f1e2-7c3a-7b4d-9e8f-1a2b3c4d5e6f")
xos ownership-transfers accept 0192f1e2-7c3a-7b4d-9e8f-1a2b3c4d5e6f