Skip to main content

Endpoint

Required Fields

The minimum required fields to create an account are: contact (email, address, city, state, postal code); identity (first name, last name, date of birth, SSN/tax ID); investment_profile (risk tolerance, investment objective, income and net worth ranges). All other fields are optional but may be required for specific account types or trading features.

Full Request Schema

contact object

identity object

disclosures object

Regulatory disclosures required by FINRA. All fields default to false if omitted: is_control_person, control_person_company_name, is_affiliated_exchange_or_finra, is_spouse_affiliated_finra, is_politically_exposed, immediate_family_exposed.

agreements array

Each agreement must be captured with a timestamp and optionally IP address. The customer_agreement is required for all accounts; margin_agreement is required if margin_enabled = true; options_agreement is required if requested_option_level > 0.

investment_profile object

Required: risk_tolerance (conservative/moderate/aggressive), investment_objective (growth/income/speculation/preservation), annual_income_range, net_worth_range, liquid_net_worth_range. Optional: liquidity_needs (low/medium/high), time_horizon (short/medium/long), years_trading_stocks, years_trading_options, stock_experience, options_experience, income_source, funds_source, investment_plan.

trading_configurations object (optional)

margin_enabled (requires margin_agreement); short_selling_enabled. Options access is requested via the top-level requested_option_level field (0–4, 0 = no options); the granted level is decided by the approval engine, never by the partner.

documents array (identity verification documents)

Government ID image(s) used for identity verification, submitted alongside the application. Each entry is one base64-encoded image: A passport requires one entry; id_card and drivers_license require two entries (one front, one back).

Other optional top-level fields

account_type (individual default, joint, ira_traditional, ira_roth, or custodial), trusted_contact, employment, mailing_address, joint_owner (required when account_type is joint), requested_option_level, dividend_reinvestment, discretionary_account, registered_rep_code, advisor_code, corr_metadata (freeform, up to 255 chars).

Identity Document Verification

Identity documents are verified through Buildmarkets’s KYC process before the account is booked on the clearing system. Both US applicants (tax_id_type of USA_SSN or USA_EIN) and non-US applicants (tax_id_type of FIN) go through the same document-based identity verification. The flow is simple from your perspective: include the government ID image(s) in the documents array of POST /v1/accounts. The account is persisted immediately with status SUBMITTED while the documents go through KYC review. Once the review passes, Buildmarkets automatically submits the application to the clearing system, which runs CIP screening (KYC + OFAC watchlist) and activates the account. Track progress via the status and kyc_status fields or webhooks. If a verification is rejected or cannot complete, the account moves to ACTION_REQUIRED. You can resubmit new document images via PATCH /v1/accounts/{accountId} with a fresh documents array, which re-runs identity verification. Once a user has passed document verification on any account, additional accounts opened for that user via POST /v1/users/{userId}/accounts skip document verification entirely — the existing approval carries over.

Complete Example Request

Response

On success, returns 201 Created with the full AccountResponse object including the generated id, the owning user_id, and initial status.
Note: Newly created accounts start in SUBMITTED status while identity documents go through KYC review. account_number is null until the account is booked on the clearing system after verification passes. KYC processing typically completes in seconds to minutes, but some accounts require manual review (action_required).

Handling KYC Outcomes

Use Webhooks to receive real-time notifications when an account’s status or kyc_status changes. Subscribe to the account.updated event and check the new status in the payload. Alternatively, poll GET /v1/accounts/{accountId} and check kyc_status until it reaches approved or rejected.

Common Validation Errors

Next Steps

  • Account Statuses — Full state machine and transitions
  • Balances & Positions — Reading portfolio data after the account is ACTIVE
  • Funding Overview — Link a bank account and make a deposit

Uploading Documents

Important: The only document upload that drives identity verification is the documents array (identity verification documents) submitted with POST /v1/accounts at account creation, or resubmitted via PATCH /v1/accounts/{accountId} when an account is in ACTION_REQUIRED.
The document upload endpoint is intended for submitting compliance and identity documents directly to a Buildmarkets brokerage account during ongoing account maintenance. Live processing of these uploads is not yet available.

Endpoint


Upload a document

Accepts a Base64-encoded file along with its document type classification. The platform processes the upload and associates it with the account for compliance review.

POST /v1/accounts/{accountId}/documents/upload

Path parameters
Request body
Supported document_type values
Response
Returns 204 No Content on success. No body is returned.

Example requests

Identity verification — passport (image)

Address verification — utility bill (PDF)

W-8BEN — JSON form data

The w8ben document type accepts form data as a JSON object in content_data rather than a Base64-encoded file. The structure mirrors the IRS W-8BEN form fields.

Response


File size and format limits

Tip: If you’re encoding in JavaScript, use Buffer.from(fileBuffer).toString('base64'). In Python, use base64.b64encode(file_bytes).decode('utf-8').

Common errors


Next steps

Updated 3 months ago