---
title: "Accept a firm FX quote and create a trade"
method: POST
path: "/v1/fx/trades"
tags: ["FX"]
---

# Accept a firm FX quote and create a trade

`POST /v1/fx/trades`

## Headers

- `X-API-Key` string

## Request body

- CreateFxTradeDto
  - `quoteId` string, required — ID of a PENDING firm quote returned by `POST /v1/fx/quotes`.
  - `payoutDestination` FxPayoutDestinationDto, required
    - `type` 'EXTERNAL_WALLET' | 'FIAT_BANK_ACCOUNT', required — Destination type. `EXTERNAL_WALLET` for crypto payouts, `FIAT_BANK_ACCOUNT` for fiat payouts.
    - `address` string — Recipient wallet address. Required when `type=EXTERNAL_WALLET`.
    - `network` string — Network the recipient address lives on. Required when `type=EXTERNAL_WALLET`.
    - `bankAccountId` string — Public ID (`eba_…` for bank rails, `epa_…` for proxy rails like PIX) of an existing external account belonging to the receiving customer. Required when `type=FIAT_BANK_ACCOUNT`. The payment rail and beneficiary fields are resolved from the persisted account; create the account first via `POST /v1/external-bank-accounts` (bank details or `aliasType`/`aliasValue`) and pass back its `id` here.
    - `payoutReference` string — Reference forwarded to the bank as the payout memo. Optional, fiat only. Must be 1-20 characters using only uppercase letters A-Z and digits 0-9 (matches the underlying SWIFT/SEPA memo field constraints).

## Response `201`

Trade created. Deposit funds within `depositDeadline`.

- FxTradeResponseDto
  - `tradeId` string, required
  - `status` 'PENDING_WALLET_APPROVAL' | 'AWAITING_DEPOSIT' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'CANCELLED' | 'AUTO_CANCELLED' | 'REFUNDED', required — Lifecycle status. `PENDING_WALLET_APPROVAL` means accept succeeded but the source wallet is still being verified — `depositInstructions` is omitted until verification clears and the trade transitions to `AWAITING_DEPOSIT` (delivered via the `fx_trade.deposit_instructions_ready` webhook).
  - `depositInstructions` FxTradeDepositInstructionsDto
    - `address` string, required — Address the customer must send `grossSource` to within the deposit window.
    - `network` string, required
    - `amount` string, required — Amount the customer must deposit, in source-currency minor units.
    - `expiresAt` string, required — Customer-facing deposit deadline (ISO 8601). Late deposits are not honored.
  - `fundingInstructions` FxTradeFundingInstructionsDto
    - `reference` string, required — Reference the customer must include on their outbound wire so the funds can be attributed to this trade. Customer-visible; renders verbatim in their banking app.
    - `currency` string, required — ISO 4217.
    - `amount` string, required — Amount the customer must wire, in source-currency minor units.
    - `supportedRails` string[], required — Rails accepted for the inbound wire — the customer picks one in their banking app and matches it to the account variant in `accounts` carrying the right identifiers for that rail.
    - `bank` FxTradeFundingInstructionsBankDto, required
      - `name` string
      - `address` string
      - `country` string — ISO 3166-2.
    - `accounts` FxTradeFundingInstructionsAccountDto[], required — One entry per rail-variant receiving account. Pick the entry matching the rail used to initiate the wire.
      - `supportedRails` string[], required — Rails this account accepts inbound wires on. Pick the account whose rails include the one used to initiate the wire.
      - `accountHolderName` string
      - `accountNumber` string
      - `iban` string
      - `bic` string
      - `sortCode` string
      - `routingNumber` string — ABA routing number (US ACH / Fedwire).
    - `swiftRoutingBanks` FxTradeFundingInstructionsSwiftBankDto[] — Correspondent / intermediary banks required when routing via SWIFT. Omitted when the route has no SWIFT correspondents.
      - `role` 'INTERMEDIARY' | 'CORRESPONDENT', required
      - `bankName` string, required
      - `bic` string, required
      - `abaRoutingNumber` string
    - `expiresAt` string, required — Wire-by deadline (ISO 8601).
  - `depositDeadline` string — Customer-facing deposit deadline (ISO 8601). Present when either `depositInstructions` or `fundingInstructions` is present.
  - `screeningDeadline` string — Deadline by which source-wallet verification must complete (ISO 8601). Present only when `status=PENDING_WALLET_APPROVAL`. If verification has not cleared by this point the trade transitions to `FAILED`.

## Other responses

- `401` — Unauthorized - Invalid or missing authentication credentials
- `409` — Another active FX trade already exists for this (customer, source asset, source network).
- `410` — Quote expired or no longer pending.

---

[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)
