FundSpec Data

Documentation

The API is a set of JSON resources under https://fundspecdata.io/v3. Every endpoint takes a ticker, returns one document, and is described in the OpenAPI document that also powers the interactive reference.

Quickstart

Create a key from your account page, then request any dataset by ticker.

Python
import requests

API = "https://fundspecdata.io/v3"
headers = {"Authorization": "Bearer fsd_live_your_key"}

r = requests.get(f"{API}/fundamentals/AAPL", headers=headers, timeout=10)
r.raise_for_status()
doc = r.json()
print(doc["period_end"], doc["income_statement"]["revenue_ttm"], doc["income_statement"]["net_income_ttm"])
JavaScript
const r = await fetch("https://fundspecdata.io/v3/metrics/AAPL", {
  headers: { Authorization: "Bearer fsd_live_your_key" },
});
if (!r.ok) throw new Error(`${r.status} ${await r.text()}`);
const doc = await r.json();
console.log(doc.date, doc.valuation.pe_ttm.value, doc.valuation.pe_ttm.rank);

Authentication

Send your key in the Authorization header as a bearer token. Keys are shown once when created, stored hashed, and can be revoked and reissued from the dashboard at any time. Requests without a valid key receive 401.

Responses and errors

Successful requests return the document with status 200. Errors return a JSON body with a machine readable code and a message.

Error shapes
{"error": {"code": "not_found", "message": "No data for ticker XYZQ"}}     404
{"error": {"code": "unauthorized", "message": "Missing or invalid API key"}}   401
{"error": {"code": "rate_limited", "message": "Retry after 3 seconds"}}       429  Retry-After: 3
{"error": {"code": "quota_exceeded", "message": "Monthly request quota reached"}} 402

Rate limits and quotas

Each plan has a sustained request rate and a monthly quota. Exceeding the rate returns 429 with a Retry-After header; exceeding the quota returns 402 until the period resets or the plan changes. The dashboard shows usage against both in real time, and an email is sent at eighty percent of quota.

History and point in time

Datasets marked with history accept ?date=YYYY-MM-DD to return the document as of that date, and /history with from and to parameters for a series. Fundamentals history is point in time: the response for a date uses only filings made on or before it. The Developer plan reaches back one year; the Business plan has the full depth and bulk downloads of any dataset as compressed JSON lines.

Versioning

The path carries the major version. One naming convention applies throughout: snake_case keys, related fields grouped in objects, period suffixes such as _ttm and _fy, and metrics as value and rank pairs. Within a version, fields are only added, never renamed or removed; additions are listed in the changelog. A new major version is announced at least ninety days before the previous one is retired.