Business Trading Accounts
Overview
The Broker API now supports opening business trading accounts through a party-based model. Instead of embedding all entity and individual details into a single account creation request, each person and entity is created as a distinct Party resource. These parties are then linked together and associated with a trading account.
What Changed from Phase 1
| Aspect | Phase 1 (Legacy) | Phase 2 (Current) |
|---|---|---|
| Entity details | Embedded in account creation | Separate Party resource |
| UBOs / Authorized Signers | Submitted as documents | First-class Party resources with API management |
| Document uploads | Account-level only | Party-level (associated to specific individuals or entity) |
| Verifications | Submitted as documents | Submitted via Verifications API per party |
| Updates | Via support ticket | Via PATCH /v1/parties/{id} |
Key Concepts
Parties
A Party represents either a natural person or a legal entity. Every individual and business involved in an account is modeled as a party.
| Party Type | Description | Example |
|---|---|---|
natural_person | An individual person | UBO, authorized signer |
legal_entity | A business or organization | The corporation opening the trading account |
Relationships
A legal entity party references its associated natural person parties through:
ubos— Ultimate Beneficial Owners (individuals who ultimately own ≥10% of the entity)authorized_signers— Individuals authorized to legally act on behalf of the entity
Agreements
Agreements are split into two levels:
- Party-level agreements (e.g.,
certifications_and_resolutions_statement) — attached when creating the legal entity party - Account-level agreements (e.g.,
customer_agreement) — attached when creating the trading account
Prerequisites
Beta Access: Business trading account onboarding is currently available by allowlist only. Please reach out to your Alpaca integration team to get your correspondent enabled before proceeding.
- CIP API enabled for your correspondent (your own KYC/KYB provider is responsible for the verifications)
- Base URL:
https://broker-api.sandbox.alpaca.markets(sandbox) - Authentication: Multiple methods are supported. See Authentication for details on API key authentication, OAuth2, and other options.
Integration Flow
The end-to-end flow for onboarding a business trading account:
┌─────────────────────────────────────────────────────────┐
│ │
│ 1. Create Natural Person Parties │
│ ├── UBO 1 (natural_person) │
│ ├── UBO 2 (natural_person) │
│ ├── Authorized Signer 1 (natural_person) │
│ └── Authorized Signer 2 (natural_person) │
│ │ │
│ ▼ │
│ 2. Create Legal Entity Party │
│ (references UBO + signer party IDs) │
│ │ │
│ ▼ │
│ 3. Upload Documents (per party) │
│ │ │
│ ▼ │
│ 4. Submit Verifications (per party) │
│ │ │
│ ▼ │
│ 5. Create Trading Account │
│ (references legal entity party ID) │
│ │ │
│ ▼ │
│ 6. Account is APPROVED → ACTIVE │
│ │
└─────────────────────────────────────────────────────────┘
Important: Natural person parties must be created before the legal entity party, because the legal entity references them by ID.
Step 1: Create Natural Person Parties
Create a party for each individual associated with the entity — every UBO and every authorized signer. A single person can serve as both a UBO and an authorized signer.
Request
POST /v1/parties
Content-Type: application/json
Authorization: <see Authentication docs>
Sample Request — UBO / Authorized Signer
{
"party_type": "natural_person",
"given_name": "Jane",
"family_name": "Smith",
"date_of_birth": "1985-06-15",
"country_of_citizenship": "USA",
"email": "[email protected]",
"phone_number": "+14155551234",
"residential_address": {
"street_address": ["742 Evergreen Terrace"],
"city": "San Francisco",
"subdivision": "CA",
"postal_code": "94103",
"country": "USA"
},
"id_numbers": [
{
"type": "USA_SSN",
"value": "123-45-6789",
"issuing_country": "USA"
}
],
"country_of_tax_residence": "USA",
"funding_source": ["employment_income"],
"disclosures": {
"is_control_person": false,
"is_affiliated_exchange_or_finra": false,
"is_politically_exposed": false,
"immediate_family_exposed": false
}
}Sample Response (201 Created)
{
"id": "b5c7e1a2-3d4f-4e5a-8b6c-9d0e1f2a3b4c",
"party_type": "natural_person",
"given_name": "Jane",
"family_name": "Smith",
"date_of_birth": "1985-06-15",
"country_of_citizenship": "USA",
"email": "[email protected]",
"phone_number": "+14155551234",
"residential_address": {
"street_address": ["742 Evergreen Terrace"],
"city": "San Francisco",
"subdivision": "CA",
"postal_code": "94103",
"country": "USA"
},
"id_numbers": [
{
"type": "USA_SSN",
"value": "***-**-6789",
"issuing_country": "USA"
}
],
"country_of_tax_residence": "USA",
"funding_source": ["employment_income"],
"disclosures": {
"is_control_person": false,
"is_affiliated_exchange_or_finra": false,
"is_politically_exposed": false,
"immediate_family_exposed": false
}
}Save the
idfrom each response — you will need these party IDs when creating the legal entity.
Required Fields — Natural Person
| Field | Type | Notes |
|---|---|---|
party_type | string | Must be "natural_person" |
given_name | string | 1–100 chars, printable ASCII |
family_name | string | Required (except single-name cultures) |
date_of_birth | date | YYYY-MM-DD format |
country_of_citizenship | string | ISO 3166-1 alpha-3 (e.g., "USA") |
phone_number | string | E.164 format (e.g., "+14155551234") |
residential_address | object | See Address Object |
id_numbers | array | At least 1 item required. See ID Numbers |
country_of_tax_residence | string | ISO 3166-1 alpha-3 |
funding_source | array | See Funding Source — Natural Person |
disclosures | object | See Disclosures — Natural Person |
Optional Fields — Natural Person
| Field | Type | Notes |
|---|---|---|
email | string | Recommended for account openers / signers |
prefix | string | e.g., "Mr.", "Dr." |
middle_name | string | |
suffix | string | e.g., "Jr.", "III" |
country_of_birth | string | ISO 3166-1 alpha-3 |
visa_type | string | Required if non-citizen US tax resident |
visa_expiration_date | date | Required when permanent_resident is false |
permanent_resident | boolean | |
marital_status | string | |
employment | object | See Employment |
financial_profile | object | Income/net worth ranges |
Step 2: Create the Legal Entity Party
After creating all natural person parties, create the legal entity party. This links UBOs and authorized signers by their party IDs and includes the party-level certifications_and_resolutions_statement agreement.
Request
POST /v1/parties
Content-Type: application/json
Authorization: <see Authentication docs>
Sample Request — Legal Entity
{
"party_type": "legal_entity",
"legal_name": "Acme Corporation",
"legal_entity_type": "c_corporation",
"country_of_incorporation": "USA",
"state_of_incorporation": "DE",
"date_of_incorporation": "2015-08-20",
"email": "[email protected]",
"phone_number": "+14155559999",
"legal_address": {
"street_address": ["100 Market Street", "Suite 500"],
"city": "San Francisco",
"subdivision": "CA",
"postal_code": "94105",
"country": "USA"
},
"id_numbers": [
{
"type": "USA_EIN",
"value": "12-3456789",
"issuing_country": "USA"
}
],
"country_of_tax_residence": "USA",
"financial_profile": {
"annual_income_min": 1000000,
"annual_income_max": 5000000,
"liquid_net_worth_min": 500000,
"liquid_net_worth_max": 2000000,
"total_net_worth_min": 2000000,
"total_net_worth_max": 10000000
},
"funding_source": ["business_revenue", "investors"],
"industry": "technology",
"disclosures": {
"is_participating_fatca": false,
"is_exempt_from_tax_under_501a": false
},
"ubos": [
{
"id": "b5c7e1a2-3d4f-4e5a-8b6c-9d0e1f2a3b4c",
"percentage_ownership": 51
},
{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"percentage_ownership": 30
}
],
"authorized_signers": [
{
"id": "b5c7e1a2-3d4f-4e5a-8b6c-9d0e1f2a3b4c",
"title_at_company": "CEO"
},
{
"id": "f9e8d7c6-b5a4-3210-fedc-ba0987654321",
"title_at_company": "CFO"
}
],
"agreements": [
{
"agreement": "certifications_and_resolutions_statement",
"signed_at": "2026-05-14T10:00:00Z",
"ip_address": "203.0.113.42",
"revision": "01.2024.02",
"signer_party_id": "b5c7e1a2-3d4f-4e5a-8b6c-9d0e1f2a3b4c"
}
]
}Sample Response (201 Created)
{
"id": "e4d3c2b1-a098-7654-3210-fedcba987654",
"party_type": "legal_entity",
"legal_name": "Acme Corporation",
"legal_entity_type": "c_corporation",
"...": "..."
}Save the legal entity
id— this is used as theprimary_account_holder_idwhen creating the trading account.
Required Fields — Legal Entity
| Field | Type | Notes |
|---|---|---|
party_type | string | Must be "legal_entity" |
legal_name | string | Registered business name |
legal_entity_type | enum | See Legal Entity Types |
country_of_incorporation | string | ISO 3166-1 alpha-3 |
date_of_incorporation | date | YYYY-MM-DD format |
email | string | Business contact email |
phone_number | string | E.164 format |
legal_address | object | See Address Object |
id_numbers | array | At least 1 (e.g., EIN for US entities) |
country_of_tax_residence | string | ISO 3166-1 alpha-3 |
financial_profile | object | All 6 min/max fields required |
funding_source | array | See Funding Source — Legal Entity |
industry | enum | See Industry Types |
disclosures | object | is_participating_fatca, is_exempt_from_tax_under_501a |
Optional Fields — Legal Entity
| Field | Type | Required | Notes |
|---|---|---|---|
state_of_incorporation | string | Conditional | Required if country_of_incorporation is "USA" |
legal_entity_type_other | string | Conditional | Required if legal_entity_type is "other" |
business_registration_number | string | No | Recommended if available |
funding_source_other_free_text | string | Conditional | Required if funding_source contains "other" |
industry_other_free_text | string | Conditional | Required if industry is "other" |
ubos | array | No | UBO references (see below). Required on the legal entity before account creation. |
authorized_signers | array | No | Signer references (see below). Required on the legal entity before account creation. |
agreements | array | No | Party-level agreements |
UBO Object
| Field | Type | Notes |
|---|---|---|
id | uuid | Party ID of an existing natural_person |
percentage_ownership | integer | 10–100 |
Authorized Signer Object
| Field | Type | Notes |
|---|---|---|
id | uuid | Party ID of an existing natural_person |
title_at_company | string | e.g., "CEO", "CFO", "Director" |
Party-Level Agreements
When creating a legal entity, include the certifications_and_resolutions_statement agreement:
| Field | Type | Notes |
|---|---|---|
agreement | string | "certifications_and_resolutions_statement" |
signed_at | datetime | ISO 8601 timestamp |
ip_address | string | IP of the signer |
revision | string | Format: XX.YYYY.MM |
signer_party_id | uuid | Must be one of the authorized_signers |
Step 3: Upload Documents
Upload required documents for each party. Documents are associated at the party level, allowing you to attach identity documents to individuals and business documents to the entity.
Request
POST /v1/documents
Content-Type: application/json
Authorization: <see Authentication docs>
Sample — Entity Document
{
"party_id": "e4d3c2b1-a098-7654-3210-fedcba987654",
"type": "entity_operating_document",
"sub_type": "articles_of_incorporation",
"content": {
"content_type": "base64",
"data": "JVBERi0xLjQK..."
},
"original_filename": "articles_of_incorporation.pdf"
}Sample — Individual Identity Document
{
"party_id": "b5c7e1a2-3d4f-4e5a-8b6c-9d0e1f2a3b4c",
"type": "identity_verification",
"sub_type": "passport",
"content": {
"content_type": "base64",
"data": "/9j/4AAQSkZJRg..."
},
"original_filename": "jane_passport.jpg"
}Required Documents
For the legal entity:
| Document Type | Sub-Type | Description |
|---|---|---|
company_formation | — | Certificate of formation / incorporation |
entity_registration | — | State or government registration |
entity_operating_document | operating_agreement, articles_of_incorporation, bylaws, or certificate_of_formation | Operating agreement, articles, or bylaws |
For each natural person (UBO / authorized signer):
| Document Type | Sub-Type | Description |
|---|---|---|
identity_verification | passport, front, back | Government-issued ID |
Retrieving Documents
GET /v1/documents?party_id={party_id}
GET /v1/documents/{document_id}
GET /v1/documents/{document_id}/download → 302 redirect to pre-signed URL
Step 4: Submit Verifications
After running KYC/KYB through your verification provider, submit the results to Alpaca for each party.
Request
POST /v1/verifications
Content-Type: application/json
Authorization: <see Authentication docs>
Sample — KYC for Natural Person
{
"party_type": "natural_person",
"party_id": "b5c7e1a2-3d4f-4e5a-8b6c-9d0e1f2a3b4c",
"providers": [{ "name": "onfido" }],
"result": "clear",
"risk_level": "low",
"risk_score": 15,
"checks": [
{
"type": "IDENTITY",
"result": "clear",
"completed_at": "2026-05-14T10:30:00Z"
},
{
"type": "WATCHLIST",
"result": "clear",
"completed_at": "2026-05-14T10:30:10Z"
}
],
"raw_data": "{\"provider_response\": \"...\"}"
}Sample — KYB for Legal Entity
{
"party_type": "legal_entity",
"party_id": "e4d3c2b1-a098-7654-3210-fedcba987654",
"providers": [{ "name": "middesk" }],
"result": "clear",
"risk_level": "low",
"risk_score": 10,
"checks": [
{
"type": "BUSINESS_REGISTRATION",
"result": "clear",
"completed_at": "2026-05-14T10:30:00Z"
},
{
"type": "BUSINESS_STATUS",
"result": "clear",
"completed_at": "2026-05-14T10:30:05Z"
},
{
"type": "OWNERSHIP",
"result": "clear",
"completed_at": "2026-05-14T10:30:10Z"
},
{
"type": "TAX_IDENTIFICATION",
"result": "clear",
"completed_at": "2026-05-14T10:30:15Z"
},
{
"type": "ADDRESS",
"result": "clear",
"completed_at": "2026-05-14T10:30:20Z"
},
{
"type": "WATCHLIST",
"result": "clear",
"completed_at": "2026-05-14T10:30:25Z"
}
],
"raw_data": "{\"provider_response\": \"...\"}"
}Providers
providers is an array of objects, not strings. Each entry requires a name, with an optional reference_id for the provider's external identifier:
"providers": [
{ "name": "onfido", "reference_id": "ref-123" },
{ "name": "complyadvantage" }
]Check Types
Natural Person: IDENTITY, PHOTO, DOCUMENT, WATCHLIST
Legal Entity: BUSINESS_REGISTRATION, BUSINESS_STATUS, OWNERSHIP, TAX_IDENTIFICATION, ADDRESS, WATCHLIST
Check Object Fields
| Field | Type | Required | Notes |
|---|---|---|---|
type | string | Yes | Check type (see Check Types above) |
result | string | Yes | "clear" or "consider" |
completed_at | datetime | Yes | ISO 8601 timestamp when the provider completed the check |
details | object | No | Provider-specific details for this check |
Verification Result Values
| Value | Meaning |
|---|---|
clear | Verification passed |
consider | Verification requires review |
Retrieving Verifications
GET /v1/verifications?party_id={party_id}
GET /v1/verifications/{verification_id}
Step 5: Create the Trading Account
Once all parties, documents, and verifications are in place, create the trading account. The account references the legal entity party as the primary account holder.
Important: The legal entity party must have at least one
ubosentry and at least oneauthorized_signersentry before account creation will succeed. If you created the legal entity without them, usePATCH /v1/parties/{id}to add them first.
Request
POST /v1/accounts
Content-Type: application/json
Authorization: <see Authentication docs>
Sample Request
{
"account_type": "trading",
"primary_account_holder_id": "e4d3c2b1-a098-7654-3210-fedcba987654",
"agreements": [
{
"agreement": "customer_agreement",
"signed_at": "2026-05-14T10:00:00Z",
"ip_address": "203.0.113.42"
}
],
"enabled_assets": ["us_equity"],
"investment_objective": "market_speculation"
}Sample Response (200 OK)
{
"id": "7a8b9c0d-1e2f-3456-7890-abcdef123456",
"account_number": "123456789",
"status": "APPROVED",
"account_type": "trading",
"primary_account_holder_id": "e4d3c2b1-a098-7654-3210-fedcba987654",
"enabled_assets": ["us_equity"],
"created_at": "2026-05-14T10:05:00Z"
}Account-Level Agreements
| Agreement | Required | Notes |
|---|---|---|
customer_agreement | Yes | Standard brokerage customer agreement |
Account Creation Fields
| Field | Type | Required | Notes |
|---|---|---|---|
account_type | string | Yes | "trading" |
primary_account_holder_id | uuid | Yes | Legal entity party ID |
agreements | array | Yes | At least customer_agreement |
enabled_assets | array | Yes | e.g., ["us_equity"]. Other supported values include crypto, us_option, global_equity. Available asset classes are configured per correspondent. |
investment_objective | enum | Yes | See Investment Objectives |
Step 6: Verify Account Status
The account will be created in APPROVED status and transition to ACTIVE shortly after.
Request
GET /v1/accounts/{account_id}
Authorization: <see Authentication docs>
Account Statuses
| Status | Description |
|---|---|
SUBMITTED | Account submitted, pending review |
APPROVAL_PENDING | Account is awaiting approval |
APPROVED | Account approved, activating |
ACTIVE | Account is active and ready for trading |
ACTION_REQUIRED | Account requires attention before proceeding |
LIMITED | Account is active but with restricted capabilities |
SUBMISSION_FAILED | Account submission failed — retry or contact support |
REJECTED | Account was rejected |
ACCOUNT_CLOSED | Account has been closed |
Updating Party Information
Party information can be updated via the API using a partial update (PATCH).
Request
PATCH /v1/parties/{party_id}
Content-Type: application/json
Authorization: <see Authentication docs>
Sample Request — Update Address
{
"residential_address": {
"street_address": ["456 New Avenue"],
"city": "Los Angeles",
"subdivision": "CA",
"postal_code": "90001",
"country": "USA"
}
}Note: Only include the fields you want to update. Fields not included will remain unchanged.
Error Handling
Error Response Format
{
"error": "invalid_request",
"error_description": "Validation failed",
"fields": [
{
"name": "email"
},
{
"name": "id_numbers[0].value"
}
]
}Common Error Codes
| Error Code | HTTP Status | Description |
|---|---|---|
invalid_request | 400 | Request validation failed — check fields array |
not_found | 404 | Resource not found |
unauthorized | 401 | Invalid or missing credentials |
forbidden | 403 | Insufficient permissions |
party_not_found | 400 | Referenced party ID does not exist |
email_in_use | 409 | Email address already associated with another party |
rate_limited | 429 | Too many requests — retry with backoff |
internal_error | 500 | Server error — contact support |
Validation Tips
- All schemas use
additionalProperties: false— unknown fields will be rejected - String fields enforce printable ASCII (U+0020–U+007E) with no leading/trailing whitespace
subdivisionis required in any address object whosecountryis"USA"controlling_firmsis required whenis_control_personistrueaffiliated_firmis required whenis_affiliated_exchange_or_finraistrue- Agreement
revisionformat:XX.YYYY.MM(e.g.,"01.2024.02")
Field Reference
Address Object
| Field | Type | Required | Notes |
|---|---|---|---|
street_address | string[] | Yes | 1–3 lines, 2–250 chars each |
unit | string | No | 1–20 chars |
city | string | Yes | 2–100 chars, no digits-only values |
subdivision | string | Conditional | Required for USA. ISO 3166-2 code |
postal_code | string | Yes | 1–12 chars |
country | string | Yes | ISO 3166-1 alpha-3 |
ID Numbers
| Field | Type | Required | Notes |
|---|---|---|---|
type | enum | Yes | See below |
value | string | Yes | Pattern: ^[0-9A-Za-z\-+\.]+$, 1–255 chars |
issuing_country | string | No | ISO 3166-1 alpha-3 |
Common ID types:
USA_SSN— US Social Security NumberUSA_EIN— US Employer Identification NumberUSA_ITIN— US Individual Taxpayer Identification NumberPASSPORT— Passport numberNATIONAL_ID— National identification numberPERMANENT_RESIDENT— Permanent resident cardDRIVER_LICENSE— Driver's license numberOTHER_GOV_ID— Other government-issued IDNOT_SPECIFIED— ID type not specified
See the OpenAPI specification for the full list of supported international ID types.
Legal Entity Types
banking_institution, broker_or_dealer, c_corporation, foreign_financial_institution, fund_or_hedge_fund, general_partnership, irrevocable_trust, limited_liability_corporation, limited_partnership, revocable_trust, s_corporation, unincorporated, other
Industry Types
administration_or_public_relations, agriculture, architecture, arts_or_film_or_music, construction, design, education, finance, food_production, government_or_public_services, healthcare, legal_services, media_or_marketing, oil_or_energy_or_mining, pharmaceuticals_or_biochemicals, real_estate, retail_restaurants, technology, sports_or_sports_medicine_or_fitness, tourism, transport, other
Funding Source — Natural Person
employment_income, investments, inheritance, business_income, savings, family, other
Funding Source — Legal Entity
business_revenue, asset_appreciation, sales_of_assets, investors, other
Investment Objectives
balance_preserve_wealth_with_growth, generate_income, growth, market_speculation, preserve_wealth
Disclosures — Natural Person
| Field | Type | Required | Notes |
|---|---|---|---|
is_control_person | boolean | Yes | If true, provide controlling_firms |
controlling_firms | array | Conditional | Required when is_control_person is true. Array of company name strings (max 255 chars each) |
is_affiliated_exchange_or_finra | boolean | Yes | If true, provide affiliated_firm |
affiliated_firm | string | Conditional | Required when is_affiliated_exchange_or_finra is true. Max 100 chars |
is_politically_exposed | boolean | Yes | |
immediate_family_exposed | boolean | Yes |
Disclosures — Legal Entity
The
disclosuresobject is required in the request body, but all subfields are optional.
| Field | Type | Required |
|---|---|---|
is_participating_fatca | boolean | No |
is_exempt_from_tax_under_501a | boolean | No |
Financial Profile — Legal Entity
| Field | Type | Required |
|---|---|---|
annual_income_min | integer | Yes |
annual_income_max | integer | Yes |
liquid_net_worth_min | integer | Yes |
liquid_net_worth_max | integer | Yes |
total_net_worth_min | integer | Yes |
total_net_worth_max | integer | Yes |
Employment (Natural Person, Optional)
| Field | Type | Required | Notes |
|---|---|---|---|
status | enum | Yes (when provided) | |
employer_name | string | When status = "employed" | |
employer_address | string | No | Free-text, max 500 chars |
position | string | Conditional | |
sector | enum | Conditional | |
years_employed | integer | No (0–100) |
Employment status values: employed, unemployed, retired, student
Employment sector values: agriculture, business_management, computers_and_it, construction, education, finance, government, healthcare, hospitality, manufacturing, marketing, media, other, science, self_employed, transportation, not_employed
Document Types
Entity documents:
| Type | Sub-Types | Notes |
|---|---|---|
company_formation | — | Certificate of formation |
entity_registration | — | Government registration |
entity_operating_document | operating_agreement, articles_of_incorporation, bylaws, certificate_of_formation | Sub-type required |
w8ben_e | — | For non-US entities |
Individual documents:
| Type | Sub-Types | Notes |
|---|---|---|
identity_verification | passport, front, back | Sub-type required |
address_verification | utility_bill, bank_statement, lease_agreement, tax_certificate | Sub-type required |
date_of_birth_verification | — | |
tax_id_verification | — | |
social_security_number_verification | — | |
selfie | — | |
tax_document | — | |
w8ben | — | For non-US individuals |
pep_declaration_form | — | Required for politically exposed persons |
hio_declaration_form | — | Required for high-income or high-risk individuals |
limited_trading_authorization | — | |
cip_result | — | KYC/KYB provider result attachment |
account_approval_letter | — | |
other | — |
Migration from Phase 1
Phase 1 of the entity account API (where entity details were embedded directly in POST /v1/accounts) remains functional and there is no immediate requirement to migrate. However, Phase 1 is not a public API and has known limitations — most notably it does not create discrete party records for UBOs and authorized signers, making those individuals unmanageable via API.
Phase 1 will eventually be deprecated. We will communicate timelines in advance.
Migrating Existing Accounts to Phase 2
If you want to manage previously created Phase 1 business accounts using the Phase 2 Party API, you will need to backfill all missing party records and link them to the existing legal entity.
We strongly recommend reaching out to your Alpaca integration team before attempting to migrate existing accounts. The process requires careful coordination to avoid data inconsistencies.
Key Differences
| Phase 1 Pattern | Phase 2 Equivalent |
|---|---|
identity.party_type in account body | Separate POST /v1/parties call |
| UBO info as uploaded documents | ubos array on legal entity party |
| Authorized individual info as documents | authorized_signers array on legal entity party |
identity.legal_name, identity.legal_entity_type, etc. | Fields on the legal entity party |
agreements in account body | Split: party-level and account-level |
| Updates via support ticket | PATCH /v1/parties/{id} |
FAQ
Can one person be both a UBO and an authorized signer?
Yes. Create a single natural_person party and reference their ID in both the ubos and authorized_signers arrays on the legal entity.
What if the entity has no UBOs with ≥10% ownership?
Contact your Alpaca integration support team to discuss the specific entity structure. In most cases, at least one control person should be identified.
Can I create parties and the account in any order?
No. Natural person parties must be created first, then the legal entity party (which references them), and finally the trading account (which references the legal entity). The flow is sequential.
What happens if I submit a verification with result consider?
consider?A consider result means your KYC/KYB provider flagged the check for manual review. Verifications are submitted by your correspondent and are independent of account creation — submitting a verification does not directly trigger account approval or rejection. Work with Alpaca support if you have questions about how a specific verification result affects a party's standing.
Is sandbox available for testing?
Yes. Use https://broker-api.sandbox.alpaca.markets with your sandbox credentials. All endpoints described in this guide are available in sandbox.
How do I handle international entities?
The API supports international entities. Use the appropriate ISO 3166-1 alpha-3 country codes for country_of_incorporation, country_of_tax_residence, and address fields. ID types support international formats (see the full ID types list in the OpenAPI spec).
What agreement revisions should I use?
If no revision is provided, the latest active revision will be used automatically. You may optionally specify a revision in the format XX.YYYY.MM (e.g., "01.2024.02") if you need to pin to a specific version — contact your Alpaca integration team if you are unsure.
Is there a maximum limit on the number of UBOs or Authorized Signers?
Yes. You can link at most 10 UBOs and 10 authorized signers per legal entity. The total UBO ownership percentage cannot exceed 100%.
What happens if I update a party's information after the account is already ACTIVE?
Certain updates may trigger a compliance review and cause the account to transition away from ACTIVE. See the Account Statuses documentation for the full list of fields that trigger a review and what to expect during each status.
How are complex, multi-layered corporate structures handled?
UBO stands for Ultimate Beneficial Owner — the natural person(s) who ultimately own or control the legal entity. The API is interested in the ultimate owner, not immediate parent entities.
If a business is owned by another business, you should trace ownership through the chain until you reach the natural person(s) who own ≥10% of the top-level entity. Only those natural persons should be listed as UBOs. Intermediate holding companies or parent entities are not captured as UBOs.
Support & Feedback
This is a Beta API — we actively welcome feedback on the API design, documentation, and developer experience.
- Integration Support: Contact your Alpaca integration team
- API Issues: Report via your designated support channel
- Documentation Feedback: Let us know what could be clearer or what's missing
© 2026 Alpaca Securities LLC. All rights reserved.
Updated about 2 months ago