WealthSignal B2B API
Programmatically manage your white-label investment platform. The WealthSignal B2B API enables Growth and Enterprise clients to automate portfolio management, team operations, model distribution, analytics reporting, and compliance workflows.
Base URL:
https://wealthsignal.net/api/enterprise
POST /api/enterprise/auth/login, then include the returned token in all subsequent requests via the Authorization: Bearer TOKEN header.
Authentication
WealthSignal uses Bearer token authentication. All API requests must include a valid JWT token in the Authorization header.
Obtaining a Token
curl -X POST https://wealthsignal.net/api/enterprise/auth/login \ -H "Content-Type: application/json" \ -d '{"email":"you@yourfirm.com","password":"your-password"}'
{ "success": true, "token": "eyJhbGciOiJIUzI1NiJ9...", "expires_at": "2026-05-07T00:00:00Z", "company": { "id": "comp_abc123", "name": "Apex Wealth", "plan": "enterprise" } }
Using the Token
curl -H "Authorization: Bearer YOUR_TOKEN" \ https://wealthsignal.net/api/enterprise/profile
Rate Limits
Rate limits are applied per API token, per hour. When you exceed the limit, you receive a 429 Too Many Requests response with a Retry-After header.
| Plan | Requests / Hour | Burst | Concurrent |
|---|---|---|---|
| Starter | 100 | 20 | 5 |
| Growth | 1,000 | 100 | 20 |
| Enterprise | 10,000 | 500 | 100 |
Rate Limit Headers
Every response includes these headers:
X-RateLimit-Limit: 1000 X-RateLimit-Remaining: 987 X-RateLimit-Reset: 1744063200 Retry-After: 3600 // only present on 429
Errors
WealthSignal uses standard HTTP status codes. All error responses follow a consistent JSON schema.
{ "success": false, "error": { "code": "UNAUTHORIZED", "message": "Invalid or expired token", "status": 401 } }
| Status | Code | Description |
|---|---|---|
| 400 | BAD_REQUEST | Missing or invalid request parameters |
| 401 | UNAUTHORIZED | Invalid, expired, or missing token |
| 403 | FORBIDDEN | Insufficient plan or permissions |
| 404 | NOT_FOUND | Resource does not exist |
| 409 | CONFLICT | Resource already exists |
| 422 | VALIDATION_ERROR | Business rule violation |
| 429 | RATE_LIMITED | Too many requests, back off and retry |
| 500 | INTERNAL_ERROR | Server error — contact support |
| 502 | UPSTREAM_ERROR | Upstream market data unavailable |
Endpoints
/api/enterprise/auth/login
Obtain a bearer token
▾
Authenticate with email and password to receive a JWT token. Store the token securely and include it in subsequent requests.
Request Body
| Field | Type | Description |
|---|---|---|
emailrequired | string | Your enterprise account email |
passwordrequired | string | Account password |
Response
{ "success": true, "token": "eyJ...", "expires_at": "2026-05-07T00:00:00Z" }
/api/enterprise/profile
Get enterprise profile
▾
Returns the authenticated enterprise's profile including plan details, AUM, and configuration.
Response
{ "success": true, "company": { "id": "comp_abc123", "name": "Apex Wealth", "plan": "enterprise", "aum_usd": 48200000, "accounts_count": 312, "created_at": "2024-06-01" } }
/api/enterprise/portfolio/accounts
List portfolio accounts
▾
Returns a paginated list of all portfolio accounts managed by this enterprise.
Query Parameters
| Param | Type | Default | Description |
|---|---|---|---|
pageoptional | integer | 1 | Page number |
per_pageoptional | integer | 50 | Results per page (max 100) |
statusoptional | string | all | Filter: active, pending, closed |
model_idoptional | string | — | Filter by assigned model portfolio |
Response
{ "success": true, "accounts": [ { "id": "acc_001", "owner_name": "Jane Smith", "status": "active", "aum_usd": 125000, "model_id": "mod_growth", "created_at": "2025-01-15" } ], "pagination": { "page": 1, "per_page": 50, "total": 312 } }
/api/enterprise/portfolio/accounts
Create a portfolio account
▾
Creates a new portfolio account and optionally assigns a model portfolio.
Request Body
| Field | Type | Description |
|---|---|---|
owner_namerequired | string | Account owner full name |
owner_emailrequired | string | Account owner email |
model_idoptional | string | Model portfolio ID to assign |
initial_deposit_usdoptional | number | Initial funding amount in USD |
risk_profileoptional | string | conservative, moderate, aggressive |
{ "success": true, "account": { "id": "acc_new123", "status": "pending_kyc", "owner_name": "Bob Jones" } }
/api/enterprise/team
List team members
▾
Returns all team members with their roles and permissions.
{ "success": true, "members": [{ "id": "usr_1", "name": "Sarah K.", "email": "sarah@firm.com", "role": "admin", "status": "active" }] }
/api/enterprise/team/invite
Invite a team member
▾
Sends an email invitation to a new team member. They receive a sign-up link valid for 72 hours.
Request Body
| Field | Type | Description |
|---|---|---|
emailrequired | string | Invitee's email address |
rolerequired | string | admin, advisor, viewer |
nameoptional | string | Display name for the invite |
{ "success": true, "invitation": { "id": "inv_xyz", "email": "newadvisor@firm.com", "expires_at": "2026-04-10T12:00:00Z" } }
/api/enterprise/models
List model portfolios
▾
Returns all model portfolios. Models are rebalancing templates that can be assigned to accounts and pushed in bulk.
{ "success": true, "models": [{ "id": "mod_growth", "name": "Growth 80/20", "assets": [ { "ticker": "VTI", "weight": 0.8 }, { "ticker": "BND", "weight": 0.2 } ], "assigned_accounts": 89 }] }
/api/enterprise/models
Create a model portfolio
▾
Creates a new model portfolio. Asset weights must sum to exactly 1.0.
Request Body
| Field | Type | Description |
|---|---|---|
namerequired | string | Display name for the model |
assetsrequired | array | Array of {ticker, weight} objects summing to 1.0 |
descriptionoptional | string | Human-readable model description |
rebalance_thresholdoptional | number | Drift % that triggers rebalance (default: 0.05) |
{ "success": true, "model": { "id": "mod_new456", "name": "Conservative Income", "status": "active" } }
/api/enterprise/models/:id/push
Push model to all assigned accounts
▾
Triggers a rebalance of all accounts assigned to this model. Creates rebalance orders asynchronously. Returns a job ID to track progress.
Request Body
| Field | Type | Description |
|---|---|---|
dry_runoptional | boolean | Simulate orders without executing. Default: false |
account_idsoptional | array | Subset of account IDs. Omit to push to all assigned |
{ "success": true, "job": { "id": "job_rebal_789", "model_id": "mod_growth", "accounts_queued": 89, "dry_run": false, "status": "processing" } }
/api/enterprise/analytics/overview
Platform analytics overview
▾
Returns aggregated analytics for the enterprise: AUM trend, account growth, return performance, and fee revenue.
Query Parameters
| Param | Type | Description |
|---|---|---|
periodoptional | string | 7d, 30d, 90d, 1y. Default: 30d |
{ "success": true, "analytics": { "aum_usd": 48200000, "aum_change_pct": 2.4, "accounts_active": 298, "new_accounts_30d": 14, "avg_return_ytd_pct": 6.8, "fee_revenue_30d_usd": 18420 } }
/api/enterprise/compliance/audit
Compliance audit log Growth+
▾
Returns a full audit log of all API actions, user logins, and trade events. Available on Growth and Enterprise plans only.
Query Parameters
| Param | Type | Description |
|---|---|---|
start_dateoptional | string | ISO 8601 date (e.g. 2026-01-01) |
end_dateoptional | string | ISO 8601 date |
event_typeoptional | string | login, trade, api_call, settings_change |
actor_idoptional | string | Filter by user or API token ID |
{ "success": true, "events": [{ "id": "evt_001", "type": "api_call", "actor": "usr_1", "endpoint": "GET /portfolio/accounts", "ip": "203.0.113.5", "timestamp": "2026-04-07T09:15:00Z" }], "total": 14820 }
Code Examples
JavaScript / Node.js
const BASE = 'https://wealthsignal.net/api/enterprise'; const token = process.env.WS_API_TOKEN; const headers = { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' }; async function getAccounts(page = 1) { const res = await fetch(`${BASE}/portfolio/accounts?page=${page}`, { headers }); const data = await res.json(); if (!data.success) throw new Error(data.error?.message); return data.accounts; } async function pushModel(modelId, dryRun = true) { const res = await fetch(`${BASE}/models/${modelId}/push`, { method: 'POST', headers, body: JSON.stringify({ dry_run: dryRun }) }); return res.json(); }
Python
import os, requests BASE = 'https://wealthsignal.net/api/enterprise' TOKEN = os.environ['WS_API_TOKEN'] HEADERS = {'Authorization': f'Bearer {TOKEN}', 'Content-Type': 'application/json'} def get_analytics(period='30d'): r = requests.get(f'{BASE}/analytics/overview', params={'period': period}, headers=HEADERS) r.raise_for_status() return r.json()['analytics'] analytics = get_analytics('90d') print(f'AUM: ${"{"}analytics["aum_usd"]{"}"}:,.0f}')
API Explorer
Test API endpoints directly from this page. Your token is pre-filled if you're logged in to the enterprise portal.
Changelog
- Added
GET /compliance/auditendpoint for Growth+ plans - Model push now returns async job ID with polling endpoint
- New
rebalance_thresholdfield on model portfolios
- Fixed pagination returning incorrect
totalcount for archived accounts - Analytics
avg_return_ytd_pctnow correctly annualizes partial-year data
- Team invite flow updated —
roleis now required - All endpoints now under
/api/enterprise/prefix - Token expiry extended from 7 days to 30 days
- Rate limit headers added to all responses
- Fixed 502 errors from market data provider during pre-market hours
- Improved error messages for validation failures