post_ownership_transfers_by_orgid_by_transferid_verify
Calls POST /api/ownership-transfers/{orgId}/{transferId}/verify as the signed-in person · REST reference
Confirm the caller's own side of an ownership transfer with their code
With the caller's own token; the side is whoever the caller is — the owner or the member the transfer names — and nobody else may confirm (403). The code is the one emailed to the caller and verifies for their side of this transfer only. The second confirmation completes the transfer: the old owner becomes a read-only member, the member becomes the owner, both are emailed, and both see their new permissions on their next request. Wrong, expired, exhausted and missing are distinct 400s (INVALID_CODE, CODE_EXPIRED, TOO_MANY_ATTEMPTS, NO_PENDING_TRANSFER); three wrong codes cancel the transfer. A transfer that can no longer happen when both have confirmed — the member left, the org was deleted — is cancelled: 409 TRANSFER_CANCELLED. Refused while impersonating.
Arguments
| Argument | Type | Description | |
|---|---|---|---|
orgIdpath | string (uuid) | required | |
transferIdpath | string (uuid) | required | |
bodyJSON | object | required | The request body, as a JSON object. Its fields are listed below. |
Fields of body
| Field | Type | Description | |
|---|---|---|---|
code | string | required | 6-digit code. Non-digits are stripped before the length check. |
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_verify",
"arguments": {
"orgId": "11111111-1111-4111-8111-111111111111",
"transferId": "11111111-1111-4111-8111-111111111111",
"body": {
"code": "string"
}
}
}
}Result
On success (HTTP 200) the tool returns one text item holding the API's JSON, pretty-printed.
This side is confirmed (VERIFIED), or the transfer completed (COMPLETED).
{
"data": {
"outcome": "VERIFIED",
"transfer": {
"createdAt": 1,
"expiresAt": 1,
"from": {},
"id": "11111111-1111-4111-8111-111111111111",
"orgId": "11111111-1111-4111-8111-111111111111",
"orgName": "string",
"status": "PENDING",
"to": {},
"cancelReason": "string",
"cancelledAt": 1,
"completedAt": 1
}
},
"success": true
}Fields
| Field | Type | Description |
|---|---|---|
data | object | |
data.outcome | "VERIFIED" | "COMPLETED" | |
data.transfer | object | |
data.transfer.cancelReason | string | null | |
data.transfer.cancelledAt | integer | null | |
data.transfer.completedAt | integer | null | |
data.transfer.createdAt | integer | Epoch milliseconds. |
data.transfer.expiresAt | integer | Epoch milliseconds — the deadline both sides must confirm by. The same lifetime as every other code (OTP_EXPIRY_SECONDS). |
data.transfer.from | object | |
data.transfer.id | string (uuid) | |
data.transfer.orgId | string (uuid) | |
data.transfer.orgName | string | |
data.transfer.status | "PENDING" | "COMPLETED" | "CANCELLED" | "EXPIRED" | |
data.transfer.to | object | |
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.
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_verify",
"description": "POST /api/ownership-transfers/{orgId}/{transferId}/verify — With the caller's own token; the side is whoever the caller is — the owner or the member the transfer names — and nobody else may confirm (403). The code is the one emailed to the caller and verifies for their side of this transfer only. The second confirmation completes the transfer: the old owner becomes a read-only member, the member becomes the owner, both are emailed, and both see their new permissions on their next request. Wrong, expired, exhausted and missing are distinct 400s (INVALID_CODE, CODE_EXPIRED, TOO_MANY_ATTEMPTS, NO_PENDING_TRANSFER); three wrong codes cancel the transfer. A transfer that can no longer happen when both have confirmed — the member left, the org was deleted — is cancelled: 409 TRANSFER_CANCELLED. Refused while impersonating.\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: { code*: string (6-digit code.) }"
}
},
"required": [
"orgId",
"transferId",
"body"
]
},
"annotations": {
"readOnlyHint": false,
"destructiveHint": true,
"idempotentHint": false,
"openWorldHint": false
}
}