Skip to main content
To access Fixed Outputs, please reach out to our team at [email protected]
Fixed outputs provide the ability to specify a fixed amount in the destination currency when creating a Transfer in Bridge’s API. Bridge will determine the amount of source currency input required based on the current exchange rate. The source of a fixed output transfer can either be a Bridge wallet or an external customer wallet.

Creating a Transfer

Request
POST https://api.bridge.xyz/v0/transfers
{
  "on_behalf_of": "cust_alice",

  "source": {
    "currency": "usdc",
    "payment_rail": "bridge_wallet" // "ethereum" if sourcce is external wallet,
    "bridge_wallet_id": "wallet_id" // "from_address": "0x.." if source is external wallet
  },
  "destination": {
    "currency": "eur",
    "payment_rail": "sepa",
    "external_account_id": "eur_external_account_id",
    "sepa_reference": "3fd33e83-5011-4425-b135-16a17d049fba",
    "amount": "850.0"
  }
}
Response
{
  "id": "euro_payout_transfer_id",
  "client_reference_id": null,
  "on_behalf_of": "cust_alice",
  "state": "pending",
  "currency": "usd",
  "amount": "1009.50",
  "source": {
    "payment_rail": "bridge_wallet",
    "currency": "usdc",
    "from_address": "bridge_wallet_address"
  },
  "destination": {
    "payment_rail": "sepa",
    "currency": "eur",
    "external_account_id": "eur_external_account_id",
    "sepa_reference": "3fd33e83-5011-4425-b135-16a17d049fba",
    "amount": "850.0"
  },
  "receipt": {
    "initial_amount": "1009.50",
    "developer_fee": "0.0",
    "exchange_fee": "0.0",
    "gas_fee": "0.0"
  },
  "created_at": "2025-07-02T00:00:00.000Z",
  "updated_at": "2025-07-02T00:00:00.000Z"
}
Transfers API response and webhook payload for completed payout
{
  "id": "eur_transfer_id",
  "state": "payment_processed",
  "on_behalf_of": "cust_alice",
  "currency": "usd",
  "amount": "1009.50",
  "source": {
    "payment_rail": "bridge_wallet",
    "currency": "usdc",
    "from_address": "bridge_wallet_address"
  },
 "destination": {
    "payment_rail": "sepa",
    "currency": "eur",
    "external_account_id": "eur_external_account_id",
    "sepa_reference": "3fd33e83-5011-4425-b135-16a17d049fba",
    "amount": "850.0"
  },
  "created_at": "2025-07-06T04:26:04.350Z",
  "updated_at": "2025-07-06T04:26:08.726Z",
  "receipt": {
    "initial_amount": "1004.50",,
    "subtotal_amount": "1009.50",
    "converted_amount": "850.00,
    "final_amount": "850.00",
    "exchange_rate": "0.842001",
    "developer_exchange_fee": { 
      "amount": "5.83",
      "currency": "eur"
    }
  }
}

Fetching the exchange rate

The Exchange Rates API provides a reference exchange rate for the requested currency pair including any Bridge fees taken out of the FX exchange. The response provides the rates in both directions for that currency pair. Request
GET https://api.bridge.xyz/v0/exchange_rates?from=usd&to=mxn
Response
{
  "midmarket_rate": "18.6556",
  "sell_rate": "18.5624",
  "buy_rate": "18.7488",
}
 Bridge provides three rates in the response:
  • Midmarket rate: the reference exchange rate before any Bridge FX fees. Bridge uses this rate to calculate the effective rates below which include fees.
  • Sell rate: how much MXN output received for each 1 USD of input including fees (from → to)
  • Buy rate: how much MXN input required for each 1 USD of output including fees (to → from)

Fixing the Source Amount

By default, Bridge will calculate the source amount required for the destination amount including some padding to accommodate exchange rate fluctuations. When Bridge calculates the source amount, any funds received exceeding the minimum amount required for the destination amount will be distributed as a Developer Exchange Fee. Bridge also supports the developer calculating the source amount themselves to provide a source.amount in the Transfer creation request. By doing so, the developer can collect any funds received exceeding the source amount provided (and greater than the minimum amount required) for the destination amount as a Developer Exchange Fee. Request
POST https://api.bridge.xyz/v0/transfers
{
  "on_behalf_of": "cust_alice",
  "source": {
    "currency": "usdc",
    "payment_rail": "bridge_wallet",
    "bridge_wallet_id": "wallet_id",
    "amount": "1020.0"
  },
  "destination": {
    "currency": "eur",
    "payment_rail": "sepa",
    "external_account_id": "eur_external_account_id",
    "sepa_reference": "3fd33e83-5011-4425-b135-16a17d049fba",
    "amount": "850.0"
  },
}
Response
{
  "id": "euro_payout_transfer_id",
  "client_reference_id": null,
  "on_behalf_of": "cust_alice",
  "state": "pending",
  "currency": "usd",
  "amount": "1020.0",
  "source": {
    "payment_rail": "bridge_wallet",
    "currency": "usdc",
    "from_address": "bridge_wallet_address",
    "amount": "1020.0"
  },
  "destination": {
    "payment_rail": "sepa",
    "currency": "eur",
    "external_account_id": "eur_external_account_id",
    "sepa_reference": "3fd33e83-5011-4425-b135-16a17d049fba",
    "amount": "850.0",
    "exchange_rate_spread": "1.04" // 1.04%. Calculated by Bridge from provided source/destination amounts  
  },
  "receipt": {
    "initial_amount": "1020.0",
    "developer_fee": "0.0",
    "exchange_fee": "0.0",
    "gas_fee": "0.0"
  },
  "created_at": "2025-07-02T00:00:00.000Z",
  "updated_at": "2025-07-02T00:00:00.000Z"
}

Transfer Creation Validations

Bridge will calculate the amount required and fail early if the source.amount specified is insufficient to achieve the destination.amount:
{
  "code": "invalid_parameters",
  "message": "Please resubmit the following parameters that are either missing or invalid",
  "source": {
    "location": "body",
    "key": {
      "amount": "must be at least 1009.50 USDC for destination amount of €850.00 EUR"
    }
  }
}

Typical Flow

2025 10 09 21 33 41 Pn The padding in the source amount will typically exceed any exchange rate variance. Excess funds are credited to the developer in a dedicated Developer Exchange Fee wallet. This Bridge wallet can be created and used as a source or destination in Bridge’s Orchestration APIs, like any other Bridge wallet. In addition to the Developer Exchange Fee where variable fees can be applied through the spread on the exchange rate presented to the customer, the Developer Fee is a fixed amount expressed in USD. If a Developer Fee is specified in the Transfer creation request input, Bridge will also take this into account when calculating the required source amount:
{
  "code": "invalid_parameters",
  "message": "Please resubmit the following parameters that are either missing or invalid",
  "source": {
    "location": "body",
    "key": {
      "amount": "must be at least 1030.00 USDC for destination amount of €850.00 EUR with developer fee of $10.00 USD"
    }
  }
}

Unhappy Paths Flow

These transfers behave similarly to a limit order. The padding included in the source.amount is intended to cover typical FX variation. If the exchange rate moves from time of Transfer creation such that the amount of padding is now insufficient when the transfer is funded, Bridge will inform the developer the transfer is underfunded, requiring the developer to either:
  1. Add more funds to allow this Transfer to complete at the desired destination amount
  2. Cancel the Transfer and return the funds to the source
The Developer Exchange Fee wallet is a valid source for adding additional funds. The intent is that this account typically accumulates excess funds from source amount padding. In rare cases where the market is experiencing unusually high volatility, the developer can use this account to fund the deficit.

Adding additional funds for an underfunded Transfer

2025 10 09 21 35 48 Pn Underfunded Transfer API response and webhook payload If the source funds are insufficient to provide the required source amount, Bridge updates the Transfer status to underfunded in the API and sends a webhook.
{
  "id": "euro_payout_transfer_id",
  "client_reference_id": null,
  "on_behalf_of": "cust_alice",
  "state": "underfunded",
  "currency": "usd",
  "amount": "1004.50",
  "source": {
    "payment_rail": "bridge_wallet",
    "currency": "usdc",
    "from_address": "bridge_wallet_address"
  },
  "destination": {
    "payment_rail": "sepa",
    "currency": "eur",
    "external_account_id": "eur_external_account_id",
    "sepa_reference": "3fd33e83-5011-4425-b135-16a17d049fba",
    "amount": "850.0",
    "exchange_rate_spread": "3.0"
  },
  "additional_funding_instructions": {
    "destination": {
      "payment_rail": "bridge_transfer",
      "bridge_transfer_id": "euro_payout_transfer_id",
    },
    "amount": "10.00" // minimum amount, can send more
  },
  "receipt": {
    "initial_amount": "1004.50",
    "developer_fee": "0.0",
    "exchange_fee": "0.0",
    "gas_fee": "0.0"
  },
  "created_at": "2025-07-02T00:00:00.000Z",
  "updated_at": "2025-07-02T00:00:00.000Z"
}
To add additional funds, use the the additional funding instructions as the destination for a new Transfer: Request
POST https://api.bridge.xyz/v0/transfers
{
  "source": {
    "currency": "usdc",
    "payment_rail": "bridge_wallet",
    "bridge_wallet_id": "developer_exchange_fee_account",
  },
  "destination": {
    "payment_rail": "bridge_transfer",
    "bridge_transfer_id": "euro_payout_transfer_id",
  },
  "amount": "10.0"
}
The developer exchange fee wallet is only one example of a valid source for additional funds. Any valid orchestration source can also be used to add more funds: crypto rails, ACH, wire, prefunded accounts. The additional funding instructions can also be used to add more customer funds instead of developer funds to the Transfer. Payload for completed Transfer when additional funds added
{
  "id": "eur_transfer_id",
  "state": "payment_processed",
  "on_behalf_of": "cust_alice",
  "currency": "usd",
  "amount": "1004.50",
  "source": {
    "payment_rail": "bridge_wallet",
    "currency": "usdc",
    "from_address": "bridge_wallet_address"
  },
  "destination": {
    "payment_rail": "sepa",
    "currency": "eur",
    "external_account_id": "eur_external_account_id",
    "sepa_reference": "3fd33e83-5011-4425-b135-16a17d049fba",
    "amount": "850.0"
  },
  "additional_funding": [
    {
       "source_id": "addl_funds_transfer_id",
       "source_rail": "solana",
       "amount": "10.0",
       "currency": "usdc"
    }
  ],
  "created_at": "2025-07-06T04:26:04.350Z",
  "updated_at": "2025-07-06T04:26:08.726Z",
  "receipt": {
    "initial_amount": "1004.50",,
    "subtotal_amount": "1004.50",
    "converted_amount": "850.00",
    "final_amount": "850.00",
    "exchange_rate": "0.842001",
    "developer_exchange_fee" : {
      "amount": "5.83",
      "currency": "eur"
    }
  }
}
receipt.exchange_rate is based on the original source input amount and provides the exchange rate from the customer’s perspective. It always matches (destination amount) / (original source amount). It does not take into account any additional funds added to address a funding shortfall.