post_ownership_transfers_by_orgid_by_transferid_cancel
Calls POST /api/ownership-transfers/{orgId}/{transferId}/cancel as the signed-in person · REST reference
Cancel a pending ownership transfer
The owner who started it, or platform staff (403 for anyone else — the member it names declines by not confirming). Both codes stop working.
Arguments
| Argument | Type | Description | |
|---|---|---|---|
orgIdpath | string (uuid) | required | |
transferIdpath | string (uuid) | required | |
bodyJSON | object | The request body, as a JSON object. Its fields are listed below. |
Fields of body
| Field | Type | Description | |
|---|---|---|---|
reason | string |
Example call
A client sends this over the MCP session; Claude and other agents build it for you. The values are placeholders — the shape is real.
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "post_ownership_transfers_by_orgid_by_transferid_cancel",
"arguments": {
"orgId": "11111111-1111-4111-8111-111111111111",
"transferId": "11111111-1111-4111-8111-111111111111",
"body": {
"reason": "string"
}
}
}
}Result
On success (HTTP 200) the tool returns one text item holding the API's JSON, pretty-printed.
Cancelled.
{
"data": {
"createdAt": 1,
"expiresAt": 1,
"from": {
"email": "string",
"side": "FROM",
"userId": "11111111-1111-4111-8111-111111111111",
"verified": true,
"firstName": "string",
"lastName": "string",
"verifiedAt": 1
},
"id": "11111111-1111-4111-8111-111111111111",
"orgId": "11111111-1111-4111-8111-111111111111",
"orgName": "string",
"status": "PENDING",
"to": {
"email": "string",
"side": "FROM",
"userId": "11111111-1111-4111-8111-111111111111",
"verified": true,
"firstName": "string",
"lastName": "string",
"verifiedAt": 1
},
"cancelReason": "string",
"cancelledAt": 1,
"completedAt": 1
},
"success": true
}Fields
| Field | Type | Description |
|---|---|---|
data | object | |
data.cancelReason | string | null | |
data.cancelledAt | integer | null | |
data.completedAt | integer | null | |
data.createdAt | integer | Epoch milliseconds. |
data.expiresAt | integer | Epoch milliseconds — the deadline both sides must confirm by. The same lifetime as every other code (OTP_EXPIRY_SECONDS). |
data.from | object | |
data.from.email | string | |
data.from.firstName | string | null | |
data.from.lastName | string | null | |
data.from.side | "FROM" | "TO" | FROM is the current owner who started the transfer; TO is the member who becomes the owner. |
data.from.userId | string (uuid) | |
data.from.verified | boolean | Whether this side has confirmed with their code. |
data.from.verifiedAt | integer | null | Epoch milliseconds. |
data.id | string (uuid) | |
data.orgId | string (uuid) | |
data.orgName | string | |
data.status | "PENDING" | "COMPLETED" | "CANCELLED" | "EXPIRED" | |
data.to | object | |
data.to.email | string | |
data.to.firstName | string | null | |
data.to.lastName | string | null | |
data.to.side | "FROM" | "TO" | FROM is the current owner who started the transfer; TO is the member who becomes the owner. |
data.to.userId | string (uuid) | |
data.to.verified | boolean | Whether this side has confirmed with their code. |
data.to.verifiedAt | integer | null | Epoch milliseconds. |
success | true |
When it fails
A failed call returns isError: true with the API's message as text. A change the person declines, or lets time out, also comes back this way and nothing changes.
400The request was malformed or failed a guard.
403Authenticated, but the caller holds none of the required permissions.
404No transfer with that id for this organization.
409The resource is not in a state that allows this operation.
What the model is shown
This is the tool exactly as the server lists it in tools/list. The description starts with the REST call it makes.
{
"name": "post_ownership_transfers_by_orgid_by_transferid_cancel",
"description": "POST /api/ownership-transfers/{orgId}/{transferId}/cancel — The owner who started it, or platform staff (403 for anyone else — the member it names declines by not confirming). Both codes stop working.\n\nThis changes data. The person is asked to confirm it before it runs, and nothing happens if they decline.",
"inputSchema": {
"type": "object",
"properties": {
"orgId": {
"type": "string"
},
"transferId": {
"type": "string"
},
"body": {
"type": "string",
"description": "The JSON request body: { reason: string }"
}
},
"required": [
"orgId",
"transferId"
]
},
"annotations": {
"readOnlyHint": false,
"destructiveHint": true,
"idempotentHint": false,
"openWorldHint": false
}
}