---
title: "Update transfer details"
method: PATCH
path: "/v1/transfers/{id}"
tags: ["Transfers"]
---

# Update transfer details

`PATCH /v1/transfers/{id}`

Update a DRAFT transfer's details before submission.

Only transfers in DRAFT status can be updated. Once a transfer is submitted (moves to PENDING),
it cannot be modified.

**Workflow:**
1. Create transfer with `confirm: false` (or omit) → transfer is in DRAFT status
2. Update transfer details via PATCH /transfers/:id as needed
3. When ready, call POST /transfers/:id/submit to submit for processing
4. Transfer transitions to PENDING status and begins processing

## Path parameters

- `id` string, required

## Headers

- `X-API-Key` string

## Request body

- UpdateTransferDto
  - `clientReferenceId` string — Client's internal reference ID
  - `counterpartyId` string — Counterparty ID for third-party recipient transfers. Omit for first-party transfers.
  - `amount` MoneyInputDto
    - `currency` string, required — Currency code (ISO 4217 for fiat, symbol for crypto)
    - `rawValue` string, required — Amount in smallest unit as a string (cents for USD, satoshi for BTC, etc.)
  - `quoteId` string — Quote ID to use for rate and amount calculation
  - `source` UpdateTransferSourceDto
    - `currency` 'USD' | 'EUR' | 'MXN' | 'USAT' | 'USDC' | 'USDT' | 'BTC' — Source currency code
    - `paymentRail` 'ACH' | 'ACH_SAME_DAY' | 'WIRE' | 'FED_NOW' | 'RTP' | 'EREBOR' | 'EREBOR_RAIL' | 'BALANCE' | 'SWIFT' | 'SEPA' | 'SEPA_INSTANT' | 'TIPS' | 'FASTER_PAYMENTS' | 'BACS' | 'CHAPS' | 'ELIXIR' | 'NICS' | 'EFT' | 'INTERAC' | 'NPP' | 'BECS' | 'UPI' | 'IMPS' | 'IMPS_WITH_FIRC' | 'NEFT' | 'RTGS' | 'BI_FAST' | 'ARTAJASA' | 'PIX' | 'TED' | 'TEF' | 'SPEI' | 'COELSA' | 'SINPE' | 'CIPS' | 'CFXPS' | 'CHATS' | 'ZENGIN' | 'KFTC' | 'FAST_SG' | 'MEPS' | 'DUITNOW' | 'PROMPTPAY' | 'INSTAPAY' | 'PESONET' | 'NAPAS' | 'BEFTN' | 'SLIPS' | 'ZAHAV' | 'GHIPSS' | 'NIBSS' | 'PESALINK' | 'RTC_ZA' | 'TZS_RTGS' | 'EGP_ACH' | 'JOD_ACH' | 'NPSS' | 'MADA' | 'QPS' | 'DOP_ACH' | 'GTQ_ACH' | 'HNL_ACH' | 'PEN_ACH' | 'JMD_ACH' | 'USD_ACH_SV' | 'USD_ACH_EC' | 'CLP_TEF' | 'PSE' | 'COP_ACH' | 'BOB_RTGS' | 'PYG_ACH' | 'CERTIS' | 'DKK_TIPS' | 'SENT' | 'NKS' | 'BANKGIROT' | 'HKD_FPS' | 'IBFT' | 'TRY_FAST' | 'ETHEREUM' | 'BASE' | 'POLYGON' | 'SOLANA' | 'TRON' | 'BITCOIN' | 'ARBITRUM' — Payment rail for the source funds
    - `refundAccountId` string — Customer wallet account ID (inw_xxx or ewa_xxx) that receives refunds for failed crypto transfers or when fees exceed deposit. Must belong to the customer and include a wallet address; validated at request time.
  - `destination` UpdateTransferDestinationDto
    - `correspondentBankName` string — Correspondent/intermediary bank name
    - `correspondentBankSwiftCode` string — Correspondent/intermediary bank SWIFT/BIC code (8 or 11 characters)
    - `correspondentAccountNumber` string — Correspondent/intermediary account number
    - `accountId` string — Account ID for the destination of funds
    - `currency` 'USD' | 'EUR' | 'MXN' | 'USAT' | 'USDC' | 'USDT' | 'BTC' — Destination currency code
    - `paymentRail` 'ACH' | 'ACH_SAME_DAY' | 'WIRE' | 'FED_NOW' | 'RTP' | 'EREBOR' | 'EREBOR_RAIL' | 'BALANCE' | 'SWIFT' | 'SEPA' | 'SEPA_INSTANT' | 'TIPS' | 'FASTER_PAYMENTS' | 'BACS' | 'CHAPS' | 'ELIXIR' | 'NICS' | 'EFT' | 'INTERAC' | 'NPP' | 'BECS' | 'UPI' | 'IMPS' | 'IMPS_WITH_FIRC' | 'NEFT' | 'RTGS' | 'BI_FAST' | 'ARTAJASA' | 'PIX' | 'TED' | 'TEF' | 'SPEI' | 'COELSA' | 'SINPE' | 'CIPS' | 'CFXPS' | 'CHATS' | 'ZENGIN' | 'KFTC' | 'FAST_SG' | 'MEPS' | 'DUITNOW' | 'PROMPTPAY' | 'INSTAPAY' | 'PESONET' | 'NAPAS' | 'BEFTN' | 'SLIPS' | 'ZAHAV' | 'GHIPSS' | 'NIBSS' | 'PESALINK' | 'RTC_ZA' | 'TZS_RTGS' | 'EGP_ACH' | 'JOD_ACH' | 'NPSS' | 'MADA' | 'QPS' | 'DOP_ACH' | 'GTQ_ACH' | 'HNL_ACH' | 'PEN_ACH' | 'JMD_ACH' | 'USD_ACH_SV' | 'USD_ACH_EC' | 'CLP_TEF' | 'PSE' | 'COP_ACH' | 'BOB_RTGS' | 'PYG_ACH' | 'CERTIS' | 'DKK_TIPS' | 'SENT' | 'NKS' | 'BANKGIROT' | 'HKD_FPS' | 'IBFT' | 'TRY_FAST' | 'ETHEREUM' | 'BASE' | 'POLYGON' | 'SOLANA' | 'TRON' | 'BITCOIN' | 'ARBITRUM' — Payment rail for destination
    - `wireMessage` string — Wire transfer message (max 140 chars)
    - `sepaReference` string — SEPA reference (6-140 chars)
    - `achReference` string — ACH reference (max 10 chars)
    - `blockchainMemo` string — Blockchain memo
    - `swiftReference` string — SWIFT reference (max 190 chars)
    - `rtpReference` string — RTP reference (max 140 chars)
  - `paymentReason` 'CAPITAL_CONTRIBUTIONS' | 'CHARITABLE_CONTRIBUTIONS' | 'CONSULTING_FEES' | 'CORPORATE_TAX_PAYMENTS' | 'DOWN_PAYMENTS_FOR_REAL_ESTATE' | 'EDUCATION_FEES' | 'EMPLOYEE_SALARIES_OR_WAGES' | 'EXPENSES_REIMBURSEMENT' | 'GIFTS' | 'GOVERNMENT_GRANTS' | 'INCOME_TAX_PAYMENTS' | 'INHERITANCE_PAYMENTS' | 'INSURANCE_CLAIM_PAYOUTS' | 'INSURANCE_PREMIUM_PAYMENTS' | 'INVESTMENTS' | 'LOAN_ADVANCES' | 'MORTGAGE_PAYMENTS' | 'OTHER' | 'PAYMENT_FOR_GOODS_AND_SERVICES' | 'PERSONAL_TRANSFERS' | 'REAL_ESTATE_PURCHASES' | 'REMITTANCES' | 'RENT' | 'REPAYMENT_OF_LOANS' | 'ROYALTIES' | 'SELF' | 'TRADE_SETTLEMENT' | 'TRUST_FUND_DISTRIBUTIONS' | 'UTILITY_BILLS' | 'WELFARE_OR_BENEFITS' | 'WINNINGS_AND_PRIZES' — Reason for the payment
  - `remarks` string — Free-form remarks or notes about the transfer (e.g., invoice discrepancy explanations)
  - `internalRemarks` string — Internal remarks visible only within your organization. Never forwarded to payment rails (SWIFT, ACH, etc.) or counterparties.
  - `documentIds` string[] — Supporting document IDs for the transfer

## Response `200`

Transfer updated successfully

- 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
    - `originator` TransferDepositOriginatorDto
      - `name` string, nullable — Originator / remitter name as reported by the payment rail
      - `bankName` string, nullable — Originating bank name
      - `routingNumber` string, nullable — Originating bank routing number (e.g. US ABA)
      - `accountNumber` string, nullable — Originating account number when the settlement rail provides it
      - `swiftBic` string, nullable — Originating bank SWIFT/BIC when available
  - `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` — Transfer is not in DRAFT status and cannot be updated
- `401` — Unauthorized - Invalid or missing authentication credentials

## Changes

- **2026-09-02** `bca54100a637` — 1 info
  - added the optional property `source/allOf[#/components/schemas/TransferSourceResponseDto]/originator` to the response with the `200` status

[Change history](https://skmtc.dev/infinite/apis/infinite-api/changes/v1/transfers/:id/patch.md)

---

[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/bca54100a637/schema)
