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
| Field | Type | Required | Description |
|---|---|---|---|
| id | string (uuid) | Yes | Identifier of the ownership transfer. |
Response 200: OwnershipTransfer
| Field | Type | Required | Description |
|---|---|---|---|
| id | string (uuid) | Yes | Identifier of the ownership transfer. |
| org_id | string (uuid) | Yes | Identifier of the owning organization, derived from the parent row and never accepted from the caller. |
| created_at | string (date-time) | Yes | When the row was created. |
| created_by | string (uuid) | null | Yes | Identifier of the person who created the row. |
| updated_at | string (date-time) | Yes | When the row was last updated. |
| updated_by | string (uuid) | null | Yes | Identifier of the person who last updated the row. |
| from_person_id | string (uuid) | Yes | Identifier of the Owner who offered the org. |
| to_person_id | string (uuid) | Yes | Identifier of the member the org is offered to. |
| previous_owner_outcome | "admin" | "leave" | Yes | What happens to the Owner who offered on acceptance. |
| offered_at | string (date-time) | Yes | When the offer was made. |
| expires_at | string (date-time) | Yes | When an unanswered offer lapses, 7 days after it was made. |
| accepted_at | string (date-time) | null | Yes | When the member accepted and became an Owner. |
| declined_at | string (date-time) | null | Yes | When the member declined. |
| canceled_at | string (date-time) | null | Yes | When an Owner withdrew the offer. |
| canceled_by | string (uuid) | null | Yes | Identifier of the Owner who withdrew it. |
| expired_at | string (date-time) | null | Yes | When 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