---
title: "Fundamentals profile of a portfolio (paid, $0.08, x402 or MPP)"
method: POST
path: "/premium/portfolio-analysis"
tags: ["Paid (x402 or MPP)"]
---

# Fundamentals profile of a portfolio (paid, $0.08, x402 or MPP)

`POST /premium/portfolio-analysis`

## Request

- Base URL: `https://truevaluerankings.com`
- URL: `https://truevaluerankings.com/premium/portfolio-analysis`
- Auth: one of:
  - none
  - HTTP bearer

Fundamentals profile of a cryptocurrency allocation from True Value Rankings: the allocation-weighted scores for the 8 fundamental metrics, each holding's TVR Score and valuation category, and the portfolio TVR Score computed by TVR's scoring engine (the same calculation as the site's what-if simulator). Scores only; no prices, market caps, gaps or estimated values. $0.08 per call, paid in-band with x402 (USDC on Base) or MPP (USDC.e on Tempo, tempo charge, push mode). Educational model output, not a recommendation. Flow: POST without payment returns 402 with the challenge headers; pay exactly 80000 units (USDC on Base through x402, or USDC.e on Tempo through MPP) and retry the same request with the payment header; the response is 200 with the profile and a receipt header. Invalid input (unknown coin, duplicate coin, allocation not above 0, empty list) is refused with 400 before any payment. A lost response is re-delivered on the same proof for 24 hours without a second charge; the same proof with different inputs is refused with 409. Free alternative: the compare_coins MCP tool and GET /api/rankings for each holding. MCP tool: get_portfolio_analysis. A GET on this path returns the same x402 challenge (PAYMENT-REQUIRED header) as a quote, never a sale, and carries no MPP challenge; a POST with no body is answered the same way. Premium subscribers send their agent key as Authorization: Bearer tvr_k_... instead of a payment (one counted Premium operation; 200 directly, no 402).

## Headers

- `PAYMENT-SIGNATURE` string
- `Authorization` string

## Request body

- object
  - `portfolio` object[], required: Holdings: each a covered coin (ticker or name) and an allocation above 0. Allocations are normalised to 100%. No coin may appear twice.
    - `coin` string, required: Ticker or name of a coin covered by TVR

## Response `200`

Paid and delivered. The portfolio profile, with the settlement receipt in PAYMENT-RESPONSE (x402) or Payment-Receipt (MPP).

- object
  - `success` boolean
  - `product` string
  - `holdings_count` integer
  - `holdings` object[]
    - `symbol` string
    - `name` string
    - `allocation_pct` number
    - `tvr_score` number
    - `valuation` 'undervalued' | 'fair' | 'overvalued'
  - `portfolio_tvr_score` number: TVR Score of the allocation-weighted metric profile under TVR default weights (same engine as the site's what-if simulator)
  - `blended_metrics` object: Allocation-weighted score for each of the 8 metrics
  - `profile` object: Strongest and weakest blended metric, valuation mix by allocation
  - `weights_used` string
  - `payment` object: Rail, network, asset, amount and transaction reference of this purchase
  - `legal` object
  - `context` string
  - `disclaimer` string

## Other responses

- `400`: Invalid input (unknown coin, duplicate coin, allocation not above 0, empty or oversized list). Refused before any payment; no challenge is issued.
- `401`: An agent key was presented but is unknown or revoked. Nothing charged.
- `402`: Payment required or payment not accepted. The PAYMENT-REQUIRED header carries the x402 challenge and WWW-Authenticate the MPP challenge; the body explains how to pay. Nothing has been charged.
- `403`: An agent key was presented but its account has no active Premium subscription. Nothing charged; pay per call or subscribe.
- `405`: Method not allowed. Use POST with a JSON body (OPTIONS is answered with 204).
- `409`: The presented proof was already used for a different input. One purchase unlocks one intended result.
- `410`: The stored result for this proof has expired (24 hours); pay again for a fresh result.
- `429`: Rate limit, or the presented agent key has used its daily cap or the account its monthly allowance. Nothing charged; TVR never switches to a wallet payment on its own.
- `503`: Settlement status unknown or the engine is unavailable; nothing was charged. Retry shortly.

---

[API](https://skmtc.dev/truevaluerankings/apis/true-value-rankings-api.md) · [All operations](https://skmtc.dev/truevaluerankings/apis/true-value-rankings-api/llms.txt) · [OpenAPI document](https://skmtc.dev/truevaluerankings/apis/true-value-rankings-api/revisions/c2cb1728b93c?raw)
