---
title: "Request transfer cancellation"
method: POST
path: "/v1/transfers/{id}/cancel"
tags: ["Transfers"]
---

# Request transfer cancellation

`POST /v1/transfers/{id}/cancel`

Cancel a transfer that has not received funds. The transfer becomes CANCELLED after the request is processed. If funds have already arrived or started moving, the transfer moves to IN_REVIEW while our operations team handles the unwind. Completed, failed, reversed, or already cancelled transfers cannot be cancelled.

## Path parameters

- `id` string, required

## Headers

- `X-API-Key` string

## Request body

- CancelTransferDto
  - `reason` string — Optional reason for cancellation. This will be stored in the transfer metadata.

## Response `200`

Cancellation accepted. The response status is CANCELLED when terminal, IN_REVIEW when funds require an unwind, or the current non-terminal status while cancellation processing completes.

- TransferResponseDto
  - `id` string, required — Transfer ID (tfr_xxx)
  - `organizationId` string, required — Organization ID
  - `clientReferenceId` string, nullable — Client's internal reference ID
  - `sourceCustomerId` string, required — Source customer ID
  - `counterpartyId` string, nullable — Counterparty ID for third-party recipient transfers
  - `flow` 'CRYPTO_TO_CRYPTO' | 'CRYPTO_TO_FIAT' | 'FIAT_TO_CRYPTO' | 'FIAT_TO_FIAT' | 'FIAT_TO_CRYPTO_TO_FIAT' | 'FX' | 'INTERNAL' | 'FEE_CRYPTO' | 'REFUND_CRYPTO' | 'REFUND_FIAT', required — Transfer flow type describing the asset conversion
  - `status` 'DRAFT' | 'PENDING_AUTHORIZATION' | 'IN_REVIEW' | 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'CANCELLED' | 'REVERSED', required — Transfer status
  - `source` TransferSourceResponseDto, required
    - `currency` string, required — Source currency code
    - `fundingCurrency` string, nullable — Asset the transfer was funded with when it differs from the settlement currency (e.g. a stablecoin deposit settled as fiat at face value)
    - `paymentRail` string, required — Source payment rail
    - `direction` 'CREDIT' | 'DEBIT', nullable — ACH direction when the source rail is ACH
    - `accountId` string, nullable — Account ID if applicable
    - `accountType` 'VIRTUAL_BANK' | 'VIRTUAL_WALLET' | 'INFINITE_BANK' | 'INFINITE_WALLET' | 'EXTERNAL_BANK' | 'EXTERNAL_WALLET' | 'EXTERNAL_PROXY' | 'PROVIDER_BALANCE', nullable — Account type for quick filtering
    - `externalAccountId` string, nullable — External account ID if applicable
    - `fromAddress` string, nullable — Source wallet address (for crypto sources)
    - `refundAccountId` string, nullable — Customer wallet account ID (inw_xxx or ewa_xxx) that receives refunds for failed crypto transfers or when fees exceed deposit
    - `accountName` string, nullable — Account holder name
  - `destination` TransferDestinationResponseDto, required
    - `currency` string, required — Destination currency code
    - `paymentRail` string, required — Destination payment rail
    - `accountId` string, nullable — Account ID if applicable
    - `accountType` 'VIRTUAL_BANK' | 'VIRTUAL_WALLET' | 'INFINITE_BANK' | 'INFINITE_WALLET' | 'EXTERNAL_BANK' | 'EXTERNAL_WALLET' | 'EXTERNAL_PROXY' | 'PROVIDER_BALANCE', nullable — Account type for quick filtering
    - `externalAccountId` string, nullable — External account ID if applicable
    - `toAddress` string, nullable — Destination wallet address (for crypto destinations)
    - `accountName` string, nullable — Account holder name
    - `wireMessage` string, nullable — Wire message if applicable
    - `achReference` string, nullable — ACH reference if applicable
    - `swiftReference` string, nullable — SWIFT reference if applicable
    - `rtpReference` string, nullable — RTP reference if applicable
    - `payoutReference` string, nullable — Payment reference that appears on the recipient bank statement, for fiat payouts. Populated once the payout has been initiated.
  - `sourceAmount` MoneyOutputDto, required
    - `currency` string, required — Currency code
    - `exponent` number, required — Number of decimal places for this currency (e.g., 2 for USD, 6 for USDC)
    - `value` string, required — Amount in smallest unit as a string
    - `displayValue` string, required — Human-readable decimal value
  - `destinationAmount` MoneyOutputDto
    - `currency` string, required — Currency code
    - `exponent` number, required — Number of decimal places for this currency (e.g., 2 for USD, 6 for USDC)
    - `value` string, required — Amount in smallest unit as a string
    - `displayValue` string, required — Human-readable decimal value
  - `refund` TransferRefundResponseDto
    - `status` 'INITIATED' | 'COMPLETED', required — Current refund status
    - `reason` string, nullable — Reason the transfer was refunded
    - `amount` MoneyOutputDto
      - `currency` string, required — Currency code
      - `exponent` number, required — Number of decimal places for this currency (e.g., 2 for USD, 6 for USDC)
      - `value` string, required — Amount in smallest unit as a string
      - `displayValue` string, required — Human-readable decimal value
    - `address` string, nullable — Destination address used for the refund
    - `txHash` string, nullable — Refund transaction hash
    - `initiatedAt` string, date-time, nullable — When the refund was initiated
    - `completedAt` string, date-time, nullable — When the refund completed
  - `quoteId` string, nullable — Quote ID if transfer was created from a quote
  - `exchangeRate` string, nullable — Exchange rate applied to the currency conversion, inclusive of all fees. Expressed on minor-unit amounts: destinationAmount = sourceAmount * exchangeRate. Populated for FX trades.
  - `developerFeeFixed` string, nullable — Fixed developer fee in minor units of source currency. Prefer the `developerFee` object, which also carries the collected amount and payout hash.
  - `developerFeePercent` number, nullable — Variable developer fee as decimal percentage (e.g., 0.005 = 0.5%). Prefer the `developerFee` object, which also carries the collected amount and payout hash.
  - `developerFee` TransferDeveloperFeeDto
    - `amount` MoneyOutputDto
      - `currency` string, required — Currency code
      - `exponent` number, required — Number of decimal places for this currency (e.g., 2 for USD, 6 for USDC)
      - `value` string, required — Amount in smallest unit as a string
      - `displayValue` string, required — Human-readable decimal value
    - `fixed` string, nullable — Configured fixed fee component, in minor units of the source currency.
    - `percent` number, nullable — Configured variable fee component as a decimal fraction (e.g., 0.005 = 0.5%).
    - `txHash` string, nullable — Transaction hash of the on-chain movement that paid the fee out to your configured fee wallet. Shared with the payout hash when the fee was split atomically in the same transaction. Null when the fee settled without a dedicated on-chain hop.
  - `depositInstructions` union — Deposit instructions if customer needs to send funds (onramps). Either crypto or fiat instructions depending on the transfer flow.
    - CryptoDepositInstructionsDto
      - `type` string, required — Instruction type
      - `paymentRail` string, required — Payment rail (blockchain)
      - `toAddress` string, required — Destination wallet address
      - `amount` MoneyOutputDto, required
        - `currency` string, required — Currency code
        - `exponent` number, required — Number of decimal places for this currency (e.g., 2 for USD, 6 for USDC)
        - `value` string, required — Amount in smallest unit as a string
        - `displayValue` string, required — Human-readable decimal value
      - `blockchainMemo` string, nullable — Blockchain memo (for chains that require it)
      - `accountId` string, nullable — Account ID for the deposit destination
    - FiatDepositInstructionsDto
      - `type` string, required — Instruction type
      - `paymentRail` string, required — Payment rail
      - `direction` 'CREDIT' | 'DEBIT', nullable — ACH direction when the funding instructions are ACH-specific
      - `amount` MoneyOutputDto, required
        - `currency` string, required — Currency code
        - `exponent` number, required — Number of decimal places for this currency (e.g., 2 for USD, 6 for USDC)
        - `value` string, required — Amount in smallest unit as a string
        - `displayValue` string, required — Human-readable decimal value
      - `bankName` string, nullable — Bank name
      - `bankAddress` BankAddressDto
        - `addressLine1` string — Address line 1 (optional for bank addresses)
        - `addressLine2` string — Address line 2 (apartment, suite, etc.)
        - `city` string — City
        - `state` string — State / Province
        - `postalCode` string — Postal code / ZIP code (optional for bank addresses)
        - `country` string — Country code (ISO 3166-2)
      - `accountNumber` string, nullable — Account number
      - `routingNumber` string, nullable — Routing number (US)
      - `beneficiaryName` string, nullable — Beneficiary name
      - `beneficiaryAddress` BankAddressDto
        - `addressLine1` string — Address line 1 (optional for bank addresses)
        - `addressLine2` string — Address line 2 (apartment, suite, etc.)
        - `city` string — City
        - `state` string — State / Province
        - `postalCode` string — Postal code / ZIP code (optional for bank addresses)
        - `country` string — Country code (ISO 3166-2)
      - `iban` string, nullable — IBAN (international)
      - `swiftBic` string, nullable — SWIFT/BIC code
      - `depositMessage` string, nullable — Deposit message/reference to include in the transfer
      - `clabe` string, nullable — CLABE (Mexico)
      - `accountId` string, nullable — Account ID for the deposit destination
  - `createdAt` string, date-time, required — Transfer creation date
  - `updatedAt` string, date-time, required — Transfer last update date
  - `legs` TransferStepDto[], required — Transfer route legs (steps in the transfer)
    - `id` string, required — Step ID
    - `sequence` number, required — Sequence in the route (0-indexed)
    - `type` 'DEPOSIT_CRYPTO' | 'DEPOSIT_FIAT' | 'ONRAMP' | 'CONVERT' | 'OFFRAMP' | 'CRYPTO_TRANSFER' | 'BRIDGE' | 'OUTBOUND_TOP_UP' | 'INBOUND_TOP_UP' | 'REFUND_CRYPTO' | 'REFUND_FIAT' | 'LIQUIDITY_ADVANCE', required — Step type
    - `inputCurrency` string, required — Input currency
    - `outputCurrency` string, required — Output currency
    - `inputRail` string, required — Input rail
    - `outputRail` string, required — Output rail
    - `status` 'PENDING' | 'IN_PROGRESS' | 'COMPLETED' | 'FAILED' | 'SKIPPED', required — Step status
    - `startedAt` string, date-time, nullable — When the step started processing
    - `completedAt` string, date-time, nullable — When the step completed
    - `uetr` string, nullable — SWIFT UETR (Universal End-to-End Transaction Reference)
    - `imad` string, nullable — Wire IMAD (Input Message Accountability Data)
    - `omad` string, nullable — Wire OMAD (Output Message Accountability Data)
    - `achTraceNumber` string, nullable — ACH trace number from the payment network
    - `txHash` string, nullable — Blockchain transaction hash. Populated for on-chain customer wallet movements: crypto deposits, crypto sends to the destination wallet, and crypto refunds. Null for internal settlement steps.
    - `developerFee` MoneyOutputDto
      - `currency` string, required — Currency code
      - `exponent` number, required — Number of decimal places for this currency (e.g., 2 for USD, 6 for USDC)
      - `value` string, required — Amount in smallest unit as a string
      - `displayValue` string, required — Human-readable decimal value
    - `feeTxHash` string, nullable — Transaction hash of the on-chain movement that paid this step's developer fee to your configured fee wallet. Matches txHash when the fee was split atomically in the same transaction; null when the fee settled without a dedicated on-chain hop.
  - `currentLegIndex` number, nullable — Index of the current active leg in the legs array (0-indexed). Null if all legs are done.
  - `fundingNeeded` boolean, required — Whether the transfer is waiting for the customer to send funds (deposit)
  - `isThirdParty` boolean — Whether this is a third-party payment (destination account belongs to someone other than the customer)
  - `remarks` string, nullable — Free-form remarks or notes about the transfer
  - `internalRemarks` string, nullable — Internal remarks visible only within your organization. Never forwarded to payment rails or counterparties.
  - `uetr` string, nullable — SWIFT UETR (Universal End-to-End Transaction Reference)
  - `imad` string, nullable — Wire IMAD (Input Message Accountability Data)
  - `omad` string, nullable — Wire OMAD (Output Message Accountability Data)
  - `achTraceNumber` string, nullable — ACH trace number from the payment network
  - `txHash` string, nullable — Blockchain transaction hash
  - `systemRemark` string, nullable — System-generated status note with important transfer context for the customer
  - `metadata` object — Additional non-contractual transfer metadata for UI display
  - `estimatedSettlementAt` string, date-time, nullable — Estimated time the recipient will receive funds. Best-effort projection — fiat rails account for bank cutoff times, weekends, and US Federal Reserve holidays; crypto conversions project from recently observed processing times for the route. Not a guarantee.
  - `nextCutoffAt` string, date-time, nullable — Next time the customer can submit and still settle same business day. Past this time, transfers settle next business day.
  - `cutoffTimezone` string, nullable — IANA timezone for the cutoff time, e.g. "America/New_York".
  - `counterparty` CounterpartyResponseDto
    - `id` string, required — Counterparty ID
    - `name` string, required — Counterparty legal name
    - `beneficiaryType` 'INDIVIDUAL' | 'BUSINESS', required — Entity type (individual or business)
    - `address` AddressDto
      - `addressLine1` string, required — Address line 1
      - `addressLine2` string — Address line 2 (apartment, suite, etc.)
      - `city` string, required — City
      - `state` string — State / Province
      - `postalCode` string, required — Postal code / ZIP code. May be empty for countries without a postal-code system, including the United Arab Emirates.
      - `country` string, required — Country code (ISO 3166-2)
      - `transliterated` TransliteratedAddressDto
        - `addressLine1` string — Transliterated address line 1 (Latin characters)
        - `addressLine2` string — Transliterated address line 2 (Latin characters)
        - `city` string — Transliterated city (Latin characters)
        - `state` string — Transliterated state/province (Latin characters)
    - `createdAt` string, date-time, required — Creation timestamp
    - `updatedAt` string, date-time, required — Last update timestamp

## Other responses

- `400` — Cancellation cannot be requested because the transfer is already completed, failed, reversed, or cancelled.
- `401` — Unauthorized - Invalid or missing authentication credentials

---

[API](https://skmtc.dev/infinite/apis/infinite-api.md) · [All operations](https://skmtc.dev/infinite/apis/infinite-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/infinite/infinite-api/revisions/5426f2706725/schema)
