Skip to main content
An ACATS transfer moves a customer’s holdings from another US broker-dealer into their Buildmarkets account through the NSCC’s Automated Customer Account Transfer Service. Use it when a customer already holds positions elsewhere and wants to consolidate them with you, rather than selling and re-buying. Buildmarkets supports incoming, full-account transfers:
  • Incoming — assets are pulled into a Buildmarkets account from the delivering firm.
  • Full — the whole account moves, and the account at the delivering firm is closed.
ACATS transfers are only supported on self-directed accounts. Initiating a transfer on a managed account returns 400 ACAT_NOT_ALLOWED_FOR_MANAGED.

Endpoints

Transfer lifecycle

There are no webhook events for ACATS transfers. Poll GET /v1/accounts/{accountId}/acats/{acatId} to track progress.

1. Choose the delivering firm

The transfer needs the delivering firm’s DTC/NSCC participant number. GET /v1/acats/brokers returns common firms so you can build a picker in your UI.
This list is a convenience, not an allowlist. The initiate endpoint accepts any valid DTC number, so let customers enter one manually if their firm is not listed.

2. Initiate the transfer

POST /v1/accounts/{accountId}/acats/incoming
Supplying account_holder_name and tax_id exactly as they appear at the delivering firm reduces the chance of a rejection for mismatched details.
Response (201 Created):

3. Track the transfer

List every incoming transfer on an account:
Or fetch one transfer by its id:
The response has the same shape as the 201 response above.

Testing in sandbox

In sandbox, a transfer’s status advances automatically based on how long ago it was created, so you can build and test your polling loop without waiting on real settlement: Sandbox transfers always settle. To test your handling of rejected, simulate that state in your own code.

Common errors

Next steps