Record Portfolio View
Records an analytics view for a published portfolio. Responds `202 Accepted` with `data: null` — the count is not persisted synchronously. Views are buffered in Redis, deduplicated per viewer IP for 30 minutes, and flushed to Postgres by a scheduled job. A repeat view inside that window is accepted and silently dropped, so a `202` does not guarantee the count increased. No user session is required, but the request must carry an API key or originate from a whitelisted first-party origin; otherwise it is rejected with `401`.
Authorization
ApiKeyAuth Your personal API key — vw_ followed by 64 hex characters. The same key is also accepted
as Authorization: Bearer vw_....
In: header
Path Parameters
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
curl -X POST "https://example.com/api/v1/portfolios/public/string/view" \ -H "Content-Type: application/json" \ -d '{}'{ "success": true, "message": "Success", "data": null}Get Public Portfolio By SubdomainGET
Returns the published snapshot for a live portfolio subdomain. Returns `404` for a suspended portfolio, or one whose grace period has just expired — that lookup also flips the record to `SUSPENDED` as a side effect. Cached for up to 10 minutes, shortened to the remaining grace window for portfolios in `GRACE`. No user session is required, but the request must carry an API key or originate from a whitelisted first-party origin; otherwise it is rejected with `401`.
Get My PortfolioGET
Returns the caller's current portfolio draft document (if any), publication status, and billing summary in one call. Session-authenticated only — this route does not accept an API key.