Get Public Portfolio By Subdomain
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`.
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
Response Body
application/json
application/json
application/json
curl -X GET "https://example.com/api/v1/portfolios/public/string"{ "success": true, "message": "string", "data": { "id": "string", "subdomain": "string", "templateId": "signal", "snapshot": {}, "status": "LIVE", "updatedAt": "2019-08-24T14:15:22Z", "isPremium": true }}List Public PortfoliosGET
Lists the subdomains of every portfolio currently in `LIVE` or `GRACE` status, most recently updated first. Returns subdomain and timestamp only — no portfolio content. 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`. Cached for 5 minutes.
Record Portfolio ViewPOST
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`.