> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://partner.ninjatrader.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://partner.ninjatrader.com/_mcp/server.

# Submit Fund Conversion

POST https://live.tradovateapi.com/v1/fundTransaction/submitfundconversion
Content-Type: application/json

### Convert cash from one currency to another within an account.

**Available to:** All authenticated users

**Environments:** Live

**[Rate Limit](/overview/core-concepts/rate-limits):** No endpoint-specific limit

Convert part of an account's cash balance from one currency to another. Use this when a customer holds a balance in one currency and needs funds in another — for example, to cover a withdrawal in a different currency.

**Field Details**

Conversions are supported between USD and EUR only. The `sourceCurrencyId` and `targetCurrencyId` must be different, and both must be convertible currencies.

Provide exactly one of `sourceAmount` or `targetAmount` — the other side is calculated from the current exchange rate. Providing both, or neither, fails validation.

A conversion fee of one percent of the source amount is debited from the source currency balance, so the source balance must cover the converted amount plus the fee.

The response returns a `conversions` array with the executed conversion details.

**Common Failure Scenarios**

- Account is closed or restricted
- Source and target currencies are the same
- Both `sourceAmount` and `targetAmount` provided, or both omitted
- Either currency is not convertible (only USD and EUR are supported)
- Source balance can't cover the conversion amount plus the conversion fee

**Error Messages**

| `errorText` | Trigger |
|-------------|---------|
| `"Account not open for conversion."` | Account is closed or restricted |
| `"Source and target currencies are the same."` | `sourceCurrencyId` equals `targetCurrencyId` |
| `"Either source amount or target amount should be provided."` | Both amounts provided, or both omitted |
| `"Currency is not supported for conversion."` | Source or target currency is not USD or EUR |
| `"Insufficient funds for conversion."` | Source balance can't cover the amount plus the conversion fee |

**Related Endpoints**

- Use [`submitFundTransaction`](/api/rest-api-endpoints/funds/submit-fund-transaction) to submit deposit and withdrawal requests.

Reference: https://partner.ninjatrader.com/connect/api/rest-api-endpoints/funds/submit-fund-conversion

## OpenAPI Specification

```yaml
openapi: 3.1.0
info:
  title: connect
  version: 1.0.0
paths:
  /fundTransaction/submitfundconversion:
    post:
      operationId: submit-fund-conversion
      summary: Submit Fund Conversion
      description: >-
        ### Convert cash from one currency to another within an account.


        **Available to:** All authenticated users


        **Environments:** Live


        **[Rate Limit](/overview/core-concepts/rate-limits):** No
        endpoint-specific limit


        Convert part of an account's cash balance from one currency to another.
        Use this when a customer holds a balance in one currency and needs funds
        in another — for example, to cover a withdrawal in a different currency.


        **Field Details**


        Conversions are supported between USD and EUR only. The
        `sourceCurrencyId` and `targetCurrencyId` must be different, and both
        must be convertible currencies.


        Provide exactly one of `sourceAmount` or `targetAmount` — the other side
        is calculated from the current exchange rate. Providing both, or
        neither, fails validation.


        A conversion fee of one percent of the source amount is debited from the
        source currency balance, so the source balance must cover the converted
        amount plus the fee.


        The response returns a `conversions` array with the executed conversion
        details.


        **Common Failure Scenarios**


        - Account is closed or restricted

        - Source and target currencies are the same

        - Both `sourceAmount` and `targetAmount` provided, or both omitted

        - Either currency is not convertible (only USD and EUR are supported)

        - Source balance can't cover the conversion amount plus the conversion
        fee


        **Error Messages**


        | `errorText` | Trigger |

        |-------------|---------|

        | `"Account not open for conversion."` | Account is closed or restricted
        |

        | `"Source and target currencies are the same."` | `sourceCurrencyId`
        equals `targetCurrencyId` |

        | `"Either source amount or target amount should be provided."` | Both
        amounts provided, or both omitted |

        | `"Currency is not supported for conversion."` | Source or target
        currency is not USD or EUR |

        | `"Insufficient funds for conversion."` | Source balance can't cover
        the amount plus the conversion fee |


        **Related Endpoints**


        - Use
        [`submitFundTransaction`](/api/rest-api-endpoints/funds/submit-fund-transaction)
        to submit deposit and withdrawal requests.
      tags:
        - Funds
      parameters:
        - name: Authorization
          in: header
          description: Bearer authentication
          required: true
          schema:
            type: string
      responses:
        '200':
          description: FundConversionResponse
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FundConversionResponse'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SubmitFundConversion'
servers:
  - url: https://live.tradovateapi.com/v1
    description: https://live.tradovateapi.com/v1
components:
  schemas:
    SubmitFundConversion:
      type: object
      properties:
        accountId:
          type: integer
          format: int64
        sourceAmount:
          type: number
          format: double
        sourceCurrencyId:
          type: integer
          format: int64
        targetAmount:
          type: number
          format: double
        targetCurrencyId:
          type: integer
          format: int64
      required:
        - accountId
        - sourceCurrencyId
        - targetCurrencyId
      title: SubmitFundConversion
    CurrencyConversionResponse:
      type: object
      properties:
        sourceCurrencyId:
          type: integer
          format: int64
        sourceAmount:
          type: number
          format: double
        targetCurrencyId:
          type: integer
          format: int64
        targetAmount:
          type: number
          format: double
        conversionFeeCurrencyId:
          type: integer
          format: int64
        conversionFee:
          type: number
          format: double
        conversionRate:
          type: number
          format: double
      required:
        - sourceCurrencyId
        - sourceAmount
        - targetCurrencyId
        - targetAmount
        - conversionFeeCurrencyId
        - conversionFee
        - conversionRate
      title: CurrencyConversionResponse
    FundConversionResponseErrorCode:
      type: string
      enum:
        - AccountLockFailed
        - AchDepositAboveMaximum
        - AchDepositBelowMinimum
        - AchDepositExpected
        - AchDepositFrequencyExceeded
        - AchDepositHoldPeriod
        - AchNoApprovedApplications
        - AchPendingDepositExists
        - AchWithdrawalFrequencyExceeded
        - ApprovalStatusLocked
        - BankAccountNSF
        - ConcurrentRequestRejected
        - DuplicateAchReturn
        - DuplicateShadowTransaction
        - FullBalanceRequestPending
        - FullBalanceWithAchHolds
        - FullBalanceWithOpenPositions
        - FullBalanceWithPendingAch
        - InsufficientFunds
        - TransactionAlreadyApproved
        - TransactionAlreadyDeclined
        - TransactionNotApplicable
        - TransactionNotFound
        - Unknown
        - WireDepositHoldPeriod
      description: >-
        AccountLockFailed, AchDepositAboveMaximum, AchDepositBelowMinimum,
        AchDepositExpected, AchDepositFrequencyExceeded, AchDepositHoldPeriod,
        AchNoApprovedApplications, AchPendingDepositExists,
        AchWithdrawalFrequencyExceeded, ApprovalStatusLocked, BankAccountNSF,
        ConcurrentRequestRejected, DuplicateAchReturn,
        DuplicateShadowTransaction, FullBalanceRequestPending,
        FullBalanceWithAchHolds, FullBalanceWithOpenPositions,
        FullBalanceWithPendingAch, InsufficientFunds,
        TransactionAlreadyApproved, TransactionAlreadyDeclined,
        TransactionNotApplicable, TransactionNotFound, Unknown,
        WireDepositHoldPeriod
      title: FundConversionResponseErrorCode
    FundConversionResponse:
      type: object
      properties:
        errorText:
          type: string
          description: Non-empty if the request failed
        errorHeader:
          type: string
          description: Non-empty if the request failed
        conversions:
          type: array
          items:
            $ref: '#/components/schemas/CurrencyConversionResponse'
        errorCode:
          $ref: '#/components/schemas/FundConversionResponseErrorCode'
          description: >-
            AccountLockFailed, AchDepositAboveMaximum, AchDepositBelowMinimum,
            AchDepositExpected, AchDepositFrequencyExceeded,
            AchDepositHoldPeriod, AchNoApprovedApplications,
            AchPendingDepositExists, AchWithdrawalFrequencyExceeded,
            ApprovalStatusLocked, BankAccountNSF, ConcurrentRequestRejected,
            DuplicateAchReturn, DuplicateShadowTransaction,
            FullBalanceRequestPending, FullBalanceWithAchHolds,
            FullBalanceWithOpenPositions, FullBalanceWithPendingAch,
            InsufficientFunds, TransactionAlreadyApproved,
            TransactionAlreadyDeclined, TransactionNotApplicable,
            TransactionNotFound, Unknown, WireDepositHoldPeriod
      title: FundConversionResponse
  securitySchemes:
    bearer_access_token:
      type: http
      scheme: bearer

```

## Examples



**Request**

```json
{
  "accountId": 123456789,
  "sourceCurrencyId": 1,
  "targetCurrencyId": 2
}
```

**Response**

```json
{
  "errorText": "",
  "errorHeader": "",
  "conversions": [
    {
      "sourceCurrencyId": 1,
      "sourceAmount": 1000,
      "targetCurrencyId": 2,
      "targetAmount": 920,
      "conversionFeeCurrencyId": 1,
      "conversionFee": 10,
      "conversionRate": 0.93
    }
  ],
  "errorCode": ""
}
```

**SDK Code**

```python
import requests

url = "https://live.tradovateapi.com/v1/fundTransaction/submitfundconversion"

payload = {
    "accountId": 123456789,
    "sourceCurrencyId": 1,
    "targetCurrencyId": 2
}
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
```

```javascript
const url = 'https://live.tradovateapi.com/v1/fundTransaction/submitfundconversion';
const options = {
  method: 'POST',
  headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
  body: '{"accountId":123456789,"sourceCurrencyId":1,"targetCurrencyId":2}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://live.tradovateapi.com/v1/fundTransaction/submitfundconversion"

	payload := strings.NewReader("{\n  \"accountId\": 123456789,\n  \"sourceCurrencyId\": 1,\n  \"targetCurrencyId\": 2\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("Authorization", "Bearer <token>")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby
require 'uri'
require 'net/http'

url = URI("https://live.tradovateapi.com/v1/fundTransaction/submitfundconversion")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"accountId\": 123456789,\n  \"sourceCurrencyId\": 1,\n  \"targetCurrencyId\": 2\n}"

response = http.request(request)
puts response.read_body
```

```java
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://live.tradovateapi.com/v1/fundTransaction/submitfundconversion")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("{\n  \"accountId\": 123456789,\n  \"sourceCurrencyId\": 1,\n  \"targetCurrencyId\": 2\n}")
  .asString();
```

```php
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://live.tradovateapi.com/v1/fundTransaction/submitfundconversion', [
  'body' => '{
  "accountId": 123456789,
  "sourceCurrencyId": 1,
  "targetCurrencyId": 2
}',
  'headers' => [
    'Authorization' => 'Bearer <token>',
    'Content-Type' => 'application/json',
  ],
]);

echo $response->getBody();
```

```csharp
using RestSharp;

var client = new RestClient("https://live.tradovateapi.com/v1/fundTransaction/submitfundconversion");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer <token>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"accountId\": 123456789,\n  \"sourceCurrencyId\": 1,\n  \"targetCurrencyId\": 2\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift
import Foundation

let headers = [
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
]
let parameters = [
  "accountId": 123456789,
  "sourceCurrencyId": 1,
  "targetCurrencyId": 2
] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://live.tradovateapi.com/v1/fundTransaction/submitfundconversion")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```