> This page is for NT Prop.

> 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 Customer Application Document

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

### Upload a document for a customer application.

**Available to:** All authenticated users

**Environments:** Live

**[Rate Limit](/prop/overview/core-concepts/rate-limits):** 750 requests per hour, 30-second back-off, counts all requests

Use this endpoint to upload a document for a customer application or compliance workflow. The `process` field determines which workflow the document belongs to, and the `documentType` field specifies the type of document being submitted.

By default, the document is uploaded for the calling user. To upload on behalf of another user, set `userId`. When `process` is `SubAccountRequest`, this requires the caller to be an organization administrator; for all other processes, it requires an organization administrator with business-to-business account-opening (B2B AOP) permission.

A successful request returns a `documentId`. Store this value for reference in subsequent API calls.

**Uploading Documents Before a Subaccount Request**

Organization administrators can use this endpoint to upload documents before submitting a subaccount request. Set `process` to `SubAccountRequest` and set `userId` to the CTA user ID of the trader the subaccount is for.

Upload each document separately by calling this endpoint three times (once per document type).

| Document                     | `documentType`             | [`createPartnerSubAccountRequest`](/prop/api/rest-api-endpoints/users/create-partner-subaccount-request) field |
| ---------------------------- | -------------------------- | -------------------------------------------------------------------------------------------------------------- |
| Power of Attorney (POA) Form | `POAForm`                  | `pOAFormDocId`                                                                                                 |
| Government ID                | `Id`                       | `governmentDocId`                                                                                              |
| Proof of Address             | `AddressVerificationFAFTA` | `addressDocId`                                                                                                 |

After collecting all three `documentId` values, pass them to [`createPartnerSubAccountRequest`](/prop/api/rest-api-endpoints/users/create-partner-subaccount-request) as `pOAFormDocId`, `governmentDocId`, and `addressDocId`.

**`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`)

**Process Types**

| Value               | Description                                                                                                                                                                                                                                                                            |
| ------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `Identity`          | Used during new account onboarding when users need to upload identity documents for Know Your Customer (KYC) verification. Documents are processed for automated identity verification.                                                                                                |
| `NFA`               | Used for uploading documents related to National Futures Association (NFA) registration and compliance requirements.                                                                                                                                                                   |
| `Bankruptcy`        | Used when applicants need to provide bankruptcy discharge paperwork or related documentation.                                                                                                                                                                                          |
| `Watchlist`         | Used for uploading documentation related to watchlist and sanctions screening.                                                                                                                                                                                                         |
| `Compliance`        | General compliance document uploads requested by the compliance team during application review.                                                                                                                                                                                        |
| `AML_FPV`           | Anti-Money Laundering (AML) and fraud prevention verification documents, including bank statements and source of funds documentation.                                                                                                                                                  |
| `SubAccountRequest` | Used to pre-upload documents for subaccount requests. Returns `documentId` values that can be passed to [`createPartnerSubAccountRequest`](/prop/api/rest-api-endpoints/users/create-partner-subaccount-request) via the `pOAFormDocId`, `governmentDocId`, and `addressDocId` fields. |

**Document Types**

This endpoint supports 86 document types. Use the `documentType` field to specify the type of document you are uploading.

**Identity Documents**

| Value                          | Description                                            |
| ------------------------------ | ------------------------------------------------------ |
| `DrivingLicense`               | Driver's license                                       |
| `Passport`                     | Passport                                               |
| `Id`                           | Government-issued ID                                   |
| `Visa`                         | Visa document                                          |
| `SocialSecurityCard`           | Social Security card                                   |
| `SSNMiskey`                    | Social Security Number correction or clarification     |
| `ConfirmFullName`              | Full name confirmation                                 |
| `ApplicationAndIDNameMismatch` | Name mismatch clarification between application and ID |

**Address Verification**

| Value                                  | Description                                            |
| -------------------------------------- | ------------------------------------------------------ |
| `UtilityBill`                          | Utility bill                                           |
| `AddressVerificationFAFTA`             | Proof of residential address                           |
| `CurrentBankStatement`                 | Current bank statement for address verification        |
| `AddressChangeVerification`            | Address change verification                            |
| `POBox`                                | P.O. Box documentation                                 |
| `AddressClarificationDocVsApplication` | Address clarification (document vs. application)       |
| `AddressClarificationDocVsConfirmedAV` | Address clarification (document vs. confirmed address) |
| `AddressVerificationLLC`               | LLC address verification                               |
| `AddressVerificationManagingMember`    | Managing member address verification                   |

**Income and Financial**

| Value                    | Description                          |
| ------------------------ | ------------------------------------ |
| `SourceOfIncome`         | Source of income documentation       |
| `AnnualIncomeAmount`     | Annual income documentation          |
| `NetWorthAmount`         | Net worth documentation              |
| `LiquidNetWorthAmount`   | Liquid net worth documentation       |
| `StudentIncome`          | Student income documentation         |
| `RetirementIncome`       | Retirement income documentation      |
| `HomemakerIncome`        | Homemaker income documentation       |
| `UnemployedIncome`       | Unemployment income documentation    |
| `OwnFunds`               | Own funds documentation              |
| `ThirdPartyFunds`        | Third-party funds documentation      |
| `ConfirmationOfDeposits` | Confirmation of deposits             |
| `SourceOfRiskCapital`    | Source of risk capital documentation |
| `InvestmentType`         | Investment type documentation        |
| `CompanyFinancials`      | Company financial documents          |
| `BankSupportingDocument` | Supporting bank documentation        |
| `FullTimeTrader`         | Full-time trader documentation       |

**Trading and Authorization**

| Value                              | Description                               |
| ---------------------------------- | ----------------------------------------- |
| `TradingAuthorityPOA`              | Trading authority Power of Attorney (POA) |
| `POAForm`                          | POA form (used for subaccount requests)   |
| `AdditionalRiskDisclosure`         | Additional risk disclosure                |
| `UnderstandingOfFuturesTrading`    | Understanding of futures trading          |
| `AccountReactivation`              | Account reactivation documentation        |
| `YearsOfTradingExperience`         | Trading experience documentation          |
| `Professional`                     | Professional trader documentation         |
| `ConfirmAccountInterest`           | Account interest confirmation             |
| `ConfirmAffiliations`              | Affiliations confirmation                 |
| `AmendmentApprovingFuturesTrading` | Amendment approving futures trading       |

**Tax and Regulatory**

| Value                         | Description                                                |
| ----------------------------- | ---------------------------------------------------------- |
| `W8Clarification`             | W-8 form clarification                                     |
| `W8Incomplete`                | Incomplete W-8 form documentation                          |
| `W9`                          | W-9 tax form                                               |
| `HedgeClarification`          | Hedge account clarification                                |
| `NFARegistrationConfirmation` | NFA registration confirmation                              |
| `EIN`                         | Employer Identification Number (EIN) documentation         |
| `EmployeeAttestationLetter`   | Employee attestation letter                                |
| `NatureOfSelfEmployment`      | Nature of self-employment documentation                    |
| `EmploymentDetails`           | Employment details documentation                           |
| `NatureOfEntity`              | Nature of entity documentation                             |
| `ConfirmIRACustodian`         | Individual Retirement Account (IRA) custodian confirmation |
| `IRACustody`                  | IRA custody documentation                                  |

**Business and Corporate**

| Value                          | Description                    |
| ------------------------------ | ------------------------------ |
| `LetterOfAwareness`            | Letter of awareness            |
| `OfferingCircular`             | Offering circular              |
| `OperatingAgreement`           | Operating agreement            |
| `ArticlesOfOrganization`       | Articles of organization       |
| `StatementOfGoodStanding`      | Statement of good standing     |
| `CertificateOfGoodStanding`    | Certificate of good standing   |
| `CorporateBylaws`              | Corporate bylaws               |
| `ManagingMemberId`             | Managing member ID             |
| `ShareholderRegister`          | Shareholder register           |
| `BeneficialOwnerCertification` | Beneficial owner certification |
| `TrustDocuments`               | Trust documents                |
| `PartnershipDocuments`         | Partnership documents          |
| `EntityWebsite`                | Entity website documentation   |

**Compliance and AML**

| Value                          | Description                       |
| ------------------------------ | --------------------------------- |
| `AMLBankStatement`             | AML bank statement                |
| `AMLOwnFundsLetter`            | AML own funds letter              |
| `BankruptcyDischargePaperwork` | Bankruptcy discharge paperwork    |
| `EVS`                          | EVS verification document         |
| `HighRiskApplicant`            | High-risk applicant documentation |

**Email and Identity Verification**

| Value                                 | Description                                                 |
| ------------------------------------- | ----------------------------------------------------------- |
| `VerifyEmailOwnership`                | Email ownership verification                                |
| `VerifyEmailAnotherName`              | Email verification for an account under a different name    |
| `VerifyUsernameAnotherName`           | Username verification for an account under a different name |
| `VerifyEmailUsernameFinancialWording` | Email or username verification (financial wording)          |
| `VerifyEmailUsernameEntityWording`    | Email or username verification (entity wording)             |

**eSign Documents**

| Value                               | Description                                          |
| ----------------------------------- | ---------------------------------------------------- |
| `eSignW9`                           | Electronically signed W-9                            |
| `eSignBeneficialOwnerCertification` | Electronically signed beneficial owner certification |
| `eSignEmployeeAttestationLetter`    | Electronically signed employee attestation letter    |
| `eSignMarketDataAgreement`          | Electronically signed market data agreement          |

**Other**

| Value       | Description                                     |
| ----------- | ----------------------------------------------- |
| `Other`     | Other document type                             |
| `OtherText` | Other document with text description            |
| `AchOther`  | Automated Clearing House (ACH)-related document |

**Common Failure Scenarios**

* `filename` is fewer than five or more than 64 characters
* `base64data` exceeds the maximum allowed size (\~6 MB)
* `userId` is provided but is not greater than zero
* `customerApplicationId` is provided but is not greater than zero
* `userId` belongs to another user, but the caller lacks the required permission: organization administrator for `SubAccountRequest` uploads, or B2B AOP permission for all other processes
* Invalid `process` value
* Invalid `documentType` value
* `base64data` is missing the data URI prefix or uses an unsupported MIME type

**Next Steps**

For the subaccount use case, after uploading all three documents, pass the returned `documentId` values to [`createPartnerSubAccountRequest`](/prop/api/rest-api-endpoints/users/create-partner-subaccount-request) as `pOAFormDocId`, `governmentDocId`, and `addressDocId`.

For the customer application use case, upload documents against the application started with `startCustomerApplication`, then continue the flow with `prepareAgreementDocuments`.

Reference: https://partner.ninjatrader.com/prop/api/rest-api-endpoints/users/submit-customer-application-document

## Authentication

- `Authorization` header (bearer token, required) — Bearer authentication of the form `Bearer <token>`, where token is your auth token.

## Request

### Body (application/json)

This endpoint expects a SubmitCustomerApplicationDocument.

- `process` (enum, required) — AML_FPV, Bankruptcy, Compliance, Identity, NFA, SubAccountRequest, Watchlist
  - Allowed values: `AML_FPV`, `Bankruptcy`, `Compliance`, `Identity`, `NFA`, `SubAccountRequest`, `Watchlist`
- `documentType` (enum, required) — 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
  - Allowed values: `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` (string, required)
- `base64data` (string, required)
- `userId` (long, optional)
- `personType` (enum, optional) — Applicant, EntityOpener, EntityResponsiblePerson, EntityStakeholder1, EntityStakeholder2, JointApplicant, JointThirdPartyPerson, SubAccount, ThirdPartyPerson
  - Allowed values: `Applicant`, `EntityOpener`, `EntityResponsiblePerson`, `EntityStakeholder1`, `EntityStakeholder2`, `JointApplicant`, `JointThirdPartyPerson`, `SubAccount`, `ThirdPartyPerson`
- `customerApplicationId` (long, optional)

## Response

### 200

SubmitCustomerApplicationDocumentResponse

- `ok` (boolean, required)
- `errorText` (string, optional) — Non-empty if the request failed
- `documentId` (long, optional)

## Examples

**Request**

```json
{
  "process": "AML_FPV",
  "documentType": "AMLBankStatement",
  "filename": "string",
  "base64data": "string"
}
```

**Response**

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

**SDK Code**

```python
import requests

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

payload = {
    "process": "AML_FPV",
    "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/submitcustomerapplicationdocument';
const options = {
  method: 'POST',
  headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
  body: '{"process":"AML_FPV","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/submitcustomerapplicationdocument"

	payload := strings.NewReader("{\n  \"process\": \"AML_FPV\",\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/submitcustomerapplicationdocument")

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  \"process\": \"AML_FPV\",\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/submitcustomerapplicationdocument")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("{\n  \"process\": \"AML_FPV\",\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/submitcustomerapplicationdocument', [
  'body' => '{
  "process": "AML_FPV",
  "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/submitcustomerapplicationdocument");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer <token>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"process\": \"AML_FPV\",\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 = [
  "process": "AML_FPV",
  "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/submitcustomerapplicationdocument")! 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()
```