---
title: "Cancel a pending project transfer"
method: POST
path: "/agent/v1/transfers/{transfer_id}/cancel"
tags: ["Project Transfers"]
---

# Cancel a pending project transfer

`POST /agent/v1/transfers/{transfer_id}/cancel`

## Request

- Base URL: `https://api.run402.com`
- URL: `https://api.run402.com/agent/v1/transfers/{transfer_id}/cancel`
- Auth: one of:
  - API key in header `SIGN-IN-WITH-X`
  - HTTP bearer

Kind-agnostic cancel. Wallet-addressed transfers may be cancelled by either signing party; email-addressed transfers may be cancelled by offering-org owner/admin. Body accepts an optional reason string. Returns 403 for unauthorized callers; 409 if the row is already terminal.

## Path parameters

- `transfer_id` string, uuid, required

## Request body

- object
  - `reason` string: Optional cancellation reason; surfaced in notification emails to both parties.

## Response `200`

Transfer cancelled

- object
  - `transfer_id` string, uuid
  - `status` 'cancelled'
  - `cancelled_by` 'from_wallet' | 'to_wallet' | 'system'
  - `cancellation_reason` string, nullable
  - `cancelled_at` string, date-time

## Other responses

- `403`: FORBIDDEN — signer not party to transfer
- `404`: TRANSFER_NOT_FOUND
- `409`: TRANSFER_ALREADY_PROCESSED (the unified cancel routes by kind; an email-addressed row is cancelled by the offering-org owner/admin)

---

[API](https://skmtc.dev/run402/apis/run402-api.md) · [All operations](https://skmtc.dev/run402/apis/run402-api/llms.txt) · [OpenAPI document](https://skmtc.dev/run402/apis/run402-api/revisions/893607557f50?raw)
