Skip to main content
POST
Analyze Portfolio

How It Works

This endpoint uses async job processing for handling large portfolios:
  1. Submit Job: POST your portfolio data to /v1/portfolio/analyze
  2. Receive Job ID: Get a job ID and polling URL immediately
  3. Poll for Status: Check /v1/jobs/{job_id} until status is completed
  4. Get Results: The completed job response contains the full analysis
Processing typically takes 60-120 seconds depending on the date range and number of holdings.

Request Body

Portfolio Holdings Format

Each item in the portfolio array:
Weights should sum to 1.0 for each date. They will be normalized if not.

Field Selection

Use the optional fields parameter to return only specific data sections. If omitted, all fields are returned.

Response Fields

The completed analysis includes:

Example Response

When the job completes, GET /v1/jobs/{job_id} returns:
Response shown is abbreviated. Full response includes all fields listed above, plus detailed timeseries for allocations, drawdowns, rolling metrics, and more.

Example: Polling for Results

Authorizations

Authorization
string
header
required

API key passed as Bearer token

Body

application/json

Request body for portfolio analysis

portfolio
object[]
required

List of holdings with date, symbol, and weight. Weights should sum to 1.0 for each rebalance date. Multiple dates supported for rebalancing.

Minimum array length: 1
start_date
string<date>

Analysis start date (YYYY-MM-DD). If not provided, defaults to first rebalance date in portfolio.

Example:

"2024-01-01"

end_date
string<date>

Analysis end date (YYYY-MM-DD). If not provided, defaults to yesterday. Future dates are auto-capped to yesterday.

Example:

"2024-11-01"

base_currency
string
default:USD

Base currency for portfolio valuation. Supports USD, SGD, EUR, GBP, JPY, etc.

Example:

"USD"

benchmark
string
default:ACWI

Benchmark for comparison (e.g., ACWI, SPY)

Example:

"ACWI"

initial_value
number
default:10000

Initial portfolio value in base currency. Used to calculate absolute P&L and position sizes.

Example:

10000

include_transaction_costs
boolean
default:false

Apply market-specific transaction costs during rebalancing

Example:

false

transaction_cost_config
object | null

Custom transaction cost rates by market. Format: {'market_name': {'buy': rate, 'sell': rate}}. If not provided, uses default rates.

Example:
fields
enum<string>[]

Optional field selection. If omitted, all fields are returned. Use this to reduce response size.

Available options:
portfolio_parameters,
portfolio_input,
data_quality,
portfolio_summary,
turnover_analysis,
performance_metrics,
rolling_metrics,
drawdown_analysis,
portfolio_scores,
concentration_metrics,
transactions,
company_info,
latest_holdings,
market_allocation,
sector_allocation,
currency_allocation,
company_contribution,
sector_contribution,
market_contribution,
time_period_returns,
monthly_returns,
annual_returns,
benchmark_prices,
daily_summary
Example:

Response

Job created successfully. Poll the check_url for results.

job_id
string

Unique job identifier

status
enum<string>

Initial job status

Available options:
pending
check_url
string

URL to poll for job status

estimated_duration_seconds
integer

Estimated processing time in seconds

message
string

Human-readable status message

portfolio_summary
object