Skip to documentation

API reference

ETF holdings API

Current and historical holdings, availability checks, and full portfolio reports.

ContentsOverview

Authentication

Bearer authentication

All v1 endpoints require an API key in the Authorization header.

HeaderAuthorization: Bearer $ETF_HOLDINGS_API_KEY
Base URLhttps://etf-holdings.com/api/v1
Access

Holdings endpoints and reports are billable; coverage checks are not.

Errors

Error responses

Errors use a consistent JSON envelope. Include requestId when contacting support.

400Invalid or missing request parameters.
401Missing, malformed, or revoked API key.
402Account access or available balance cannot cover the request.
429Request rate exceeded; retry with backoff.
503No supported holdings or report snapshot was available for the request.
{
  "error": {
    "code": "holdings_unavailable",
    "message": "Holdings are not available for that request",
    "requestId": "req_123"
  }
}

Coverage

Coverage checker

Check current and historical availability for a ticker.

CurrentWaiting
Check current endpoint coverage

Check current endpoint coverage.

HistoricalWaiting
Check historical endpoint coverage

Check supported historical years.

Current

Current holdings

Issuer-provided snapshots and current availability.

Current source integrationsView supported issuer families

Availability varies by fund and date. Check coverage before requesting a snapshot.

  • Aberdeen...
  • AdvisorShares...
  • Alger...
  • ALPS...
  • American Century...
  • Amplify...
  • ARK...
  • Avantis...
  • Bitwise...
  • BNY Mellon...
  • Calamos...
  • Capital Group...
  • Davis...
  • Dimensional...
  • Eaton Vance...
  • Fidelity...
  • First Trust...
  • Global X...
  • GMO...
  • Goldman Sachs...
  • GraniteShares...
  • Grayscale...
  • Harbor...
  • Innovator...
  • Invesco...
  • iShares...
  • JPMorgan...
  • MarketDesk...
  • MicroSectors...
  • Neuberger...
  • ProShares...
  • Roundhill...
  • Schwab...
  • SEI...
  • Simplify...
  • Sprott...
  • State Street...
  • Strive...
  • T. Rowe Price...
  • USCF...
  • VanEck...
  • Vanguard...
  • WisdomTree...

Current holdings

Get the latest available holdings

Resolve an issuer-published holdings snapshot for an ETF. Use at to request the latest cached snapshot on or before a date.

GET/api/v1/current/holdings
API key requiredIssuer-backedBillable: per returned holding
Request

Query parameters

NameTypeDescription
tickerRequiredstringETF or fund ticker symbol.SPY
atOptionalISO 8601 dateOptional query time. The endpoint resolves the latest snapshot on or before it.2026-06-01
limitOptionalintegerMaximum holdings to return after descending-weight sorting.25
fallbackOptionalbooleanWhen true, fall back to the latest SEC filing-backed holdings if issuer holdings are unavailable. Defaults to false.false
curl --request GET \
  --url 'https://etf-holdings.com/api/v1/current/holdings?ticker=SPY&limit=25' \
  --header 'Authorization: Bearer $ETF_HOLDINGS_API_KEY'
Response

Response fields

FieldTypeDescription
tickerstringThe ETF ticker that was resolved for this request.
asOfdateThe snapshot date that was returned.
sourceOptionalstringA source label when the resolved snapshot has one.
holdings[]Holding[]Holdings sorted by descending weight. The optional limit is applied after sorting.
Live request

Run this endpoint

ticker
ETF or fund ticker symbol.
at(optional)
Optional query time. The endpoint resolves the latest snapshot on or before it.
limit(optional)
Maximum holdings to return after descending-weight sorting.
fallback(optional)
When true, fall back to the latest SEC filing-backed holdings if issuer holdings are unavailable. Defaults to false.

Loading request runner.

Example

curl "https://etf-holdings.com/api/v1/current/holdings" \
  --get \
  --data-urlencode "ticker=SPY" \
  --data-urlencode "limit=25" \
  -H "Authorization: Bearer $ETF_HOLDINGS_API_KEY"

Current coverage

Check current data availability

Check whether an issuer-backed current holdings snapshot is available for a ticker, without retrieving its holdings table.

GET/api/v1/current/coverage
API key requiredAvailability onlyCurrent source
Request

Query parameters

NameTypeDescription
tickerRequiredstringETF or fund ticker symbol to check.SPY
curl --request GET \
  --url 'https://etf-holdings.com/api/v1/current/coverage?ticker=SPY' \
  --header 'Authorization: Bearer $ETF_HOLDINGS_API_KEY'
Response

Response fields

FieldTypeDescription
lookupCoverageLookupCoverage state and the metadata available for the requested data family.
lookup.statusstringCurrent lookups use fresh, cached, stale, or missing. Historical lookups can use mapped, mixed, legacy_only, missing, or scanning.
lookup.asOfOptionaldateThe latest available snapshot date for a current lookup.
lookup.yearCoverageOptionalobjectHistorical-year availability and per-year report details for a historical lookup.
Live request

Run this endpoint

ticker
ETF or fund ticker symbol to check.

Loading request runner.

Example

curl "https://etf-holdings.com/api/v1/current/coverage" \
  --get \
  --data-urlencode "ticker=SPY" \
  -H "Authorization: Bearer $ETF_HOLDINGS_API_KEY"

Historical

Historical holdings

Filing-backed snapshots and historical-year availability.

Historical holdings

Resolve a filing-backed historical snapshot

Return the latest supported holdings snapshot on or before the requested date without lookahead.

GET/api/v1/historical/holdings
API key requiredFiling-backedBillable: per returned holding
Request

Query parameters

NameTypeDescription
tickerRequiredstringETF or fund ticker symbol.IWM
atOptionalISO 8601 dateOptional requested historical date. The API returns the latest supported snapshot on or before it.2008-06-30
limitOptionalintegerMaximum holdings to return after descending-weight sorting.25
tickerMappingOptionalnone | partial | fullControls identifier-to-ticker mapping. Use full when downstream analysis needs maximum ticker coverage.full
curl --request GET \
  --url 'https://etf-holdings.com/api/v1/historical/holdings?ticker=IWM&at=2008-06-30&tickerMapping=full' \
  --header 'Authorization: Bearer $ETF_HOLDINGS_API_KEY'
Response

Response fields

FieldTypeDescription
tickerstringThe ETF ticker that was resolved for this request.
asOfdateThe snapshot date that was returned.
sourceOptionalstringA source label when the resolved snapshot has one.
holdings[]Holding[]Holdings sorted by descending weight. The optional limit is applied after sorting.
Live request

Run this endpoint

ticker
ETF or fund ticker symbol.
at(optional)
Optional requested historical date. The API returns the latest supported snapshot on or before it.
limit(optional)
Maximum holdings to return after descending-weight sorting.
tickerMapping(optional)
Controls identifier-to-ticker mapping. Use full when downstream analysis needs maximum ticker coverage.

Loading request runner.

Example

curl "https://etf-holdings.com/api/v1/historical/holdings" \
  --get \
  --data-urlencode "ticker=SPY" \
  --data-urlencode "at=2024-06-30" \
  --data-urlencode "limit=25" \
  --data-urlencode "tickerMapping=full" \
  -H "Authorization: Bearer $ETF_HOLDINGS_API_KEY"

Historical coverage

Check historical-year availability

Inspect which historical years have an available supported filing snapshot before requesting a historical table or report.

GET/api/v1/historical/coverage
API key requiredAvailability onlyFiling coverage
Request

Query parameters

NameTypeDescription
tickerRequiredstringETF or fund ticker symbol to check.SPY
curl --request GET \
  --url 'https://etf-holdings.com/api/v1/historical/coverage?ticker=SPY' \
  --header 'Authorization: Bearer $ETF_HOLDINGS_API_KEY'
Response

Response fields

FieldTypeDescription
lookupCoverageLookupCoverage state and the metadata available for the requested data family.
lookup.statusstringCurrent lookups use fresh, cached, stale, or missing. Historical lookups can use mapped, mixed, legacy_only, missing, or scanning.
lookup.asOfOptionaldateThe latest available snapshot date for a current lookup.
lookup.yearCoverageOptionalobjectHistorical-year availability and per-year report details for a historical lookup.
Live request

Run this endpoint

ticker
ETF or fund ticker symbol to check.

Loading request runner.

Example

curl "https://etf-holdings.com/api/v1/historical/coverage" \
  --get \
  --data-urlencode "ticker=SPY" \
  -H "Authorization: Bearer $ETF_HOLDINGS_API_KEY"

Reports

Portfolio reports

Reports retain the complete holdings response and add portfolio or comparison statistics from ticker-mapped rows.

Current report

Return a complete current portfolio report

Get the full enriched holdings table plus portfolio statistics, classifications, and valuation analysis for the latest available snapshot.

GET/api/v1/reports/current
API key requiredFull holdings tableBillable: per returned holding
Request

Query parameters

NameTypeDescription
tickerRequiredstringETF or fund ticker symbol.SPY
curl --request GET \
  --url 'https://etf-holdings.com/api/v1/reports/current?ticker=SPY' \
  --header 'Authorization: Bearer $ETF_HOLDINGS_API_KEY'
Response

Response fields

FieldTypeDescription
reportType"portfolio"Identifies a one-portfolio report.
endpoint"current" | "historical"The data family that produced the report.
requestedReportRequestNormalized ticker and optional requested historical date.
generatedAttimestampWhen the API assembled the report.
portfolioPortfolioReportThe full holdings table and derived analysis for the requested ETF.
Live request

Run this endpoint

ticker
ETF or fund ticker symbol.

Loading request runner.

Example

curl "https://etf-holdings.com/api/v1/reports/current" \
  --get \
  --data-urlencode "ticker=SPY" \
  -H "Authorization: Bearer $ETF_HOLDINGS_API_KEY"

Historical report

Return a complete historical portfolio report

Get a filing-backed full holdings table and derived analysis for the latest supported snapshot on or before an optional historical date.

GET/api/v1/reports/historical
API key requiredFull holdings tableBillable: per returned holding
Request

Query parameters

NameTypeDescription
tickerRequiredstringETF or fund ticker symbol.SPY
dateOptionalYYYY-MM-DDOptional requested historical date. The API resolves the nearest supported snapshot on or before it.2024-06-30
curl --request GET \
  --url 'https://etf-holdings.com/api/v1/reports/historical?ticker=SPY&date=2024-06-30' \
  --header 'Authorization: Bearer $ETF_HOLDINGS_API_KEY'
Response

Response fields

FieldTypeDescription
reportType"portfolio"Identifies a one-portfolio report.
endpoint"current" | "historical"The data family that produced the report.
requestedReportRequestNormalized ticker and optional requested historical date.
generatedAttimestampWhen the API assembled the report.
portfolioPortfolioReportThe full holdings table and derived analysis for the requested ETF.
Live request

Run this endpoint

ticker
ETF or fund ticker symbol.
date(optional)
Optional requested historical date. The API resolves the nearest supported snapshot on or before it.

Loading request runner.

Example

curl "https://etf-holdings.com/api/v1/reports/historical" \
  --get \
  --data-urlencode "ticker=SPY" \
  --data-urlencode "date=2024-06-30" \
  -H "Authorization: Bearer $ETF_HOLDINGS_API_KEY"

Current comparison

Compare two current ETF portfolios

Return both complete current holdings tables plus shared positions, unique positions, weighted overlap, classifications, and valuation comparisons.

GET/api/v1/reports/current/comparison
API key requiredTwo full portfoliosBillable: both tables
Request

Query parameters

NameTypeDescription
tickerRequiredstringPrimary ETF ticker symbol.SPY
comparisonRequiredstringETF ticker symbol to compare with ticker.QQQ
curl --request GET \
  --url 'https://etf-holdings.com/api/v1/reports/current/comparison?ticker=SPY&comparison=QQQ' \
  --header 'Authorization: Bearer $ETF_HOLDINGS_API_KEY'
Response

Response fields

FieldTypeDescription
reportType"comparison"Identifies a two-portfolio report.
endpoint"current" | "historical"The data family used for both portfolios.
requestedReportRequestNormalized primary ticker, comparison ticker, and historical date when applicable.
portfolios.tickerPortfolioReportFull enriched holdings table and analysis for ticker.
portfolios.comparisonPortfolioReportFull enriched holdings table and analysis for comparison.
analysisComparisonAnalysisShared and unique rows, overlap counts, allocation deltas, classifications, and valuations.
Live request

Run this endpoint

ticker
Primary ETF ticker symbol.
comparison
ETF ticker symbol to compare with ticker.

Loading request runner.

Example

curl "https://etf-holdings.com/api/v1/reports/current/comparison" \
  --get \
  --data-urlencode "ticker=SPY" \
  --data-urlencode "comparison=QQQ" \
  -H "Authorization: Bearer $ETF_HOLDINGS_API_KEY"

Historical comparison

Compare two historical ETF portfolios

Resolve comparable filing-backed snapshots on or before a requested date and return both full portfolios with overlap analysis.

GET/api/v1/reports/historical/comparison
API key requiredTwo full portfoliosBillable: both tables
Request

Query parameters

NameTypeDescription
tickerRequiredstringPrimary ETF ticker symbol.SPY
comparisonRequiredstringETF ticker symbol to compare with ticker.QQQ
dateRequiredYYYY-MM-DDRequested historical date. Each ETF resolves to its latest supported snapshot on or before this date.2024-06-30
curl --request GET \
  --url 'https://etf-holdings.com/api/v1/reports/historical/comparison?ticker=SPY&comparison=QQQ&date=2024-06-30' \
  --header 'Authorization: Bearer $ETF_HOLDINGS_API_KEY'
Response

Response fields

FieldTypeDescription
reportType"comparison"Identifies a two-portfolio report.
endpoint"current" | "historical"The data family used for both portfolios.
requestedReportRequestNormalized primary ticker, comparison ticker, and historical date when applicable.
portfolios.tickerPortfolioReportFull enriched holdings table and analysis for ticker.
portfolios.comparisonPortfolioReportFull enriched holdings table and analysis for comparison.
analysisComparisonAnalysisShared and unique rows, overlap counts, allocation deltas, classifications, and valuations.
Live request

Run this endpoint

ticker
Primary ETF ticker symbol.
comparison
ETF ticker symbol to compare with ticker.
date
Requested historical date. Each ETF resolves to its latest supported snapshot on or before this date.

Loading request runner.

Example

curl "https://etf-holdings.com/api/v1/reports/historical/comparison" \
  --get \
  --data-urlencode "ticker=SPY" \
  --data-urlencode "comparison=QQQ" \
  --data-urlencode "date=2024-06-30" \
  -H "Authorization: Bearer $ETF_HOLDINGS_API_KEY"

Schemas

Shared response objects

Fields shared by holdings and report responses. Enrichment is optional and may have a different as-of date.

Holding

A source row in a holdings table. Reports retain these rows even when some enrichment is unavailable.

FieldTypeDescription
weightnumber | nullPortfolio weight as a decimal fraction.
identifiersHoldingIdentifiersSparse public identifiers for the source row.
classificationOptionalHoldingClassificationAvailable sector, industry-group, and industry enrichment.
valuationOptionalHoldingValuationAvailable valuation enrichment. Its asOf date can differ from the holdings snapshot.

HoldingIdentifiers

Resolved public identifiers. Fields are omitted when the source or reference data does not provide them.

FieldTypeDescription
tickerOptionalstringResolved security ticker.
nameOptionalstringResolved security name.
originalOptionalstringSource-row identifier or name retained for traceability.
cusipOptionalstringCUSIP when public identifier visibility permits it.
isinOptionalstringISIN when public identifier visibility permits it.
cikOptionalstringSEC central index key.
leiOptionalstringLegal entity identifier.
sedolOptionalstringSEDOL identifier.
figiOptionalstringFinancial Instrument Global Identifier.
compositeFigiOptionalstringComposite FIGI for the resolved security.
shareClassFigiOptionalstringShare-class FIGI for the resolved security.
identifierOptionalstringProvider-supplied identifier when available.

HoldingClassification

GICS-style classification enrichment for a mapped security.

FieldTypeDescription
sectorOptionalstringSector label.
industryGroupOptionalstringIndustry-group label.
industryOptionalstringIndustry label.

HoldingValuation

Point-in-time valuation enrichment for a mapped security.

FieldTypeDescription
priceToEarningsOptionalnumberPrice-to-earnings ratio.
priceToBookOptionalnumberPrice-to-book ratio.
priceToSalesOptionalnumberPrice-to-sales ratio.
asOfOptionaldateValuation provider as-of date.

CoverageLookup

Current and historical coverage share these core fields; the calendar applies to current lookups and filing fields apply to historical lookups.

FieldTypeDescription
tickerstringRequested ETF ticker.
statusstringCurrent: fresh, cached, stale, or missing. Historical: mapped, mixed, legacy_only, missing, or scanning.
okbooleanWhether the relevant data family has confirmed coverage.
messagestringHuman-readable coverage result.
codeOptionalstring | nullCurrent coverage warning or miss code.
providerOptionalstring | nullCurrent holdings provider.
asOfOptionaldate | nullCurrent holdings snapshot date.
calendarOptionalCurrentAvailabilityCalendar | nullCurrent availability across the returned date window.
matchCountOptionalintegerHistorical fund-record matches.
lookupSourceOptionalstring | nullHistorical ticker-mapping source.
postNportOptionalHistoricalCoverageCheckPost-2019 filing availability.
preNportOptionalHistoricalCoverageCheckPre-2019 filing availability or applicability.
yearCoverageOptionalHistoricalYearCoveragePer-year historical filing coverage.
listingStartYearOptionalintegerEarliest listed year from reference metadata.

CurrentAvailabilityCalendar

The recent-date coverage window returned by current coverage checks.

FieldTypeDescription
startDatedateFirst date in the coverage window.
endDatedateLast date in the coverage window.
totalDaysintegerNumber of dates in the window.
availableDaysintegerDates served by a current cached snapshot.
daysCurrentAvailabilityDay[]Coverage state for every date in the window.

CurrentAvailabilityDay

Current availability for one calendar date.

FieldTypeDescription
datedateDate being checked.
status"snapshot" | "covered" | "missing"Direct snapshot, coverage from an earlier snapshot, or no cached coverage.
sourceAsOfdate | nullSnapshot date serving this calendar date.
labelstringHuman-readable date result.

HistoricalCoverageCheck

A post-NPORT or pre-NPORT coverage result. Some dates and metadata apply to only one check type.

FieldTypeDescription
statusstringavailable, missing, pending, error, or not_applicable.
okbooleanWhether this period has confirmed coverage.
titlestringCoverage period title.
labelstringPublic date or year-range label.
messagestringHuman-readable coverage result.
codeOptionalstring | nullMiss or temporary error code.
asOfdate | nullConfirmed report date, when one is available.
sourceFormstring | nullFiling form that supplied the report.
matchCountOptionalintegerMatching post-NPORT fund records.
lookupSourceOptionalstring | nullTicker-mapping source for post-NPORT coverage.
reportDateStartOptionaldateStart of the public post-NPORT report period.
filingDateStartOptionaldateStart of the public post-NPORT filing period.
probeDateOptionaldatePre-NPORT probe date.
startYearOptionalintegerReference listing-start year when pre-NPORT is not applicable.

HistoricalYearCoverage

Historical filing availability across the returned year range.

FieldTypeDescription
startYearintegerFirst year in the scan.
endYearintegerLast year in the scan.
totalYearsintegerNumber of year entries.
availableYearCountintegerYears with a confirmed usable report.
pendingYearCountintegerYears still being checked.
parseFailureYearCountintegerYears with a matched filing that could not be parsed.
completebooleanWhether no year remains pending.
sourcestring | nullCoverage source, such as cache, when available.
yearsHistoricalCoverageYear[]One entry per year, newest first.

HistoricalCoverageYear

Historical filing coverage for one calendar year.

FieldTypeDescription
yearintegerCalendar year.
status"available" | "pending" | "missing"Confirmed, still checking, or no usable filing confirmed.
sourceFormstring | nullFiling form that supplied the report.
reportDatedate | nullResolved filing as-of date.
filingDatedate | nullSEC filing date.
holdingsCountinteger | nullParsed holdings count when available.
requestedYearinteger | nullYear used for the coverage probe.
requestedAttimestamp | nullRequested timestamp for the coverage probe.
parseFailureHistoricalParseFailure | nullParsing details when a filing matched but did not yield a usable table.
labelstringHuman-readable year result.

HistoricalParseFailure

Details for a matched historical filing that could not be parsed into usable holdings.

FieldTypeDescription
codestringParser failure code.
messagestring | nullParser failure message.
accessionNumberstring | nullSEC accession number.
formstring | nullSEC filing form.
filingDatedate | nullSEC filing date.
reportDatedate | nullFiling report date.
sourceUrlstring | nullSource document URL.
filingIndexUrlstring | nullSEC filing index URL.
lookupModestring | nullHistorical lookup mode used for the filing.

PortfolioReport

The portfolio object in a single report or either side of a comparison report.

FieldTypeDescription
tickerstringResolved ETF ticker.
asOfdateResolved snapshot date.
sourceOptionalstringSource label when available.
holdingsHolding[]Complete enriched public holdings table returned for this portfolio.
enrichmentReportEnrichmentEnrichment status plus ticker coverage counts.
analysisPortfolioAnalysisCounts, mapped-row coverage, statistics, and sector, industry-group, industry, and valuation analysis.

ReportEnrichment

Ticker-level enrichment coverage for a report portfolio.

FieldTypeDescription
status"ready" | "partial" | "empty" | "unavailable"Overall enrichment availability.
requestedTickersintegerMapped tickers requested from enrichment providers.
classifiedTickersintegerMapped tickers with classification data.
valuedTickersintegerMapped tickers with valuation data.

PortfolioAnalysis

Derived from the full holdings table after ticker-mapped rows are normalized. Classification and valuation side B is empty for a single portfolio.

FieldTypeDescription
holdingsCountintegerAll source rows in the returned holdings table.
mappedHoldingsCountintegerDistinct ticker-mapped positions after duplicate rows are combined.
mappedHoldingRowCountintegerSource rows with a mapped ticker.
unmappedHoldingRowCountintegerSource rows without a mapped ticker.
statisticsPortfolioStatistics | nullConcentration and exposure statistics when weighted mapped positions are present.
classificationsClassificationBreakdownSector, industry-group, and industry breakdowns.
valuationsValuationAnalysisP/E, P/B, and P/S aggregates and buckets.

PortfolioStatistics

Weight-based statistics for normalized mapped positions.

FieldTypeDescription
largestHoldingNormalizedHoldingLargest position by absolute weight.
topTenConcentrationnumberSum of absolute weights for the ten largest positions.
grossExposurenumberSum of absolute mapped weights.
netExposurenumberSum of signed mapped weights.

NormalizedHolding

A ticker-mapped position used for report analysis after duplicate source rows are combined.

FieldTypeDescription
tickerstringMapped security ticker.
namestringFirst available resolved security name; may be empty.
weightnumber | nullCombined position weight.

ClassificationBreakdown

Parallel sector, industry-group, and industry breakdowns. A is the requested ticker; B is the comparison ticker, or zero for a single portfolio.

FieldTypeDescription
sectorClassificationDimensionSector allocation and coverage.
industryGroupClassificationDimensionIndustry-group allocation and coverage.
industryClassificationDimensionIndustry allocation and coverage.

ClassificationDimension

Allocation buckets and classified-row coverage for one classification dimension.

FieldTypeDescription
bucketsClassificationBucket[]Classification labels, including Unclassified when present.
coverageClassificationCoverageClassified weight and row coverage for each side.

ClassificationBucket

One sector, industry group, or industry allocation bucket.

FieldTypeDescription
labelstringClassification label.
weightAnumberAbsolute mapped weight for the requested ticker.
weightBnumberAbsolute mapped weight for the comparison ticker.
countAintegerSource-row count for the requested ticker.
countBintegerSource-row count for the comparison ticker.

ClassificationCoverage

Classified weight and row counts for a classification dimension.

FieldTypeDescription
weightAnumberClassified absolute weight for the requested ticker.
weightBnumberClassified absolute weight for the comparison ticker.
countAintegerClassified source rows for the requested ticker.
countBintegerClassified source rows for the comparison ticker.
totalAintegerAll source rows for the requested ticker.
totalBintegerAll source rows for the comparison ticker.

ValuationAnalysis

Parallel valuation analysis for price-to-earnings, price-to-book, and price-to-sales.

FieldTypeDescription
priceToEarningsValuationMetricP/E aggregate and buckets.
priceToBookValuationMetricP/B aggregate and buckets.
priceToSalesValuationMetricP/S aggregate and buckets.

ValuationMetric

One valuation ratio for the requested ticker and comparison ticker, or an empty B side for a single portfolio.

FieldTypeDescription
labelstringDisplay label: P/E, P/B, or P/S.
aValuationMetricSideRequested ticker aggregate.
bValuationMetricSideComparison ticker aggregate; empty for a single portfolio.
bucketsValuationBucket[]Weight and row counts by valuation band.

ValuationMetricSide

Weighted valuation aggregate and provider coverage for one portfolio.

FieldTypeDescription
valuenumber | nullWeighted harmonic ratio when positive values are available.
coveragenumberShare of absolute row weight covered by the metric.
countintegerRows with a numeric metric.
totalintegerRows considered for the metric.
asOfdate | nullLatest valuation as-of date among covered rows.

ValuationBucket

One valuation-band allocation bucket.

FieldTypeDescription
labelstringValuation band label.
weightAnumberAbsolute mapped weight in the band for the requested ticker.
weightBnumberAbsolute mapped weight in the band for the comparison ticker.
countAintegerRows in the band for the requested ticker.
countBintegerRows in the band for the comparison ticker.

ComparisonAnalysis

Mapped-ticker comparison metrics. Full source rows remain available in both portfolio tables.

FieldTypeDescription
snapshotAComparisonSnapshotMapped-ticker summary for the requested ticker.
snapshotBComparisonSnapshotMapped-ticker summary for the comparison ticker.
sharedSharedHolding[]Mapped securities held by both portfolios, with both weights and their delta.
uniqueANormalizedHolding[]Mapped securities unique to the requested ticker.
uniqueBNormalizedHolding[]Mapped securities unique to the comparison ticker.
sharedTickerCountintegerNumber of shared mapped tickers.
uniqueTickerCountAintegerMapped tickers unique to the requested ticker.
uniqueTickerCountBintegerMapped tickers unique to the comparison ticker.
weightedOverlapnumberSum of the lower same-direction weight for shared mapped positions.
classificationsClassificationBreakdownSector, industry-group, and industry allocation comparisons.
valuationsValuationAnalysisP/E, P/B, and P/S comparisons.

ComparisonSnapshot

Mapped-ticker summary for one side of a comparison.

FieldTypeDescription
tickerstringResolved ETF ticker.
asOfdateResolved snapshot date.
holdingsCountintegerDistinct mapped tickers after duplicate rows are combined.
mappedHoldingRowCountintegerSource rows with a mapped ticker.
unmappedHoldingRowCountintegerSource rows without a mapped ticker.
statisticsPortfolioStatistics | nullConcentration and exposure statistics for mapped positions.

SharedHolding

A ticker-mapped position present in both portfolios.

FieldTypeDescription
tickerstringShared security ticker.
namestringFirst available resolved security name; may be empty.
weightAnumber | nullCombined weight in the requested ticker.
weightBnumber | nullCombined weight in the comparison ticker.
differencenumber | nullweightA minus weightB.
absoluteDifferencenumber | nullAbsolute value of difference.
combinedWeightnumberSum of absolute weights across both portfolios.
sameDirectionbooleanWhether both nonzero weights have the same sign.

ReportRequest

Normalized report query parameters returned with each report.

FieldTypeDescription
tickerstringPrimary requested ETF ticker.
comparisonOptionalstringComparison ticker for a comparison report.
datedate | nullRequested historical date, or null for current reports.

ErrorResponse

Response body for a non-successful API request.

FieldTypeDescription
errorApiErrorStructured API error.

ApiError

Structured error returned with the HTTP status code.

FieldTypeDescription
codestringMachine-readable error code.
messagestringHuman-readable error message.
requestIdstringRequest identifier for support and troubleshooting.
detailsOptionalobjectAdditional details for exposed client errors.

Support

Coverage and data questions

Include the ticker, date, and requestId.
Contact support