> For clean Markdown of any page, append .md to the page URL. > For a complete documentation index, see https://partner.ninjatrader.com/connect/api/rest-api-endpoints/users/submit-customer-application-document/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://demo.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](/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`](/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`](/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:;base64, ``` Supported MIME types: * `application/pdf` * `text/plain` * `image/` (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`](/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`](/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`](/api/rest-api-endpoints/users/start-customer-application), then continue the flow with [`prepareAgreementDocuments`](/api/rest-api-endpoints/users/prepare-agreement-documents). Reference: https://partner.ninjatrader.com/connect/api/rest-api-endpoints/users/submit-customer-application-document ## Authentication - `Authorization` header (bearer token, required) — Bearer authentication of the form `Bearer `, 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://demo.tradovateapi.com/v1/customerApplication/submitcustomerapplicationdocument" payload = { "process": "AML_FPV", "documentType": "AMLBankStatement", "filename": "string", "base64data": "string" } headers = { "Authorization": "Bearer ", "Content-Type": "application/json" } response = requests.post(url, json=payload, headers=headers) print(response.json()) ``` ```javascript const url = 'https://demo.tradovateapi.com/v1/customerApplication/submitcustomerapplicationdocument'; const options = { method: 'POST', headers: {Authorization: 'Bearer ', '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://demo.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 ") 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://demo.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 ' 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 response = Unirest.post("https://demo.tradovateapi.com/v1/customerApplication/submitcustomerapplicationdocument") .header("Authorization", "Bearer ") .header("Content-Type", "application/json") .body("{\n \"process\": \"AML_FPV\",\n \"documentType\": \"AMLBankStatement\",\n \"filename\": \"string\",\n \"base64data\": \"string\"\n}") .asString(); ``` ```php request('POST', 'https://demo.tradovateapi.com/v1/customerApplication/submitcustomerapplicationdocument', [ 'body' => '{ "process": "AML_FPV", "documentType": "AMLBankStatement", "filename": "string", "base64data": "string" }', 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/json', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://demo.tradovateapi.com/v1/customerApplication/submitcustomerapplicationdocument"); var request = new RestRequest(Method.POST); request.AddHeader("Authorization", "Bearer "); 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 ", "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://demo.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() ```