Onboarding a Trust Entity
Overview
A Trust Entity is a trust (including an Australian Self-Managed Super Fund) opening a DriveWealth
trading account. This is type: TRUST on the Entities API. See Creating an entity if you're not sure this is the one you need — a corporation, LLC, or partnership uses Onboarding a Business Entity instead.
Create the entity
curl -X POST https://bo-api.drivewealth.io/back-office/entities \
-H "Authorization: Bearer $DW_BEARER_TOKEN" \
-H "dw-client-app-key: $DW_APP_KEY" \
-H "Content-Type: application/json" \
-d '{
"ibID": "80f9b672-120d-4b73-9cc9-42fb3262c4b9",
"type": "TRUST",
"attributes": {
"name": "Wise Family Trust",
"incorporationCountry": "USA",
"incorporationProvince": "NJ",
"incorporationDate": "2014-09-29"
},
"identifications": {
"ssn": "891234589"
},
"contact": {
"addresses": {
"primary": {
"street1": "15 Exchange Place",
"street2": "Unit 1100",
"city": "Jersey City",
"province": "NJ",
"zipcode": "07302",
"country": "USA"
}
},
"phone": "+12025550149",
"email": "[email protected]"
},
"disclosures": {
"termsOfUse": {
"agreed": true,
"signedBy": "Justin Case",
"signedWhen": "2026-09-08T19:00:00Z"
},
"customerAgreement": {
"agreed": true,
"signedBy": "Justin Case",
"signedWhen": "2026-09-08T19:00:00Z"
},
"rule14b": {
"agreed": true,
"signedBy": "Justin Case",
"signedWhen": "2026-09-08T19:00:00Z"
}
}
}'Required top-level: ibID, type, attributes (needs name + incorporationCountry),
identifications, contact (needs addresses, phone, email).
subType is optional for TRUST — the only valid value is SMSF (Australian Self-Managed Super
Fund); omit it entirely for a standard trust.
identifications.ssn here is documented as "Social Security Number of the grantor for trust entity"
(9 digits, no hyphens) — the trust's own tax identification, distinct from any grantor User you create in
step 3.
disclosuresis optional per the schema, but required in practice before you can open the trust
Account. Skipping it here (or via a laterPATCH /entities/{entityId}) makes step 5'sPOST /accountsfail withU040:"Missing/Incomplete documents: [Document: DISCLOSURES - Missing fields: [ termsOfUse rule14b customerAgreement signedBy ] ]". SendtermsOfUse,customerAgreement, andrule14bup front — each needsagreed,signedBy, andsignedWhen.
Response — 201
{
"id": "ded54b83-f6e4-4086-a745-f5366f376a57",
"ibID": "80f9b672-120d-4b73-9cc9-42fb3262c4b9",
"wlpID": "DW",
"type": "TRUST",
"attributes": {
"name": "Wise Family Trust",
"incorporationCountry": "USA",
"incorporationProvince": "NJ",
"incorporationDate": "2014-09-29"
},
"identifications": {
"SSN": "****4589"
},
"contact": {
"addresses": {
"PRIMARY": {
"street1": "15 Exchange Place",
"street2": "Unit 1100",
"city": "Jersey City",
"province": "NJ",
"zipcode": "07302",
"country": "USA"
}
},
"phone": "+12025550149",
"email": "[email protected]"
},
"disclosures": {
"termsOfUse": {
"agreed": true,
"signedBy": "Justin Case",
"signedWhen": "2026-09-08T19:00:00Z"
},
"customerAgreement": {
"agreed": true,
"signedBy": "Justin Case",
"signedWhen": "2026-09-08T19:00:00Z"
},
"rule14b": {
"agreed": true,
"signedBy": "Justin Case",
"signedWhen": "2026-09-08T19:00:00Z"
}
},
"kyb": {
"status": "KYB_APPROVED",
"statusWhen": "2026-09-08T19:51:27.096759860Z",
"statusBy": "SYSTEM",
"reasons": [
{
"code": "D201",
"description": "KYB has been auto-approved by the system for a no-KYB partner."
}
]
},
"tax": {
"status": "TAX_READY",
"message": "Entity is ready for tax processing"
},
"status": "PENDING",
"createdAt": "2026-09-08T19:51:27.097114180Z",
"updatedAt": "2026-09-08T19:51:27.097114180Z",
"createdBy": "7c0e3e79-59ae-475d-bf76-85ea82b363af",
"updatedBy": "7c0e3e79-59ae-475d-bf76-85ea82b363af",
"taxData": {
"fatcaData": {
"applicable": false,
"applicableFrom": "2026-09-08T19:51:27.096792801Z",
"setBy": "SYSTEM"
},
"data": {}
}
}
SSNcomes back masked (****4589), same convention as the Users API'sIDENTIFICATION_INFO, andidentifications/address-type keys come back uppercase (SSN,PRIMARY) even though the request used lowercase.disclosuresechoes back exactly what was sent.Who performs KYB depends on partner configuration, same as KYC. This entity's
kyb.statuscame backKYB_APPROVEDimmediately —reasons[0].descriptionsays why:"KYB has been auto-approved by the system for a no-KYB partner."A do-KYB partner would instead seeKYB_NOT_READY/KYB_PROCESSING_*progress through the states in Check KYB status. Either way, the coarsestatusfield stayedPENDINGeven withkyb.status: KYB_APPROVED— don't assume the two move together, and don't gate onstatuswhenkyb.statusis the one that reflects reality.
Upload trust documents
A Certification of Trust (or a "short form" Trust Deed/Memorandum of Trust) — showing trustee names, the
trust's legal name, the trust agreement date, and jurisdiction — goes through the Physical Documents API,
using type: TRUST_DOCUMENTS:
curl -X POST https://bo-api.drivewealth.io/back-office/documents \
-H "Authorization: Bearer $DW_BEARER_TOKEN" \
-H "dw-client-app-key: $DW_APP_KEY" \
-H "Content-Type: application/json" \
-d '{
"userID": "<the entityID from step 1>",
"type": "TRUST_DOCUMENTS",
"document": "data:image/jpeg;base64,<base64-encoded file>"
}'Required: userID, type, document (base64-encoded, data-URI prefixed). side (FRONT/BACK) is
optional — most trust documents are single-sided and can omit it.
userIDis documented as a User's id, not an entity's — butPOST /documentsaccepts the entity'sidin this field.
Response — 200
{
"id": "cb8c4bfb-14f5-40d6-ab46-41cc384ca428",
"type": "TRUST_DOCUMENTS",
"status": {
"name": "NOT_SUBMITTED",
"description": "Document has not been submitted for approval."
},
"active": true
}status.name starts at NOT_SUBMITTED right after upload and moves through PENDING → APPROVED /
REJECTED once DriveWealth reviews it — this upload call alone doesn't submit it for review.
Link trustees, grantors, and beneficiaries
Each individual connected to the trust is created as a normal User (userType: INDIVIDUAL_TRADER) with a DIRECTOR_INFO document pointing back at the entity via institutionalID. A single person can hold more than one role:
curl -X POST https://bo-api.drivewealth.io/back-office/users \
-H "Authorization: Bearer $DW_BEARER_TOKEN" \
-H "dw-client-app-key: $DW_APP_KEY" \
-H "Content-Type: application/json" \
-d '{
"userType": "INDIVIDUAL_TRADER",
"username": "justin.trustee08",
"password": "my#1Account",
"documents": [
{
"type": "BASIC_INFO",
"data": {
"firstName": "Justin",
"lastName": "Case",
"country": "USA",
"phone": "12025550149",
"emailAddress": "[email protected]"
}
},
{
"type": "IDENTIFICATION_INFO",
"data": {
"value": "402724321",
"type": "SSN",
"citizenship": "USA"
}
},
{
"type": "PERSONAL_INFO",
"data": {
"birthDay": 14,
"birthMonth": 6,
"birthYear": 1965,
"politicallyExposedNames": "NULL"
}
},
{
"type": "ADDRESS_INFO",
"data": {
"street1": "15 Exchange Place",
"city": "Jersey City",
"province": "NJ",
"postalCode": "07302",
"country": "USA"
}
},
{
"type": "DIRECTOR_INFO",
"data": {
"directorList": [
{
"institutionalID": "<the entity's id from step 1>",
"title": "Trustee",
"controlContact": true,
"roles": ["TRUSTEE", "GRANTOR", "BENEFICIARY"]
}
]
}
}
]
}'Response — 200
{
"id": "bccfc3f3-9851-4bf9-99e3-861f98bd834e",
"username": "justin.trustee08",
"userType": {
"name": "INDIVIDUAL_TRADER",
"description": "Individual Trader"
},
"status": {
"name": "APPROVED",
"description": "User approved."
},
"parentIB": {
"id": "80f9b672-120d-4b73-9cc9-42fb3262c4b9",
"name": "DriveWealth"
},
"documents": [
{
"type": "ADDRESS_INFO",
"data": {
"street1": "15 Exchange Place",
"city": "Jersey City",
"province": "NJ",
"postalCode": "07302",
"country": "USA"
},
"description": "Physical address information"
},
{
"type": "BASIC_INFO",
"data": {
"firstName": "Justin",
"lastName": "Case",
"displayName": "JCase",
"emailAddress": "[email protected]",
"phone": "12025550149",
"country": "USA",
"language": "en_US"
},
"description": "Name, email, phone, etc."
},
{
"type": "DIRECTOR_INFO",
"data": {
"directorList": [
{
"title": "Trustee",
"controlContact": true,
"institutionalID": "ded54b83-f6e4-4086-a745-f5366f376a57",
"roles": ["TRUSTEE", "GRANTOR", "BENEFICIARY"]
}
]
},
"description": "Director specific information for a user"
},
{
"type": "IDENTIFICATION_INFO",
"data": {
"value": "****4321",
"type": "SSN",
"citizenship": "USA",
"description": "Social Security Number"
},
"description": "ID Number and citizenship"
},
{
"type": "PERSONAL_INFO",
"data": {
"birthdate": "1965-06-14",
"politicallyExposedNames": "NULL"
},
"description": "Birth date, gender, marital status, etc."
},
{
"type": "TAX_INFO",
"data": {
"usTaxpayer": true,
"taxTreatyWithUS": false
},
"description": "Tax Information"
}
],
"wlpID": "DW",
"referralCode": "748259",
"createdWhen": "2026-09-08T19:55:52.922Z",
"updatedWhen": "2026-09-08T19:55:52.922Z"
}Same no-KYC-partner pattern as the other User guides:
status: APPROVEDimmediately,TAX_INFOis auto-added,birthDay/birthMonth/birthYearcollapse into a singlebirthdate,SSNcomes back masked (****4321), and adisplayName/languageget auto-populated onBASIC_INFO. TheDIRECTOR_INFOdocument echoes back theinstitutionalIDand all three roles you sent, matching the entity'sidfrom step 1.
| Role | Meaning |
|---|---|
TRUSTEE | Legally responsible for managing the assets in the account |
GRANTOR | The individual who creates and funds the trust |
BENEFICIARY | Benefits from the managed assets, without necessarily controlling them |
The trust must have at least one linked
BENEFICIARYbefore you can open its Account. Opening the Account (step 5) with only aTRUSTEE/GRANTORlinked fails.
Link a bank account for Travel Rule
Opening a CASH-funded Account requires an active linked bank account with bankAccountPurpose: TRAVEL_RULE first — skip this and POST /accounts fails with A080
("Account's user is missing an active bank account of purpose TRAVEL_RULE"). This is a separate API (LinkedBankAccountsAPI.json, POST /bank-accounts):
curl -X POST https://bo-api.drivewealth.io/back-office/bank-accounts \
-H "Authorization: Bearer $DW_BEARER_TOKEN" \
-H "dw-client-app-key: $DW_APP_KEY" \
-H "Content-Type: application/json" \
-d '{
"userID": "<the entityID from step 1>",
"bankAccountNumber": "7442393174",
"bankRoutingNumber": "110000000",
"bankAccountNickname": "Trust Checking",
"bankAccountType": "CHECKING",
"bankAccountPurpose": "TRAVEL_RULE",
"bankName": "Bank of America",
"bankAddress": "222 Broadway, New York City, NY, 10038",
"bankCountry": "USA",
"beneficiaryDetails": {
"accountHolderName": "Wise Family Trust",
"accountHolderAddress": "15 Exchange Place, Unit 1100, Jersey City, NJ, 07302",
"accountHolderCountry": "USA"
}
}'
bankName,bankAddress,bankCountry, andbeneficiaryDetailsare required in
practice — omitting any one fails withE032naming that exact field.
userIDhere is the entity'sidagain, same pattern as steps 2 and 5.
Response — 200
{
"id": "bank_4abd9b75-b398-420d-8b83-b92d4ecd263f",
"userDetails": {
"userID": "ded54b83-f6e4-4086-a745-f5366f376a57",
"username": "ded54b83-f6e4-4086-a745-f5366f376a57",
"firstName": "Wise Family Trust",
"email": "[email protected]",
"parentIB": {
"id": "80f9b672-120d-4b73-9cc9-42fb3262c4b9",
"name": "DriveWealth"
},
"wlpID": "DW"
},
"bankAccountDetails": {
"bankAccountNickname": "Trust Checking",
"bankAccountNumber": "****3174",
"bankRoutingNumber": "110000000",
"bankAccountType": "CHECKING",
"bankName": "Bank of America",
"bankAddress": {
"addressLine1": "222 Broadway, New York City, NY, 10038",
"country": "USA"
}
},
"default": false,
"status": "ACTIVE",
"bankAccountPurpose": "TRAVEL_RULE",
"beneficiaryDetails": {
"accountHolderName": "Wise Family Trust",
"accountHolderAddress": "15 Exchange Place, Unit 1100, Jersey City, NJ, 07302",
"accountHolderCountry": "USA"
},
"created": "2026-09-08T19:56:55.249Z",
"updated": "2026-09-08T19:56:55.249Z"
}bankAccountNumber comes back masked (****3174), and status: ACTIVE confirms the account is ready to satisfy the Travel Rule requirement in the next step.
Open the trust Account
curl -X POST https://bo-api.drivewealth.io/back-office/accounts \
-H "Authorization: Bearer $DW_BEARER_TOKEN" \
-H "dw-client-app-key: $DW_APP_KEY" \
-H "Content-Type: application/json" \
-d '{
"userID": "<the entity'"'"'s id from step 1>",
"accountType": "LIVE",
"accountManagementType": "TRUST_SELF",
"tradingType": "CASH",
"accountFundingType": "CASH"
}'
userIDhere is the entity'sid, not an individual's. Confirm this against current Accounts API
behavior before relying on it in production.
accountFundingTypeis required for partners that support both wallet and bulk funding types.
accountManagementType for a trust entity is TRUST_SELF, TRUST_ADVISORY, or TRUST_RIA_MANAGED —
not the BUSINESS_* values, which are for corporations/LLCs/partnerships.
Response — 200
{
"id": "ded54b83-f6e4-4086-a745-f5366f376a57.1788897462923",
"accountNo": "DWRE002541",
"accountType": {
"name": "LIVE",
"description": "Live Account"
},
"accountMgmtType": {
"name": "TRUST_SELF",
"description": "Self Directed Trust Account"
},
"accountHolderType": {
"name": "I",
"description": "An account that does not meet FINRA Rule 4215(c) or a proprietary trading account"
},
"accountFundingType": "CASH",
"status": {
"name": "OPEN",
"description": "Open"
},
"tradingType": {
"name": "CASH",
"description": "Cash account"
},
"leverage": 1.00,
"nickname": "Wise Family Trust's Self Directed Trust Account",
"parentIB": {
"id": "80f9b672-120d-4b73-9cc9-42fb3262c4b9",
"name": "DriveWealth"
},
"taxProfile": {
"taxStatusCode": "W-9",
"taxRecipientCode": "TRUST"
},
"currencyID": "USD",
"commissionID": "b3e985dd-9679-63dc-5dd5-9bd7982efecd",
"beneficiaries": false,
"userID": "ded54b83-f6e4-4086-a745-f5366f376a57",
"restricted": false,
"gfvRestricted": false,
"goodFaithViolations": 0,
"pdtRestricted": false,
"patternDayTrader": false,
"patternDayTrades": 0,
"freeTradeBalance": 0,
"gfvPdtExempt": false,
"buyingPowerOverride": false,
"bod": {},
"sweepInd": true,
"interestFree": false,
"openedWhen": "2026-09-08T19:57:42Z",
"ignoreMarketHoursForTest": false,
"flaggedForACATS": false,
"regType": "CUST"
}Check KYB status
There's no separate kyb-status endpoint like the Users API's kyc-status — GET /entities/{entityId}
carries everything, including a rolled-up kycStatus per linked director:
curl -X GET https://bo-api.drivewealth.io/back-office/entities/<entity id> \
-H "Authorization: Bearer $DW_BEARER_TOKEN" \
-H "dw-client-app-key: $DW_APP_KEY"Response — 200
Pending — validate this call in sandbox and paste the actual response here.
The response's directors[] array includes each linked individual's kycStatus directly — you don't need
a separate GET /users/USERID/kyc-status call per director just to see where they stand.
status (coarse: PENDING/APPROVED/REJECTED/REVOKED/CLOSED) and kyb.status (granular) are the
same two-tier pattern as User KYC — and the two don't move together. A captured no-KYB-partner response
came back kyb.status: KYB_APPROVED with kyb.reasons[0] explaining "KYB has been auto-approved by the system for a no-KYB partner", while the entity's own status stayed PENDING. Don't gate on status;
kyb.status (plus kyb.reasons[] when present, each a {code, description} pair) is the one that reflects
reality. Whether you see this immediate approval or the full KYB_NOT_READY → … progression below depends
on whether your partner is configured do-KYB or no-KYB/verify-KYB — same distinction as User KYC, confirm
with DriveWealth which model you're on.
kyb.status | Meaning |
|---|---|
KYB_NOT_READY | Entity hasn't submitted all required data/documents yet |
KYB_READY | All required info submitted, queued for processing |
KYB_PROCESSING_DIRECTORS | KYC in progress for the linked directors |
KYB_PROCESSING_ENTITY | Director KYC cleared; entity-level verification in progress |
KYB_MANUAL_REVIEW | Escalated — can take up to a week per DriveWealth's guidance |
KYB_DOC_REQUIRED | A supporting document is missing |
KYB_INFO_REQUIRED | Submitted entity data needs correction |
KYB_APPROVED | Terminal — cleared |
KYB_DENIED | Terminal — rejected; any Account already opened moves to a frozen accountStatus |
DriveWealth's own KYB documentation shows a notes array (e.g. ["Need more doc"]) alongside reasons[]
on the kyb object — EntityKybResponseModel doesn't define it, so treat it as present-but-undocumented
rather than something to build strict parsing around.
Subscribe to entity.created/entity.updated on your SQS queue rather than polling this endpoint —entity.updated carries previous/current KYB state so you can see exactly what changed.
Requirements vary by entity origin
- Foreign (non-US) trusts complete a W-8 form via a DriveWealth-generated ComplyExchange URL instead of the standard US flow.
- SMSF (
subType: SMSF) is an Australian retirement-fund structure — confirm with DriveWealth which
additional fields or documents it requires beyond the standard trust flow before assuming this guide's
US-trust example covers it.
What's next
Once the entity clears KYB and its Account is open, funding and trading follow the same Accounts/Deposits
flows as an individual Account.
Updated 2 days ago