Harbour is the API gateway for Equity Data Science (EDS). It provides rate-limited, authenticated access to portfolio analytics, Excel/Outlook add-in services, OAuth token exchange, and the MCP protocol.
https://harbour-api.equitydatascience.com28 endpoints across 3 categories
eds-api-keyAPI key issued per user. Passed in the 'eds-api-key' request header.
OAuth 2.0 JWT bearer token. Passed in the 'Authorization: Bearer
Authorize with your API key above to view API endpoint documentation.
Rate limiting is enforced per-user across all endpoints. Limits apply across three time windows: per-minute, per-hour, and per-day.
Default limits: 5,000/min, 30,000/hr, 60,000/day
| Code | Name | Description |
|---|---|---|
| 400 | Bad Request | The request body is malformed, missing required fields, or contains invalid values. |
| 401 | Unauthorized | Authentication credentials are missing or invalid (expired token, revoked API key). |
| 403 | Forbidden | The authenticated user does not have the required scopes or permissions for this operation. |
| 404 | Not Found | The requested resource does not exist (e.g., unknown username, missing template). |
| 406 | Not Acceptable | The Accept header specifies a media type the server cannot produce. |
| 415 | Unsupported Media Type | The Content-Type header is not supported. Most endpoints require application/json. |
| 422 | Unprocessable Entity | The request was well-formed but could not be processed (e.g., missing required user attributes such as email or fund). |
| 429 | Too Many Requests | Rate limit exceeded. Check Retry-After header for when to retry. |
| 500 | Internal Server Error | An unexpected error occurred on the server. Contact support if the issue persists. |
| 502 | Bad Gateway | An upstream service returned an invalid response. |
Authenticated API endpoints for programmatic access to EDS analytics, portfolio management, charting, internal data, and user management.
/datapull/v1/api/user_token/{username}
eds-api-keyrate-limitedtoken.read
Get user token
Retrieves (or creates) an active API token for the given username. Requires the 'token.read' scope.
| Name | Type | Required | Description |
|---|---|---|---|
username | string | Yes | The target username to retrieve or create a token for. |
GET https://harbour-api.equitydatascience.com/datapull/v1/api/user_token/jdoe
eds-api-key: <your-api-key>
HTTP/1.1 200
{
"username": "jdoe",
"fund": "eds100",
"token": "abc123-..."
}
/datapull/rate-limit-info
eds-api-key
Get current rate limit status
Returns the current rate limit counters and remaining quota for the authenticated user.
GET https://harbour-api.equitydatascience.com/datapull/rate-limit-info
eds-api-key: <your-api-key>
HTTP/1.1 200
{
"rate_limiter": "slowapi",
"info": {
"auth_id": "jdoe",
"auth_type": "username",
"fund_id": "eds100",
"redis_source": "graphite_redis",
"limits": {
"minute": {
"used": 15,
"limit": 5000
},
"hour": {
"used": 100,
"limit": 30000
},
"day": {
"used": 200,
"limit": 60000
}
}
}
}
/datapull/v1/api/nexus_factors
eds-api-keyrate-limited
Factor Exposures
Returns factor exposure data for a portfolio, including Z-scores, volatility-adjusted exposures, variance contributions, 30-day returns, and annualized volatility. Results are grouped by factor group (Market, Risk Indices, Industries, Countries, Currencies).
| Name | Type | Required | Description |
|---|---|---|---|
portfolio | string | No | Portfolio name (e.g. "Fund A"). When omitted, the user's default portfolio is used. |
factorModel | string | No | Factor model identifier (e.g. "GEMTRD", "GEMLTD", "AXUS4S"). When omitted, the user's default factor model is used. |
aumType | string | No | AUM type. Default "aum". Options: "aum", "custom". |
benchmark | string | No | Benchmark name or null for no benchmark. |
proxyToStreet | boolean | No | Use street-side proxy mappings. Default false. |
currencyHedge | boolean | No | Apply currency hedge. Default false. |
as_of_date | string | No | Return factor exposures as of this date (YYYY-MM-DD). Resolved to nearest prior trading day. Default null (latest available). |
POST https://harbour-api.equitydatascience.com/datapull/v1/api/nexus_factors
eds-api-key: <your-api-key>
Content-Type: application/json
{
"portfolio": "Fund A",
"factorModel": "GEMTRD",
"aumType": "aum",
"benchmark": null,
"proxyToStreet": false,
"currencyHedge": false
}
HTTP/1.1 200
[
{
"Factor Group": "Market",
"Factors": "World",
"Z-Score": 2.0422,
"Vol Adj Exp (Daily)": 0.014651,
"% of Total Variance": 0.627096,
"Ret (30D)": 0.028855,
"Vol (Ann)": 0.113888
},
{
"Factor Group": "Risk Indices",
"Factors": "Beta",
"Z-Score": 0.949855,
"Vol Adj Exp (Daily)": 0.002932,
"% of Total Variance": 0.107569,
"Ret (30D)": -7.5e-05,
"Vol (Ann)": 0.049004
}
]
/datapull/v1/api/nexus_summary
eds-api-keyrate-limited
Portfolio Summary
Returns portfolio summary metrics including positions, AUM, exposures, beta, volatility, VaR, and IRR. Results are returned in Dollar and Percent sections. Optional valueType filter accepts: "$", "%", "Dollar", "Percent".
| Name | Type | Required | Description |
|---|---|---|---|
portfolio | string | No | Portfolio name (e.g. "Fund A"). When omitted, the user's default portfolio is used. |
factorModel | string | No | Factor model identifier (e.g. "GEMTRD", "GEMLTD", "AXUS4S"). When omitted, the user's default factor model is used. |
aumType | string | No | AUM type. Default "aum". Options: "aum", "custom". |
valueType | string | No | Filter results by value type. Options: "$", "%", "Dollar", "Percent". |
as_of_date | string | No | Return portfolio summary as of this date (YYYY-MM-DD). Resolved to nearest prior trading day. Default null (latest available). |
POST https://harbour-api.equitydatascience.com/datapull/v1/api/nexus_summary
eds-api-key: <your-api-key>
Content-Type: application/json
{
"portfolio": "Fund A",
"factorModel": "GEMTRD",
"aumType": "aum"
}
HTTP/1.1 200
{
"Dollar": {
"Total Positions": 19,
"Longs": 19,
"Shorts": 0,
"AUM": 617375528.86,
"Gross": 1260804305.04,
"Net": 1260804305.04,
"Beta Net": 1565013113.15,
"Vol Ann": 206328565.32,
"VaR Ann": 339389857.1,
"IRR": 0.492365
},
"Percent": {
"Total Positions": 19,
"Longs": 19,
"Shorts": 0,
"AUM": 1.0,
"Gross": 2.0422,
"Net": 2.0422,
"Beta Net": 2.534945,
"Vol Ann": 0.334203,
"VaR Ann": 0.54973,
"IRR": 0.492365
}
}
/datapull/v1/api/columns
eds-api-keyrate-limited
Available Grid Columns
Returns all available column definitions for the portfolio grid, grouped by source (e.g., Risk, Fundamentals, Holdings). Use the variable_name values as input for the nexus_portfolio_grid endpoint's columnNames parameter.
| Name | Type | Required | Description |
|---|---|---|---|
rawPriceTargets | boolean | No | Include raw price target columns. Default: true. |
POST https://harbour-api.equitydatascience.com/datapull/v1/api/columns
eds-api-key: <your-api-key>
Content-Type: application/json
{
"rawPriceTargets": true
}
HTTP/1.1 200
{
"Risk": [
{
"display_name": "% of Variance",
"variable_name": "grid_pct_variance",
"tooltip": "% of Variance",
"data_type": "percent",
"has_history": false
},
{
"display_name": "Contrib to Portfolio Vol",
"variable_name": "grid_vol_contri",
"tooltip": "Contribution to Portfolio Vol",
"data_type": "number",
"has_history": false
}
],
"Holdings": [
{
"display_name": "Ticker",
"variable_name": "ticker",
"tooltip": "Ticker",
"data_type": "string",
"has_history": false
}
]
}
/datapull/v1/api/nexus_portfolio_grid
eds-api-keyrate-limited
Portfolio Grid Data
Returns portfolio grid data with selectable columns. Pass columnNames as an array of variable names (e.g., ["ticker", "priceusd", "country"]). Use the columns endpoint to discover available variable names. When portfolio is passed as an array of securities, null values are returned for Quantity, AUM, % of Gross, Ticker, % of AUM, Invested ($M), Strategy, and Gross.
| Name | Type | Required | Description |
|---|---|---|---|
portfolio | string | No | Portfolio name (e.g. "Fund A"). When omitted, the user's default portfolio is used. |
factorModel | string | No | Factor model identifier (e.g. "GEMTRD", "GEMLTD", "AXUS4S"). When omitted, the user's default factor model is used. |
aumType | string | No | AUM type. Default "aum". Options: "aum", "custom". |
columnNames | array[string] | No | Array of column variable_name values from the columns endpoint. |
viewId | string | No | Saved bookmark/view ID (UUID) to load column configuration from. |
rawPriceTargets | boolean | No | Include raw price target columns. Default: true. |
as_of_date | string | No | Return portfolio positions as of this date (YYYY-MM-DD). Resolved to nearest prior trading day. Default null (latest available). |
appliedPPK | array[string] | No | PPK column names to net and aggregate positions by (e.g. ["strategy"]). When omitted, positions are aggregated by factset_id only. |
ppk_filters | object | No | Filter to a specific PPK sub-group and renormalise weights (e.g. {"strategy": ["Long Only"]}). When omitted, all sub-groups are included. |
POST https://harbour-api.equitydatascience.com/datapull/v1/api/nexus_portfolio_grid
eds-api-key: <your-api-key>
Content-Type: application/json
{
"portfolio": "Fund A",
"factorModel": "GEMTRD",
"aumType": "aum",
"columnNames": [
"ticker",
"priceusd",
"country"
]
}
HTTP/1.1 200
[
{
"ticker": "CRH US",
"grid_pct_factor": 0.009876
},
{
"ticker": "AMZN US",
"grid_pct_factor": 0.062986
},
{
"ticker": "BAC US",
"grid_pct_factor": 0.047578
}
]
/datapull/v1/api/nexus_optimizer
eds-api-keyrate-limited
Portfolio Optimizer
Optimizes portfolio allocations using various objective functions and constraints. objectiveFunction values: "maximumIdio", "maximumExpReturn", "minimumTrading", "balancedVariance", "riskPriority". Constraints include portfolio-level (maxTurnover, maxVol, maxNetExposure, etc.), position-level (maxLongPosition, maxShortPosition), risk (minIdio, factorConstraints), beta (maxNetBeta, minNetBeta), and holdings (maxLongHoldings, maxShortHoldings).
| Name | Type | Required | Description |
|---|---|---|---|
portfolio | string | array | Yes | Portfolio name or array of [ticker, weight] pairs (e.g. [["CRH US", 0.16], ["AMZN US", 0.12]]). |
factorModel | string | No | Factor model identifier (e.g. "GEMTRD", "GEMLTD", "AXUS4S"). When omitted, the user's default factor model is used. |
aum | number | No | Assets under management in dollars. |
objectiveFunction | string | Yes | Optimization objective. Options: "maximumIdio", "maximumExpReturn", "minimumTrading", "balancedVariance". |
aumType | string | No | AUM type. Default "aum". Options: "aum", "custom". |
constraints | object | No | Optimization constraints object. Keys include maxTurnover, maxVol, maxNetExposure, minNetExposure, minGrossExposure, maxGrossExposure, minIdio, maxNetBeta, minNetBeta, maxLongPosition, maxShortPosition, maxLongHoldings, maxShortHoldings, factorConstraints. |
simulateByGroup | boolean | No | Simulate optimization by factor group. Default false. |
proxyToStreet | boolean | No | Use street-side proxy mappings. Default false. |
currencyHedge | boolean | No | Apply currency hedge. Default false. |
excludePortfolio | boolean | No | Exclude current portfolio positions from optimization. Default false. |
watchlistTickers | array[string] | No | Array of tickers to restrict the optimization universe to. |
as_of_date | string | No | Run optimization as of a specific date (YYYY-MM-DD). Default null (latest available). |
custom_position_constraints | object | No | Per-position constraints keyed by ticker (e.g. min/max weight overrides). |
featureFlags | object | No | Feature flag overrides for experimental optimizer behaviour. |
POST https://harbour-api.equitydatascience.com/datapull/v1/api/nexus_optimizer
eds-api-key: <your-api-key>
Content-Type: application/json
{
"portfolio": [
[
"CRH US",
0.1646
],
[
"COF US",
0.1418
],
[
"AMZN US",
0.1157
],
[
"BAC US",
0.1099
]
],
"factorModel": "GEMTRD",
"aum": 10000000,
"aumType": "aum",
"objectiveFunction": "minimumTrading",
"constraints": {
"maxVol": 16,
"maxNetExposure": 8,
"minNetExposure": -8,
"minGrossExposure": 95,
"maxGrossExposure": 105,
"minIdio": 0.25
},
"simulateByGroup": false,
"proxyToStreet": false,
"currencyHedge": true
}
HTTP/1.1 200
[
{
"ticker": "CRH US",
"current_weight": 0.1646,
"optimal_weight": 0.17,
"trade": 0.0054
},
{
"ticker": "COF US",
"current_weight": 0.1418,
"optimal_weight": 0.14,
"trade": -0.0018
}
]
/datapull/v1/api/holdings
eds-api-keyrate-limited
Portfolio Holdings
Returns the current holdings for a portfolio.
| Name | Type | Required | Description |
|---|---|---|---|
portfolio | string | No | Portfolio name (e.g. "Fund A"). When omitted, the user's default portfolio is used. |
POST https://harbour-api.equitydatascience.com/datapull/v1/api/holdings
eds-api-key: <your-api-key>
Content-Type: application/json
{
"portfolio": "Fund A"
}
HTTP/1.1 200
[
{
"factset_id": "0P000003MH",
"bbg_ticker": "AAPL US",
"security_type": "Common Stock",
"figi": "BBG000B9XRY4"
},
{
"factset_id": "0HGQ8W-E",
"bbg_ticker": "MSFT US",
"security_type": "Common Stock",
"figi": "BBG000BPH459"
},
{
"factset_id": "MH33D6-R",
"bbg_ticker": null,
"security_type": null,
"figi": null
}
]
/datapull/v1/api/portfolio_data
eds-api-keyrate-limited
Portfolio Data
Returns portfolio position data including factset_id, ticker, description, pct_aum, instrument_type, and all portfolio primary key (PPK) columns for the specified portfolio. Paginated at 500 records per page. Response includes data array, total record count, page number, and total pages.
| Name | Type | Required | Description |
|---|---|---|---|
portfolio | string | Yes | Portfolio name (e.g. "Fund A"). |
page | integer | No | Page number (starts at 1). Default 1. Each page returns up to 500 records. |
as_of_date | string | No | Return portfolio as of this date (YYYY-MM-DD). Falls back to the nearest prior available date if the exact date is not found (e.g. weekends). Default null (latest available snapshot). |
POST https://harbour-api.equitydatascience.com/datapull/v1/api/portfolio_data
eds-api-key: <your-api-key>
Content-Type: application/json
{
"portfolio": "Fund A",
"page": 1,
"as_of_date": null
}
HTTP/1.1 200
{
"data": [
{
"factset_id": "0P000003MH",
"ticker": "AAPL US",
"description": "Apple Inc.",
"pct_aum": 0.0523,
"instrument_type": "Common Stock",
"strategy": "Long Only"
},
{
"factset_id": "0HGQ8W-E",
"ticker": "MSFT US",
"description": "Microsoft Corp.",
"pct_aum": 0.0412,
"instrument_type": "Common Stock",
"strategy": "Long Only"
}
],
"total": 750,
"page": 1,
"total_pages": 2,
"portfoliodate": "2025-12-04"
}
/datapull/v1/api/nexus_bookmarks
eds-api-keyrate-limited
Saved Nexus Bookmarks
Returns the list of saved Nexus bookmarks (views) for the authenticated user. Includes both user-owned bookmarks and shared (grouped) bookmarks visible to the user's fund. Use the returned viewId values to load saved portfolio views. No request body parameters are required.
POST https://harbour-api.equitydatascience.com/datapull/v1/api/nexus_bookmarks
eds-api-key: <your-api-key>
Content-Type: application/json
HTTP/1.1 200
[
{
"viewId": 42,
"viewName": "My Risk View",
"sharedWithMe": false
},
{
"viewId": 87,
"viewName": "Team Factor View",
"sharedWithMe": true
}
]
/datapull/v1/api/columns_data
eds-api-keyrate-limited
Column Data Values
Returns calculated column values for securities in a portfolio. Resolves each data key through a hybrid lookup: if the key exists as a generic config column (e.g., FactSet fundamentals), the financial data source is used; otherwise it falls back to fund-scoped internal data. Use the columns or internal_data_key_list endpoints to discover available data keys.
| Name | Type | Required | Description |
|---|---|---|---|
identifier | string | array[string] | No | Bloomberg ticker or FactSet ID. Pass a single string for one security, or an array for multiple. Required if portfolio is not provided. |
portfolio | string | No | Portfolio name — fetches data for all current holdings. Required if identifier is not provided. |
data_key | string | array[string] | Yes | Column variable_name to retrieve. Pass a single string for one column, or an array for multiple. Multiple keys are fetched in parallel and merged by identifier. |
POST https://harbour-api.equitydatascience.com/datapull/v1/api/columns_data
eds-api-key: <your-api-key>
Content-Type: application/json
{
"identifier": [
"AAPL US",
"GOOGL US"
],
"data_key": [
"priceusd",
"country",
"sector"
]
}
HTTP/1.1 200
[
{
"identifier": "AAPL US",
"priceusd": 189.3,
"country": "UNITED STATES",
"sector": "Information Technology"
},
{
"identifier": "GOOGL US",
"priceusd": 415.2,
"country": "UNITED STATES",
"sector": "Communication Services"
}
]
/datapull/v1/api/proxy_mappings
eds-api-keyrate-limited
Factor Model Proxy Mappings
Returns factor model proxy mappings for the authenticated user's fund. Each mapping shows the original security, its proxy, and a description. No request body parameters are required.
POST https://harbour-api.equitydatascience.com/datapull/v1/api/proxy_mappings
eds-api-key: <your-api-key>
Content-Type: application/json
HTTP/1.1 200
[
{
"proxied_factsetid": "AAPL-USA",
"factset_id": "MSFT-USA",
"description": "Apple Inc."
}
]
/datapull/v1/api/nexus_intraday
eds-api-keyrate-limited
Intraday Return & Factor Attribution
Returns intraday return and factor attribution data per security. Response columns include intraday_return_percent, intraday_return_amount, factor_return_contribution_percent, factor_return_contribution_amount, idio_return_contribution_percent, idio_return_contribution_amount, currency_return_contribution_percent, currency_return_contribution_amount, and their unweighted variants. Requires Redis intraday ticker/factor returns to be populated. When the factor model does not cover securities, factor contribution columns are returned as null. When as_of_date is provided, only ticker stubs (factsetId) are returned without intraday columns, since intraday data is only available for the current trading session.
| Name | Type | Required | Description |
|---|---|---|---|
portfolio | string | array | No | Portfolio name or array of [ticker, weight] pairs. When omitted, the user's default portfolio is used. |
factorModel | string | No | Factor model identifier (e.g. "GEMTRD", "GEMLTD", "AXUS4S"). When omitted, the user's default factor model is used. |
aumType | string | No | AUM type. Default "aum". Options: "aum", "custom". |
proxyToStreet | boolean | No | Use street-side proxy mappings. Default false. |
currencyHedge | boolean | No | Apply currency hedge. Default false. |
lookThrough | boolean | No | Enable look-through for fund-of-fund holdings. Default false. |
as_of_date | string | No | Historical date (YYYY-MM-DD). When provided, only ticker stubs (factsetId) are returned without intraday return columns, since intraday data is only available for the current trading session. |
POST https://harbour-api.equitydatascience.com/datapull/v1/api/nexus_intraday
eds-api-key: <your-api-key>
Content-Type: application/json
{
"portfolio": "Fund A",
"factorModel": "GEMTRD",
"aumType": "aum",
"currencyHedge": false
}
HTTP/1.1 200
[
{
"factsetId": "0P000003MH",
"index": 0,
"intraday_return_percent": 0.000523,
"intraday_return_amount": 0.322891,
"factor_return_contribution_percent": 0.000312,
"factor_return_contribution_amount": 0.192654,
"idio_return_contribution_percent": 0.000211,
"idio_return_contribution_amount": 0.130237,
"currency_return_contribution_percent": 0.0,
"currency_return_contribution_amount": 0.0,
"unweighted_return_intraday": 0.00312,
"unweighted_factor_return": 0.00186,
"unweighted_idio_return": 0.00126,
"unweighted_currency_return": 0.0,
"pctequity": 0.1676
}
]
/datapull/v1/api/myportfolio
eds-api-keyrate-limited
MyPortfolio Widget Data
Returns data for a specified MyPortfolio widget. Only portfolio names are supported (not array format). Filters must match exactly as they appear on the widget in the MyPortfolio page.
| Name | Type | Required | Description |
|---|---|---|---|
widgetName | string | Yes | Name of the MyPortfolio widget to retrieve data for. |
portfolio | string | No | Portfolio name (e.g. "Fund A"). When omitted, the user's default portfolio is used. |
factorModel | string | No | Factor model identifier (e.g. "GEMTRD", "GEMLTD", "AXUS4S"). When omitted, the user's default factor model is used. |
aumType | string | No | AUM type. Default "aum". Options: "aum", "custom". |
benchmark | string | No | Benchmark name or null for no benchmark. |
adrProxies | boolean | No | Use ADR proxy mappings. Default false. |
currencyHedge | boolean | No | Apply currency hedge. Default false. |
lookthrough | boolean | No | Enable look-through for fund-of-fund holdings. Default false. |
filters | object | No | Widget filter overrides as key-value pairs (e.g. {"direction": ["long"]}). Available filters depend on the widget. When omitted, widget defaults are used. |
POST https://harbour-api.equitydatascience.com/datapull/v1/api/myportfolio
eds-api-key: <your-api-key>
Content-Type: application/json
{
"widgetName": "Category Risk Contribution",
"portfolio": "Fund B",
"factorModel": "GEMTRD",
"aumType": "aum",
"benchmark": null,
"adrProxies": false,
"currencyHedge": true,
"lookthrough": false
}
HTTP/1.1 200
[
{
"Sector (GICS)": "Health Care",
"Net Portfolio Exposure": "18.14%",
"Net Beta Exposure": "14.19%",
"Portfolio Vol": "4.33%",
"Idio Vol": "2.0%",
"% of Variance": "36.71%",
"% of Idio": "19.71%",
"Idio % of Variance": "7.8%"
},
{
"Sector (GICS)": "Industrials",
"Net Portfolio Exposure": "7.58%",
"Net Beta Exposure": "10.23%",
"Portfolio Vol": "3.21%",
"Idio Vol": "2.25%",
"% of Variance": "20.23%",
"% of Idio": "24.96%",
"Idio % of Variance": "9.87%"
}
]
/datapull/v1/api/charting_metrics
eds-api-keyrate-limited
Available Charting Metrics
Returns available charting metric groups and their individual metrics. Use the metric_id values in the charting endpoint's selected_metrics parameter.
POST https://harbour-api.equitydatascience.com/datapull/v1/api/charting_metrics
eds-api-key: <your-api-key>
Content-Type: application/json
HTTP/1.1 200
[
{
"metric_group_id": "8a9d15e4-...",
"metric_group_name": "Z-Score",
"metrics": [
{
"metric_id": "002d1f73-...",
"display_name": "Market Z-Score"
}
]
},
{
"metric_group_id": "d5f529c9-...",
"metric_group_name": "Exposures %",
"metrics": [
{
"metric_id": "05b79b4c-...",
"display_name": "Net Exposure %"
}
]
}
]
/datapull/v1/api/charting_assets
eds-api-keyrate-limited
Available Charting Assets
Returns available charting asset groups (Factors, Securities, Portfolios) and their individual assets. Use the asset_id values in the charting endpoint's selected_asset parameter.
POST https://harbour-api.equitydatascience.com/datapull/v1/api/charting_assets
eds-api-key: <your-api-key>
Content-Type: application/json
HTTP/1.1 200
[
{
"asset_group_id": "48241bca-...",
"asset_group_name": "Factors",
"assets": [
{
"asset_id": "000e91f7-...",
"display_name": "Market"
}
]
},
{
"asset_group_id": "be82d163-...",
"asset_group_name": "Securities",
"assets": [
{
"asset_id": "0A8QVM-D",
"display_name": "S&P 500"
}
]
},
{
"asset_group_id": "c86fb42d-...",
"asset_group_name": "Portfolios",
"assets": [
{
"asset_id": "eds100_1",
"display_name": "Fund C"
}
]
}
]
/datapull/v1/api/charting
eds-api-keyrate-limited
Chart Data
Returns time-series chart data for selected metrics and assets. Use charting_metrics and charting_assets endpoints to discover available metric_id and asset_id values.
| Name | Type | Required | Description |
|---|---|---|---|
portfolio | string | No | Portfolio name (e.g. "Fund A"). When omitted, the user's default portfolio is used. |
factorModel | string | No | Factor model identifier (e.g. "GEMTRD", "GEMLTD", "AXUS4S"). When omitted, the user's default factor model is used. |
selected_asset | string | Yes | Asset ID from the charting_assets endpoint. |
selected_metrics | array[object] | Yes | Array of metric objects, each with a metric_id from the charting_metrics endpoint. |
daterange | object | No | Date range with start_date and end_date in YYYY-MM-DD format. |
globalSettings | object | No | Global settings object with lookThrough, proxyToStreet, currencyHedge, relatedSecuritiesProxies booleans. |
aumType | string | No | AUM type. Default "aum". Options: "aum", "custom". |
POST https://harbour-api.equitydatascience.com/datapull/v1/api/charting
eds-api-key: <your-api-key>
Content-Type: application/json
{
"portfolio": "Fund B",
"factorModel": "GEMTRD",
"selected_asset": "eds100_fund1",
"selected_metrics": [
{
"metric_id": "17cbff15-7c37-4e61-8069-649fe94bb936"
},
{
"metric_id": "d5e57964-0388-4532-9a55-33a8c50d4ea3"
}
],
"daterange": {
"start_date": "2024-10-01",
"end_date": "2025-09-11"
},
"globalSettings": {
"lookThrough": false,
"proxyToStreet": false,
"currencyHedge": true,
"relatedSecuritiesProxies": false
},
"aumType": "aum"
}
HTTP/1.1 200
{
"data": [
{
"date": "2024-10-01",
"17cbff15-...": 0.0512,
"d5e57964-...": 1.245
},
{
"date": "2024-10-02",
"17cbff15-...": 0.0498,
"d5e57964-...": 1.251
}
],
"selected_metrics": [
{
"metric_id": "17cbff15-...",
"display_name": "Net Exposure %"
},
{
"metric_id": "d5e57964-...",
"display_name": "Gross Exposure %"
}
]
}
/datapull/v1/api/internal_data_key_list
eds-api-keyrate-limited
Available Internal Data Keys
Returns all available internal data field IDs for your fund. Use these data_key values in the internal_data_history endpoint. No request body parameters are required.
POST https://harbour-api.equitydatascience.com/datapull/v1/api/internal_data_key_list
eds-api-key: <your-api-key>
Content-Type: application/json
HTTP/1.1 200
[
{
"source": "Excel Push",
"data key": "30D CONSENSUS EPS REVISION"
},
{
"source": "Excel Push",
"data key": "ABSOLUTE FCF YIELD"
},
{
"source": "Excel Push",
"data key": "BLOOMBERG_TICKER"
}
]
/datapull/v1/api/internal_data_history
eds-api-keyrate-limited
Internal Data History
Returns historical internal data for securities or portfolios. Use either identifiers (array of tickers) or portfolio (portfolio name), but not both. Pass data_keys as an array of field IDs to retrieve. Optional start_date and end_date in YYYY-MM-DD format.
| Name | Type | Required | Description |
|---|---|---|---|
portfolio | string | No | Portfolio name. Required if identifiers is not provided. |
identifiers | array[string] | No | Array of security tickers. Required if portfolio is not provided. |
data_keys | array[string] | Yes | Array of internal data field IDs to retrieve. |
start_date | string | No | Start date in YYYY-MM-DD format. |
end_date | string | No | End date in YYYY-MM-DD format. |
POST https://harbour-api.equitydatascience.com/datapull/v1/api/internal_data_history
eds-api-key: <your-api-key>
Content-Type: application/json
{
"portfolio": "Fund B",
"data_keys": [
"EBIT_FY2026Q1"
],
"start_date": "2024-09-10",
"end_date": "2025-11-29"
}
HTTP/1.1 200
{
"2330 TT": [
{
"date": "2025-11-07",
"EBIT_FY2026Q1": 524626.73
},
{
"date": "2025-11-14",
"EBIT_FY2026Q1": 521948.19
}
],
"AMZN US": [
{
"date": "2025-11-07",
"EBIT_FY2026Q1": 32150.25
}
]
}
/datapull/v1/api/price_targets
eds-api-keyrate-limited
price_targets
| Name | Type | Required | Description |
|---|---|---|---|
identifier | string | Yes | Bloomberg ticker or FactSet ID. |
portfolio | string | No | Portfolio name to scope scenarios to. When omitted, scenarios are returned grouped by all accessible portfolios. |
POST https://harbour-api.equitydatascience.com/datapull/v1/api/price_targets
eds-api-key: <your-api-key>
Content-Type: application/json
{
"identifier": "AAPL US",
"portfolio": "Fund A"
}
HTTP/1.1 200
[
{
"price": 220.0,
"probability": 0.6,
"title": "Bull Case",
"comment": "Strong earnings growth expected.",
"targetDate": "2025-12-31",
"identifier": "AAPL US",
"figi": "BBG000B9XRY4",
"analyst": "Jane Smith"
},
{
"price": 160.0,
"probability": 0.25,
"title": "Bear Case",
"comment": "Margin compression risk.",
"targetDate": "2025-12-31",
"identifier": "AAPL US",
"figi": "BBG000B9XRY4",
"analyst": "Jane Smith"
}
]
/datapull/v1/api/research_grid
eds-api-keyrate-limited
EDS Construction Dashboard
Returns data from the EDS Construction Dashboard for a specified view. Pass view as the view name (e.g., "summary dashboard"). Optionally filter by watchlist or portfolio names.
| Name | Type | Required | Description |
|---|---|---|---|
view | string | Yes | View name (e.g. "summary dashboard"). Use the views endpoint to discover available views. |
watchlist | string | No | Watchlist name to filter results. |
portfolio | string | No | Portfolio name to filter results. |
POST https://harbour-api.equitydatascience.com/datapull/v1/api/research_grid
eds-api-key: <your-api-key>
Content-Type: application/json
{
"view": "summary dashboard",
"watchlist": "Sample Watchlist"
}
HTTP/1.1 200
[
{
"Ticker": "AMZN US",
"Strategy": "Long/Short",
"Instrument Type": "CommonStock",
"Direction": "Long",
"Name": "Amazon.com, Inc.",
"Sector": "Consumer Discretionary",
"Current Value USD": 5.112698
}
]
/datapull/v1/api/views
eds-api-keyrate-limited
Saved Views
Returns all saved views accessible to the authenticated user. Each view includes its name, type, associated watchlists/portfolios, and column configuration. No request body parameters are required.
POST https://harbour-api.equitydatascience.com/datapull/v1/api/views
eds-api-key: <your-api-key>
Content-Type: application/json
HTTP/1.1 200
[
{
"view_name": "summary dashboard",
"view_type": "watchlist",
"watchlist": "Sample Watchlist"
}
]
/datapull/v1/api/ai_users
eds-api-keyrate-limitedtoken.read
AI-Enabled Users
Returns internal users with AI access. Lists .eds email users associated with funds that have linqalpha_organization_id set and are not internal funds. Requires the 'token.read' scope. No request body parameters are required.
POST https://harbour-api.equitydatascience.com/datapull/v1/api/ai_users
eds-api-key: <your-api-key>
Content-Type: application/json
HTTP/1.1 200
[
{
"fundname": "Example Fund",
"fund": "eds100",
"username": "jdoe"
}
]
OAuth 2.0 authorization and OIDC/OAuth discovery endpoints. Supports authorization code flow with PKCE.
/oauth/authorize
none
OAuth authorization redirect
Initiates the OAuth authorization flow. All query parameters (client_id, redirect_uri, scope, etc.) are forwarded to the authorization server.
| Name | Type | Required | Description |
|---|---|---|---|
client_id | string | Yes | OAuth client ID. |
redirect_uri | string | Yes | Callback URL after authorization. |
response_type | string | Yes | OAuth response type (e.g., 'code'). |
scope | string | No | Requested scopes (e.g., 'openid profile email'). |
state | string | No | CSRF state parameter. |
code_challenge | string | No | PKCE code challenge. |
code_challenge_method | string | No | PKCE method (S256). |
GET https://harbour-api.equitydatascience.com/oauth/authorize?client_id=abc&redirect_uri=https://app.example.com/callback&response_type=code&scope=openid
HTTP/1.1 302
/oauth/token
none
OAuth token exchange
Exchanges authorization codes, refresh tokens, or client credentials for access/refresh tokens.
grant_type=authorization_code&code=AUTH_CODE&redirect_uri=https://app.example.com/callback&client_id=abc
POST https://harbour-api.equitydatascience.com/oauth/token
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code&code=AUTH_CODE&redirect_uri=https://app.example.com/callback&client_id=abc
HTTP/1.1 200
{
"access_token": "eyJ...",
"token_type": "Bearer",
"expires_in": 86400,
"refresh_token": "v1.abc...",
"scope": "openid profile email"
}
Model Context Protocol (MCP) endpoints implementing Streamable HTTP transport (MCP specification 2025-11-25). Requires JWT bearer authentication.
/mcp
jwt-bearerrate-limited
Send MCP JSON-RPC request
Accepts a JSON-RPC 2.0 request (or batch) for MCP operations such as tools/list, tools/call, resources/list, etc. Returns JSON or SSE stream.
| Name | Required | Description |
|---|---|---|
Mcp-Session-Id | No | Session ID for an existing MCP session. Omit for initialization. |
POST https://harbour-api.equitydatascience.com/mcp
Authorization: Bearer <jwt-token>
Content-Type: application/json
Mcp-Session-Id: <session-id>
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/list",
"params": {}
}
HTTP/1.1 200
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"tools": [
{
"name": "example_tool",
"description": "An example MCP tool",
"inputSchema": {
"type": "object"
}
}
]
}
}
/mcp
jwt-bearerrate-limited
Open MCP SSE stream
Opens a Server-Sent Events (SSE) stream for receiving MCP notifications and server-initiated messages within an active session.
| Name | Required | Description |
|---|---|---|
Mcp-Session-Id | Yes | Session ID for an existing MCP session. |
GET https://harbour-api.equitydatascience.com/mcp
Authorization: Bearer <jwt-token>
Mcp-Session-Id: <session-id>
Accept: text/event-stream
HTTP/1.1 200
event: message
data: {"jsonrpc": "2.0", ...}
/mcp
jwt-bearerrate-limited
Terminate MCP session
Terminates an active MCP session and cleans up server-side resources.
| Name | Required | Description |
|---|---|---|
Mcp-Session-Id | Yes | Session ID of the MCP session to terminate. |
DELETE https://harbour-api.equitydatascience.com/mcp
Authorization: Bearer <jwt-token>
Mcp-Session-Id: <session-id>
HTTP/1.1 200