WealthSignal API REST · JSON

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.

REST API JSON Responses Bearer Auth TLS 1.3 Webhooks

Base URL:

base url
https://wealthsignal.net/api/enterprise
Quick Start: Authenticate with 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

bash
curl -X POST https://wealthsignal.net/api/enterprise/auth/login \
  -H "Content-Type: application/json" \
  -d '{"email":"you@yourfirm.com","password":"your-password"}'
response
{
  "success": true,
  "token": "eyJhbGciOiJIUzI1NiJ9...",
  "expires_at": "2026-05-07T00:00:00Z",
  "company": {
    "id": "comp_abc123",
    "name": "Apex Wealth",
    "plan": "enterprise"
  }
}

Using the Token

bash
curl -H "Authorization: Bearer YOUR_TOKEN" \
  https://wealthsignal.net/api/enterprise/profile
Token Expiration: Tokens expire after 30 days. Store the token securely (environment variables, secrets manager). Never commit tokens to source control.

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.

PlanRequests / HourBurstConcurrent
Starter100205
Growth1,00010020
Enterprise10,000500100

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.

error response
{
  "success": false,
  "error": {
    "code": "UNAUTHORIZED",
    "message": "Invalid or expired token",
    "status": 401
  }
}
StatusCodeDescription
400BAD_REQUESTMissing or invalid request parameters
401UNAUTHORIZEDInvalid, expired, or missing token
403FORBIDDENInsufficient plan or permissions
404NOT_FOUNDResource does not exist
409CONFLICTResource already exists
422VALIDATION_ERRORBusiness rule violation
429RATE_LIMITEDToo many requests, back off and retry
500INTERNAL_ERRORServer error — contact support
502UPSTREAM_ERRORUpstream market data unavailable

Endpoints

POST /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

FieldTypeDescription
emailrequiredstringYour enterprise account email
passwordrequiredstringAccount password

Response

200 ok
{ "success": true, "token": "eyJ...", "expires_at": "2026-05-07T00:00:00Z" }
GET /api/enterprise/profile Get enterprise profile

Returns the authenticated enterprise's profile including plan details, AUM, and configuration.

Response

200 ok
{
  "success": true,
  "company": {
    "id": "comp_abc123",
    "name": "Apex Wealth",
    "plan": "enterprise",
    "aum_usd": 48200000,
    "accounts_count": 312,
    "created_at": "2024-06-01"
  }
}
GET /api/enterprise/portfolio/accounts List portfolio accounts

Returns a paginated list of all portfolio accounts managed by this enterprise.

Query Parameters

ParamTypeDefaultDescription
pageoptionalinteger1Page number
per_pageoptionalinteger50Results per page (max 100)
statusoptionalstringallFilter: active, pending, closed
model_idoptionalstringFilter by assigned model portfolio

Response

200 ok
{
  "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 }
}
POST /api/enterprise/portfolio/accounts Create a portfolio account

Creates a new portfolio account and optionally assigns a model portfolio.

Request Body

FieldTypeDescription
owner_namerequiredstringAccount owner full name
owner_emailrequiredstringAccount owner email
model_idoptionalstringModel portfolio ID to assign
initial_deposit_usdoptionalnumberInitial funding amount in USD
risk_profileoptionalstringconservative, moderate, aggressive
201 created
{ "success": true, "account": { "id": "acc_new123", "status": "pending_kyc", "owner_name": "Bob Jones" } }
GET /api/enterprise/team List team members

Returns all team members with their roles and permissions.

200 ok
{
  "success": true,
  "members": [{
    "id": "usr_1", "name": "Sarah K.",
    "email": "sarah@firm.com",
    "role": "admin", "status": "active"
  }]
}
POST /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

FieldTypeDescription
emailrequiredstringInvitee's email address
rolerequiredstringadmin, advisor, viewer
nameoptionalstringDisplay name for the invite
200 ok
{ "success": true, "invitation": { "id": "inv_xyz", "email": "newadvisor@firm.com", "expires_at": "2026-04-10T12:00:00Z" } }
GET /api/enterprise/models List model portfolios

Returns all model portfolios. Models are rebalancing templates that can be assigned to accounts and pushed in bulk.

200 ok
{
  "success": true,
  "models": [{
    "id": "mod_growth",
    "name": "Growth 80/20",
    "assets": [
      { "ticker": "VTI", "weight": 0.8 },
      { "ticker": "BND", "weight": 0.2 }
    ],
    "assigned_accounts": 89
  }]
}
POST /api/enterprise/models Create a model portfolio

Creates a new model portfolio. Asset weights must sum to exactly 1.0.

Request Body

FieldTypeDescription
namerequiredstringDisplay name for the model
assetsrequiredarrayArray of {ticker, weight} objects summing to 1.0
descriptionoptionalstringHuman-readable model description
rebalance_thresholdoptionalnumberDrift % that triggers rebalance (default: 0.05)
201 created
{ "success": true, "model": { "id": "mod_new456", "name": "Conservative Income", "status": "active" } }
POST /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.

Note: This triggers live trading orders for all assigned accounts. Use with caution in production. Consider dry_run mode first.

Request Body

FieldTypeDescription
dry_runoptionalbooleanSimulate orders without executing. Default: false
account_idsoptionalarraySubset of account IDs. Omit to push to all assigned
202 accepted
{
  "success": true,
  "job": {
    "id": "job_rebal_789",
    "model_id": "mod_growth",
    "accounts_queued": 89,
    "dry_run": false,
    "status": "processing"
  }
}
GET /api/enterprise/analytics/overview Platform analytics overview

Returns aggregated analytics for the enterprise: AUM trend, account growth, return performance, and fee revenue.

Query Parameters

ParamTypeDescription
periodoptionalstring7d, 30d, 90d, 1y. Default: 30d
200 ok
{
  "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
  }
}
GET /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

ParamTypeDescription
start_dateoptionalstringISO 8601 date (e.g. 2026-01-01)
end_dateoptionalstringISO 8601 date
event_typeoptionalstringlogin, trade, api_call, settings_change
actor_idoptionalstringFilter by user or API token ID
200 ok
{
  "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

javascript
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

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.

// Response will appear here…


Changelog

April 7, 2026
v2.1.0 new
  • Added GET /compliance/audit endpoint for Growth+ plans
  • Model push now returns async job ID with polling endpoint
  • New rebalance_threshold field on model portfolios
March 12, 2026
v2.0.5 fix
  • Fixed pagination returning incorrect total count for archived accounts
  • Analytics avg_return_ytd_pct now correctly annualizes partial-year data
January 20, 2026
v2.0.0 new breaking
  • Team invite flow updated — role is 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
November 8, 2025
v1.4.2 fix
  • Fixed 502 errors from market data provider during pre-market hours
  • Improved error messages for validation failures
SEC registration pending · Paper trading is for educational purposes only · Terms · Privacy