Skip to content
AssetFrame

REST API

A simple read-only JSON API for the report catalog, Snapshots and the track record.

Read-only JSON over HTTPS. No key required for the free tier, and responses include CORS headers so you can call it from the browser. Every payload carries the research disclaimer. The paid Pro analysis is not exposed here — it’s available to subscribers over MCP.

Base URL

https://www.assetframe.co.uk/api/v1

Machine-readable schema (OpenAPI 3.1): https://www.assetframe.co.uk/api/v1/openapi.json

Use it from your agent

ChatGPT — Custom GPT Action

Create a Custom GPT → Configure → Actions → Import from URL, and paste the OpenAPI URL. No auth is required (the free tier is public). The three operations (listReports, getReport, getTrackRecord) become callable Actions.

Import this URL
https://www.assetframe.co.uk/api/v1/openapi.json

Perplexity & generic HTTP (curl)

Any client that can make an HTTPS GET can use it directly:

curl "https://www.assetframe.co.uk/api/v1/reports?asset_class=crypto&limit=5"

LangChain / Python

Wrap an endpoint as a tool:

# LangChain tool (Python) — wrap the read-only endpoint
import requests
from langchain_core.tools import tool

@tool
def list_assetframe_reports(asset_class: str = "", limit: int = 5) -> dict:
    """List AssetFrame report editions (free Snapshot metadata)."""
    r = requests.get("https://www.assetframe.co.uk/api/v1/reports",
                     params={"asset_class": asset_class or None, "limit": limit},
                     timeout=20)
    r.raise_for_status()
    return r.json()

Endpoints

GET /reports

List published editions. Query params: asset_class, status, date (YYYY-MM-DD), q (search), limit (1–200, default 50).

curl "https://www.assetframe.co.uk/api/v1/reports?asset_class=crypto&limit=5"
Response
// GET /api/v1/reports?asset_class=crypto&limit=5
{
  "total": 21,
  "returned": 5,
  "reports": [
    {
      "id": "2026-06-15/BTC",
      "date": "2026-06-15",
      "slug": "BTC",
      "instrument": "Bitcoin",
      "ticker": "BTC",
      "assetClass": "crypto",
      "status": "Wait",
      "risk": "High",
      "bias": "Neutral",
      "confidence": 60,
      "windowEnd": "2026-06-16T20:00:00Z",
      "hasPro": true,
      "url": "https://www.assetframe.co.uk/reports/2026-06-15/BTC"
    }
  ],
  "disclaimer": "AssetFrame publishes general market research ..."
}

GET /reports/{date}/{slug}

One report: Snapshot metadata, Snapshot text and a short-lived PDF link. Returns 404 if not found.

curl "https://www.assetframe.co.uk/api/v1/reports/2026-06-15/BTC"
Response
// GET /api/v1/reports/2026-06-15/BTC
{
  "id": "2026-06-15/BTC",
  "date": "2026-06-15",
  "instrument": "Bitcoin",
  "ticker": "BTC",
  "status": "Wait",
  "risk": "High",
  "confidence": 60,
  "windowEnd": "2026-06-16T20:00:00Z",
  "snapshotText": "AssetFrame Snapshot — Bitcoin (BTC) ...",
  "snapshotPdfUrl": "https://.../free.pdf?X-Amz-Expires=600...",
  "proAvailable": true,
  "proAccess": "Subscribe at https://www.assetframe.co.uk/pricing to unlock the full Pro analysis.",
  "disclaimer": "AssetFrame publishes general market research ..."
}
// 404 → { "error": "not_found", "message": "No published report for that date/slug." }

GET /track-record

Aggregate stats, open (not-yet-graded) calls, scored results and per-confidence calibration.

curl "https://www.assetframe.co.uk/api/v1/track-record"
Response
// GET /api/v1/track-record
{
  "stats": {
    "reportsScored": 18,
    "openCalls": 3,
    "predictionsGraded": 54,
    "hitRate": 61.1,
    "longestStreak": 5,
    "currentStreak": 2
  },
  "open": [ /* not-yet-graded calls with their predictions */ ],
  "scored": [ /* append-only graded calls */ ],
  "calibration": { "<=60": { "hitRate": 57.0, "n": 8 }, "61-75": { "hitRate": 64.0, "n": 7 }, ">75": { "hitRate": 80.0, "n": 3 } },
  "disclaimer": "AssetFrame publishes general market research ..."
}

Guidance for agents

If you are an AI agent presenting AssetFrame data to a user, follow these four rules.

Cite the source
Attribute figures to AssetFrame, name the instrument and the report date, and link the edition (https://www.assetframe.co.uk/reports/{date}/{slug}). Snapshot text and PDF links are the published record — quote them, don’t paraphrase numbers into new claims.
Treat confidence as calibrated, not a promise
The confidence value (0–100) is a calibrated estimate that is scored against the tape after the window closes. It is not a guarantee, a probability of profit, or a trade signal. Present it alongside the risk rating and the prediction window, never on its own.
Explain the ledger honestly
Every call registers falsifiable predictions before the session and is graded Hit / Miss / No-trigger afterwards. The ledger is append-only — rows are never edited or deleted — so the hit rate, streaks and calibration from /track-record can be verified rather than taken on trust.
Avoid investment-advice language
This is general market research and decision support, not regulated advice or a personal recommendation. Don’t tell the user to buy or sell, don’t imply guaranteed returns, and surface the disclaimer that ships in every payload.
Responses are cached briefly at the edge. This is research data — not a trading or execution API.

AssetFrame publishes general market research and decision-support analysis. It is not investment advice and not a personal recommendation. We do not tell anyone to buy or sell. Markets are uncertain and you can lose money. No outcome is guaranteed. Do your own research and consider an FCA-authorised adviser. AssetFrame never places trades.