> 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 Partner Subaccount Document

POST https://live.tradovateapi.com/v1/customerApplication/submitpartnersubaccountdocument
Content-Type: application/json

### Upload a document for a subaccount request.

**Available to:** Organization administrators

**Environments:** Production

**Rate Limit:** 10 requests per hour with 30-second back-off penalty

After creating a subaccount request, use this endpoint once per `documentType` to upload each of the three required documents.

| Document | `documentType` |
| ---------------------------- | -------------------------------- |
| Power of Attorney (POA) Form | `POAForm` |
| Government ID | `Id` |
| Proof of Address | `AddressVerificationFAFTA` |

<Warning>**Warning:** This endpoint returns **HTTP 200** for successes **and** business errors. Always check the `errorText` field in the response body to determine whether the request succeeded or failed.</Warning>

**subAccountRequestId**

For `subAccountRequestId`, use the `requestId` returned from `createpartnersubaccountrequest`.

**`base64data` Format**

Documents are submitted inline as base64 data URIs. The `base64data` field must be a data URI with a supported MIME type prefix. The maximum field length is 8,388,608 characters (approximately 6 MB).

```
data:<mime-type>;base64,<base64-encoded-content>
```

Supported MIME types:
- `application/pdf`
- `text/plain`
- `image/<file type>` (for example, `image/png` or `image/jpeg`)

**Size Limits**

- Maximum request body: 5 MB
- Effective maximum file size: ~3.5 MB (base64 encoding adds ~33% overhead)
- Filename length: 5-64 characters

**Re-upload Behavior**

- Each document slot can only be filled once. The API rejects re-uploads to slots that already have a completed upload.
- If you uploaded the wrong document, contact Evaluation Support.

**Common Failure Scenarios**

- Invalid or non-existent `subAccountRequestId`
- Subaccount request is already `Approved` or `Denied`
- Invalid `documentType` value
- Missing or invalid data URI prefix in `base64data`
- Unsupported MIME type
- Document slot already has a completed upload
- Non-admin user attempting to call the endpoint
- Subaccount request belongs to a different organization
- POA contact not found on the subaccount request

**Next Steps**

After uploading all three documents, use the `getpartnersubaccountrequeststatus` endpoint to check the status of the subaccount request.

Reference: https://partner.ninjatrader.com/eval/api/rest-api-endpoints/users/submit-partner-subaccount-document

## OpenAPI Specification

```yaml
openapi: 3.1.0
info:
  title: eval
  version: 1.0.0
paths:
  /customerApplication/submitpartnersubaccountdocument:
    post:
      operationId: submit-partner-subaccount-document
      summary: Submit Partner Subaccount Document
      description: >-
        ### Upload a document for a subaccount request.


        **Available to:** Organization administrators


        **Environments:** Production


        **Rate Limit:** 10 requests per hour with 30-second back-off penalty


        After creating a subaccount request, use this endpoint once per
        `documentType` to upload each of the three required documents.


        | Document | `documentType` |

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

        | Power of Attorney (POA) Form | `POAForm` |

        | Government ID | `Id` |

        | Proof of Address | `AddressVerificationFAFTA` |


        <Warning>**Warning:** This endpoint returns **HTTP 200** for successes
        **and** business errors. Always check the `errorText` field in the
        response body to determine whether the request succeeded or
        failed.</Warning>


        **subAccountRequestId**


        For `subAccountRequestId`, use the `requestId` returned from
        `createpartnersubaccountrequest`.


        **`base64data` Format**


        Documents are submitted inline as base64 data URIs. The `base64data`
        field must be a data URI with a supported MIME type prefix. The maximum
        field length is 8,388,608 characters (approximately 6 MB).


        ```

        data:<mime-type>;base64,<base64-encoded-content>

        ```


        Supported MIME types:

        - `application/pdf`

        - `text/plain`

        - `image/<file type>` (for example, `image/png` or `image/jpeg`)


        **Size Limits**


        - Maximum request body: 5 MB

        - Effective maximum file size: ~3.5 MB (base64 encoding adds ~33%
        overhead)

        - Filename length: 5-64 characters


        **Re-upload Behavior**


        - Each document slot can only be filled once. The API rejects re-uploads
        to slots that already have a completed upload.

        - If you uploaded the wrong document, contact Evaluation Support.


        **Common Failure Scenarios**


        - Invalid or non-existent `subAccountRequestId`

        - Subaccount request is already `Approved` or `Denied`

        - Invalid `documentType` value

        - Missing or invalid data URI prefix in `base64data`

        - Unsupported MIME type

        - Document slot already has a completed upload

        - Non-admin user attempting to call the endpoint

        - Subaccount request belongs to a different organization

        - POA contact not found on the subaccount request


        **Next Steps**


        After uploading all three documents, use the
        `getpartnersubaccountrequeststatus` endpoint to check the status of the
        subaccount request.
      tags:
        - subpackage_users
      parameters:
        - name: Authorization
          in: header
          description: Bearer authentication
          required: true
          schema:
            type: string
      responses:
        '200':
          description: SubmitPartnerSubAccountDocumentResponse
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SubmitPartnerSubAccountDocumentResponse'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SubmitPartnerSubAccountDocument'
servers:
  - url: https://live.tradovateapi.com/v1
    description: https://live.tradovateapi.com/v1
components:
  schemas:
    SubmitPartnerSubAccountDocumentDocumentType:
      type: string
      enum:
        - AMLBankStatement
        - AMLOwnFundsLetter
        - AccountReactivation
        - AchOther
        - AdditionalRiskDisclosure
        - AddressChangeVerification
        - AddressClarificationDocVsApplication
        - AddressClarificationDocVsConfirmedAV
        - AddressVerificationFAFTA
        - AddressVerificationLLC
        - AddressVerificationManagingMember
        - AmendmentApprovingFuturesTrading
        - AnnualIncomeAmount
        - ApplicationAndIDNameMismatch
        - ArticlesOfOrganization
        - BankSupportingDocument
        - BankruptcyDischargePaperwork
        - BeneficialOwnerCertification
        - CertificateOfGoodStanding
        - CompanyFinancials
        - ConfirmAccountInterest
        - ConfirmAffiliations
        - ConfirmFullName
        - ConfirmIRACustodian
        - ConfirmationOfDeposits
        - CorporateBylaws
        - CurrentBankStatement
        - DrivingLicense
        - EIN
        - EVS
        - EmployeeAttestationLetter
        - EmploymentDetails
        - EntityWebsite
        - FullTimeTrader
        - HedgeClarification
        - HighRiskApplicant
        - HomemakerIncome
        - IRACustody
        - Id
        - InvestmentType
        - LetterOfAwareness
        - LiquidNetWorthAmount
        - ManagingMemberId
        - NFARegistrationConfirmation
        - NatureOfEntity
        - NatureOfSelfEmployment
        - NetWorthAmount
        - OfferingCircular
        - OperatingAgreement
        - Other
        - OtherText
        - OwnFunds
        - POAForm
        - POBox
        - PartnershipDocuments
        - Passport
        - Professional
        - ResidentialAddressConfirmation
        - RetirementIncome
        - SSNMiskey
        - ShareholderRegister
        - SocialSecurityCard
        - SourceOfIncome
        - SourceOfRiskCapital
        - StatementOfGoodStanding
        - StudentIncome
        - ThirdPartyFunds
        - TradingAuthorityPOA
        - TrustDocuments
        - UnderstandingOfFuturesTrading
        - UnemployedIncome
        - UtilityBill
        - VerifyEmailAnotherName
        - VerifyEmailOwnership
        - VerifyEmailUsernameEntityWording
        - VerifyEmailUsernameFinancialWording
        - VerifyUsernameAnotherName
        - Visa
        - W8Clarification
        - W8Incomplete
        - W9
        - YearsOfTradingExperience
        - eSignBeneficialOwnerCertification
        - eSignEmployeeAttestationLetter
        - eSignMarketDataAgreement
        - eSignW9
      description: >-
        AMLBankStatement, AMLOwnFundsLetter, AccountReactivation, AchOther,
        AdditionalRiskDisclosure, AddressChangeVerification,
        AddressClarificationDocVsApplication,
        AddressClarificationDocVsConfirmedAV, AddressVerificationFAFTA,
        AddressVerificationLLC, AddressVerificationManagingMember,
        AmendmentApprovingFuturesTrading, AnnualIncomeAmount,
        ApplicationAndIDNameMismatch, ArticlesOfOrganization,
        BankSupportingDocument, BankruptcyDischargePaperwork,
        BeneficialOwnerCertification, CertificateOfGoodStanding,
        CompanyFinancials, ConfirmAccountInterest, ConfirmAffiliations,
        ConfirmFullName, ConfirmIRACustodian, ConfirmationOfDeposits,
        CorporateBylaws, CurrentBankStatement, DrivingLicense, EIN, EVS,
        EmployeeAttestationLetter, EmploymentDetails, EntityWebsite,
        FullTimeTrader, HedgeClarification, HighRiskApplicant, HomemakerIncome,
        IRACustody, Id, InvestmentType, LetterOfAwareness, LiquidNetWorthAmount,
        ManagingMemberId, NFARegistrationConfirmation, NatureOfEntity,
        NatureOfSelfEmployment, NetWorthAmount, OfferingCircular,
        OperatingAgreement, Other, OtherText, OwnFunds, POAForm, POBox,
        PartnershipDocuments, Passport, Professional,
        ResidentialAddressConfirmation, RetirementIncome, SSNMiskey,
        ShareholderRegister, SocialSecurityCard, SourceOfIncome,
        SourceOfRiskCapital, StatementOfGoodStanding, StudentIncome,
        ThirdPartyFunds, TradingAuthorityPOA, TrustDocuments,
        UnderstandingOfFuturesTrading, UnemployedIncome, UtilityBill,
        VerifyEmailAnotherName, VerifyEmailOwnership,
        VerifyEmailUsernameEntityWording, VerifyEmailUsernameFinancialWording,
        VerifyUsernameAnotherName, Visa, W8Clarification, W8Incomplete, W9,
        YearsOfTradingExperience, eSignBeneficialOwnerCertification,
        eSignEmployeeAttestationLetter, eSignMarketDataAgreement, eSignW9
      title: SubmitPartnerSubAccountDocumentDocumentType
    SubmitPartnerSubAccountDocument:
      type: object
      properties:
        subAccountRequestId:
          type: integer
          format: int64
        documentType:
          $ref: '#/components/schemas/SubmitPartnerSubAccountDocumentDocumentType'
          description: >-
            AMLBankStatement, AMLOwnFundsLetter, AccountReactivation, AchOther,
            AdditionalRiskDisclosure, AddressChangeVerification,
            AddressClarificationDocVsApplication,
            AddressClarificationDocVsConfirmedAV, AddressVerificationFAFTA,
            AddressVerificationLLC, AddressVerificationManagingMember,
            AmendmentApprovingFuturesTrading, AnnualIncomeAmount,
            ApplicationAndIDNameMismatch, ArticlesOfOrganization,
            BankSupportingDocument, BankruptcyDischargePaperwork,
            BeneficialOwnerCertification, CertificateOfGoodStanding,
            CompanyFinancials, ConfirmAccountInterest, ConfirmAffiliations,
            ConfirmFullName, ConfirmIRACustodian, ConfirmationOfDeposits,
            CorporateBylaws, CurrentBankStatement, DrivingLicense, EIN, EVS,
            EmployeeAttestationLetter, EmploymentDetails, EntityWebsite,
            FullTimeTrader, HedgeClarification, HighRiskApplicant,
            HomemakerIncome, IRACustody, Id, InvestmentType, LetterOfAwareness,
            LiquidNetWorthAmount, ManagingMemberId, NFARegistrationConfirmation,
            NatureOfEntity, NatureOfSelfEmployment, NetWorthAmount,
            OfferingCircular, OperatingAgreement, Other, OtherText, OwnFunds,
            POAForm, POBox, PartnershipDocuments, Passport, Professional,
            ResidentialAddressConfirmation, RetirementIncome, SSNMiskey,
            ShareholderRegister, SocialSecurityCard, SourceOfIncome,
            SourceOfRiskCapital, StatementOfGoodStanding, StudentIncome,
            ThirdPartyFunds, TradingAuthorityPOA, TrustDocuments,
            UnderstandingOfFuturesTrading, UnemployedIncome, UtilityBill,
            VerifyEmailAnotherName, VerifyEmailOwnership,
            VerifyEmailUsernameEntityWording,
            VerifyEmailUsernameFinancialWording, VerifyUsernameAnotherName,
            Visa, W8Clarification, W8Incomplete, W9, YearsOfTradingExperience,
            eSignBeneficialOwnerCertification, eSignEmployeeAttestationLetter,
            eSignMarketDataAgreement, eSignW9
        filename:
          type: string
        base64data:
          type: string
      required:
        - subAccountRequestId
        - documentType
        - filename
        - base64data
      title: SubmitPartnerSubAccountDocument
    SubmitPartnerSubAccountDocumentResponse:
      type: object
      properties:
        errorText:
          type: string
          description: Non-empty if the request failed
        documentId:
          type: integer
          format: int64
      title: SubmitPartnerSubAccountDocumentResponse
  securitySchemes:
    bearer_access_token:
      type: http
      scheme: bearer

```

## Examples



**Request**

```json
{
  "subAccountRequestId": 1,
  "documentType": "AMLBankStatement",
  "filename": "string",
  "base64data": "string"
}
```

**Response**

```json
{
  "errorText": "string",
  "documentId": 1
}
```

**SDK Code**

```python
import requests

url = "https://live.tradovateapi.com/v1/customerApplication/submitpartnersubaccountdocument"

payload = {
    "subAccountRequestId": 1,
    "documentType": "AMLBankStatement",
    "filename": "string",
    "base64data": "string"
}
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/customerApplication/submitpartnersubaccountdocument';
const options = {
  method: 'POST',
  headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
  body: '{"subAccountRequestId":1,"documentType":"AMLBankStatement","filename":"string","base64data":"string"}'
};

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/customerApplication/submitpartnersubaccountdocument"

	payload := strings.NewReader("{\n  \"subAccountRequestId\": 1,\n  \"documentType\": \"AMLBankStatement\",\n  \"filename\": \"string\",\n  \"base64data\": \"string\"\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/customerApplication/submitpartnersubaccountdocument")

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  \"subAccountRequestId\": 1,\n  \"documentType\": \"AMLBankStatement\",\n  \"filename\": \"string\",\n  \"base64data\": \"string\"\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/customerApplication/submitpartnersubaccountdocument")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("{\n  \"subAccountRequestId\": 1,\n  \"documentType\": \"AMLBankStatement\",\n  \"filename\": \"string\",\n  \"base64data\": \"string\"\n}")
  .asString();
```

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

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://live.tradovateapi.com/v1/customerApplication/submitpartnersubaccountdocument', [
  'body' => '{
  "subAccountRequestId": 1,
  "documentType": "AMLBankStatement",
  "filename": "string",
  "base64data": "string"
}',
  'headers' => [
    'Authorization' => 'Bearer <token>',
    'Content-Type' => 'application/json',
  ],
]);

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

```csharp
using RestSharp;

var client = new RestClient("https://live.tradovateapi.com/v1/customerApplication/submitpartnersubaccountdocument");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer <token>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"subAccountRequestId\": 1,\n  \"documentType\": \"AMLBankStatement\",\n  \"filename\": \"string\",\n  \"base64data\": \"string\"\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift
import Foundation

let headers = [
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
]
let parameters = [
  "subAccountRequestId": 1,
  "documentType": "AMLBankStatement",
  "filename": "string",
  "base64data": "string"
] as [String : Any]

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

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