- Deposits (
POST .../funding/deposits) — pull funds from the bank into the brokerage account - Withdrawals (
POST .../funding/withdrawals) — push settled cash from the brokerage account back to the bank
"1000.00").
Transfer lifecycle
All deposits and withdrawals progress through the same status states. You can track these via the Funding Activity endpoints or by listening to webhook events.| Status | Description |
|---|---|
PENDING | Transfer has been submitted and is awaiting ACH initiation |
QUEUED | Transfer has been queued for the next ACH batch |
SENT | Transfer has been sent to the ACH network and is in transit |
SETTLED | Funds have successfully moved; transfer is complete |
RETURNED | The ACH transfer was returned by the bank (e.g., NSF, closed account) |
CANCELLED | Transfer was cancelled before clearing |
Settlement timing: “Standard ACH deposits typically settle in 1–3 business days. Buildmarkets may apply instant buying power for deposits up to a configured limit, allowing users to trade before funds fully settle.”
Endpoints
| Method | Path | Description |
|---|---|---|
POST | /v1/accounts/{accountId}/funding/deposits | Initiate an ACH deposit into the brokerage account |
POST | /v1/accounts/{accountId}/funding/withdrawals | Initiate an ACH withdrawal from the brokerage account |
Initiate a deposit
Pulls funds from the user’s external bank account into their Buildmarkets brokerage account. The specified ACH relationship must be inAPPROVED status.
POST /v1/accounts/{accountId}/funding/deposits
Path parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
accountId | string (UUID) | ✅ | The Buildmarkets account to deposit funds into |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
ach_relationship_id | string (UUID) | ✅ | ID of an APPROVED ACH relationship to pull funds from |
amount | string | ✅ | Dollar amount to deposit. Must match pattern ^\d+\.\d{2}$ (e.g., "1000.00") |
description | string | ❌ | Optional memo visible in funding activity (e.g., "Initial deposit") |
Response body (201 Created)
| Field | Type | Description |
|---|---|---|
id | string (UUID) | Unique identifier for this funding activity record |
account_id | string (UUID) | The Buildmarkets account receiving the funds |
ach_relationship_id | string (UUID) | The ACH relationship used for this transfer |
type | string | DEPOSIT |
amount | string | Dollar amount transferred (e.g., "1000.00") |
status | string | Initial status: PENDING |
description | string | null | Memo provided at creation |
created_at | string (ISO 8601) | Timestamp when the deposit was initiated |
updated_at | string (ISO 8601) | Timestamp of the last status change |
settled_at | string (ISO 8601) | null | Timestamp when funds fully settled; null until SETTLED |
Example request
Example response
Initiate a withdrawal
Pushes settled cash from the user’s Buildmarkets brokerage account back to their external bank account. Only settled cash can be withdrawn — unsettled funds from recent trades or pending deposits are not eligible.POST /v1/accounts/{accountId}/funding/withdrawals
Path parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
accountId | string (UUID) | ✅ | The Buildmarkets account to withdraw funds from |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
ach_relationship_id | string (UUID) | ✅ | ID of an APPROVED ACH relationship to push funds to |
amount | string | Conditional | Dollar amount to withdraw. Required unless withdraw_full_balance is true. Pattern: ^\d+\.\d{2}$ |
withdraw_full_balance | boolean | ❌ | If true, withdraws the entire settled cash balance. Omit amount when using this flag |
description | string | ❌ | Optional memo (e.g., "Monthly withdrawal") |
fee_amount | string | ❌ | Optional processing fee to deduct in addition to amount. Pattern: ^\d+\.\d{2}$ |
IRA-specific fields
For IRA accounts, additional fields are required to classify the distribution for tax reporting purposes.| Field | Type | Required for IRA | Description |
|---|---|---|---|
ira_distribution_type | string | ✅ | Classification of the IRA distribution (e.g., "NORMAL", "PREMATURE") |
ira_tax_code | string | ✅ | IRS tax code for the distribution |
ira_year | integer | ✅ | Tax year to attribute the distribution to (e.g., 2026) |
ira_federal_withholding | string | ❌ | Federal income tax withholding amount. Pattern: ^\d+\.\d{2}$ |
ira_state_withholding | string | ❌ | State income tax withholding amount. Pattern: ^\d+\.\d{2}$ |
ira_state | string | ❌ | 2-letter state code for withholding (e.g., "TX"). Required if ira_state_withholding is set |
Response body (201 Created)
| Field | Type | Description |
|---|---|---|
id | string (UUID) | Unique identifier for this funding activity record |
account_id | string (UUID) | The Buildmarkets account funds are being withdrawn from |
ach_relationship_id | string (UUID) | The ACH relationship receiving the funds |
type | string | WITHDRAWAL |
amount | string | Dollar amount withdrawn (e.g., "500.00") |
fee_amount | string | null | Fee amount if provided |
status | string | Initial status: PENDING |
description | string | null | Memo provided at creation |
created_at | string (ISO 8601) | Timestamp when the withdrawal was initiated |
updated_at | string (ISO 8601) | Timestamp of the last status change |
settled_at | string (ISO 8601) | null | Timestamp when funds settled at the destination bank |
Example request — standard withdrawal
Example response
Example request — withdraw full balance
Example request — IRA distribution
Common errors
| HTTP Status | Error | Cause |
|---|---|---|
400 | INVALID_AMOUNT | Amount does not match the ^\d+\.\d{2}$ pattern, or is zero |
400 | AMOUNT_REQUIRED | Neither amount nor withdraw_full_balance was provided |
400 | INVALID_IRA_FIELDS | IRA distribution fields are incomplete or contain invalid values |
404 | ACCOUNT_NOT_FOUND | The accountId does not exist or is inaccessible |
404 | ACH_RELATIONSHIP_NOT_FOUND | The ach_relationship_id does not exist for this account |
409 | ACH_RELATIONSHIP_NOT_APPROVED | The referenced ACH relationship is not in APPROVED status |
422 | INSUFFICIENT_FUNDS | Withdrawal amount exceeds settled cash balance |
422 | ACCOUNT_NOT_ACTIVE | The Buildmarkets account is not in ACTIVE status |
Webhook events
Subscribe to these events to track transfer status in real time without polling.| Event | Fired when |
|---|---|
funding.deposit.pending | Deposit has been accepted and is queued for ACH |
funding.deposit.settled | Deposit has fully cleared and funds are available |
funding.deposit.returned | Deposit was returned by the bank |
funding.withdrawal.pending | Withdrawal has been accepted and is queued for ACH |
funding.withdrawal.settled | Withdrawal has fully cleared at the destination bank |
funding.withdrawal.returned | Withdrawal was returned by the bank |
Next steps
- Funding Activity → — Query and filter the history of all transfers on an account
- ACH Relationships → — Set up the bank link required before initiating transfers
- Webhooks Overview → — Receive real-time notifications as transfer status changes
Funding Activity
The funding activity endpoints provide a comprehensive, auditable record of all ACH transfers on a brokerage account—including deposits, withdrawals, fees, and bank returns. These tools enable transaction history interfaces, account reconciliation, and transfer status investigation.Available Endpoints
Two primary endpoints exist:- List all funding activity:
GET /v1/accounts/{accountId}/funding/activity - Retrieve single record:
GET /v1/accounts/{accountId}/funding/activity/{activityId}
Listing Funding Activity
The list endpoint returns paginated results ordered by most recent first. Required parameters include the account UUID. Optional query filters include:status: Transfer state (PENDING, QUEUED, SENT, SETTLED, RETURNED, CANCELLED)type: DEPOSIT or WITHDRAWALstart_dateandend_date: ISO 8601 date rangespageandper_page: Pagination controls (default 25, max 100 per page)
Single Record Retrieval
This endpoint accepts an account ID and activity ID, returning complete details about that specific transfer—particularly useful for checking current status or examining return codes for rejected transfers.ACH Return Codes
The system uses standard NACHA codes when transfers are rejected. Common examples include:- “R01” (Insufficient Funds)
- “R02” (Account Closed)
- “R03” (No Account/Unable to Locate)
- “R10” (Customer Claims Unauthorized)
funding.deposit.returned or funding.withdrawal.returned) notify applications when transfers fail, including both code and human-readable explanation.