> 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 Shadow Fund Transaction

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

### Submit a deposit or withdrawal against a shadow account.

**Available to:** Organization administrators with shadow fund transactions enabled

**Environments:** Live

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

Move funds in or out of a shadow account — a customer trading account whose cash is backed by your organization's entity account. Set `outgoing` to `false` for a deposit or `true` for a withdrawal.

Unlike standard funding requests, shadow fund transactions are approved and applied immediately: the transaction is created with status `Approved` and the account's cash balance updates right away.

Your organization admin user needs the `shadowFundTransactionsEnabled` property to call this endpoint. If your calls return an access denied error, contact your NinjaTrader representative to have it enabled.

**Field Details**

The `shadowAccountId` identifies the shadow account, which must be linked to an open, unrestricted trading account.

The `fundCurrencyId` must correspond to one of the supported currencies: USD, EUR, AUD, GBP, or CAD. Currency IDs are environment-specific — use the `/currency/list` endpoint to retrieve valid IDs.

The `transactionIdentifier` is optional but recommended as an idempotency key. It's stored as the transaction description, and submitting a shadow transaction whose identifier already exists on the account is rejected as a duplicate.

Set `fullBalance` to `true` on a withdrawal to request the account's entire balance.

**Balance Protection**

Deposits are checked against your entity account: if the combined cash balance of all shadow accounts plus the deposit would exceed the entity account's balance (including any configured buffer), the request is rejected. Withdrawals are checked against the shadow account's available funds.

**Common Failure Scenarios**

- Caller is not an organization administrator, or doesn't have `shadowFundTransactionsEnabled`
- Linked trading account is closed, restricted, or missing
- Deposit would push total shadow balances above the entity account balance
- Withdrawal amount exceeds the shadow account's available funds
- `transactionIdentifier` was already used on the account

**Error Messages**

| `errorText` | Trigger |
|-------------|---------|
| `"Fund transaction with provided identifier already exists."` | Duplicate `transactionIdentifier` (`errorCode: DuplicateShadowTransaction`) |
| `"Account not open for funding"` | Linked trading account is closed, restricted, or missing |
| `"The selected currency is not supported. Please select either USD, EUR, AUD, or GBP."` | `fundCurrencyId` is not a supported currency |
| `"Total shadow accounts cash balance exceeds entity account cash balance."` | Deposit would exceed the entity account's backing balance |
| `"You do not have sufficient margin excess to place this request. Please decrease the amount."` | Withdrawal exceeds available funds (`errorCode: InsufficientFunds`) |

**Related Endpoints**

- Use [`submitManagedFundTransaction`](/api/rest-api-endpoints/funds/submit-managed-fund-transaction) to submit a shadow account transaction through a stored managed funding method with pending approval.
- Use [`submitFundTransaction`](/api/rest-api-endpoints/funds/submit-fund-transaction) for standard (non-shadow) account funding.

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

## OpenAPI Specification

```yaml
openapi: 3.1.0
info:
  title: connect
  version: 1.0.0
paths:
  /fundTransaction/submitshadowfundtransaction:
    post:
      operationId: submit-shadow-fund-transaction
      summary: Submit Shadow Fund Transaction
      description: >-
        ### Submit a deposit or withdrawal against a shadow account.


        **Available to:** Organization administrators with shadow fund
        transactions enabled


        **Environments:** Live


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


        Move funds in or out of a shadow account — a customer trading account
        whose cash is backed by your organization's entity account. Set
        `outgoing` to `false` for a deposit or `true` for a withdrawal.


        Unlike standard funding requests, shadow fund transactions are approved
        and applied immediately: the transaction is created with status
        `Approved` and the account's cash balance updates right away.


        Your organization admin user needs the `shadowFundTransactionsEnabled`
        property to call this endpoint. If your calls return an access denied
        error, contact your NinjaTrader representative to have it enabled.


        **Field Details**


        The `shadowAccountId` identifies the shadow account, which must be
        linked to an open, unrestricted trading account.


        The `fundCurrencyId` must correspond to one of the supported currencies:
        USD, EUR, AUD, GBP, or CAD. Currency IDs are environment-specific — use
        the `/currency/list` endpoint to retrieve valid IDs.


        The `transactionIdentifier` is optional but recommended as an
        idempotency key. It's stored as the transaction description, and
        submitting a shadow transaction whose identifier already exists on the
        account is rejected as a duplicate.


        Set `fullBalance` to `true` on a withdrawal to request the account's
        entire balance.


        **Balance Protection**


        Deposits are checked against your entity account: if the combined cash
        balance of all shadow accounts plus the deposit would exceed the entity
        account's balance (including any configured buffer), the request is
        rejected. Withdrawals are checked against the shadow account's available
        funds.


        **Common Failure Scenarios**


        - Caller is not an organization administrator, or doesn't have
        `shadowFundTransactionsEnabled`

        - Linked trading account is closed, restricted, or missing

        - Deposit would push total shadow balances above the entity account
        balance

        - Withdrawal amount exceeds the shadow account's available funds

        - `transactionIdentifier` was already used on the account


        **Error Messages**


        | `errorText` | Trigger |

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

        | `"Fund transaction with provided identifier already exists."` |
        Duplicate `transactionIdentifier` (`errorCode:
        DuplicateShadowTransaction`) |

        | `"Account not open for funding"` | Linked trading account is closed,
        restricted, or missing |

        | `"The selected currency is not supported. Please select either USD,
        EUR, AUD, or GBP."` | `fundCurrencyId` is not a supported currency |

        | `"Total shadow accounts cash balance exceeds entity account cash
        balance."` | Deposit would exceed the entity account's backing balance |

        | `"You do not have sufficient margin excess to place this request.
        Please decrease the amount."` | Withdrawal exceeds available funds
        (`errorCode: InsufficientFunds`) |


        **Related Endpoints**


        - Use
        [`submitManagedFundTransaction`](/api/rest-api-endpoints/funds/submit-managed-fund-transaction)
        to submit a shadow account transaction through a stored managed funding
        method with pending approval.

        - Use
        [`submitFundTransaction`](/api/rest-api-endpoints/funds/submit-fund-transaction)
        for standard (non-shadow) account funding.
      tags:
        - Funds
      parameters:
        - name: Authorization
          in: header
          description: Bearer authentication
          required: true
          schema:
            type: string
      responses:
        '200':
          description: FundTransactionResponse
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FundTransactionResponse'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SubmitShadowFundTransaction'
servers:
  - url: https://live.tradovateapi.com/v1
    description: https://live.tradovateapi.com/v1
components:
  schemas:
    SubmitShadowFundTransaction:
      type: object
      properties:
        shadowAccountId:
          type: integer
          format: int64
        outgoing:
          type: boolean
        fundAmount:
          type: number
          format: double
        fundCurrencyId:
          type: integer
          format: int64
        fullBalance:
          type: boolean
        transactionIdentifier:
          type: string
      required:
        - shadowAccountId
        - outgoing
        - fundAmount
        - fundCurrencyId
      title: SubmitShadowFundTransaction
    FundTransactionFundPaymentType:
      type: string
      enum:
        - ACHR
        - ACHS
        - BOOKR
        - BOOKS
        - CKF
        - CKR
        - CKS
        - DCR
        - DCS
        - FPR
        - FX
        - MDF
        - SHR
        - SHS
        - TF
        - TT
        - WTF
        - WTR
        - WTS
        - XFR
      description: >-
        ACHR, ACHS, BOOKR, BOOKS, CKF, CKR, CKS, DCR, DCS, FPR, FX, MDF, SHR,
        SHS, TF, TT, WTF, WTR, WTS, XFR
      title: FundTransactionFundPaymentType
    FundTransactionFeePaymentType:
      type: string
      enum:
        - ACHR
        - ACHS
        - BOOKR
        - BOOKS
        - CKF
        - CKR
        - CKS
        - DCR
        - DCS
        - FPR
        - FX
        - MDF
        - SHR
        - SHS
        - TF
        - TT
        - WTF
        - WTR
        - WTS
        - XFR
      description: >-
        ACHR, ACHS, BOOKR, BOOKS, CKF, CKR, CKS, DCR, DCS, FPR, FX, MDF, SHR,
        SHS, TF, TT, WTF, WTR, WTS, XFR
      title: FundTransactionFeePaymentType
    FundTransactionStatus:
      type: string
      enum:
        - Approved
        - Declined
        - InReview
        - InSecondaryReview
        - InTransit
        - Locked
        - Pending
        - ReplicaNTC
        - ReviewCompleted
        - Suspended
      description: >-
        Approved, Declined, InReview, InSecondaryReview, InTransit, Locked,
        Pending, ReplicaNTC, ReviewCompleted, Suspended
      title: FundTransactionStatus
    TradeDate:
      type: object
      properties:
        year:
          type: integer
        month:
          type: integer
        day:
          type: integer
      required:
        - year
        - month
        - day
      title: TradeDate
    FundTransactionSuspendReason:
      type: string
      enum:
        - CurrencyConversionRequired
        - IncompleteRequest
        - IncorrectRoutingNumber
        - IncorrectSwiftCode
        - LargeWireConfirmation
        - Other
        - TooLateToProcess
        - TradingHold
      description: >-
        CurrencyConversionRequired, IncompleteRequest, IncorrectRoutingNumber,
        IncorrectSwiftCode, LargeWireConfirmation, Other, TooLateToProcess,
        TradingHold
      title: FundTransactionSuspendReason
    FundTransactionAchrSecondCheckResult:
      type: string
      enum:
        - DataUnavailable
        - NSF
        - NoPaymentItemsAssigned
        - OK
      description: DataUnavailable, NSF, NoPaymentItemsAssigned, OK
      title: FundTransactionAchrSecondCheckResult
    FundTransaction:
      type: object
      properties:
        id:
          type: integer
          format: int64
        accountId:
          type: integer
          format: int64
        timestamp:
          type: string
          format: date-time
        submitterId:
          type: integer
          format: int64
        outgoing:
          type: boolean
        fundPaymentType:
          $ref: '#/components/schemas/FundTransactionFundPaymentType'
          description: >-
            ACHR, ACHS, BOOKR, BOOKS, CKF, CKR, CKS, DCR, DCS, FPR, FX, MDF,
            SHR, SHS, TF, TT, WTF, WTR, WTS, XFR
        fundAmount:
          type: number
          format: double
        fundCurrencyId:
          type: integer
          format: int64
        fundDescription:
          type: string
        feePaymentType:
          $ref: '#/components/schemas/FundTransactionFeePaymentType'
          description: >-
            ACHR, ACHS, BOOKR, BOOKS, CKF, CKR, CKS, DCR, DCS, FPR, FX, MDF,
            SHR, SHS, TF, TT, WTF, WTR, WTS, XFR
        feeAmount:
          type: number
          format: double
        feeCurrencyId:
          type: integer
          format: int64
        feeDescription:
          type: string
        bankAccountId:
          type: integer
          format: int64
        approved:
          type: boolean
        status:
          $ref: '#/components/schemas/FundTransactionStatus'
          description: >-
            Approved, Declined, InReview, InSecondaryReview, InTransit, Locked,
            Pending, ReplicaNTC, ReviewCompleted, Suspended
        autoApprovalDate:
          $ref: '#/components/schemas/TradeDate'
        suspendReason:
          $ref: '#/components/schemas/FundTransactionSuspendReason'
          description: >-
            CurrencyConversionRequired, IncompleteRequest,
            IncorrectRoutingNumber, IncorrectSwiftCode, LargeWireConfirmation,
            Other, TooLateToProcess, TradingHold
        suspendReasonNotes:
          type: string
        fullBalance:
          type: boolean
        approvalDate:
          type: string
          format: date-time
        submissionSignalId:
          type: integer
          format: int64
        achId:
          type: integer
          format: int64
        achrSecondCheckResult:
          $ref: '#/components/schemas/FundTransactionAchrSecondCheckResult'
          description: DataUnavailable, NSF, NoPaymentItemsAssigned, OK
        achrSecondCheckTimestamp:
          type: string
          format: date-time
        achrSecondCheckComments:
          type: string
        returnCode:
          type: string
        statementDate:
          $ref: '#/components/schemas/TradeDate'
        managedFundingMethodId:
          type: integer
          format: int64
        paymentInitiationApplicationId:
          type: integer
          format: int64
        transactionIdentifier:
          type: string
      required:
        - accountId
        - timestamp
        - submitterId
        - outgoing
        - fundPaymentType
        - fundAmount
        - fundCurrencyId
      title: FundTransaction
    FundTransactionResponseErrorCode:
      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: FundTransactionResponseErrorCode
    FundTransactionResponse:
      type: object
      properties:
        errorText:
          type: string
          description: Non-empty if the request failed
        errorHeader:
          type: string
          description: Non-empty if the request failed
        fundTransaction:
          $ref: '#/components/schemas/FundTransaction'
        errorCode:
          $ref: '#/components/schemas/FundTransactionResponseErrorCode'
          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: FundTransactionResponse
  securitySchemes:
    bearer_access_token:
      type: http
      scheme: bearer

```

## Examples



**Request**

```json
{
  "shadowAccountId": 12345,
  "outgoing": true,
  "fundAmount": 2500.75,
  "fundCurrencyId": 1
}
```

**Response**

```json
{
  "errorText": "",
  "errorHeader": "",
  "fundTransaction": {
    "accountId": 12345,
    "timestamp": "2024-06-10T14:45:00Z",
    "submitterId": 67890,
    "outgoing": true,
    "fundPaymentType": "ACHR",
    "fundAmount": 2500.75,
    "fundCurrencyId": 1,
    "id": 987654321,
    "fundDescription": "Withdrawal from shadow account",
    "feePaymentType": "ACHR",
    "feeAmount": 15,
    "feeCurrencyId": 1,
    "feeDescription": "Withdrawal processing fee",
    "bankAccountId": 54321,
    "approved": true,
    "status": "Approved",
    "autoApprovalDate": {
      "year": 2024,
      "month": 6,
      "day": 10
    },
    "suspendReason": "",
    "suspendReasonNotes": "",
    "fullBalance": false,
    "approvalDate": "2024-06-10T14:45:00Z",
    "submissionSignalId": 112233,
    "achId": 445566,
    "achrSecondCheckResult": "OK",
    "achrSecondCheckTimestamp": "2024-06-10T14:46:00Z",
    "achrSecondCheckComments": "Second check passed successfully",
    "returnCode": "00",
    "statementDate": {
      "year": 2024,
      "month": 6,
      "day": 10
    },
    "managedFundingMethodId": 778899,
    "paymentInitiationApplicationId": 334455,
    "transactionIdentifier": "TXN-20240610-987654"
  },
  "errorCode": ""
}
```

**SDK Code**

```python
import requests

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

payload = {
    "shadowAccountId": 12345,
    "outgoing": True,
    "fundAmount": 2500.75,
    "fundCurrencyId": 1
}
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/submitshadowfundtransaction';
const options = {
  method: 'POST',
  headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
  body: '{"shadowAccountId":12345,"outgoing":true,"fundAmount":2500.75,"fundCurrencyId":1}'
};

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/submitshadowfundtransaction"

	payload := strings.NewReader("{\n  \"shadowAccountId\": 12345,\n  \"outgoing\": true,\n  \"fundAmount\": 2500.75,\n  \"fundCurrencyId\": 1\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/submitshadowfundtransaction")

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  \"shadowAccountId\": 12345,\n  \"outgoing\": true,\n  \"fundAmount\": 2500.75,\n  \"fundCurrencyId\": 1\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/submitshadowfundtransaction")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("{\n  \"shadowAccountId\": 12345,\n  \"outgoing\": true,\n  \"fundAmount\": 2500.75,\n  \"fundCurrencyId\": 1\n}")
  .asString();
```

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

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://live.tradovateapi.com/v1/fundTransaction/submitshadowfundtransaction', [
  'body' => '{
  "shadowAccountId": 12345,
  "outgoing": true,
  "fundAmount": 2500.75,
  "fundCurrencyId": 1
}',
  'headers' => [
    'Authorization' => 'Bearer <token>',
    'Content-Type' => 'application/json',
  ],
]);

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

```csharp
using RestSharp;

var client = new RestClient("https://live.tradovateapi.com/v1/fundTransaction/submitshadowfundtransaction");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer <token>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"shadowAccountId\": 12345,\n  \"outgoing\": true,\n  \"fundAmount\": 2500.75,\n  \"fundCurrencyId\": 1\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift
import Foundation

let headers = [
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
]
let parameters = [
  "shadowAccountId": 12345,
  "outgoing": true,
  "fundAmount": 2500.75,
  "fundCurrencyId": 1
] as [String : Any]

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

let request = NSMutableURLRequest(url: NSURL(string: "https://live.tradovateapi.com/v1/fundTransaction/submitshadowfundtransaction")! 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()
```